KoreanHackerTeam
Moderator
0x01 thinkadmin历史漏洞复习
상대방의 앱의 배경 주소는 ThinkAdmin 인 것으로 밝혀 졌으므로 ThinkAdmin의 역사적 허점을 검토해야합니다.CVE-2020-25540
ThinkAdmin v6 未授权列目录/任意文件读取 · Issue #244 · zoujingli/ThinkAdmin
ThinkAdmin v6 列目录/任意文件读取 app/admin/controller/api/Update.php存在3个function,都是不用登录认证就可以使用的,引用列表如下: namespace app\admin\controller\api; use think\admin\Controller; use think\admin\service\InstallServic...
GitHub - Schira4396/CVE-2020-25540: ThinkAdmin CVE-2020-25540 poc
ThinkAdmin CVE-2020-25540 poc. Contribute to Schira4396/CVE-2020-25540 development by creating an account on GitHub.
post /?s=admin/api.update/noderules=]] 파일 읽기
/? 결과적으로 디렉토리 트래버스로 인해 모든 디렉토리를 읽습니다. 특정 제한 사항이 있지만 피해는 여전히 매우 크기 때문에이 기능은 후속 업데이트 후 선반에서 제거됩니다.
CVE가없는 사막화 취약점도 있습니다
Remote code execution vulnerability · Issue #238 · zoujingli/ThinkAdmin
Hi, this is Tencent Xcheck team. Our code safety check tool Xcheck has found several unserialize vulnerabilities in this project(v4, v5, v6). It leads to remote code execution. Here are the details...
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