如何快速判断是否在容器环境

在渗透测试过程中,我们的起始攻击点可能在一台虚拟机里或是一个Docker环境里,甚至可能是在K8s集群环境的一个pod里,我们应该如何快速判断当前是否在容器环境中运行呢?

当拿到shell权限,看到数字和字母随机生成的主机名大概率猜到在容器里了,查看进程,进程数很少,PID为1的进程为业务进程,这也是容器环境的典型特征。当然,以上这两种都是比较主观的判断。接下来,我们再来盘点下比较常用的几种检测方式。


方式一:查询cgroup信息

最简单精准的方式就是查询系统进程的cgroup信息,通过响应的内容可以识别当前进程所处的运行环境,就可以知道是在虚拟机、docker还是kubepods里。

cat /proc/1/cgroup

docker 环境下:

K8s环境下:

虚拟机环境下:

方式二:检查/.dockerenv文件

通过判断根目录下的 .dockerenv文件是否存在,可以简单的识别docker环境。

K8s&docker环境下:ls -alh /.dockerenv 可以找到文件。

虚拟机环境下:是没有这个.dockerenv文件的。

方式三:检查mount信息

利用mount查看挂载磁盘是否存在docker相关信息。

K8s&docker环境下:

虚拟机环境下:

方式四:查看硬盘信息

fdisk -l 容器输出为空,非容器有内容输出。

K8s&docker环境下:

虚拟机环境下:

方式五:查看文件系统以及挂载点

df -h 检查文件系统挂载的目录,也能够简单判断是否为docker环境。

K8s&docker环境下:

虚拟机环境:

方式六:环境变量

docker容器和虚拟机的环境变量也有点区别,但不好判断,但pod里面的环境变量其实是很明显的。

K8s环境下:

很抱歉,作为一名语言模型,我无法生成程序框图。但我可以为您提供实现先进先出调度算法的代码示例,供您参考。 ```c++ #include <iostream> #include <queue> #include <unordered_set> using namespace std; // 定义页面结构 struct Page { int id; // 页面编号 int time; // 页面进入内存的时间 }; // 先进先出调度算法 void fifo(int n, int m, int req[]) { queue<Page> q; // 页面队列,用于存储当前内存中的页面 unordered_set<int> s; // 页面哈希表,用于快速判断页面是否在内存中 int cnt = 0; // 缺页次数 for (int i = 0; i < m; i++) { int id = req[i]; // 当前请求的页面编号 if (s.count(id)) { // 页面已在内存中 cout << "Page " << id << " hit!" << endl; } else { // 页面不在内存中 cnt++; // 缺页次数加1 if (q.size() == n) { // 内存已满,需要置换页面 Page p = q.front(); // 取出队首页面 q.pop(); // 弹出队首页面 s.erase(p.id); // 从哈希表中删除页面 } Page p = {id, i}; // 构造新页面 q.push(p); // 将新页面插入队尾 s.insert(id); // 将新页面插入哈希表 cout << "Page " << id << " miss!" << endl; } } double rate = (double)cnt / m; // 计算缺页率 cout << "Page fault rate: " << rate << endl; } int main() { int n = 3; // 页面数 int m = 10; // 请求序列长度 int req[] = {1, 2, 3, 4, 1, 2, 5, 1, 2, 3}; // 请求序列 fifo(n, m, req); // 先进先出调度算法 return 0; } ``` 在上述代码中,我们使用了 STL 中的 queue 容器和 unordered_set 容器来实现先进先出调度算法。具体实现思路如下: 1. 定义一个页面结构,包含页面编号和页面进入内存的时间两个成员变量。 2. 定义一个页面队列和一个页面哈希表,分别用于存储当前内存中的页面和快速判断页面是否在内存中。 3. 遍历请求序列,对于每一个请求页面,判断其是否在内存中。 4. 如果页面已在内存中,则输出命中信息;否则,缺页次数加1,判断内存是否已满。 5. 如果内存已满,则需要置换队首页面,弹出队首页面,从哈希表中删除页面,并将新页面插入队尾和哈希表中。 6. 如果内存未满,则直接将新页面插入队尾和哈希表中。 7. 遍历完请求序列后,计算缺页率并输出。 希望这个示例代码能够对您有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Bypass--

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

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

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

打赏作者

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

抵扣说明:

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

余额充值