본문 바로가기
Hacking/Hacking Beginner Class (normaltic)

[해킹 비기너 클래스] Drill Course 2주차 정리

by st-og 2023. 9. 21.

nfs 가 열려있는 피시는 어떤 방식으로 해킹이 가능한지 배웠다

nfs란 네트워크 파일 시스템의 약자로 네트워크 상에서 다른 피시의 파일을 사용할 수 있게 해주는 시스템이다

nfs는 포트번호 111번을 사용한다

 

nmap을 통해 피해자 피시에서 111번 포트가 열려있고 nfs가 사용 중인 것을 확인할 수 있다.

 

showmount -e [ip주소] 명령어를 사용하여 nfs가 설정되어 있는 파일목록을 확인할 수 있으며

mount [타겟ip]:[파일경로] [마운트 할 내 파일 경로] 명령어를 사용해 내 파일과 해당 파일을 동기화시킬 수 있다

 


정보 수집

먼저 해당 머신의 아이피를 알기 위해 호스트 스캔을 해보자

192.168.206.131가 오늘 실습 머신의 아이피 주소이다

 

해당 아이피에 포트스캔을 해주었다

 

22번, 80번, 111번, 2049번 포트가 열려 있는 것을 확인할 수 있다

웹서비스가 열려 있으니 확인을 해보자

 

happycorporation 이라는 웹 사이트를 확인할 수 있는데 해당 페이지 내에서는 특별한 점을 찾기 어려워 보인다

해당 웹사이트에 디렉터리 스캔을 진행해보자

 

gobuster dir -u http://192.168.206.131/ -w /usr/share/wordlists/dirb/big.txt -t 100 -f
gobuster [모드선택] -u [url주소] -w [디렉터리 단어 리스트] -t [스레드 갯수] -f (디렉터리내의 파일 찾기)

 

여러 디렉터리가 스캔이 되었다.

해당 경로들로 접속을 해보았지만 의미 있는 정보는 찾지 못했다

 

nikto를 실행시켜 보자

nikto -h [url주소]

 

/admin.php 파일이 있음을 알려준다

해당 경로에 접속해 보자

 

로그인 페이지가 나온 것을 확인할 수 있다

우리는 현재 아무런 정보가 없기 때문에 일단은 hydra를 통해 브루트포싱을 해둔 상태로 더 많은 정보를 수집해 보자

exploit

먼저 hydra를 사용하기 위해 어떤 파라미터를 이용해 값이 입력되는지, 어떤 방식으로 전송되는지를 확인해야 한다

웹 브라우저에서 f12를 눌러 네트워크화면에 들어가서 값을 보내게 되면 

post방식으로 전송되는 것을 확인할 수 있다

 

그리고 우측 하단의 Resend를 눌러 body를 확인하면 파라미터의 이름을 확인할 수 있다

 

 

그리고 실패했을 경우 로그인창 위에 invalid username.이라는 문구가 뜨는 것을 확인할 수 있는데

해당 문구로 실패와 성공의 여부를 구분 지을 것이다

 

hydra -L /usr/share/wordlists/rockyou.txt -P /usr/share/wordlists/rockyou.txt 192.168.206.131 http-post-form "/admin.php:user=^USER^&pass=^PASS^:Invalid username."
# hydra -L [id단어리스트] -P [pw단어리스트] [해당ip] [프로토콜과 전송방식] [페이지이름]:[파리미터에 들어갈 값]:[실패했을때 뜨는 문구]
# ^USER^부분에 id단어리스트의 값들이 들어감
# ^PASS^부분에 pw단어리스트의 값들이 들어감

 

이렇게 hydra를 켜놓은 상태로 다음 포트인 111번 포트를 확인해 보자

 

111번 포트는 nfs서비스를 하는 포트임으로 nfs가 되어있는 파일을 확인하는 것이 중요하다

showmount -e [ip주소]

 

/home/karl 가 nfs로 지정되어 있는 것을 확인할 수 있다

해당 파일을 나의 파일과 동기화를 시켜 보자

 

먼저 동기화할 파일을 만들어 줘야 하는데

편의상 /tmp/test로 만들었다

해당 파일을 동기화해 보자

mount 192.168.206.131:/home/karl /tmp/test

 

해당 파일에 들어가 확인을 해보면

동기화에 성공한 것을 확인할 수 있다

 

파일에서는 .ssh를 확인할 수 있는데

해당 경로에 들어가 개인키를 가져올 수 있다면 ssh로 접근이 가능할 것이다

.ssh 파일에 들어가 보자

.ssh로 접근할 수 있는 권한이 없다고 한다

위의 사진을 보면 1001번의 uid를 가진 유저만이 접근을 할 수 있게 한 것을 알 수 있다  

 

얼핏 보면 문제가 생긴 것 같지만 그냥 단순하게 생각하면 1001번의 uid를 가진 유저를 만들어서 접근하면 된다

유저를 만들기 위해서는 useradd 명령어를 사용하면 된다

useradd --uid 1001 test

 

만들어진 test유저로 접속을 해보자 이때 su 명령어를 사용하면 된다

su test

 

해당 유저로 아까 접근이 불가능했던 .ssh 디렉터리에 들어가 보자

 

접근이 잘 되며 ssh키까지 확인이 가능했다

해당 키를 /tmp디렉터리로 옮겨주자

 

그 후 다시 root 계정으로 돌아와 /tmp에 있는 개인키를 사용해 ssh로 접속을 해보자

 

개인키의 비밀번호를 묻는다 

해당 키의 비밀번호를 알아내기 위해 john을 사용해 보자

 

먼저 john을 사용하기 전 john을 사용할 수 있게 ssh키를 변경시켜줘야 한다

 

그 후 john을 사용해 보자

비밀번호는 sheep임을 알아냈다

 

다시 ssh로 접속을 해보자

성공적으로 karl의 계정을 획득하였다

 

Post-Exploit

권한 상승을 위해 setuid가 걸려있는 파일을 찾아보자

find / -perm -4000

 

여기서 가장 눈에 보이는 건 /bin/cp가 setuid가 걸려 있다는 것이다

모든 파일을 복사할 수 있다는 건 큰 취약점이 될 수 있다

 

cp를 이용한 가장 쉬운 권한 상승 방법은 /etc/passwd 파일을 복사해서 가져와 수정한 뒤 cp 명령어를 통해 다시 덮어쓰기를 하는 것이다

 

먼저 /etc/passwd를 cp 명령어를 통해 가져와보자

그 후 해당 파일을 수정을 해야 하는데 현재의 폴더에서는 수정이 불가능하다

그렇기 때문에 다시 root의 계정으로 와 해당 파일을 다른 디렉터리로 옮긴 후 수정을 해주면 된다

 

 

/tmp 디렉터리에 옮겼으니 /tmp로 들어가 에디터를 사용해 수정을 해보자

root의 내용을 그대로 옮겨 비밀번호와 유저 이름만 바꿔주면 된다

 

유저의 이름은 test2로 하였고 비밀번호는 password로 지정해 줬다

하지만 이렇게 지정할 경우 리눅스에서는 해당 유저의 비밀번호를 인지하지 못한다

/etc/passwd 에 저장되는 비밀번호는 해시가 되어 있어야 된다

 

문자열을 해시시키기 위해서는 mkpasswd를 사용하면 된다

이렇게 해시된 문자열로 다시 바꿔주자

 

수정된 파일을 다시 karl 계정에 옮기기 위해 서버를 열어 wget을 통해 옮겨 보자

 

 

passwd.1이란 이름으로 저장된 것을 확인할 수 있다

이제 해당 파일을 /etc/passwd로 덮어쓰게 하면 된다

 

 

그 후 su 명령어를 통해 test2의 계정에 접속하게 되면

 

 

성공적으로 root 계정을 획득하였다.