网络安全实验报告
网络安全实验报告
姓名: : 杨瑞春
班级: : 自动化 86
学号 :08045009
实验一: 网络命令操作与网络协议分析 一.实验目的: 1. 熟悉网络基本命令的操作与功能。
2. 熟练使用网络协议分析软件 ethereal 分析应用协议。
二.实验步骤: 1. 网络命令: ping tracert netstat ipconfig telnet netcat Arp route nslookup Ssh 2. 协议分析软件:ethereal 的主要功能:设置流量过滤条件,分析网络数据包,流重组功能,协议分析。
三.实验任务: 1.跟踪某一网站如 google 的路由路径
2.查瞧本机的 MAC 地址,ip 地址 输入 ipconfig /all 找见本地连接、 Description 、 、 、、 、 : SiS 900-Based PCI Fast Ethernet Adapte Physical Address、、 、 : 00-13-8F-07-3A-57 DHCP Enabled、 、 、、 、 : No
IP Address、 、 、 、、 、 : 192、168、1、5 Subnet Mask 、 、 、、 、 : 255、255、255、0 Default Gateway 、、 、 : 192、168、1、1 DNS Servers 、 、 、、 、 : 61、128、128、67
192、168、1、1 Default Gateway 、、 、 : 192、168、1、1 这项就是网关、也就就是路由器 IP Physical Address、、 、 : 00-13-8F-07-3A-57 这项就就是 MAC 地址了、
3.telnet 到 linux 服务器,执行指定的命令
4、ssh 连接到 linux 服务器,执行指定的命令
5、nc 应用:telnet,绑定程序(cmd,shell 等),扫描,连接等。
6、选择任意一种应用层协议如,qq 等,利用 ethereal 对该协议进行分析。实验报告要求有 ethereal 捕获的网络流量与数据包协议解析的屏幕截图。
7 分析 honeynet challenge dataset 的真实攻击网络流量 利用 ethereal 捕获的网络流量如下图所示:
分析:从捕获的网络流量可以发现,有许多的SYN信号,但就是TCK信号很少,因此可以认为三次握手没有建立,连接失败。
实验二: 黑客攻击技术实验 一.实验要求: 1. 掌握典型攻击技术原理 2. 熟悉典型攻击软件的功能及操作 3. 分析黑客攻击软件执行输出结果 二.实验内容: 1. namp 2. nessus 3. craft network packet: hping 4. crack password: john the ripper 5. web attack: nikto 6. google hacking tools 三.实验任务 1 利用 winnmap 扫描功能,给出扫描报告及分析
2 nessus 应用,给出漏洞扫描报告
设置扫描策略
添加新扫描
扫描结果
扫描报告:
3、执行 nikto 对 web 服务器进行漏洞扫描。
4、john 应用及配置 在 run 目录下运行 john-386 --wordlist=password、lst newxjtu、txt,对 newxjtu、txt中内容解密,会生成一个、pot 的文件,对同一密文只能解密一次,若删除、pot 文件,可以再次解密。
破解后生成的明文为$LM$9eceeb689e046fcd:NEWXJTU $LM$aad3b435b51404ee:
5、google hacking tools 应用 打开 Google Hacking,在网站输入框中输入,点击查询网站详情,可以在随后弹出的网页上查瞧交大网站的详细信息,包括站点创建时间,IP 地址,IP 所在地,WEB 服务器等信息。
实验三: 网络安全技术实验 一.实验要求: 1. 掌握防火墙,VPN,入侵检测系统等安全技术的基本原理与实现过程 2. 熟悉 IPSec、SSL、Kerberos、PGP 中的安全认证协议关键技术 3. 熟练使用 IPSec、SSL、Kerberos、PGP 等安全工具 二.实验内容: 1. 防火墙 2. VPN 3. IPSec 4. SSL 5. Kerberos 6. PGP 7. Snort 三.实验任务: 1、防火墙:利用个人防火墙软件,定义防火墙规则,允许或就是禁止某类网络流量的访问。
2 、IPSec:windows 自带的 IPSec 服务配置及使用。搭建一个 VPN,实现隧道模式,传输模式等功能。
(1)、启用 xp 的远程访问组件,该组件默认不启用。打开服务 services、msc,找到 Routing and
Remote Access 服务,设置启动类型为自动,并启动服务。
(2)、双击打开属性,勾选“虚拟专用网”下的复选框。
打开“用户页”,选择允许远程拨入的用户,或者新建用户。
打开网络页,确保计算机上已经安装了 IPX/SPX 协议。服务器上设置完成。
(3)、打开客户机,打开网上邻居,单击创建一个新的连接。点击“下一步” 单击“连接到我的工作场所的网络”
单击“虚拟专用网络连接”
输入公司名,单击下一步
输入 VPN 服务器的 IP 地址,
单击完成客户机创建连接完毕。
(5)、打开刚刚创建好的连接,输入允许介入的用户名与密码,单击“连接”
网络连接后,客户机成功接入 XP VPN 服务器 3、SSL:openSSL 配置及使用 4. Kerberos:windows 实现的 kerberos 认证服务器配置及使用 5. PGP:GNUpgp
6、Snort:定义变量,配置规则,定义新的规则,学习攻击检测规则及报警分析 在使用 snort 之前请先安装 wireshark,因为会用到其中的 winpcap: 1、将 snort 安装在 C 盘根目录下。
2、安装完成后先把 rules、rar 解压,将里面的文件全部直接放在 snort\rules\下 3、将 snort、conf 拷贝到 bin 目录下 4、在 cmd 中执行 snort 的命令
Snort 扫描到的端口
查瞧 snort、conf
实验四: 网络安全软件开发: 网络扫描器 一.实验目的: 1、熟悉网络扫描器实现的关键技术 2、熟练运用 C#,java 开发网络应用程序 3、熟悉网络协议字段含义及结构 二.实验内容: 1、网络扫描器实现基本的地址扫描,端口扫描,TCP/UDP 扫描,实现多线程扫描。
2、图形化界面的网络扫描器软件 3、提交源代码、可执行程序及代码注释文件及执行结果截图。
三.实验分析:
多线程:电脑上有322个端口。如果只启动一个线程的话322个端口需要的时间可以用小时计算。解决这个问题需要用到多线程原理。多线程实现可通过继承 Thread 类或者实现 Runnable接口来达到。
主机端口扫描:与目标主机创建 TCP 连接,如果成功则说明端口监听中,同事对正在监听的端口做识别操作!默认按照常用端口服务给出提示!例如 21,则提示 ftp 服务。UDP 扫描就是向目标主机端口发送固定字符,读取目标主机回复内容!
TCP 扫描原理:利用 java、net、Socket 类建立 socket 连接,如果无法与指定的 IP 与端口建立连接,将会抛出 IOException。我们用 try-catch 对这个 IOException 异常进行捕获,以判断就是否成功与指定的 IP 端口建立连接。如果成功建立了连接,说明指定 IP 的指定端口已经开放;如果程序抛出了一个 IOException 异常被我们捕获,则说明指定的 IP 没有开放指定的端口。扫描指定端口段则就是利用循环不断与服务器的指定端口进行连接,供我们判断就是否开放。
UDP 扫描原理:这种方法使用的就是 UDP 协议。由于这个协议很简单,所以扫描变得相对比较困难。这就是由于打开的端口对扫描探测并不发送一个确认,关闭的端口也并不需要发送一个错误数据包。幸运的就是,许多主机在您向一个未打开的 UDP 端口发送一个数据包时,会返回一个 ICMP_PORT_UNREACH 错误。这样您就能发现哪个端口就是关闭的。UDP 与ICMP 错误都不保证能到达,因此这种扫描器必须还实现在一个包瞧上 去就是丢失的时候能重新传输。这种扫描方法就是很慢的,因为 RFC 对 ICMP 错误消息的产生速率做了规定。同样,这种扫描方法需要具有 root 权限。利用 java、net、DatagramSocket 类给指导 IP 发送DatagramPacket 数据包,如果捕获到 java、net、PortUnreachableException 异常,说明对方主机返回了ICMP_PORT_UNREACH的错误,说明端口关闭,否则如果在指定等待时间内没有得到回复,则捕获到 java、net、SocketTimeoutException 连接超时异常,说明端口就是开放的。
断 判断 IP 地址与端口合法性:在得到端口与建立 socket 之前一定要判断 IP 地址与端口的合法性,因为端口的范围就是在 1~65535,如果我们去建立范围外端口的连接就就是没必要的,而且就是不可行的。IP 地址表示成 XX、XX、XX、XX 格式,XX 范围在 0~255 之间,在这之外就是不合法的。
图形化界面(GUI) 设计:主要用到了 java、awt 提供的与图形界面相关的类。为了使界面更美观使用了 swing 组件。
socket 中的 close 方法:不需要一个 socket 的时候应关闭它,因为 socket 就是一种有限的系统资源。关闭 socket 将释放有关的资源,并允许绑定在此 socket 上的端口被重新使用。Socket被关闭之后就不能再向它收发数据 UDP 缺陷说明:开放的 UDP 端口并不需要送回 ACK 包,而关闭的端口也不要求送回错误包(而本实验基于的原理就就是那些主机在关闭的UDP端口会回送ICMP Port Unreachable错误,因此有很大的几率误判,由于时间原因与自身知识的局限不能想到更好的方法),所以利用UDP 包进行扫描非常困难。UDP 包与 ICMP 包都就是不可靠的,速度慢(差错报文产生的速度有限制),并且需要 root 权限才能读取 ICMP 消息,因此使用的局限性好大。
四.实验结果: 1、 初始界面:
2 、对站点 127、0、0、1 进行 TCP 扫描:
3 、对站点 127、0、0、1 进行 UDP 扫描:
实验源代码: /*基于多线程端口扫描程序源代码*/ import java、awt、Color;
//类的调用 import java、awt、Container; import java、awt、Label; import java、awt、TextArea; import java、awt、event、ActionEvent; import java、awt、event、ActionListener; import java、awt、event、WindowAdapter; import java、awt、event、WindowEvent; import java、io、IOException; import java、net、InetAddress; import java、net、InetSocketAddress; import java、net、Socket; import java、net、SocketAddress; import java、net、DatagramPacket; import java、net、DatagramSocket; import java、net、UnknownHostException; import javax、swing、JButton; import javax、swing、JDialog; import javax、swing、JFrame; import javax、swing、JTextField; public class Scanner implements ActionListener{
// 创建主窗口
public static JFrame mainFrame = new JFrame();
public static Label labelIP = new Label("主机 IP");
public static Label labelPortStart = new Label("起始端口:");
public static Label labelPortEnd = new Label("结束端口:");
public static Label labelThread = new Label("线程数:");
public static Label labelResult = new Label("扫描结果:");
public static Label State = new Label("扫描状态:");
public static Label Scanning = new Label("未开始扫描");
public
static JTextField hostName = new JTextField("172、22、65、10");
public static JTextField PortStart = new JTextField("0");
public static JTextField PortEnd = new JTextField("100");
public static JTextField ThreadNum = new JTextField("10");
// 文本区域,显示扫描结果
public static TextArea Result = new TextArea();
public static Label DLGINFO = new Label("");
public static JButton Start = new JButton("TCP 扫描");
public static JButton Start2 = new JButton("UDP 扫描");
public static JButton Exit = new JButton("退出");
//
错误提示对话框
public static JDialog DLGError = new JDialog(mainFrame, "错误");
public static JButton OK = new JButton("确定");
public Scanner(){//GUI 界面
// 设置主窗体名称
mainFrame、setTitle("多线程端口扫描器");
// 设置主窗体位置与大小
mainFrame、setBounds(180, 200, 550, 300);
mainFrame、addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System、exit(0);
}
});
// 设置错误提示框
Container dPanel = DLGError、getContentPane();
dPanel、setLayout(null);
dPanel、add(DLGINFO);
dPanel、add(OK);
dPanel、setBackground(new Color(153,255,204));
OK、setActionCommand("ok");
OK、addActionListener(this);
// 在主窗体中添加其她组件
mainFrame、setLayout(null);
mainFrame、setResizable(false);
mainFrame、add(Start);
mainFrame、add(Start2);
mainFrame、add(Exit);
mainFrame、add(labelIP);
mainFrame、add(hostName);
mainFrame、add(labelPortStart);
mainFrame、add(labelPortEnd);
mainFrame、add(PortStart);
mainFrame、add(PortEnd);
mainFrame、add(labelThread);
mainFrame、add(ThreadNum);
mainFrame、add(labelResult);
mainFrame、add(Result);
mainFrame、add(State);
mainFrame、add(Scanning);
// 设置扫描按钮与退出按钮
Start、setBounds(350, 232, 100, 30);
Start、setActionCommand("Start");
Start、addActionListener(this);
Start、setBackground(new Color(153,255,204));
Start2、setBackground(new Color(153,255,204));
Start2、setBounds(250, 232, 100, 30);
Start2、setActionCommand("Start2");
Start2、addActionListener(this);
Exit、setBounds(475, 232, 60, 30);
Exit、setActionCommand("Exit");
Exit、addActionListener(this);
Exit、setBackground(new Color(153,255,204));
labelIP、setBounds(17, 13, 50, 20);
hostName、setBounds(67, 10, 92, 25);
hostName、setHorizontalAlignment(JTextField、CENTER);
labelPortStart、setBounds(162, 13, 60, 20);
PortStart、setBounds(227, 10, 45, 25);
PortStart、setHorizontalAlignment(JTextField、CENTER);
labelPortEnd、setBounds(292, 13, 60, 20);
PortEnd、setBounds(357, 10, 45, 25);
PortEnd、setHorizontalAlignment(JTextField、CENTER);
labelThread、setBounds(422, 13, 50, 20);
ThreadNum、setBounds(477, 10, 45, 25);
ThreadNum、setHorizontalAlignment(JTextField、CENTER);
labelResult、setBounds(1, 45, 55, 20);
Result、setBounds(1, 65, 542, 160);
Result、setEditable(false);
Result、setBackground(new Color(204,255,51));//设置显示结果窗口颜色 RGB
State、setBounds(17, 232, 60, 30);
Scanning、setBounds(80, 232, 120, 30);
mainFrame、setVisible(true);
}
public void actionPerformed(ActionEvent e) {
String cmd = e、getActionCommand();
//得到明明处理事件
if(cmd、equals("Start")||cmd、equals("Start2")){
//启动扫描线程
try {
Scan、hostAddress = InetAddress、getByName(Scanner、hostName、getText());
Scan2、hostAddress = InetAddress、getByName(Scanner、hostName、getText());
} catch (UnknownHostException e1) {
DLGError、setBounds(300, 280, 160, 110);
DLGINFO、setText("错误的 IP 地址/域名");
DLGINFO、setBounds(25, 15, 100, 20);
OK、setBounds(45, 40, 60, 30);
DLGError、setVisible(true);
return ;
}
int minPort ;
int maxPort ;
int threadNum ;
// 获取输入数据
try {
minPort = Integer、parseInt(PortStart、getText());
maxPort = Integer、parseInt(PortEnd、getText());
threadNum = Integer、parseInt(ThreadNum、getText());
} catch (NumberFormatException e1) {
DLGError、setBounds(300, 280, 299, 120);
DLGINFO、setText("错误的端口号或线程数!端口号与线程数必须为整数!");
DLGINFO、setBounds(10, 20, 280, 20);
OK、setBounds(110, 50, 60, 30);
DLGError、setVisible(true);
return;
}
// 输入信息错误处理
if((minPort < 0)||(maxPort > 65535)||(minPort > maxPort)){
DLGError、setBounds(300, 280, 295, 120);
DLGINFO、setText("最小端口必须就是 0-65535 并且小于最大端口的整数");
DLGINFO、setBounds(10, 20, 280, 20);
OK、setBounds(120, 50, 60, 30);
DLGError、setVisible(true);
return ;
}
if((threadNum > 200)|| (threadNum < 0)){
DLGError、setBounds(300, 280, 184, 120);
DLGINFO、setText("进程数必须就是 1-200 中的整数");
DLGINFO、setBounds(10, 20, 200, 20);
OK、setBounds(55, 50, 60, 30);
DLGError、setVisible(true);
return ;
}
Result 、 append(" 正 在 扫 描 " + hostName 、 getText() + " 线 程数:"+threadNum+"\n");
Scanning、setText("开始扫描 、、、");
Result、append("开始端口 " + minPort + " 结束端口 " + maxPort + " \n");
if(cmd、equals("Start"))//启动 TCP 扫描线程
{
for(int i = minPort;i <= maxPort; ) {
if((i + threadNum) <= maxPort) {
new Scan(i, i + threadNum)、start();
i += threadNum;
}
else {
new Scan(i, maxPort)、start();
i += threadNum;
}
}
}
else
if(cmd、equals("Start2"))//启动 UDP 扫描线程
{
for(int i = minPort;i <= maxPort; ) {
if((i + threadNum) <= maxPort) {
new Scan2(i, i + threadNum)、start();
i += threadNum;
}
else {
new Scan2(i, maxPort)、start();
i += threadNum;
}
}
}
try {
Thread、sleep(3000);//设置处理等待时间
} catch (InterruptedException e1) {
e1、printStackTrace();
}
Result、append("扫描完成!\n");
Scanning、setText("扫描完成!");
}
else if(cmd、equals("ok")){
DLGError、dispose();
}
else if(cmd、equals("Exit")){
System、exit(1);
}
}
public static void main(String[] args) {
new Scanner();
} } //TCP Scan class class Scan extends Thread{
int maxPort, minPort;
public static InetAddress hostAddress;
Scan(int minPort, int maxPort){
this、minPort = minPort;
this、maxPort = maxPort;
}
public void run(){
// 扫描指定端口
for(int i = minPort;i < maxPort; i++){
Scanner、Scanning、setText("正在扫描"+i+"端口");
try {
// 根据主机名与端口号创建套接字地址。
SocketAddress sockaddr = new InetSocketAddress(hostAddress, i);
Socket scans=new Socket();
int timeoutMs=50;
// 将此套接字连接到具有指定超时值的服务器。
scans、connect(sockaddr, timeoutMs);
// 关闭此套接字。
scans、close();
// 添加结果显示
Scanner、Result、append("主机:" + Scanner、hostName、getText() + " TCP端口:" + i);
switch(i){//通用 TCP 端口作用显示
case 20: Scanner、Result、append("()");break;
case 21: Scanner、Result、append("()");break;
case 23: Scanner、Result、append("(TELNET)");break;
case 25: Scanner、Result、append("(SMTP)");break;
case 38: Scanner、Result、append("(RAP)");break;
case 53: Scanner、Result、append("(DNS)");break;
case 79: Scanner、Result、append("FINGER");break;
case 80: Scanner、Result、append("(HTTP)");break;
case 139: Scanner、Result、append("(netBIOS)");break;
case 110: Scanner、Result、append("(POP)");break;
case 161: Scanner、Result、append("(SNMP)");break;
case 443: Scanner、Result、append("(HTTPS)");break;
case 1433: Scanner、Result、append("(SQL)");break;
case 1521: Scanner、Result、append("(Oracle)");break;
case 3389: Scanner、Result、append("(Terminal Service)");break;
case 8000: Scanner、Result、append("(OICQ)");break;
}
Scanner、Result、append(" 开放\n");
} catch (IOException e) {
}
}
} } //UDP Scan class class Scan2 extends Thread
{
int maxPort, minPort,port;
public static InetAddress hostAddress;
Scan2(int minPort, int maxPort)
{
this、minPort = minPort;
this、maxPort = maxPort;
} public void run()
{
for(int port=minPort;port<=maxPort;port++)
{
DatagramSocket connection = null;
byte[] myByte = hostAddress、toString()、getBytes();
String myStr = new String(myByte);
try
{ //connection = new DatagramSocket(port, InetAddress 、getByName(ipAddress));//(ipAddress, port);
connection = new DatagramSocket( );//(ipAddress, port);
//connection、setReceiveTimeout(20*1000);
connection、setSoTimeout(60*1000);
Scanner、Scanning、setText("正在扫描"+port+"端口");
connection、connect( hostAddress, port);
System、out、println(port+"连结创建完成、、、");
connection、send((new DatagramPacket(myByte, myByte、length)));
System、out、println(" 数据发送完成、、、");
while(true)
{
byte[] newByte = new byte[4096];
DatagramPacket dp = new DatagramPacket(newByte, 4096);
connection、receive(dp);
if (dp != null && dp、getData() != null)
{
System、out、println(dp、getLength());
System、out、println("#####");
byte[] rslt = dp、getData();
for (int i = 0;i < dp、getLength(); i++)
{ System、out、println(rslt);
}
System、out、println("#####");
}
break;
}
connection、close();
}
catch(java、net、PortUnreachableException e)//ICMP 不可达
{
System、out、println(port+"UDP 端口关闭了\n");
}
catch(java、net、SocketTimeoutException e)//连接超时
{
Scanner、Result、append(port+"UDP 端口打开\n");
}
catch(Exception ex)
{
ex、printStackTrace();
}
} } }
下一篇:【推荐】个人自查报告