谁泄露的公司内部机密?TextWatermark助你抓出内鬼!

渗透技巧 1年前 (2023) admin
398 0 0

谁泄露的公司内部机密?TextWatermark助你抓出内鬼!

背景
2008年,特斯拉还没有出成品车,但公司内部机密消息经常性外泄,对公司造成了严重负面影响,马斯克决心抓出这个内鬼。于是他给全公司所有人员发送了一封邮件,虽然内容看起来相同,但由于空白字符的插入,导致所有人的邮件都是独一无二的。也因此,最终马斯克成功揪出了公司内鬼。
从DBIR 2022数据来看,每年至少有20%以上的数据泄露是由于内部人员造成的。内鬼已经成为除黑客、合作方外,一条主要的数据泄露途径。
防止数据泄露,从事前、事中、事后来看,分别可以通过防拷贝、防截屏、DLP和水印溯源来进行防御。但因移动办公大行其道,事前和事中防御效果逐渐失效,事后溯源因图片水印对于截屏效果较好,但如果是基于文本的复制粘贴,则显得力不从心。为此我们开源 textwatermark 文本水印python库,寄托此库为文本泄密溯源提供建设和解决方案。
TextWatermark库介绍

谁泄露的公司内部机密?TextWatermark助你抓出内鬼!

文本水印说一千道一万,无非是通过插入、修改、修饰字符来插入特征。为此,本库提供五类水印插入方式,分别是:查找特定字符替换成同形异义字、在指定位置插入不可见字符、对字符进行额外的修饰、对字符添加组合字符,以及二进制方式表示不可见或组合字符,并最终扩展成15种水印模板。
不同模板适用不同场景,譬如:“不可见字符”水印模板在纯文本复制粘贴下效果较好,且隐蔽性极强,但对于截图和屏摄下无能为力;“字体样式”对于截图和屏摄的效果较好,但是隐蔽性较差,在进行纯文本的复制粘贴时会丢失水印信息;“空格字符”在粘贴、截图、屏摄下效果均较好,但在英文文本的表现力好,中文等情况下表现力差;“同形异义-数字”主要使用在手机号、身份证号等极短数字文本场景等。库使用者可以根据自身偏好使用不同的水印模板。当然后续我们也将添加多模板融合使用等功能,力争在各种场景下均能有更佳表现。
我们先来看看使用其中之一水印模板的最终展示效果:
谁泄露的公司内部机密?TextWatermark助你抓出内鬼!
TextWatermark库使用

安装(使用pip):

$ pip install textwatermark

使用:

命令行调用:

插入水印到文本:
$ textwatermark -v insert -f './tests/text/number.txt' -m ALPHA_NUMERICAL -t HOMOGRAPH_NUMBERS -x 999 -w 123
Ӏ2???Ⳓ?890
保存水印参数:
$ textwatermark -v insert -f './tests/text/number.txt' -m ALPHA_NUMERICAL -t HOMOGRAPH_NUMBERS -x 999 -w 123 -e
{"tpl_type""HOMOGRAPH_NUMBERS""confusables_chars": [], "confusables_chars_key""""wm_base"7"method"1"wm_mode"5"wm_len"7"wm_loop"false"start_at"0"version""0.1.2"}
从文本提取水印:
$ textwatermark -v retrieve -f out.txt -p '{"tpl_type""HOMOGRAPH_NUMBERS""confusables_chars": [], "confusables_chars_key""""wm_base"7"method"1"wm_mode"5"wm_len"7"wm_loop"false"start_at"0"version""0.1.2"}'
The retrieved watermark is: 123

代码调用:

'''Sample Example'''import os
from textwatermark.defines import WMModefrom textwatermark.main import TextWatermarkfrom textwatermark.template_type import WMTemplateType
# 1.Init TextWatermark instancewm_mode = WMMode.REAL_NUMBERwm = TextWatermark(wm_mode=wm_mode)
# 2.Choose a watermark templatewm.set_tpl_type(tpl_type=WMTemplateType.HOMOGRAPH_NUMBERS)
# 3.Set the maximum value of the watermark stringwm_max = '9'*9wm.set_wm_max(wm_max=wm_max)
# 4.Set the text to be watermarkedwm.set_text_file(path=os.path.abspath('../tests/text/1.txt'))
# 5.Insert watermark string to textwm_str = '123456789'wm_text = wm.insert_watermark(wm_str=wm_str)print(wm_text)
##############################################################
# Save the parameters to retrieve the watermarkparams = wm.export_params()
# retrieve the watermarkwm_out_str = TextWatermark.retrieve_watermark(wm_text=wm_text, params=params)
assert wm_out_str == wm_str

更多参见:https://textwatermark.jd.army/usage/

找回水印
本库内置了一些的简单的方法去找回水印信息,但只适合水印信息没有任何变化的文本。因为文本可能会在复制粘贴中丢失信息、信息被改造(譬如HTML标签的表示发生变化),或因截屏、屏摄变成图片无法自动找回信息。此时就需要人工分析判断来还原水印信息。
譬如上文通过 FONT_COLOR 水印模板生成的含有水印文本图片,就需要我们在ps中通过调整曲线来人工判断和还原水印信息:10010000011000100000101000110000111

谁泄露的公司内部机密?TextWatermark助你抓出内鬼!

再通过调用还原命令即可解析出水印信息。
$ textwatermark -v retrieve -b 10010000011000100000101000110000111 -p '{"tpl_type""FONT_COLOR""confusables_chars": [], "confusables_chars_key""black4""wm_base"2"method"3"wm_mode"5"wm_len"35"wm_loop"false"start_at"0"version""0.1.2"}'The retrieved watermark is: 123456
结束语
本库没有使用唯一的某一种模板,就是希望建立一种通用型文本水印解决方案来给开发者更多的选择。甚至开发者可以摒弃现有模板,去自定义一种自己独特的模板,以便水印有更强的隐蔽性和强壮性(可参考:https://textwatermark.jd.army/usage/#2)。
最后,希望本库能得到更多的开源力量参与和建议,多谢!


参考:

DBIR 2022:https://www.verizon.com/business/resources/T27b/reports/dbir/2022-data-breach-investigations-report-dbir.pdf#pdfjs.action=download

马斯克在特斯拉总部抓内鬼:https://www.163.com/dy/article/HS1OQ0O2055302A2.html
textwatermark pypi:https://pypi.org/project/textwatermark/
textwatermark website&docs:https://textwatermark.jd.army/
textwatermark github:https://github.com/JDArmy/TextWatermark
点击原文链接跳转到项目Github?

原文始发于微信公众号(梦之光芒的电子梦):谁泄露的公司内部机密?TextWatermark助你抓出内鬼!

版权声明:admin 发表于 2023年2月24日 下午12:24。
转载请注明:谁泄露的公司内部机密?TextWatermark助你抓出内鬼! | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...