Vulnhub靶场渗透-CH4INRULZ_v1.0.1

通过详细的信息收集找到关键备份文件,利用脏牛漏洞成功提权,最终获取靶机上的两个flag。

前言

靶机ip(192.168.110.135)
攻击机ip(192.168.110.127)
网络NAT模式

直接开始

信息收集

吃了上次的亏,这次就比较详细的扫了一下端口
发现 ftp服务的2.3.4版本在 msf中可以直接利用,但这是2.3.5版本,抱着试一试去搞了一下,哈哈哈没有任何作用
在这里插入图片描述
扫描 80 端口
在这里插入图片描述
扫描 8011 端口
在这里插入图片描述
看见 8011 的结果里有 index.html,直觉告诉我可能有备份文件
在这里插入图片描述
在这里插入图片描述
对这个解密,拿到一对账号密码,先不管他

### `PumpBoard_TypeDef`结构体分析 ```c typedef struct { FlagStatus Write_Flag; Pump_Reg_Addr_TypeDef Pump_RegAddr; uint16_t Pump_RegVal; FlagStatus CH1_Valve; FlagStatus CH2_Valve; FlagStatus CH3_Valve; FlagStatus CH4_Valve; FlagStatus Air_Valve; FlagStatus Water_Valve; FlagStatus Liquid_Level; FlagStatus Pump_Switch; uint16_t Pressure_Percentage_Valve; uint16_t Pressure_Set_Valve; float Pressure_Real_Valve; uint16_t Pump_PWM; uint16_t Pressure_Base; } PumpBoard_TypeDef; ``` `PumpBoard_TypeDef`结构体用于表示泵板的相关状态和参数信息。各成员的含义推测如下: - `Write_Flag`:写标志,可能用于指示是否可以对泵板进行写操作。 - `Pump_RegAddr`:泵的寄存器地址,类型为`Pump_Reg_Addr_TypeDef`,该类型可能是自定义的枚举或结构体,用于表示不同的寄存器地址。 - `Pump_RegVal`:泵的寄存器值,用于存储写入或读取的寄存器数据。 - `CH1_Valve` - `CH4_Valve`:四个通道的阀门状态,使用`FlagStatus`类型表示阀门的开关状态。 - `Air_Valve`:空气阀门状态。 - `Water_Valve`:水阀门状态。 - `Liquid_Level`:液位状态。 - `Pump_Switch`:泵的开关状态。 - `Pressure_Percentage_Valve`:压力百分比阀门值。 - `Pressure_Set_Valve`:压力设定阀门值。 - `Pressure_Real_Valve`:实际压力值,使用浮点数表示。 - `Pump_PWM`:泵的脉宽调制值,用于控制泵的转速。 - `Pressure_Base`:压力基准值。 ### `Tens_PumpBoard_PutDataToMemBuf`函数分析 由于没有给出`Tens_PumpBoard_PutDataToMemBuf`函数的具体实现代码,下面推测其功能和代码逻辑。 #### 功能 该函数的功能可能是将`PumpBoard_TypeDef`结构体中的数据按一定格式存储到指定的内存缓冲区中,以便进行数据传输或存储。 #### 代码逻辑推测 ```c void Tens_PumpBoard_PutDataToMemBuf(uint8_t *pBuf, PumpBoard_TypeDef *pPumpBoard) { // 将 Write_Flag 存储到缓冲区 *pBuf++ = (uint8_t)pPumpBoard->Write_Flag; // 将 Pump_RegAddr 存储到缓冲区 // 假设 Pump_RegAddr 是一个枚举类型,可直接转换为 uint8_t 存储 *pBuf++ = (uint8_t)pPumpBoard->Pump_RegAddr; // 将 Pump_RegVal 存储到缓冲区,需要两个字节 *pBuf++ = (uint8_t)(pPumpBoard->Pump_RegVal >> 8); *pBuf++ = (uint8_t)(pPumpBoard->Pump_RegVal & 0xFF); // 依次存储各个阀门状态 *pBuf++ = (uint8_t)pPumpBoard->CH1_Valve; *pBuf++ = (uint8_t)pPumpBoard->CH2_Valve; *pBuf++ = (uint8_t)pPumpBoard->CH3_Valve; *pBuf++ = (uint8_t)pPumpBoard->CH4_Valve; *pBuf++ = (uint8_t)pPumpBoard->Air_Valve; *pBuf++ = (uint8_t)pPumpBoard->Water_Valve; *pBuf++ = (uint8_t)pPumpBoard->Liquid_Level; *pBuf++ = (uint8_t)pPumpBoard->Pump_Switch; // 存储压力百分比阀门值 *pBuf++ = (uint8_t)(pPumpBoard->Pressure_Percentage_Valve >> 8); *pBuf++ = (uint8_t)(pPumpBoard->Pressure_Percentage_Valve & 0xFF); // 存储压力设定阀门值 *pBuf++ = (uint8_t)(pPumpBoard->Pressure_Set_Valve >> 8); *pBuf++ = (uint8_t)(pPumpBoard->Pressure_Set_Valve & 0xFF); // 存储实际压力值,需要四个字节 uint32_t pressureReal = *(uint32_t *)&pPumpBoard->Pressure_Real_Valve; *pBuf++ = (uint8_t)(pressureReal >> 24); *pBuf++ = (uint8_t)(pressureReal >> 16); *pBuf++ = (uint8_t)(pressureReal >> 8); *pBuf++ = (uint8_t)(pressureReal & 0xFF); // 存储泵的 PWM 值 *pBuf++ = (uint8_t)(pPumpBoard->Pump_PWM >> 8); *pBuf++ = (uint8_t)(pPumpBoard->Pump_PWM & 0xFF); // 存储压力基准值 *pBuf++ = (uint8_t)(pPumpBoard->Pressure_Base >> 8); *pBuf++ = (uint8_t)(pPumpBoard->Pressure_Base & 0xFF); } ``` ### 优化建议 - **字节序问题**:在处理多字节数据(如`uint16_t`、`float`)时,需要考虑字节序(大端或小端)的问题,确保数据在不同平台上的兼容性。 - **代码复用**:可以将存储多字节数据的操作封装成函数,提高代码的复用性和可读性。 - **错误处理**:在函数中添加对输入参数的检查,确保`pBuf`和`pPumpBoard`不为空指针。 ### 相关问题
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

paidx0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值