제목 : 사소한 금지 앱에 대한 침투 테스트 기록

0x01 thinkadmin历史漏洞复习​

상대방의 앱의 배경 주소는 ThinkAdmin 인 것으로 밝혀 졌으므로 ThinkAdmin의 역사적 허점을 검토해야합니다.
CVE-2020-25540
다음과 같이 POC를 사용하십시오
열 디렉토리
post /?s=admin/api.update/noderules=]] 파일 읽기
/? 결과적으로 디렉토리 트래버스로 인해 모든 디렉토리를 읽습니다. 특정 제한 사항이 있지만 피해는 여전히 매우 크기 때문에이 기능은 후속 업데이트 후 선반에서 제거됩니다.
CVE가없는 사막화 취약점도 있습니다
두 개의 인터페이스가 있으며 그 중 하나는 위에 나열된 디렉토리 함수의 규칙 매개 변수입니다.
post /?s=admin/api.update/noderules=payload 다른 장소입니다
post /?s=wechat/api.push/indexreceive=payload

0x02 第一份源码​

공무원은 더 이상 기존 버전의 소스 코드를 다운로드하지 않기 때문에 즉시 ThinkPhp55.1.38을 사용하여 이전 버전의 소스 코드를 찾기 위해 즉시 다른 장소로갔습니다. 감지 후 다음과 같은 취약점이 있습니다.
응용 프로그램/wechat/컨트롤러/API/PUSH.PHP
두 가지 사제 중 하나만 고정되었습니다.
图片

응용 프로그램/관리자/컨트롤러/API/Update.php
열 디렉토리와 파일을 읽는 경로는 약간 변경되었으며 규칙 매개 변수를 전달하여 열 디렉토리를 제어 할 수 없으므로 웹 루트 디렉토리 만 나열 할 수 있습니다. 그러나 임의의 파일 읽기는 다양한 제한 사항을 제거하므로 구성/Database.php를 직접 읽으려면 데이터베이스 구성을 얻을 수 있습니다.
图片

데이터베이스 구성을 얻은 후 데이터베이스를 외부로 연결할 수 있다면 더 깊이 사용할 수 있습니다.
응용 프로그램/관리자/컨트롤러/API/Plugs.php
图片

이것은 ThinkAdmin과 함께 제공되는 파일 업로드 인터페이스입니다. 많은 CMS와 마찬가지로 디자인 된 Whitelist Storage_local_exts는 데이터베이스 또는 시스템 배경에서 구성 할 수 있습니다. 일반적으로, 우리는 이것을 사용할 수 있지만 getshell 작업을 수행 할 수 있지만 화이트리스트에 PHP를 직접 추가하면 네 번째 IF를 전달할 수 없으며 백그라운드에서 시스템 구성에도 인터셉트가있을 것입니다.
응용 프로그램/관리자/컨트롤러/config.php
图片

데이터베이스를 직접 작동하면 배경 구성 제한을 우회 할 수 있지만 업로드 () 제한을 우회 할 수는 없습니다.
분명히 PHP 필터링으로는 충분하지 않습니다. 상대방이 Windows 서버 인 경우 여전히 PHP: $ 데이터 옵션이 있습니다. 상대방이 Apache이고 잘못된 구성을 한 경우 PHP3/PHP4/PHP5/PHP7/PHT/PHT/PHTML/PHAR와 같은 구문 분석 접미사도 있습니다.
그러나

0x03 第二份源码​

그러나 ThinkAdmin 아키텍처에 익숙하지 않는 첫 번째 소스 코드는 사용하지 않습니다. 대상은 ThinkPhp6.0.3이고 취약성은 첫 번째와 다르기 때문에 사막화는 없습니다. 그러나 여전히 열 디렉토리 및 파일 판독 값이 있으며 역사적 취약점과 정확히 동일합니다.
앱/관리자/컨트롤러/API/Update.php
图片

그러나 리스팅 디렉토리가있을 때 문제가 발생했습니다.
图片

웹 루트 디렉토리를 나열하기 때문입니다. 상대방의 프로젝트가 크거나 폴더에 허가가 없으면 오류가 발생합니다. 현재 디렉토리를 대상 방식으로 주로 ./app 및 ./runtime으로 나열해야합니다.
图片

图片

컨트롤러 경로를 얻으려면 ./app을 읽으십시오. 원래 ThinkAdmin에는 많은 돌파구가 없지만 이러한 프로그램 중 많은 부분이 2 위에 열립니다. 원래 ThinkAdmin에없는 컨트롤러와 비교하여 취약점을 직접 감사 할 수 있습니다. 감사 취약점은 모든 파일과 함께 읽어야합니다. 자세한 내용은 이전 사항을 검토하십시오. 요컨대, CVE-2020-25540을 사용하면 소스 코드를 얻는 것과 같습니다.
이 프로그램은 SQL 주입을 쉽게 찾을 수 있습니다.
/app/admin/controller/api/main.php
图片

图片

그러나 암호를 호출 한 후 로그인에 OTP 확인이 필요하므로 감사를 계속할 수 없었습니다.
/app/admin/controller/posting.php
图片

매우 어리석은 명령 스 플라이 싱, 같은 위치에 세 곳이 있지만 모두 배경 권한이 필요합니다. 결국, exec ()가 disabled_functions 인 것으로 밝혀 졌으므로 사용할 수 없습니다.
/app/admin/controller/api/upload.php
图片

마지막 장소는 친구의 알림으로 발견되었습니다. 언뜻보기에 ThinkAdmin이 가져온 업로드가 아닌가? 나는 그것을 사용하기 위해 특정 환경이 필요하다는 것을 전에 분석 했으므로 직접 건너 뛰었습니다. 결과적 으로이 이름 $를 완전히 제어 할 수있는 추가 Xkey 매개 변수가 있습니다. 이것이 백도어라고 의심하지 않는 것은 어렵습니다. 결국, getshell은 이와 같습니다.
图片

그러나이 업로드 인터페이스도 배경 권한이 필요합니다. 어떻게해야합니까? 현재 ./runtime이 종종 사용하는 ThinkPhp의 차례가 나타납니다.
파일 런타임/admin/log/single_error.log를 읽으면 일련의 세션 오류를 기록 할 수 있습니다.
图片

또한이 프로그램은 원래 PHP 세션을 사용하고 있으며/TMP 또는/var/lib/php/sessions/에 배치되지 않고 런타임/세션에 배치됩니다. 간단합니다. 우리는 열 디렉토리를 직접 사용하여 모든 세션을 나열한 다음 폭발합니다.
图片

이러한 방식으로 배경을 직접 입력하고 OTP 한도를 우회 할 수 있습니다. 그런 다음 Xkey Backdoor Getshell을 사용하십시오.
图片

0x04 另类脑洞​

뒷문이 없으면 어떻게됩니까? 이 시스템은 Linux+Nginx이며 ThinkAdmin의 원래 업로드 한계를 우회 할 수 없습니다.
그러나 후속 코드 감사에서 그래프 베드 서버가 있음을 발견했습니다.
图片

이 getshell 서버 (a)는 file_paths 매개 변수와 함께 그래프 베드 서버 (b)의 인터페이스에 액세스 할 수 있습니다. 목적은 서버 B가 서버 A에서 사진을 차례로 다운로드하여 백업 할 수 있도록하는 것입니다. 왜 이것을 알고 있습니까?
서버 B는 구멍이 훨씬 더 수수께끼이기 때문에이 인터페이스에 직접 액세스하여 알게됩니다.
图片

디버그로 인해 소스 코드가 누출 될뿐만 아니라이 명령의 스 플라이 싱은 너무 알몸이며 쉘로 사용할 수도 있습니다.
图片

따라서 서버 A를 중단하지 않고 임의 파일 읽기 및 코드 감사를 통해 서버 B를 직접 완전히 중단 할 수 있습니다.
서버 B를 얻는 것은 무엇입니까? 서버 A는 CURL을 사용하여 서버 B를 요청합니다.이 경우 서버 B 코드를 변조하고 인터페이스를 302로 변경 한 다음 점프로 변경 한 다음 프로토콜을 Gopher로 수정하면 서버 A의 로컬 포트를 누를 수 있습니다.
FPM 9000 포트와 6379 포트의 Redis 포트가 서버 A에 로컬로 존재하는 경우 SSRF GetShell을 이러한 방식으로 수행 할 수 있습니다. 이 사례는 종종 Discuz의 SSRF 취약성에서 악용 될 수 있습니다.
이번에는 9000 fpm이 없지만 Redis가 있습니다. Redis 키 및 포트는 Config/Cache.php에도 저장되며 웹 디렉토리에는 777 개의 권한이 있으며 Gopher가 로컬 Redis를 때리는 조건을 완전히 충족합니다.
물론, 나는 결국 그것을 시도하지 않았지만 이론에는 아무런 문제가 없었습니다.
원래 링크에서 재 인쇄 : https://mp.weixin.qq.com/s/buhjuqh3lyaq1smy2xkl3g
 
뒤로
상단